@pipeline-builder/pipeline-data 4.3.3 → 4.3.4

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 (47) hide show
  1. package/lib/api/crud-service.d.ts +7 -0
  2. package/lib/api/crud-service.js +14 -3
  3. package/lib/api/pipeline-step-resolution.d.ts +111 -0
  4. package/lib/api/pipeline-step-resolution.js +163 -0
  5. package/lib/api/plugin-consumption-policy.d.ts +8 -2
  6. package/lib/api/plugin-consumption-policy.js +20 -3
  7. package/lib/api/plugin-resolution.d.ts +26 -9
  8. package/lib/api/plugin-resolution.js +51 -33
  9. package/lib/api/reporting/analytics-queries.d.ts +6 -4
  10. package/lib/api/reporting/analytics-queries.js +11 -11
  11. package/lib/api/reporting/deploy-rollup.d.ts +2 -0
  12. package/lib/api/reporting/deploy-rollup.js +5 -1
  13. package/lib/api/reporting/failure-classifier.d.ts +2 -6
  14. package/lib/api/reporting/failure-classifier.js +22 -1
  15. package/lib/api/reporting/ingest.js +73 -16
  16. package/lib/api/reporting/plugin-exposure.d.ts +261 -15
  17. package/lib/api/reporting/plugin-exposure.js +423 -38
  18. package/lib/api/reporting/stakeholder/compose.d.ts +1 -1
  19. package/lib/api/reporting/stakeholder/compose.js +30 -1
  20. package/lib/api/reporting/stakeholder/store.d.ts +16 -2
  21. package/lib/api/reporting/stakeholder/store.js +17 -6
  22. package/lib/api/reporting/types.d.ts +80 -1
  23. package/lib/api/reporting/types.js +1 -1
  24. package/lib/api/reporting-service.d.ts +11 -4
  25. package/lib/api/reporting-service.js +106 -43
  26. package/lib/api/soft-delete-sweep.d.ts +8 -18
  27. package/lib/api/soft-delete-sweep.js +35 -5
  28. package/lib/api/version-references.d.ts +80 -0
  29. package/lib/api/version-references.js +135 -0
  30. package/lib/core/query-filters.d.ts +3 -3
  31. package/lib/core/query-filters.js +1 -1
  32. package/lib/database/drizzle-schema.d.ts +1238 -143
  33. package/lib/database/drizzle-schema.js +6 -3
  34. package/lib/database/index.d.ts +1 -1
  35. package/lib/database/index.js +2 -2
  36. package/lib/database/schema/ecosystem.d.ts +53 -0
  37. package/lib/database/schema/ecosystem.js +14 -3
  38. package/lib/database/schema/pipeline.d.ts +38 -0
  39. package/lib/database/schema/pipeline.js +20 -2
  40. package/lib/database/schema/plugin.d.ts +265 -0
  41. package/lib/database/schema/plugin.js +34 -3
  42. package/lib/database/schema/reporting-analytics.d.ts +786 -4
  43. package/lib/database/schema/reporting-analytics.js +111 -5
  44. package/lib/index.d.ts +5 -3
  45. package/lib/index.js +5 -3
  46. package/lib/testing/exports.json +24 -0
  47. package/package.json +4 -3
@@ -22,7 +22,7 @@ export declare const LOW_SAMPLE_THRESHOLD = 5;
22
22
  export type TrendDirection = 'up' | 'down' | 'flat' | 'unknown';
23
23
  /** A data-quality caveat attached to the whole snapshot. */
24
24
  export interface DataQualityNote {
25
- code: 'missing_deploy_tag' | 'missing_commit_data' | 'low_sample' | 'section_failed' | 'section_locked';
25
+ code: 'missing_deploy_tag' | 'missing_commit_data' | 'low_sample' | 'section_failed' | 'section_locked' | 'rule_unavailable';
26
26
  /** Manager-readable. Not a metric name and not a stack trace. */
27
27
  message: string;
28
28
  /** The section it concerns, when it is section-specific. */
@@ -128,6 +128,33 @@ function deployCoverageNotes(dora) {
128
128
  }
129
129
  return notes;
130
130
  }
131
+ /** Manager-facing names of the needs-attention rules, for the unavailable note. */
132
+ const ATTENTION_RULE_LABELS = {
133
+ low_success_rate: 'low success rate',
134
+ slower_p95: 'slower builds',
135
+ consecutive_failures: 'consecutive failures',
136
+ no_recent_success: 'no recent success',
137
+ failed_after_config_change: 'failed after a configuration change',
138
+ vulnerable_plugin: 'vulnerable plugins',
139
+ no_deploy_tracking: 'deploy tracking',
140
+ };
141
+ /**
142
+ * The needs-attention rules that could not run. An empty list there must read as
143
+ * "nothing tripped", never as "a rule could not look" — above all for the
144
+ * vulnerable-plugin rule, where the second reading is a false all-clear.
145
+ */
146
+ function attentionNotes(value) {
147
+ const rules = value?.unavailableRules;
148
+ if (!Array.isArray(rules) || rules.length === 0)
149
+ return [];
150
+ const names = rules.map((r) => ATTENTION_RULE_LABELS[String(r)] ?? String(r));
151
+ return [{
152
+ code: 'rule_unavailable',
153
+ sectionId: 'needs_attention',
154
+ message: `Some checks could not run this period (${names.join(', ')}): their data was unavailable. `
155
+ + 'A pipeline missing from this list was not checked for those — this is not an all-clear.',
156
+ }];
157
+ }
131
158
  /**
132
159
  * Compose one period's snapshot.
133
160
  *
@@ -205,6 +232,8 @@ export async function composeSnapshot(sectionIdList, opts) {
205
232
  }
206
233
  if (id === 'dora')
207
234
  notes.push(...deployCoverageNotes(current));
235
+ if (id === 'needs_attention')
236
+ notes.push(...attentionNotes(current));
208
237
  sections.push(composed);
209
238
  }
210
239
  catch (err) {
@@ -231,4 +260,4 @@ export async function composeSnapshot(sectionIdList, opts) {
231
260
  generatedAt: (opts.now ?? new Date()).toISOString(),
232
261
  };
233
262
  }
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3N0YWtlaG9sZGVyL2NvbXBvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQW9CdEMsT0FBTyxFQUFFLFVBQVUsRUFBaUUsTUFBTSxlQUFlLENBQUM7QUFFMUcsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQWdFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWdELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkcsa0JBQWtCLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSCxvRkFBb0Y7QUFDcEYsU0FBUyxTQUFTLENBQUMsUUFBMkIsRUFBRSxRQUFnQjtJQUM5RCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0MsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsU0FBUyxVQUFVLENBQUMsU0FBaUIsRUFBRSxLQUFjO0lBQ25ELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZELHVFQUF1RTtJQUN2RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0s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TSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsUUFBUSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJO2NBQ3JHLGVBQWUsUUFBUSx3QkFBd0IsU0FBUyx1QkFBdUI7Y0FDL0UsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLElBQUk7Y0FDeEUsdUZBQXVGO1FBQzNGLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRTtLQUNwRCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBjb21wb3NlcjogdHVybiBhIGRlZmluaXRpb24ncyBzZWN0aW9uIGxpc3QgaW50byB0aGUgc25hcHNob3QgYSBtYW5hZ2VyIHJlYWRzLlxuICpcbiAqIFRocmVlIHRoaW5ncyBpdCBkb2VzIHRoYXQgdGhlIHJhdyBxdWVyaWVzIGRvIG5vdDpcbiAqXG4gKiAgLSBQRVJJT0QtT1ZFUi1QRVJJT0QuIEV2ZXJ5IGNvbXBhcmFibGUgc2VjdGlvbiBpcyBydW4gdHdpY2UsIGZvciB0aGlzIHBlcmlvZFxuICogICAgYW5kIHRoZSBvbmUgYmVmb3JlLCBzbyB0aGUgc25hcHNob3QgY2FycmllcyBcIjkxJSAoZG93biAzIHBvaW50cylcIi4gVGhlIHRyZW5kXG4gKiAgICBpcyB3aGF0IGEgbWFuYWdlciBhY3RzIG9uOyB0aGUgYWJzb2x1dGUgbnVtYmVyIGFsb25lIHJhcmVseSBpcy5cbiAqICAtIExPQ0tFRCBTRUNUSU9OUy4gQSBzZWN0aW9uIHdob3NlIGZlYXR1cmUgdGhlIG9yZyBsYWNrcyByZW5kZXJzIGFzIGxvY2tlZFxuICogICAgaW5zdGVhZCBvZiBmYWlsaW5nIHRoZSBydW4uIEEgcmVwb3J0IHRoYXQgZGllcyBiZWNhdXNlIG9uZSBnYXRlZCBzZWN0aW9uIHdhc1xuICogICAgaW5jbHVkZWQgaXMgYSBzdXBwb3J0IHRpY2tldDsgYSBsb2NrZWQgcGFuZWwgaXMgYW4gdXBzZWxsLlxuICogIC0gREFUQS1RVUFMSVRZIE5PVEVTLiBNaXNzaW5nIGRlcGxveSB0YWdzIGFuZCB0aW55IHNhbXBsZXMgYXJlIHN0YXRlZCwgbm90XG4gKiAgICBzaWxlbnRseSByZW5kZXJlZCBhcyB6ZXJvLiBcIjAgZGVwbG95c1wiIGFuZCBcIndlIGNhbm5vdCBzZWUgeW91ciBkZXBsb3lzXCIgbG9va1xuICogICAgaWRlbnRpY2FsIG9uIGEgY2hhcnQgYW5kIG1lYW4gb3Bwb3NpdGUgdGhpbmdzIOKAlCBhIG1hbmFnZXIgcmVhZGluZyB0aGUgZmlyc3RcbiAqICAgIHdoZW4gaXQgaXMgcmVhbGx5IHRoZSBzZWNvbmQgZHJhd3MgZXhhY3RseSB0aGUgd3JvbmcgY29uY2x1c2lvbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVkUGVyaW9kIH0gZnJvbSAnLi9wZXJpb2QuanMnO1xuaW1wb3J0IHsgZ2V0U2VjdGlvbiwgdHlwZSBTZWN0aW9uQ29udGV4dCwgdHlwZSBTZWN0aW9uRGF0YVNvdXJjZSwgdHlwZSBTZWN0aW9uU3BlYyB9IGZyb20gJy4vc2VjdGlvbnMuanMnO1xuXG4vKiogQmVsb3cgdGhpcyBtYW55IG9ic2VydmF0aW9ucyBhIHJhdGUgaXMgbm9pc2UsIGFuZCBzYXlzIHNvLiAqL1xuZXhwb3J0IGNvbnN0IExPV19TQU1QTEVfVEhSRVNIT0xEID0gNTtcblxuLyoqIFdoaWNoIHdheSBhIG1ldHJpYyBtb3ZlZC4gYGZsYXRgIHdoZW4gdGhlIGNoYW5nZSByb3VuZHMgdG8gbm90aGluZy4gKi9cbmV4cG9ydCB0eXBlIFRyZW5kRGlyZWN0aW9uID0gJ3VwJyB8ICdkb3duJyB8ICdmbGF0JyB8ICd1bmtub3duJztcblxuLyoqIEEgZGF0YS1xdWFsaXR5IGNhdmVhdCBhdHRhY2hlZCB0byB0aGUgd2hvbGUgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFRdWFsaXR5Tm90ZSB7XG4gIGNvZGU6ICdtaXNzaW5nX2RlcGxveV90YWcnIHwgJ21pc3NpbmdfY29tbWl0X2RhdGEnIHwgJ2xvd19zYW1wbGUnIHwgJ3NlY3Rpb25fZmFpbGVkJyB8ICdzZWN0aW9uX2xvY2tlZCc7XG4gIC8qKiBNYW5hZ2VyLXJlYWRhYmxlLiBOb3QgYSBtZXRyaWMgbmFtZSBhbmQgbm90IGEgc3RhY2sgdHJhY2UuICovXG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgLyoqIFRoZSBzZWN0aW9uIGl0IGNvbmNlcm5zLCB3aGVuIGl0IGlzIHNlY3Rpb24tc3BlY2lmaWMuICovXG4gIHNlY3Rpb25JZD86IHN0cmluZztcbn1cblxuLyoqIE9uZSBjb21wb3NlZCBzZWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlZFNlY3Rpb24ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogYGxvY2tlZGAgd2hlbiB0aGUgb3JnIGxhY2tzIHRoZSBmZWF0dXJlOyBgZmFpbGVkYCB3aGVuIHRoZSBxdWVyeSB0aHJldy4gKi9cbiAgc3RhdGU6ICdvaycgfCAnbG9ja2VkJyB8ICdmYWlsZWQnO1xuICAvKiogVGhlIGZlYXR1cmUgbmVlZGVkLCB3aGVuIGxvY2tlZCDigJQgZHJpdmVzIHRoZSB1cHNlbGwgY29weS4gKi9cbiAgcmVxdWlyZXNGZWF0dXJlPzogc3RyaW5nO1xuICAvKiogVGhpcyBwZXJpb2QncyByYXcgcmVzdWx0LCBleGFjdGx5IGFzIHRoZSBkYXNoYm9hcmQgd291bGQgc2hvdyBpdC4gKi9cbiAgY3VycmVudD86IHVua25vd247XG4gIC8qKiBUaGUgcHJldmlvdXMgcGVyaW9kJ3MgcmVzdWx0LCBmb3IgY29tcGFyYWJsZSBzZWN0aW9ucy4gKi9cbiAgcHJldmlvdXM/OiB1bmtub3duO1xuICAvKiogVGhlIHNpbmdsZSBudW1iZXIgYSBtYW5hZ2VyIHJlYWRzIGZpcnN0LCB3aGVuIHRoZSBzZWN0aW9uIGhhcyBvbmUuICovXG4gIGhlYWRsaW5lPzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyOyB1bml0Pzogc3RyaW5nIH07XG4gIC8qKiBDaGFuZ2UgdmVyc3VzIHRoZSBwcmV2aW91cyBwZXJpb2QsIGZvciBjb21wYXJhYmxlIHNlY3Rpb25zLiAqL1xuICBjaGFuZ2U/OiB7IGFic29sdXRlOiBudW1iZXI7IHBlcmNlbnQ6IG51bWJlciB8IG51bGw7IGRpcmVjdGlvbjogVHJlbmREaXJlY3Rpb24gfTtcbn1cblxuLyoqIFRoZSBmcm96ZW4gb3V0cHV0IG9mIG9uZSBydW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydFNuYXBzaG90IHtcbiAgLyoqIFBlcmlvZCBib3VuZHMgKyBsYWJlbCwgY29waWVkIGluIHNvIHRoZSBzbmFwc2hvdCBpcyBzZWxmLWRlc2NyaWJpbmcuICovXG4gIHBlcmlvZDogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9O1xuICBwcmV2aW91c1BlcmlvZDogeyBzdGFydDogc3RyaW5nOyBlbmQ6IHN0cmluZyB9O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICB3ZWVrU3RhcnQ6ICdtb25kYXknIHwgJ3N1bmRheSc7XG4gIHNlY3Rpb25zOiBDb21wb3NlZFNlY3Rpb25bXTtcbiAgbm90ZXM6IERhdGFRdWFsaXR5Tm90ZVtdO1xuICAvKipcbiAgICogSG93IGV2ZXJ5IG51bWJlciBoZXJlIHdhcyBwcm9kdWNlZCwgc2hvd24gaW4gdGhlIHJlcG9ydCBmb290ZXIuIE1hbmFnZXJzXG4gICAqIGNvbXBhcmUgcmVwb3J0cyB0byB0aGUgZGFzaGJvYXJkOyBzYXlpbmcgcGxhaW5seSB0aGF0IGJvdGggcnVuIHRoZSBzYW1lXG4gICAqIHF1ZXJpZXMgb3ZlciB0aGUgc2FtZSB3aW5kb3cgaXMgd2hhdCBtYWtlcyBhIGRpZmZlcmVuY2UgaW52ZXN0aWdhYmxlIHJhdGhlclxuICAgKiB0aGFuIGEgcmVhc29uIHRvIGRpc3RydXN0IGJvdGguXG4gICAqL1xuICBtZXRob2RvbG9neTogc3RyaW5nO1xuICBnZW5lcmF0ZWRBdDogc3RyaW5nO1xufVxuXG4vKiogV2hhdCB0aGUgY29tcG9zZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgb3JnJ3MgZW50aXRsZW1lbnRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb3NlT3B0aW9ucyB7XG4gIHNvdXJjZTogU2VjdGlvbkRhdGFTb3VyY2U7XG4gIHBlcmlvZDogUmVzb2x2ZWRQZXJpb2Q7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHdlZWtTdGFydDogJ21vbmRheScgfCAnc3VuZGF5JztcbiAgb3JnSWQ6IHN0cmluZztcbiAgb3JnSWRzPzogc3RyaW5nW107XG4gIC8qKiBGZWF0dXJlcyB0aGUgb3JnIGhvbGRzLiBBIHNlY3Rpb24gbmVlZGluZyBvbmUgdGhhdCBpcyBhYnNlbnQgcmVuZGVycyBsb2NrZWQuICovXG4gIGZlYXR1cmVzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgbm93PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBGZWF0dXJlcyB0aGF0LCBpbnNpZGUgYSBSRVBPUlQsIHN0YW5kIGluIGZvciBhbm90aGVyLlxuICpcbiAqIEJ1eWluZyBTdGFrZWhvbGRlciBSZXBvcnRzIGJ1eXMgdGhlIERPUkEgU0VDVElPTlMgb2YgYSByZXBvcnQuIEl0IGRvZXMgbm90IGJ1eSB0aGVcbiAqIGxpdmUgRE9SQSBkYXNoYm9hcmQsIHdoaWNoIHN0YXlzIGJlaGluZCBgYWR2YW5jZWRfcmVwb3J0aW5nYCBhbmQgaXMgZ2F0ZWQgb24gaXRzIG93blxuICogcm91dGVzIOKAlCBzbyB0aGlzIHN1YnN0aXR1dGlvbiBpcyBkZWxpYmVyYXRlbHkgc2NvcGVkIHRvIGNvbXBvc2l0aW9uIGFuZCBleGlzdHNcbiAqIG5vd2hlcmUgZWxzZS4gV2l0aG91dCBpdCwgYSBQcm8gY3VzdG9tZXIgd2hvIGJvdWdodCB0aGUgcmVwb3J0cyBhZGQtb24gd291bGQgb3BlblxuICogdGhlaXIgZmlyc3Qgd2Vla2x5IHJlcG9ydCBhbmQgZmluZCBpdHMgaGVhZGxpbmUgcGFuZWxzIGxvY2tlZCBiZWhpbmQgYSBzZWNvbmRcbiAqIHB1cmNoYXNlLCB3aGljaCBpcyBub3Qgd2hhdCB0aGUgYWRkLW9uJ3Mgb3duIGRlc2NyaXB0aW9uIHByb21pc2VzLlxuICpcbiAqIFN0YXRlZCBhcyBkYXRhIHJhdGhlciB0aGFuIGFuIGBpZmAsIHNvIGFkZGluZyBhIHNlY3Rpb24gdGhhdCBuZWVkcyBhIGRpZmZlcmVudFxuICogZmVhdHVyZSBjYW5ub3Qgc2lsZW50bHkgaW5oZXJpdCB0aGUgY2FydmUtb3V0LlxuICovXG5leHBvcnQgY29uc3QgUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPj4gPSBPYmplY3QuZnJlZXplKHtcbiAgYWR2YW5jZWRfcmVwb3J0aW5nOiBbJ3N0YWtlaG9sZGVyX3JlcG9ydHMnXSxcbn0pO1xuXG4vKiogRG9lcyB0aGUgb3JnIGhvbGQgYHJlcXVpcmVkYCwgb3Igc29tZXRoaW5nIHRoYXQgc3RhbmRzIGluIGZvciBpdCBpbiBhIHJlcG9ydD8gKi9cbmZ1bmN0aW9uIHNhdGlzZmllcyhmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW10sIHJlcXVpcmVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGZlYXR1cmVzLmluY2x1ZGVzKHJlcXVpcmVkKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAoUkVQT1JUX0ZFQVRVUkVfU1VCU1RJVFVURVNbcmVxdWlyZWRdID8/IFtdKS5zb21lKChhbHQpID0+IGZlYXR1cmVzLmluY2x1ZGVzKGFsdCkpO1xufVxuXG4vKiogUHVsbCBhIGNvbXBhcmFibGUgbnVtYmVyIG91dCBvZiBhIHNlY3Rpb24gcmVzdWx0LCBvciBudWxsIHdoZW4gdGhlcmUgaXNuJ3Qgb25lLiAqL1xuZnVuY3Rpb24gaGVhZGxpbmVPZihzZWN0aW9uSWQ6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBudW1iZXI7IHVuaXQ/OiBzdHJpbmcgfSB8IG51bGwge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cbiAgLy8gVGltZSBzZXJpZXMgKHN1Y2Nlc3MgcmF0ZSwgYnVpbGQgc3VjY2Vzcyk6IHRoZSBMQVNUIGJ1Y2tldCBpcyBcIm5vd1wiLlxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3QgPSB2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAodHlwZW9mIGxhc3Q/LnN1Y2Nlc3NfcGN0ID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6ICdTdWNjZXNzIHJhdGUnLCB2YWx1ZTogbGFzdC5zdWNjZXNzX3BjdCwgdW5pdDogJyUnIH07XG4gICAgLy8gRXhlY3V0aW9uIGNvdW50czogdG90YWwgcnVucyBhY3Jvc3MgcGlwZWxpbmVzLlxuICAgIC8vXG4gICAgLy8gQSB0b3RhbCBvZiBaRVJPIGlzIGEgcmVhbCBoZWFkbGluZSwgbm90IG1pc3NpbmcgZGF0YTogXCIwIGRlcGxveXMsIGRvd24gZnJvbVxuICAgIC8vIDVcIiBpcyB0aGUgc2luZ2xlIG1vc3QgaW1wb3J0YW50IHRoaW5nIGEgd2Vla2x5IHJlcG9ydCBjYW4gdGVsbCBhIG1hbmFnZXIsXG4gICAgLy8gYW5kIHRyZWF0aW5nIDAgYXMgXCJubyB2YWx1ZVwiIG1hZGUgZXhhY3RseSB0aGF0IGNhc2UgZGlzYXBwZWFyIOKAlCB0aGUgY2hhbmdlXG4gICAgLy8gY2FtZSBiYWNrIGB1bmtub3duYCBhbmQgbm8gYXJyb3cgd2FzIHNob3duLiBTbyB0aGUgdGVzdCBpcyB3aGV0aGVyIGFueSByb3dcbiAgICAvLyBDQVJSSUVEIGEgY291bnQsIG5vdCB3aGV0aGVyIHRoZSBzdW0gaXMgcG9zaXRpdmUuXG4gICAgbGV0IGNvdW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0b3RhbCA9ICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zO1xuICAgICAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJykgcmV0dXJuIHN1bTtcbiAgICAgIGNvdW50ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN1bSArIG47XG4gICAgfSwgMCk7XG4gICAgaWYgKGNvdW50ZWQpIHJldHVybiB7IGxhYmVsOiAnVG90YWwnLCB2YWx1ZTogdG90YWwgfTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvLyBET1JBOiBkZXBsb3ltZW50IGZyZXF1ZW5jeSBpcyB0aGUgaGVhZGxpbmUgYSBtYW5hZ2VyIHJlY29nbmlzZXMuXG4gIGNvbnN0IGVudnMgPSBvYmouZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSAmJiBlbnZzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmaXJzdCA9IGVudnNbMF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgZGYgPSAoZmlyc3QuZGVwbG95bWVudEZyZXF1ZW5jeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmRlcGxveW1lbnRzO1xuICAgIGlmICh0eXBlb2YgZGYgPT09ICdudW1iZXInKSByZXR1cm4geyBsYWJlbDogJ0RlcGxveXMnLCB2YWx1ZTogZGYgfTtcbiAgfVxuICAvLyBQbHVnaW4gc3VtbWFyeSBhbmQgZnJpZW5kczogYSBwbGFpbiB0b3RhbC5cbiAgLy8gWmVybyBpcyBhIHZhbHVlIGhlcmUgdG9vIOKAlCBgcGx1Z2luX3ZlcnNpb25zYCByZXBvcnRpbmcgMCBvdXRkYXRlZCBwbHVnaW5zIGlzXG4gIC8vIGdvb2QgbmV3cyBhIG1hbmFnZXIgc2hvdWxkIHNlZSwgbm90IGFuIGFic2VudCBzZWN0aW9uLlxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ3RvdGFsJywgJ2NvdW50JywgJ2RlcGxveW1lbnRzJ10pIHtcbiAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6IHNlY3Rpb25JZCA9PT0gJ3BsdWdpbl92ZXJzaW9ucycgPyAnT3V0ZGF0ZWQnIDogJ1RvdGFsJywgdmFsdWU6IG9ialtrZXldIGFzIG51bWJlciB9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQ2hhbmdlIGJldHdlZW4gdHdvIGhlYWRsaW5lIG51bWJlcnMuICovXG5mdW5jdGlvbiBjaGFuZ2VPZihcbiAgY3VycmVudDogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuICBwcmV2aW91czogeyB2YWx1ZTogbnVtYmVyIH0gfCBudWxsLFxuKTogQ29tcG9zZWRTZWN0aW9uWydjaGFuZ2UnXSB7XG4gIGlmICghY3VycmVudCB8fCAhcHJldmlvdXMpIHJldHVybiB7IGFic29sdXRlOiAwLCBwZXJjZW50OiBudWxsLCBkaXJlY3Rpb246ICd1bmtub3duJyB9O1xuICBjb25zdCBhYnNvbHV0ZSA9IE51bWJlcigoY3VycmVudC52YWx1ZSAtIHByZXZpb3VzLnZhbHVlKS50b0ZpeGVkKDIpKTtcbiAgLy8gQSBwZXJjZW50IGNoYW5nZSBvZmYgYSB6ZXJvIGJhc2VsaW5lIGlzIHVuZGVmaW5lZCwgbm90IGluZmluaXRlOiBnb2luZyBmcm9tIDBcbiAgLy8gdG8gNSBkZXBsb3lzIGlzIFwiNSBtb3JlXCIsIG5ldmVyIFwiK+KIniVcIi5cbiAgY29uc3QgcGVyY2VudCA9IHByZXZpb3VzLnZhbHVlID09PSAwID8gbnVsbCA6IE51bWJlcigoKGFic29sdXRlIC8gcHJldmlvdXMudmFsdWUpICogMTAwKS50b0ZpeGVkKDEpKTtcbiAgY29uc3QgZGlyZWN0aW9uOiBUcmVuZERpcmVjdGlvbiA9IGFic29sdXRlID09PSAwID8gJ2ZsYXQnIDogYWJzb2x1dGUgPiAwID8gJ3VwJyA6ICdkb3duJztcbiAgcmV0dXJuIHsgYWJzb2x1dGUsIHBlcmNlbnQsIGRpcmVjdGlvbiB9O1xufVxuXG4vKiogQ291bnQgdGhlIG9ic2VydmF0aW9ucyBiZWhpbmQgYSBzZWN0aW9uLCBmb3IgdGhlIGxvdy1zYW1wbGUgbm90ZS4gKi9cbmZ1bmN0aW9uIHNhbXBsZVNpemUodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByb3cudG90YWwgPz8gcm93LmNvdW50ID8/IHJvdy5leGVjdXRpb25zID8/IHJvdy5kZXBsb3ltZW50cztcbiAgICAgIHJldHVybiBzdW0gKyAodHlwZW9mIG4gPT09ICdudW1iZXInID8gbiA6IDApO1xuICAgIH0sIDApO1xuICB9XG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgY29uc3QgZW52cyA9IG9iaj8uZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSkge1xuICAgIHJldHVybiBlbnZzLnJlZHVjZSgoc3VtOiBudW1iZXIsIGUpID0+IHtcbiAgICAgIGNvbnN0IGF0dGVtcHRzID0gKChlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5jaGFuZ2VGYWlsdXJlUmF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmF0dGVtcHRzO1xuICAgICAgcmV0dXJuIHN1bSArICh0eXBlb2YgYXR0ZW1wdHMgPT09ICdudW1iZXInID8gYXR0ZW1wdHMgOiAwKTtcbiAgICB9LCAwKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIERlcGxveS1jb3ZlcmFnZSBub3RlczogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBcInplcm8gZGVwbG95c1wiIGFuZCBcImJsaW5kXCIuICovXG5mdW5jdGlvbiBkZXBsb3lDb3ZlcmFnZU5vdGVzKGRvcmE6IHVua25vd24pOiBEYXRhUXVhbGl0eU5vdGVbXSB7XG4gIGNvbnN0IG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXSA9IFtdO1xuICBjb25zdCBjb3ZlcmFnZSA9IChkb3JhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCk/LmNvdmVyYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBjb25zdCB3aXRob3V0ID0gY292ZXJhZ2U/LndpdGhvdXREZXBsb3lzO1xuICBpZiAodHlwZW9mIHdpdGhvdXQgPT09ICdudW1iZXInICYmIHdpdGhvdXQgPiAwKSB7XG4gICAgbm90ZXMucHVzaCh7XG4gICAgICBjb2RlOiAnbWlzc2luZ19kZXBsb3lfdGFnJyxcbiAgICAgIHNlY3Rpb25JZDogJ2RvcmEnLFxuICAgICAgbWVzc2FnZTogYERlcGxveSBkYXRhIHVuYXZhaWxhYmxlIGZvciAke3dpdGhvdXR9IHBpcGVsaW5lJHt3aXRob3V0ID09PSAxID8gJycgOiAncyd9OiB0aGV5IGhhdmUgbm90IHJlLXN5bnRoZWQgd2l0aCBkZXBsb3kgdGFncywgc28gdGhlaXIgZGVwbG95cyBhcmUgbm90IGNvdW50ZWQgaGVyZS4gVGhpcyBpcyBub3QgXCJ6ZXJvIGRlcGxveXNcIi5gLFxuICAgIH0pO1xuICB9XG4gIGNvbnN0IGVudnMgPSAoZG9yYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy5lbnZpcm9ubWVudHM7XG4gIGlmIChBcnJheS5pc0FycmF5KGVudnMpKSB7XG4gICAgY29uc3Qgbm9MZWFkID0gKGVudnMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5maWx0ZXIoKGUpID0+IHtcbiAgICAgIGNvbnN0IGx0ID0gZS5sZWFkVGltZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBsdCAmJiBsdC5tZWRpYW5TZWNvbmRzID09PSBudWxsO1xuICAgIH0pO1xuICAgIGlmIChub0xlYWQubGVuZ3RoID4gMCkge1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdtaXNzaW5nX2NvbW1pdF9kYXRhJyxcbiAgICAgICAgc2VjdGlvbklkOiAnZG9yYScsXG4gICAgICAgIG1lc3NhZ2U6IGBMZWFkIHRpbWUgdW5hdmFpbGFibGUgZm9yICR7bm9MZWFkLmxlbmd0aH0gZW52aXJvbm1lbnQke25vTGVhZC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJ306IG5vIHN1Y2Nlc3NmdWwgZGVwbG95IGNhcnJpZWQgYSByZXNvbHZhYmxlIGNvbW1pdCB0aW1lc3RhbXAsIHNvIGNvbW1pdC10by1kZXBsb3kgdGltZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuYCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm90ZXM7XG59XG5cbi8qKlxuICogQ29tcG9zZSBvbmUgcGVyaW9kJ3Mgc25hcHNob3QuXG4gKlxuICogTmV2ZXIgdGhyb3dzIGZvciBhIHNlY3Rpb24tbGV2ZWwgcHJvYmxlbTogYSBzZWN0aW9uIHRoYXQgZmFpbHMgaXMgbWFya2VkXG4gKiBgZmFpbGVkYCB3aXRoIGEgbm90ZSwgYW5kIHRoZSByZXN0IG9mIHRoZSByZXBvcnQgc3RpbGwgcmVhY2hlcyB0aGUgbGVhZC4gQSBydW5cbiAqIHRoYXQgcHJvZHVjZXMgbmluZSBnb29kIHNlY3Rpb25zIGFuZCBvbmUgZmFpbHVyZSBpcyB1c2VmdWw7IGEgcnVuIHRoYXQgcHJvZHVjZXNcbiAqIGFuIGV4Y2VwdGlvbiBpcyBub3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb21wb3NlU25hcHNob3Qoc2VjdGlvbklkTGlzdDogcmVhZG9ubHkgc3RyaW5nW10sIG9wdHM6IENvbXBvc2VPcHRpb25zKTogUHJvbWlzZTxSZXBvcnRTbmFwc2hvdD4ge1xuICBjb25zdCB7IHNvdXJjZSwgcGVyaW9kLCB0aW1lem9uZSwgd2Vla1N0YXJ0LCBvcmdJZCwgb3JnSWRzLCBmZWF0dXJlcyB9ID0gb3B0cztcbiAgY29uc3Qgbm90ZXM6IERhdGFRdWFsaXR5Tm90ZVtdID0gW107XG4gIGNvbnN0IHNlY3Rpb25zOiBDb21wb3NlZFNlY3Rpb25bXSA9IFtdO1xuXG4gIGNvbnN0IGN0eEZvciA9IChmcm9tOiBEYXRlLCB0bzogRGF0ZSk6IFNlY3Rpb25Db250ZXh0ID0+ICh7XG4gICAgb3JnSWQsXG4gICAgLi4uKG9yZ0lkcyA/IHsgb3JnSWRzIH0gOiB7fSksXG4gICAgZnJvbTogZnJvbS50b0lTT1N0cmluZygpLFxuICAgIHRvOiB0by50b0lTT1N0cmluZygpLFxuICAgIHR6OiB0aW1lem9uZSxcbiAgICB3ZWVrU3RhcnQsXG4gICAgLy8gVGhlIHByZXZpb3VzIHBlcmlvZCB0cmF2ZWxzIFdJVEggdGhlIGNvbnRleHQsIGZvciB0aGUgYW5hbHl0aWNzIHNlY3Rpb25zXG4gICAgLy8gd2hvc2UgdHJlbmQgaXMgcGVyIGNhdGVnb3J5LCBwZXIgc3RhZ2Ugb3IgcGVyIHBpcGVsaW5lLiBUaG9zZSBjYW5ub3QgYmVcbiAgICAvLyBoYW5kbGVkIGJ5IHJ1bm5pbmcgdGhlIHNlY3Rpb24gdHdpY2UgYW5kIGNvbXBhcmluZyBvbmUgaGVhZGxpbmUg4oCUIHRoZVxuICAgIC8vIGNvbXBhcmlzb24gaXMgYSBqb2luLCBhbmQgZG9pbmcgaXQgaW4gdGhlIGNvbXBvc2VyIGFmdGVyd2FyZHMgd291bGQgbWVhblxuICAgIC8vIHJlLWltcGxlbWVudGluZyBpdCBmb3IgZXZlcnkgc2hhcGUuXG4gICAgcHJldmlvdXNGcm9tOiBwZXJpb2QucHJldlN0YXJ0LnRvSVNPU3RyaW5nKCksXG4gICAgcHJldmlvdXNUbzogcGVyaW9kLnByZXZFbmQudG9JU09TdHJpbmcoKSxcbiAgfSk7XG4gIGNvbnN0IGN1cnJlbnRDdHggPSBjdHhGb3IocGVyaW9kLnN0YXJ0LCBwZXJpb2QuZW5kKTtcbiAgY29uc3QgcHJldmlvdXNDdHggPSBjdHhGb3IocGVyaW9kLnByZXZTdGFydCwgcGVyaW9kLnByZXZFbmQpO1xuXG4gIGZvciAoY29uc3QgaWQgb2Ygc2VjdGlvbklkTGlzdCkge1xuICAgIGNvbnN0IHNwZWM6IFNlY3Rpb25TcGVjIHwgdW5kZWZpbmVkID0gZ2V0U2VjdGlvbihpZCk7XG4gICAgaWYgKCFzcGVjKSB7XG4gICAgICAvLyBBbiB1bmtub3duIGlkIGlzIGEgZGVmaW5pdGlvbiByZWZlcmVuY2luZyBhIHNlY3Rpb24gdGhhdCBubyBsb25nZXIgZXhpc3RzLlxuICAgICAgLy8gUmVjb3JkZWQgcmF0aGVyIHRoYW4gZHJvcHBlZCwgc28gdGhlIGxlYWQgY2FuIHNlZSB3aHkgYSBwYW5lbCB2YW5pc2hlZC5cbiAgICAgIHNlY3Rpb25zLnB1c2goeyBpZCwgdGl0bGU6IGlkLCBzdGF0ZTogJ2ZhaWxlZCcgfSk7XG4gICAgICBub3Rlcy5wdXNoKHsgY29kZTogJ3NlY3Rpb25fZmFpbGVkJywgc2VjdGlvbklkOiBpZCwgbWVzc2FnZTogYFVua25vd24gcmVwb3J0IHNlY3Rpb24gXCIke2lkfVwiIOKAlCBpdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuYCB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzcGVjLnJlcXVpcmVzRmVhdHVyZSAmJiAhc2F0aXNmaWVzKGZlYXR1cmVzLCBzcGVjLnJlcXVpcmVzRmVhdHVyZSkpIHtcbiAgICAgIHNlY3Rpb25zLnB1c2goe1xuICAgICAgICBpZCwgdGl0bGU6IHNwZWMudGl0bGUsIHN0YXRlOiAnbG9ja2VkJywgcmVxdWlyZXNGZWF0dXJlOiBzcGVjLnJlcXVpcmVzRmVhdHVyZSxcbiAgICAgIH0pO1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdzZWN0aW9uX2xvY2tlZCcsXG4gICAgICAgIHNlY3Rpb25JZDogaWQsXG4gICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBuZWVkcyB0aGUgJHtzcGVjLnJlcXVpcmVzRmVhdHVyZX0gYWRkLW9uLiBUaGUgcmVzdCBvZiB0aGlzIHJlcG9ydCBpcyB1bmFmZmVjdGVkLmAsXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgc3BlYy5ydW4oc291cmNlLCBjdXJyZW50Q3R4KTtcbiAgICAgIGNvbnN0IGNvbXBvc2VkOiBDb21wb3NlZFNlY3Rpb24gPSB7IGlkLCB0aXRsZTogc3BlYy50aXRsZSwgc3RhdGU6ICdvaycsIGN1cnJlbnQgfTtcblxuICAgICAgY29uc3QgaGVhZCA9IGhlYWRsaW5lT2YoaWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKGhlYWQpIGNvbXBvc2VkLmhlYWRsaW5lID0gaGVhZDtcblxuICAgICAgaWYgKHNwZWMuY29tcGFyYWJsZSkge1xuICAgICAgICAvLyBUaGUgY29tcGFyaXNvbiBpcyBiZXN0LWVmZm9ydDogYSBmYWlsZWQgcHJldmlvdXMgcGVyaW9kIG11c3Qgbm90IGNvc3QgdGhlXG4gICAgICAgIC8vIGxlYWQgdGhpcyBwZXJpb2QncyBudW1iZXJzLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgc3BlYy5ydW4oc291cmNlLCBwcmV2aW91c0N0eCk7XG4gICAgICAgICAgY29tcG9zZWQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICBjb21wb3NlZC5jaGFuZ2UgPSBjaGFuZ2VPZihoZWFkLCBoZWFkbGluZU9mKGlkLCBwcmV2aW91cykpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjb21wb3NlZC5jaGFuZ2UgPSB7IGFic29sdXRlOiAwLCBwZXJjZW50OiBudWxsLCBkaXJlY3Rpb246ICd1bmtub3duJyB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbXBsZSA9IHNhbXBsZVNpemUoY3VycmVudCk7XG4gICAgICBpZiAoc2FtcGxlICE9PSBudWxsICYmIHNhbXBsZSA+IDAgJiYgc2FtcGxlIDwgTE9XX1NBTVBMRV9USFJFU0hPTEQpIHtcbiAgICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgICAgY29kZTogJ2xvd19zYW1wbGUnLFxuICAgICAgICAgIHNlY3Rpb25JZDogaWQsXG4gICAgICAgICAgbWVzc2FnZTogYFwiJHtzcGVjLnRpdGxlfVwiIGlzIGJhc2VkIG9uICR7c2FtcGxlfSBvYnNlcnZhdGlvbiR7c2FtcGxlID09PSAxID8gJycgOiAncyd9IOKAlCBwZXJjZW50YWdlcyBzd2luZyB3aWxkbHkgYXQgdGhpcyB2b2x1bWUuIFJlYWQgdGhlIGNvdW50cywgbm90IHRoZSByYXRlLmAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaWQgPT09ICdkb3JhJykgbm90ZXMucHVzaCguLi5kZXBsb3lDb3ZlcmFnZU5vdGVzKGN1cnJlbnQpKTtcbiAgICAgIHNlY3Rpb25zLnB1c2goY29tcG9zZWQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2VjdGlvbnMucHVzaCh7IGlkLCB0aXRsZTogc3BlYy50aXRsZSwgc3RhdGU6ICdmYWlsZWQnIH0pO1xuICAgICAgbm90ZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdzZWN0aW9uX2ZhaWxlZCcsXG4gICAgICAgIHNlY3Rpb25JZDogaWQsXG4gICAgICAgIG1lc3NhZ2U6IGBcIiR7c3BlYy50aXRsZX1cIiBjb3VsZCBub3QgYmUgY29tcHV0ZWQgZm9yIHRoaXMgcGVyaW9kLiBUaGUgcmVzdCBvZiB0aGUgcmVwb3J0IGlzIHVuYWZmZWN0ZWQuYCxcbiAgICAgIH0pO1xuICAgICAgdm9pZCBlcnI7IC8vIHRoZSByZWFzb24gaXMgbG9nZ2VkIGJ5IHRoZSBjYWxsZXIsIG5ldmVyIHNob3duIHRvIGEgbWFuYWdlclxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGVyaW9kOiB7IHN0YXJ0OiBwZXJpb2Quc3RhcnQudG9JU09TdHJpbmcoKSwgZW5kOiBwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCksIGxhYmVsOiBwZXJpb2QubGFiZWwgfSxcbiAgICBwcmV2aW91c1BlcmlvZDogeyBzdGFydDogcGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpLCBlbmQ6IHBlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCkgfSxcbiAgICB0aW1lem9uZSxcbiAgICB3ZWVrU3RhcnQsXG4gICAgc2VjdGlvbnMsXG4gICAgbm90ZXMsXG4gICAgbWV0aG9kb2xvZ3k6XG4gICAgICBgQ29tcHV0ZWQgZnJvbSBwaXBlbGluZSBldmVudHMgYmV0d2VlbiAke3BlcmlvZC5zdGFydC50b0lTT1N0cmluZygpfSBhbmQgJHtwZXJpb2QuZW5kLnRvSVNPU3RyaW5nKCl9LCBgXG4gICAgICArIGBidWNrZXRlZCBpbiAke3RpbWV6b25lfSB3aXRoIHdlZWtzIHN0YXJ0aW5nICR7d2Vla1N0YXJ0fS4gQ29tcGFyaXNvbiBwZXJpb2Q6IGBcbiAgICAgICsgYCR7cGVyaW9kLnByZXZTdGFydC50b0lTT1N0cmluZygpfSB0byAke3BlcmlvZC5wcmV2RW5kLnRvSVNPU3RyaW5nKCl9LiBgXG4gICAgICArICdUaGVzZSBhcmUgdGhlIHNhbWUgcXVlcmllcyB0aGUgZGFzaGJvYXJkIHJ1bnMgb3ZlciB0aGUgc2FtZSB3aW5kb3csIHNvIHRoZSB0d28gYWdyZWUuJyxcbiAgICBnZW5lcmF0ZWRBdDogKG9wdHMubm93ID8/IG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gIH07XG59XG4iXX0=
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcmVwb3J0aW5nL3N0YWtlaG9sZGVyL2NvbXBvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQW9CdEMsT0FBTyxFQUFFLFVBQVUsRUFBaUUsTUFBTSxlQUFlLENBQUM7QUFFMUcsaUVBQWlFO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQWdFdEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWdELE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkcsa0JBQWtCLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFFSCxvRkFBb0Y7QUFDcEYsU0FBUyxTQUFTLENBQUMsUUFBMkIsRUFBRSxRQUFnQjtJQUM5RCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDN0MsT0FBTyxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsU0FBUyxVQUFVLENBQUMsU0FBaUIsRUFBRSxLQUFjO0lBQ25ELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZELHVFQUF1RTtJQUN2RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0s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TSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJO2NBQ3hFLHVGQUF1RjtRQUMzRixXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUU7S0FDcEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgY29tcG9zZXI6IHR1cm4gYSBkZWZpbml0aW9uJ3Mgc2VjdGlvbiBsaXN0IGludG8gdGhlIHNuYXBzaG90IGEgbWFuYWdlciByZWFkcy5cbiAqXG4gKiBUaHJlZSB0aGluZ3MgaXQgZG9lcyB0aGF0IHRoZSByYXcgcXVlcmllcyBkbyBub3Q6XG4gKlxuICogIC0gUEVSSU9ELU9WRVItUEVSSU9ELiBFdmVyeSBjb21wYXJhYmxlIHNlY3Rpb24gaXMgcnVuIHR3aWNlLCBmb3IgdGhpcyBwZXJpb2RcbiAqICAgIGFuZCB0aGUgb25lIGJlZm9yZSwgc28gdGhlIHNuYXBzaG90IGNhcnJpZXMgXCI5MSUgKGRvd24gMyBwb2ludHMpXCIuIFRoZSB0cmVuZFxuICogICAgaXMgd2hhdCBhIG1hbmFnZXIgYWN0cyBvbjsgdGhlIGFic29sdXRlIG51bWJlciBhbG9uZSByYXJlbHkgaXMuXG4gKiAgLSBMT0NLRUQgU0VDVElPTlMuIEEgc2VjdGlvbiB3aG9zZSBmZWF0dXJlIHRoZSBvcmcgbGFja3MgcmVuZGVycyBhcyBsb2NrZWRcbiAqICAgIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuLiBBIHJlcG9ydCB0aGF0IGRpZXMgYmVjYXVzZSBvbmUgZ2F0ZWQgc2VjdGlvbiB3YXNcbiAqICAgIGluY2x1ZGVkIGlzIGEgc3VwcG9ydCB0aWNrZXQ7IGEgbG9ja2VkIHBhbmVsIGlzIGFuIHVwc2VsbC5cbiAqICAtIERBVEEtUVVBTElUWSBOT1RFUy4gTWlzc2luZyBkZXBsb3kgdGFncyBhbmQgdGlueSBzYW1wbGVzIGFyZSBzdGF0ZWQsIG5vdFxuICogICAgc2lsZW50bHkgcmVuZGVyZWQgYXMgemVyby4gXCIwIGRlcGxveXNcIiBhbmQgXCJ3ZSBjYW5ub3Qgc2VlIHlvdXIgZGVwbG95c1wiIGxvb2tcbiAqICAgIGlkZW50aWNhbCBvbiBhIGNoYXJ0IGFuZCBtZWFuIG9wcG9zaXRlIHRoaW5ncyDigJQgYSBtYW5hZ2VyIHJlYWRpbmcgdGhlIGZpcnN0XG4gKiAgICB3aGVuIGl0IGlzIHJlYWxseSB0aGUgc2Vjb25kIGRyYXdzIGV4YWN0bHkgdGhlIHdyb25nIGNvbmNsdXNpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlZFBlcmlvZCB9IGZyb20gJy4vcGVyaW9kLmpzJztcbmltcG9ydCB7IGdldFNlY3Rpb24sIHR5cGUgU2VjdGlvbkNvbnRleHQsIHR5cGUgU2VjdGlvbkRhdGFTb3VyY2UsIHR5cGUgU2VjdGlvblNwZWMgfSBmcm9tICcuL3NlY3Rpb25zLmpzJztcblxuLyoqIEJlbG93IHRoaXMgbWFueSBvYnNlcnZhdGlvbnMgYSByYXRlIGlzIG5vaXNlLCBhbmQgc2F5cyBzby4gKi9cbmV4cG9ydCBjb25zdCBMT1dfU0FNUExFX1RIUkVTSE9MRCA9IDU7XG5cbi8qKiBXaGljaCB3YXkgYSBtZXRyaWMgbW92ZWQuIGBmbGF0YCB3aGVuIHRoZSBjaGFuZ2Ugcm91bmRzIHRvIG5vdGhpbmcuICovXG5leHBvcnQgdHlwZSBUcmVuZERpcmVjdGlvbiA9ICd1cCcgfCAnZG93bicgfCAnZmxhdCcgfCAndW5rbm93bic7XG5cbi8qKiBBIGRhdGEtcXVhbGl0eSBjYXZlYXQgYXR0YWNoZWQgdG8gdGhlIHdob2xlIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUXVhbGl0eU5vdGUge1xuICBjb2RlOiAnbWlzc2luZ19kZXBsb3lfdGFnJyB8ICdtaXNzaW5nX2NvbW1pdF9kYXRhJyB8ICdsb3dfc2FtcGxlJyB8ICdzZWN0aW9uX2ZhaWxlZCcgfCAnc2VjdGlvbl9sb2NrZWQnIHwgJ3J1bGVfdW5hdmFpbGFibGUnO1xuICAvKiogTWFuYWdlci1yZWFkYWJsZS4gTm90IGEgbWV0cmljIG5hbWUgYW5kIG5vdCBhIHN0YWNrIHRyYWNlLiAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBUaGUgc2VjdGlvbiBpdCBjb25jZXJucywgd2hlbiBpdCBpcyBzZWN0aW9uLXNwZWNpZmljLiAqL1xuICBzZWN0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgY29tcG9zZWQgc2VjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZWRTZWN0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIGBsb2NrZWRgIHdoZW4gdGhlIG9yZyBsYWNrcyB0aGUgZmVhdHVyZTsgYGZhaWxlZGAgd2hlbiB0aGUgcXVlcnkgdGhyZXcuICovXG4gIHN0YXRlOiAnb2snIHwgJ2xvY2tlZCcgfCAnZmFpbGVkJztcbiAgLyoqIFRoZSBmZWF0dXJlIG5lZWRlZCwgd2hlbiBsb2NrZWQg4oCUIGRyaXZlcyB0aGUgdXBzZWxsIGNvcHkuICovXG4gIHJlcXVpcmVzRmVhdHVyZT86IHN0cmluZztcbiAgLyoqIFRoaXMgcGVyaW9kJ3MgcmF3IHJlc3VsdCwgZXhhY3RseSBhcyB0aGUgZGFzaGJvYXJkIHdvdWxkIHNob3cgaXQuICovXG4gIGN1cnJlbnQ/OiB1bmtub3duO1xuICAvKiogVGhlIHByZXZpb3VzIHBlcmlvZCdzIHJlc3VsdCwgZm9yIGNvbXBhcmFibGUgc2VjdGlvbnMuICovXG4gIHByZXZpb3VzPzogdW5rbm93bjtcbiAgLyoqIFRoZSBzaW5nbGUgbnVtYmVyIGEgbWFuYWdlciByZWFkcyBmaXJzdCwgd2hlbiB0aGUgc2VjdGlvbiBoYXMgb25lLiAqL1xuICBoZWFkbGluZT86IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IG51bWJlcjsgdW5pdD86IHN0cmluZyB9O1xuICAvKiogQ2hhbmdlIHZlcnN1cyB0aGUgcHJldmlvdXMgcGVyaW9kLCBmb3IgY29tcGFyYWJsZSBzZWN0aW9ucy4gKi9cbiAgY2hhbmdlPzogeyBhYnNvbHV0ZTogbnVtYmVyOyBwZXJjZW50OiBudW1iZXIgfCBudWxsOyBkaXJlY3Rpb246IFRyZW5kRGlyZWN0aW9uIH07XG59XG5cbi8qKiBUaGUgZnJvemVuIG91dHB1dCBvZiBvbmUgcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRTbmFwc2hvdCB7XG4gIC8qKiBQZXJpb2QgYm91bmRzICsgbGFiZWwsIGNvcGllZCBpbiBzbyB0aGUgc25hcHNob3QgaXMgc2VsZi1kZXNjcmliaW5nLiAqL1xuICBwZXJpb2Q6IHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfTtcbiAgcHJldmlvdXNQZXJpb2Q6IHsgc3RhcnQ6IHN0cmluZzsgZW5kOiBzdHJpbmcgfTtcbiAgdGltZXpvbmU6IHN0cmluZztcbiAgd2Vla1N0YXJ0OiAnbW9uZGF5JyB8ICdzdW5kYXknO1xuICBzZWN0aW9uczogQ29tcG9zZWRTZWN0aW9uW107XG4gIG5vdGVzOiBEYXRhUXVhbGl0eU5vdGVbXTtcbiAgLyoqXG4gICAqIEhvdyBldmVyeSBudW1iZXIgaGVyZSB3YXMgcHJvZHVjZWQsIHNob3duIGluIHRoZSByZXBvcnQgZm9vdGVyLiBNYW5hZ2Vyc1xuICAgKiBjb21wYXJlIHJlcG9ydHMgdG8gdGhlIGRhc2hib2FyZDsgc2F5aW5nIHBsYWlubHkgdGhhdCBib3RoIHJ1biB0aGUgc2FtZVxuICAgKiBxdWVyaWVzIG92ZXIgdGhlIHNhbWUgd2luZG93IGlzIHdoYXQgbWFrZXMgYSBkaWZmZXJlbmNlIGludmVzdGlnYWJsZSByYXRoZXJcbiAgICogdGhhbiBhIHJlYXNvbiB0byBkaXN0cnVzdCBib3RoLlxuICAgKi9cbiAgbWV0aG9kb2xvZ3k6IHN0cmluZztcbiAgZ2VuZXJhdGVkQXQ6IHN0cmluZztcbn1cblxuLyoqIFdoYXQgdGhlIGNvbXBvc2VyIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIG9yZydzIGVudGl0bGVtZW50cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZU9wdGlvbnMge1xuICBzb3VyY2U6IFNlY3Rpb25EYXRhU291cmNlO1xuICBwZXJpb2Q6IFJlc29sdmVkUGVyaW9kO1xuICB0aW1lem9uZTogc3RyaW5nO1xuICB3ZWVrU3RhcnQ6ICdtb25kYXknIHwgJ3N1bmRheSc7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIG9yZ0lkcz86IHN0cmluZ1tdO1xuICAvKiogRmVhdHVyZXMgdGhlIG9yZyBob2xkcy4gQSBzZWN0aW9uIG5lZWRpbmcgb25lIHRoYXQgaXMgYWJzZW50IHJlbmRlcnMgbG9ja2VkLiAqL1xuICBmZWF0dXJlczogcmVhZG9ubHkgc3RyaW5nW107XG4gIG5vdz86IERhdGU7XG59XG5cbi8qKlxuICogRmVhdHVyZXMgdGhhdCwgaW5zaWRlIGEgUkVQT1JULCBzdGFuZCBpbiBmb3IgYW5vdGhlci5cbiAqXG4gKiBCdXlpbmcgU3Rha2Vob2xkZXIgUmVwb3J0cyBidXlzIHRoZSBET1JBIFNFQ1RJT05TIG9mIGEgcmVwb3J0LiBJdCBkb2VzIG5vdCBidXkgdGhlXG4gKiBsaXZlIERPUkEgZGFzaGJvYXJkLCB3aGljaCBzdGF5cyBiZWhpbmQgYGFkdmFuY2VkX3JlcG9ydGluZ2AgYW5kIGlzIGdhdGVkIG9uIGl0cyBvd25cbiAqIHJvdXRlcyDigJQgc28gdGhpcyBzdWJzdGl0dXRpb24gaXMgZGVsaWJlcmF0ZWx5IHNjb3BlZCB0byBjb21wb3NpdGlvbiBhbmQgZXhpc3RzXG4gKiBub3doZXJlIGVsc2UuIFdpdGhvdXQgaXQsIGEgUHJvIGN1c3RvbWVyIHdobyBib3VnaHQgdGhlIHJlcG9ydHMgYWRkLW9uIHdvdWxkIG9wZW5cbiAqIHRoZWlyIGZpcnN0IHdlZWtseSByZXBvcnQgYW5kIGZpbmQgaXRzIGhlYWRsaW5lIHBhbmVscyBsb2NrZWQgYmVoaW5kIGEgc2Vjb25kXG4gKiBwdXJjaGFzZSwgd2hpY2ggaXMgbm90IHdoYXQgdGhlIGFkZC1vbidzIG93biBkZXNjcmlwdGlvbiBwcm9taXNlcy5cbiAqXG4gKiBTdGF0ZWQgYXMgZGF0YSByYXRoZXIgdGhhbiBhbiBgaWZgLCBzbyBhZGRpbmcgYSBzZWN0aW9uIHRoYXQgbmVlZHMgYSBkaWZmZXJlbnRcbiAqIGZlYXR1cmUgY2Fubm90IHNpbGVudGx5IGluaGVyaXQgdGhlIGNhcnZlLW91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFUE9SVF9GRUFUVVJFX1NVQlNUSVRVVEVTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBzdHJpbmdbXT4+ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGFkdmFuY2VkX3JlcG9ydGluZzogWydzdGFrZWhvbGRlcl9yZXBvcnRzJ10sXG59KTtcblxuLyoqIERvZXMgdGhlIG9yZyBob2xkIGByZXF1aXJlZGAsIG9yIHNvbWV0aGluZyB0aGF0IHN0YW5kcyBpbiBmb3IgaXQgaW4gYSByZXBvcnQ/ICovXG5mdW5jdGlvbiBzYXRpc2ZpZXMoZmVhdHVyZXM6IHJlYWRvbmx5IHN0cmluZ1tdLCByZXF1aXJlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChmZWF0dXJlcy5pbmNsdWRlcyhyZXF1aXJlZCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gKFJFUE9SVF9GRUFUVVJFX1NVQlNUSVRVVEVTW3JlcXVpcmVkXSA/PyBbXSkuc29tZSgoYWx0KSA9PiBmZWF0dXJlcy5pbmNsdWRlcyhhbHQpKTtcbn1cblxuLyoqIFB1bGwgYSBjb21wYXJhYmxlIG51bWJlciBvdXQgb2YgYSBzZWN0aW9uIHJlc3VsdCwgb3IgbnVsbCB3aGVuIHRoZXJlIGlzbid0IG9uZS4gKi9cbmZ1bmN0aW9uIGhlYWRsaW5lT2Yoc2VjdGlvbklkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogbnVtYmVyOyB1bml0Pzogc3RyaW5nIH0gfCBudWxsIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuXG4gIC8vIFRpbWUgc2VyaWVzIChzdWNjZXNzIHJhdGUsIGJ1aWxkIHN1Y2Nlc3MpOiB0aGUgTEFTVCBidWNrZXQgaXMgXCJub3dcIi5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsYXN0ID0gdmFsdWVbdmFsdWUubGVuZ3RoIC0gMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBsYXN0Py5zdWNjZXNzX3BjdCA9PT0gJ251bWJlcicpIHJldHVybiB7IGxhYmVsOiAnU3VjY2VzcyByYXRlJywgdmFsdWU6IGxhc3Quc3VjY2Vzc19wY3QsIHVuaXQ6ICclJyB9O1xuICAgIC8vIEV4ZWN1dGlvbiBjb3VudHM6IHRvdGFsIHJ1bnMgYWNyb3NzIHBpcGVsaW5lcy5cbiAgICAvL1xuICAgIC8vIEEgdG90YWwgb2YgWkVSTyBpcyBhIHJlYWwgaGVhZGxpbmUsIG5vdCBtaXNzaW5nIGRhdGE6IFwiMCBkZXBsb3lzLCBkb3duIGZyb21cbiAgICAvLyA1XCIgaXMgdGhlIHNpbmdsZSBtb3N0IGltcG9ydGFudCB0aGluZyBhIHdlZWtseSByZXBvcnQgY2FuIHRlbGwgYSBtYW5hZ2VyLFxuICAgIC8vIGFuZCB0cmVhdGluZyAwIGFzIFwibm8gdmFsdWVcIiBtYWRlIGV4YWN0bHkgdGhhdCBjYXNlIGRpc2FwcGVhciDigJQgdGhlIGNoYW5nZVxuICAgIC8vIGNhbWUgYmFjayBgdW5rbm93bmAgYW5kIG5vIGFycm93IHdhcyBzaG93bi4gU28gdGhlIHRlc3QgaXMgd2hldGhlciBhbnkgcm93XG4gICAgLy8gQ0FSUklFRCBhIGNvdW50LCBub3Qgd2hldGhlciB0aGUgc3VtIGlzIHBvc2l0aXZlLlxuICAgIGxldCBjb3VudGVkID0gZmFsc2U7XG4gICAgY29uc3QgdG90YWwgPSAodmFsdWUgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCBuID0gcm93LnRvdGFsID8/IHJvdy5jb3VudCA/PyByb3cuZXhlY3V0aW9ucztcbiAgICAgIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicpIHJldHVybiBzdW07XG4gICAgICBjb3VudGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdW0gKyBuO1xuICAgIH0sIDApO1xuICAgIGlmIChjb3VudGVkKSByZXR1cm4geyBsYWJlbDogJ1RvdGFsJywgdmFsdWU6IHRvdGFsIH07XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLy8gRE9SQTogZGVwbG95bWVudCBmcmVxdWVuY3kgaXMgdGhlIGhlYWRsaW5lIGEgbWFuYWdlciByZWNvZ25pc2VzLlxuICBjb25zdCBlbnZzID0gb2JqLmVudmlyb25tZW50cztcbiAgaWYgKEFycmF5LmlzQXJyYXkoZW52cykgJiYgZW52cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmlyc3QgPSBlbnZzWzBdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGRmID0gKGZpcnN0LmRlcGxveW1lbnRGcmVxdWVuY3kgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5kZXBsb3ltZW50cztcbiAgICBpZiAodHlwZW9mIGRmID09PSAnbnVtYmVyJykgcmV0dXJuIHsgbGFiZWw6ICdEZXBsb3lzJywgdmFsdWU6IGRmIH07XG4gIH1cbiAgLy8gUGx1Z2luIHN1bW1hcnkgYW5kIGZyaWVuZHM6IGEgcGxhaW4gdG90YWwuXG4gIC8vIFplcm8gaXMgYSB2YWx1ZSBoZXJlIHRvbyDigJQgYHBsdWdpbl92ZXJzaW9uc2AgcmVwb3J0aW5nIDAgb3V0ZGF0ZWQgcGx1Z2lucyBpc1xuICAvLyBnb29kIG5ld3MgYSBtYW5hZ2VyIHNob3VsZCBzZWUsIG5vdCBhbiBhYnNlbnQgc2VjdGlvbi5cbiAgZm9yIChjb25zdCBrZXkgb2YgWyd0b3RhbCcsICdjb3VudCcsICdkZXBsb3ltZW50cyddKSB7XG4gICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ251bWJlcicpIHJldHVybiB7IGxhYmVsOiBzZWN0aW9uSWQgPT09ICdwbHVnaW5fdmVyc2lvbnMnID8gJ091dGRhdGVkJyA6ICdUb3RhbCcsIHZhbHVlOiBvYmpba2V5XSBhcyBudW1iZXIgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIENoYW5nZSBiZXR3ZWVuIHR3byBoZWFkbGluZSBudW1iZXJzLiAqL1xuZnVuY3Rpb24gY2hhbmdlT2YoXG4gIGN1cnJlbnQ6IHsgdmFsdWU6IG51bWJlciB9IHwgbnVsbCxcbiAgcHJldmlvdXM6IHsgdmFsdWU6IG51bWJlciB9IHwgbnVsbCxcbik6IENvbXBvc2VkU2VjdGlvblsnY2hhbmdlJ10ge1xuICBpZiAoIWN1cnJlbnQgfHwgIXByZXZpb3VzKSByZXR1cm4geyBhYnNvbHV0ZTogMCwgcGVyY2VudDogbnVsbCwgZGlyZWN0aW9uOiAndW5rbm93bicgfTtcbiAgY29uc3QgYWJzb2x1dGUgPSBOdW1iZXIoKGN1cnJlbnQudmFsdWUgLSBwcmV2aW91cy52YWx1ZSkudG9GaXhlZCgyKSk7XG4gIC8vIEEgcGVyY2VudCBjaGFuZ2Ugb2ZmIGEgemVybyBiYXNlbGluZSBpcyB1bmRlZmluZWQsIG5vdCBpbmZpbml0ZTogZ29pbmcgZnJvbSAwXG4gIC8vIHRvIDUgZGVwbG95cyBpcyBcIjUgbW9yZVwiLCBuZXZlciBcIiviiJ4lXCIuXG4gIGNvbnN0IHBlcmNlbnQgPSBwcmV2aW91cy52YWx1ZSA9PT0gMCA/IG51bGwgOiBOdW1iZXIoKChhYnNvbHV0ZSAvIHByZXZpb3VzLnZhbHVlKSAqIDEwMCkudG9GaXhlZCgxKSk7XG4gIGNvbnN0IGRpcmVjdGlvbjogVHJlbmREaXJlY3Rpb24gPSBhYnNvbHV0ZSA9PT0gMCA/ICdmbGF0JyA6IGFic29sdXRlID4gMCA/ICd1cCcgOiAnZG93bic7XG4gIHJldHVybiB7IGFic29sdXRlLCBwZXJjZW50LCBkaXJlY3Rpb24gfTtcbn1cblxuLyoqIENvdW50IHRoZSBvYnNlcnZhdGlvbnMgYmVoaW5kIGEgc2VjdGlvbiwgZm9yIHRoZSBsb3ctc2FtcGxlIG5vdGUuICovXG5mdW5jdGlvbiBzYW1wbGVTaXplKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiAodmFsdWUgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5yZWR1Y2UoKHN1bSwgcm93KSA9PiB7XG4gICAgICBjb25zdCBuID0gcm93LnRvdGFsID8/IHJvdy5jb3VudCA/PyByb3cuZXhlY3V0aW9ucyA/PyByb3cuZGVwbG95bWVudHM7XG4gICAgICByZXR1cm4gc3VtICsgKHR5cGVvZiBuID09PSAnbnVtYmVyJyA/IG4gOiAwKTtcbiAgICB9LCAwKTtcbiAgfVxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gIGNvbnN0IGVudnMgPSBvYmo/LmVudmlyb25tZW50cztcbiAgaWYgKEFycmF5LmlzQXJyYXkoZW52cykpIHtcbiAgICByZXR1cm4gZW52cy5yZWR1Y2UoKHN1bTogbnVtYmVyLCBlKSA9PiB7XG4gICAgICBjb25zdCBhdHRlbXB0cyA9ICgoZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY2hhbmdlRmFpbHVyZVJhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5hdHRlbXB0cztcbiAgICAgIHJldHVybiBzdW0gKyAodHlwZW9mIGF0dGVtcHRzID09PSAnbnVtYmVyJyA/IGF0dGVtcHRzIDogMCk7XG4gICAgfSwgMCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBEZXBsb3ktY292ZXJhZ2Ugbm90ZXM6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gXCJ6ZXJvIGRlcGxveXNcIiBhbmQgXCJibGluZFwiLiAqL1xuZnVuY3Rpb24gZGVwbG95Q292ZXJhZ2VOb3Rlcyhkb3JhOiB1bmtub3duKTogRGF0YVF1YWxpdHlOb3RlW10ge1xuICBjb25zdCBub3RlczogRGF0YVF1YWxpdHlOb3RlW10gPSBbXTtcbiAgY29uc3QgY292ZXJhZ2UgPSAoZG9yYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy5jb3ZlcmFnZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgd2l0aG91dCA9IGNvdmVyYWdlPy53aXRob3V0RGVwbG95cztcbiAgaWYgKHR5cGVvZiB3aXRob3V0ID09PSAnbnVtYmVyJyAmJiB3aXRob3V0ID4gMCkge1xuICAgIG5vdGVzLnB1c2goe1xuICAgICAgY29kZTogJ21pc3NpbmdfZGVwbG95X3RhZycsXG4gICAgICBzZWN0aW9uSWQ6ICdkb3JhJyxcbiAgICAgIG1lc3NhZ2U6IGBEZXBsb3kgZGF0YSB1bmF2YWlsYWJsZSBmb3IgJHt3aXRob3V0fSBwaXBlbGluZSR7d2l0aG91dCA9PT0gMSA/ICcnIDogJ3MnfTogdGhleSBoYXZlIG5vdCByZS1zeW50aGVkIHdpdGggZGVwbG95IHRhZ3MsIHNvIHRoZWlyIGRlcGxveXMgYXJlIG5vdCBjb3VudGVkIGhlcmUuIFRoaXMgaXMgbm90IFwiemVybyBkZXBsb3lzXCIuYCxcbiAgICB9KTtcbiAgfVxuICBjb25zdCBlbnZzID0gKGRvcmEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsKT8uZW52aXJvbm1lbnRzO1xuICBpZiAoQXJyYXkuaXNBcnJheShlbnZzKSkge1xuICAgIGNvbnN0IG5vTGVhZCA9IChlbnZzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikuZmlsdGVyKChlKSA9PiB7XG4gICAgICBjb25zdCBsdCA9IGUubGVhZFRpbWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gbHQgJiYgbHQubWVkaWFuU2Vjb25kcyA9PT0gbnVsbDtcbiAgICB9KTtcbiAgICBpZiAobm9MZWFkLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICBjb2RlOiAnbWlzc2luZ19jb21taXRfZGF0YScsXG4gICAgICAgIHNlY3Rpb25JZDogJ2RvcmEnLFxuICAgICAgICBtZXNzYWdlOiBgTGVhZCB0aW1lIHVuYXZhaWxhYmxlIGZvciAke25vTGVhZC5sZW5ndGh9IGVudmlyb25tZW50JHtub0xlYWQubGVuZ3RoID09PSAxID8gJycgOiAncyd9OiBubyBzdWNjZXNzZnVsIGRlcGxveSBjYXJyaWVkIGEgcmVzb2x2YWJsZSBjb21taXQgdGltZXN0YW1wLCBzbyBjb21taXQtdG8tZGVwbG95IHRpbWUgY291bGQgbm90IGJlIG1lYXN1cmVkLmAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vdGVzO1xufVxuXG4vKiogTWFuYWdlci1mYWNpbmcgbmFtZXMgb2YgdGhlIG5lZWRzLWF0dGVudGlvbiBydWxlcywgZm9yIHRoZSB1bmF2YWlsYWJsZSBub3RlLiAqL1xuY29uc3QgQVRURU5USU9OX1JVTEVfTEFCRUxTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBsb3dfc3VjY2Vzc19yYXRlOiAnbG93IHN1Y2Nlc3MgcmF0ZScsXG4gIHNsb3dlcl9wOTU6ICdzbG93ZXIgYnVpbGRzJyxcbiAgY29uc2VjdXRpdmVfZmFpbHVyZXM6ICdjb25zZWN1dGl2ZSBmYWlsdXJlcycsXG4gIG5vX3JlY2VudF9zdWNjZXNzOiAnbm8gcmVjZW50IHN1Y2Nlc3MnLFxuICBmYWlsZWRfYWZ0ZXJfY29uZmlnX2NoYW5nZTogJ2ZhaWxlZCBhZnRlciBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlJyxcbiAgdnVsbmVyYWJsZV9wbHVnaW46ICd2dWxuZXJhYmxlIHBsdWdpbnMnLFxuICBub19kZXBsb3lfdHJhY2tpbmc6ICdkZXBsb3kgdHJhY2tpbmcnLFxufTtcblxuLyoqXG4gKiBUaGUgbmVlZHMtYXR0ZW50aW9uIHJ1bGVzIHRoYXQgY291bGQgbm90IHJ1bi4gQW4gZW1wdHkgbGlzdCB0aGVyZSBtdXN0IHJlYWQgYXNcbiAqIFwibm90aGluZyB0cmlwcGVkXCIsIG5ldmVyIGFzIFwiYSBydWxlIGNvdWxkIG5vdCBsb29rXCIg4oCUIGFib3ZlIGFsbCBmb3IgdGhlXG4gKiB2dWxuZXJhYmxlLXBsdWdpbiBydWxlLCB3aGVyZSB0aGUgc2Vjb25kIHJlYWRpbmcgaXMgYSBmYWxzZSBhbGwtY2xlYXIuXG4gKi9cbmZ1bmN0aW9uIGF0dGVudGlvbk5vdGVzKHZhbHVlOiB1bmtub3duKTogRGF0YVF1YWxpdHlOb3RlW10ge1xuICBjb25zdCBydWxlcyA9ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwpPy51bmF2YWlsYWJsZVJ1bGVzO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocnVsZXMpIHx8IHJ1bGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCBuYW1lcyA9IHJ1bGVzLm1hcCgocikgPT4gQVRURU5USU9OX1JVTEVfTEFCRUxTW1N0cmluZyhyKV0gPz8gU3RyaW5nKHIpKTtcbiAgcmV0dXJuIFt7XG4gICAgY29kZTogJ3J1bGVfdW5hdmFpbGFibGUnLFxuICAgIHNlY3Rpb25JZDogJ25lZWRzX2F0dGVudGlvbicsXG4gICAgbWVzc2FnZTogYFNvbWUgY2hlY2tzIGNvdWxkIG5vdCBydW4gdGhpcyBwZXJpb2QgKCR7bmFtZXMuam9pbignLCAnKX0pOiB0aGVpciBkYXRhIHdhcyB1bmF2YWlsYWJsZS4gYFxuICAgICAgKyAnQSBwaXBlbGluZSBtaXNzaW5nIGZyb20gdGhpcyBsaXN0IHdhcyBub3QgY2hlY2tlZCBmb3IgdGhvc2Ug4oCUIHRoaXMgaXMgbm90IGFuIGFsbC1jbGVhci4nLFxuICB9XTtcbn1cblxuLyoqXG4gKiBDb21wb3NlIG9uZSBwZXJpb2QncyBzbmFwc2hvdC5cbiAqXG4gKiBOZXZlciB0aHJvd3MgZm9yIGEgc2VjdGlvbi1sZXZlbCBwcm9ibGVtOiBhIHNlY3Rpb24gdGhhdCBmYWlscyBpcyBtYXJrZWRcbiAqIGBmYWlsZWRgIHdpdGggYSBub3RlLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHJlcG9ydCBzdGlsbCByZWFjaGVzIHRoZSBsZWFkLiBBIHJ1blxuICogdGhhdCBwcm9kdWNlcyBuaW5lIGdvb2Qgc2VjdGlvbnMgYW5kIG9uZSBmYWlsdXJlIGlzIHVzZWZ1bDsgYSBydW4gdGhhdCBwcm9kdWNlc1xuICogYW4gZXhjZXB0aW9uIGlzIG5vdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbXBvc2VTbmFwc2hvdChzZWN0aW9uSWRMaXN0OiByZWFkb25seSBzdHJpbmdbXSwgb3B0czogQ29tcG9zZU9wdGlvbnMpOiBQcm9taXNlPFJlcG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IHsgc291cmNlLCBwZXJpb2QsIHRpbWV6b25lLCB3ZWVrU3RhcnQsIG9yZ0lkLCBvcmdJZHMsIGZlYXR1cmVzIH0gPSBvcHRzO1xuICBjb25zdCBub3RlczogRGF0YVF1YWxpdHlOb3RlW10gPSBbXTtcbiAgY29uc3Qgc2VjdGlvbnM6IENvbXBvc2VkU2VjdGlvbltdID0gW107XG5cbiAgY29uc3QgY3R4Rm9yID0gKGZyb206IERhdGUsIHRvOiBEYXRlKTogU2VjdGlvbkNvbnRleHQgPT4gKHtcbiAgICBvcmdJZCxcbiAgICAuLi4ob3JnSWRzID8geyBvcmdJZHMgfSA6IHt9KSxcbiAgICBmcm9tOiBmcm9tLnRvSVNPU3RyaW5nKCksXG4gICAgdG86IHRvLnRvSVNPU3RyaW5nKCksXG4gICAgdHo6IHRpbWV6b25lLFxuICAgIHdlZWtTdGFydCxcbiAgICAvLyBUaGUgcHJldmlvdXMgcGVyaW9kIHRyYXZlbHMgV0lUSCB0aGUgY29udGV4dCwgZm9yIHRoZSBhbmFseXRpY3Mgc2VjdGlvbnNcbiAgICAvLyB3aG9zZSB0cmVuZCBpcyBwZXIgY2F0ZWdvcnksIHBlciBzdGFnZSBvciBwZXIgcGlwZWxpbmUuIFRob3NlIGNhbm5vdCBiZVxuICAgIC8vIGhhbmRsZWQgYnkgcnVubmluZyB0aGUgc2VjdGlvbiB0d2ljZSBhbmQgY29tcGFyaW5nIG9uZSBoZWFkbGluZSDigJQgdGhlXG4gICAgLy8gY29tcGFyaXNvbiBpcyBhIGpvaW4sIGFuZCBkb2luZyBpdCBpbiB0aGUgY29tcG9zZXIgYWZ0ZXJ3YXJkcyB3b3VsZCBtZWFuXG4gICAgLy8gcmUtaW1wbGVtZW50aW5nIGl0IGZvciBldmVyeSBzaGFwZS5cbiAgICBwcmV2aW91c0Zyb206IHBlcmlvZC5wcmV2U3RhcnQudG9JU09TdHJpbmcoKSxcbiAgICBwcmV2aW91c1RvOiBwZXJpb2QucHJldkVuZC50b0lTT1N0cmluZygpLFxuICB9KTtcbiAgY29uc3QgY3VycmVudEN0eCA9IGN0eEZvcihwZXJpb2Quc3RhcnQsIHBlcmlvZC5lbmQpO1xuICBjb25zdCBwcmV2aW91c0N0eCA9IGN0eEZvcihwZXJpb2QucHJldlN0YXJ0LCBwZXJpb2QucHJldkVuZCk7XG5cbiAgZm9yIChjb25zdCBpZCBvZiBzZWN0aW9uSWRMaXN0KSB7XG4gICAgY29uc3Qgc3BlYzogU2VjdGlvblNwZWMgfCB1bmRlZmluZWQgPSBnZXRTZWN0aW9uKGlkKTtcbiAgICBpZiAoIXNwZWMpIHtcbiAgICAgIC8vIEFuIHVua25vd24gaWQgaXMgYSBkZWZpbml0aW9uIHJlZmVyZW5jaW5nIGEgc2VjdGlvbiB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAvLyBSZWNvcmRlZCByYXRoZXIgdGhhbiBkcm9wcGVkLCBzbyB0aGUgbGVhZCBjYW4gc2VlIHdoeSBhIHBhbmVsIHZhbmlzaGVkLlxuICAgICAgc2VjdGlvbnMucHVzaCh7IGlkLCB0aXRsZTogaWQsIHN0YXRlOiAnZmFpbGVkJyB9KTtcbiAgICAgIG5vdGVzLnB1c2goeyBjb2RlOiAnc2VjdGlvbl9mYWlsZWQnLCBzZWN0aW9uSWQ6IGlkLCBtZXNzYWdlOiBgVW5rbm93biByZXBvcnQgc2VjdGlvbiBcIiR7aWR9XCIg4oCUIGl0IG1heSBoYXZlIGJlZW4gcmVtb3ZlZC5gIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHNwZWMucmVxdWlyZXNGZWF0dXJlICYmICFzYXRpc2ZpZXMoZmVhdHVyZXMsIHNwZWMucmVxdWlyZXNGZWF0dXJlKSkge1xuICAgICAgc2VjdGlvbnMucHVzaCh7XG4gICAgICAgIGlkLCB0aXRsZTogc3BlYy50aXRsZSwgc3RhdGU6ICdsb2NrZWQnLCByZXF1aXJlc0ZlYXR1cmU6IHNwZWMucmVxdWlyZXNGZWF0dXJlLFxuICAgICAgfSk7XG4gICAgICBub3Rlcy5wdXNoKHtcbiAgICAgICAgY29kZTogJ3NlY3Rpb25fbG9ja2VkJyxcbiAgICAgICAgc2VjdGlvbklkOiBpZCxcbiAgICAgICAgbWVzc2FnZTogYFwiJHtzcGVjLnRpdGxlfVwiIG5lZWRzIHRoZSAke3NwZWMucmVxdWlyZXNGZWF0dXJlfSBhZGQtb24uIFRoZSByZXN0IG9mIHRoaXMgcmVwb3J0IGlzIHVuYWZmZWN0ZWQuYCxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzcGVjLnJ1bihzb3VyY2UsIGN1cnJlbnRDdHgpO1xuICAgICAgY29uc3QgY29tcG9zZWQ6IENvbXBvc2VkU2VjdGlvbiA9IHsgaWQsIHRpdGxlOiBzcGVjLnRpdGxlLCBzdGF0ZTogJ29rJywgY3VycmVudCB9O1xuXG4gICAgICBjb25zdCBoZWFkID0gaGVhZGxpbmVPZihpZCwgY3VycmVudCk7XG4gICAgICBpZiAoaGVhZCkgY29tcG9zZWQuaGVhZGxpbmUgPSBoZWFkO1xuXG4gICAgICBpZiAoc3BlYy5jb21wYXJhYmxlKSB7XG4gICAgICAgIC8vIFRoZSBjb21wYXJpc29uIGlzIGJlc3QtZWZmb3J0OiBhIGZhaWxlZCBwcmV2aW91cyBwZXJpb2QgbXVzdCBub3QgY29zdCB0aGVcbiAgICAgICAgLy8gbGVhZCB0aGlzIHBlcmlvZCdzIG51bWJlcnMuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCBzcGVjLnJ1bihzb3VyY2UsIHByZXZpb3VzQ3R4KTtcbiAgICAgICAgICBjb21wb3NlZC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgIGNvbXBvc2VkLmNoYW5nZSA9IGNoYW5nZU9mKGhlYWQsIGhlYWRsaW5lT2YoaWQsIHByZXZpb3VzKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGNvbXBvc2VkLmNoYW5nZSA9IHsgYWJzb2x1dGU6IDAsIHBlcmNlbnQ6IG51bGwsIGRpcmVjdGlvbjogJ3Vua25vd24nIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2FtcGxlID0gc2FtcGxlU2l6ZShjdXJyZW50KTtcbiAgICAgIGlmIChzYW1wbGUgIT09IG51bGwgJiYgc2FtcGxlID4gMCAmJiBzYW1wbGUgPCBMT1dfU0FNUExFX1RIUkVTSE9MRCkge1xuICAgICAgICBub3Rlcy5wdXNoKHtcbiAgICAgICAgICBjb2RlOiAnbG93X3NhbXBsZScsXG4gICAgICAgICAgc2VjdGlvbklkOiBpZCxcbiAgICAgICAgICBtZXNzYWdlOiBgXCIke3NwZWMudGl0bGV9XCIgaXMgYmFzZWQgb24gJHtzYW1wbGV9IG9ic2VydmF0aW9uJHtzYW1wbGUgPT09IDEgPyAnJyA6ICdzJ30g4oCUIHBlcmNlbnRhZ2VzIHN3aW5nIHdpbGRseSBhdCB0aGlzIHZvbHVtZS4gUmVhZCB0aGUgY291bnRzLCBub3QgdGhlIHJhdGUuYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpZCA9PT0gJ2RvcmEnKSBub3Rlcy5wdXNoKC4uLmRlcGxveUNvdmVyYWdlTm90ZXMoY3VycmVudCkpO1xuICAgICAgaWYgKGlkID09PSAnbmVlZHNfYXR0ZW50aW9uJykgbm90ZXMucHVzaCguLi5hdHRlbnRpb25Ob3RlcyhjdXJyZW50KSk7XG4gICAgICBzZWN0aW9ucy5wdXNoKGNvbXBvc2VkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNlY3Rpb25zLnB1c2goeyBpZCwgdGl0bGU6IHNwZWMudGl0bGUsIHN0YXRlOiAnZmFpbGVkJyB9KTtcbiAgICAgIG5vdGVzLnB1c2goe1xuICAgICAgICBjb2RlOiAnc2VjdGlvbl9mYWlsZWQnLFxuICAgICAgICBzZWN0aW9uSWQ6IGlkLFxuICAgICAgICBtZXNzYWdlOiBgXCIke3NwZWMudGl0bGV9XCIgY291bGQgbm90IGJlIGNvbXB1dGVkIGZvciB0aGlzIHBlcmlvZC4gVGhlIHJlc3Qgb2YgdGhlIHJlcG9ydCBpcyB1bmFmZmVjdGVkLmAsXG4gICAgICB9KTtcbiAgICAgIHZvaWQgZXJyOyAvLyB0aGUgcmVhc29uIGlzIGxvZ2dlZCBieSB0aGUgY2FsbGVyLCBuZXZlciBzaG93biB0byBhIG1hbmFnZXJcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmlvZDogeyBzdGFydDogcGVyaW9kLnN0YXJ0LnRvSVNPU3RyaW5nKCksIGVuZDogcGVyaW9kLmVuZC50b0lTT1N0cmluZygpLCBsYWJlbDogcGVyaW9kLmxhYmVsIH0sXG4gICAgcHJldmlvdXNQZXJpb2Q6IHsgc3RhcnQ6IHBlcmlvZC5wcmV2U3RhcnQudG9JU09TdHJpbmcoKSwgZW5kOiBwZXJpb2QucHJldkVuZC50b0lTT1N0cmluZygpIH0sXG4gICAgdGltZXpvbmUsXG4gICAgd2Vla1N0YXJ0LFxuICAgIHNlY3Rpb25zLFxuICAgIG5vdGVzLFxuICAgIG1ldGhvZG9sb2d5OlxuICAgICAgYENvbXB1dGVkIGZyb20gcGlwZWxpbmUgZXZlbnRzIGJldHdlZW4gJHtwZXJpb2Quc3RhcnQudG9JU09TdHJpbmcoKX0gYW5kICR7cGVyaW9kLmVuZC50b0lTT1N0cmluZygpfSwgYFxuICAgICAgKyBgYnVja2V0ZWQgaW4gJHt0aW1lem9uZX0gd2l0aCB3ZWVrcyBzdGFydGluZyAke3dlZWtTdGFydH0uIENvbXBhcmlzb24gcGVyaW9kOiBgXG4gICAgICArIGAke3BlcmlvZC5wcmV2U3RhcnQudG9JU09TdHJpbmcoKX0gdG8gJHtwZXJpb2QucHJldkVuZC50b0lTT1N0cmluZygpfS4gYFxuICAgICAgKyAnVGhlc2UgYXJlIHRoZSBzYW1lIHF1ZXJpZXMgdGhlIGRhc2hib2FyZCBydW5zIG92ZXIgdGhlIHNhbWUgd2luZG93LCBzbyB0aGUgdHdvIGFncmVlLicsXG4gICAgZ2VuZXJhdGVkQXQ6IChvcHRzLm5vdyA/PyBuZXcgRGF0ZSgpKS50b0lTT1N0cmluZygpLFxuICB9O1xufVxuIl19
@@ -1,5 +1,19 @@
1
1
  import type { ReportCadence, ReportDefinition, ReportPauseReason, ReportRecipient, ReportRun, ReportRunStatus, ReportScope, ReportShareLink, ReportTemplate } from '../../../database/schema/reporting-stakeholder.js';
2
2
  /** How long a freshly minted share link lives when the caller names no window. */
3
+ /**
4
+ * What an unsubscribe click did. `recipient` is returned to the ROUTE (for its
5
+ * audit row), never to the clicker, who is told "unsubscribed" either way.
6
+ */
7
+ export interface UnsubscribeResult {
8
+ matched: boolean;
9
+ recipient?: {
10
+ id: string;
11
+ orgId: string;
12
+ email: string;
13
+ };
14
+ /** True only for the click that actually set `unsubscribed_at`. */
15
+ newlyUnsubscribed?: boolean;
16
+ }
3
17
  export declare const DEFAULT_SHARE_LINK_TTL_DAYS = 30;
4
18
  /** The longest a share link may live. Beyond this it is a permanent URL. */
5
19
  export declare const MAX_SHARE_LINK_TTL_DAYS = 180;
@@ -75,7 +89,7 @@ export declare class StakeholderReportStore {
75
89
  transferOwner(orgId: string, id: string, newOwnerId: string, actorId: string): Promise<ReportDefinition>;
76
90
  /**
77
91
  * Pause every definition a user owns, with the reason recorded. Called when the
78
- * owner is deactivated or loses `reports:author` — a report must stop when the
92
+ * owner is deactivated or loses `reports:write` — a report must stop when the
79
93
  * person accountable for it can no longer see the data behind it.
80
94
  *
81
95
  * Returns the paused definitions so the caller can notify an org admin: a
@@ -252,7 +266,7 @@ export declare class StakeholderReportStore {
252
266
  * second call finds the row already unsubscribed and reports success, because from the
253
267
  * clicker's point of view it is.
254
268
  */
255
- unsubscribeByToken(token: string, now?: Date): Promise<boolean>;
269
+ unsubscribeByToken(token: string, now?: Date): Promise<UnsubscribeResult>;
256
270
  /** Record a delivery bounce. At {@link MAX_BOUNCES} the address is skipped. */
257
271
  recordBounce(orgId: string, email: string, now?: Date): Promise<number>;
258
272
  deleteRecipient(orgId: string, id: string, deletedBy: string): Promise<void>;