@pipeline-builder/api-core 5.2.2 → 5.2.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 (91) hide show
  1. package/lib/constants/ai-providers.d.ts +3 -22
  2. package/lib/constants/ai-providers.js +6 -56
  3. package/lib/errors/app-errors.d.ts +14 -0
  4. package/lib/errors/app-errors.js +21 -1
  5. package/lib/helpers/index.d.ts +1 -0
  6. package/lib/helpers/index.js +2 -1
  7. package/lib/helpers/sse-helpers.d.ts +33 -3
  8. package/lib/helpers/sse-helpers.js +91 -19
  9. package/lib/helpers/support-calendar.d.ts +69 -0
  10. package/lib/helpers/support-calendar.js +179 -0
  11. package/lib/middleware/auth.js +6 -3
  12. package/lib/middleware/deferred-quota-check.d.ts +5 -0
  13. package/lib/middleware/deferred-quota-check.js +33 -0
  14. package/lib/middleware/ecosystem-guard.d.ts +3 -3
  15. package/lib/middleware/ecosystem-guard.js +5 -5
  16. package/lib/middleware/index.d.ts +5 -2
  17. package/lib/middleware/index.js +6 -3
  18. package/lib/middleware/on-behalf.d.ts +37 -0
  19. package/lib/middleware/on-behalf.js +143 -0
  20. package/lib/middleware/permission-gates.d.ts +11 -0
  21. package/lib/middleware/permission-gates.js +7 -1
  22. package/lib/middleware/quota-exempt-routes.d.ts +36 -0
  23. package/lib/middleware/quota-exempt-routes.js +47 -0
  24. package/lib/middleware/route-table.d.ts +104 -0
  25. package/lib/middleware/route-table.js +72 -2
  26. package/lib/middleware/service-tokens.d.ts +8 -0
  27. package/lib/middleware/service-tokens.js +5 -3
  28. package/lib/middleware/step-up.js +11 -1
  29. package/lib/services/ai-call-weight.d.ts +24 -0
  30. package/lib/services/ai-call-weight.js +77 -0
  31. package/lib/services/alert-delivery.d.ts +99 -0
  32. package/lib/services/alert-delivery.js +132 -0
  33. package/lib/services/audit-context.d.ts +105 -0
  34. package/lib/services/audit-context.js +134 -0
  35. package/lib/services/index.d.ts +10 -2
  36. package/lib/services/index.js +10 -2
  37. package/lib/services/org-ai-client.d.ts +61 -0
  38. package/lib/services/org-ai-client.js +112 -0
  39. package/lib/services/pagerduty-inbound.d.ts +101 -0
  40. package/lib/services/pagerduty-inbound.js +195 -0
  41. package/lib/services/pagerduty.d.ts +109 -0
  42. package/lib/services/pagerduty.js +186 -0
  43. package/lib/services/quota-increment-batcher.d.ts +81 -0
  44. package/lib/services/quota-increment-batcher.js +166 -0
  45. package/lib/services/quota.d.ts +158 -14
  46. package/lib/services/quota.js +252 -22
  47. package/lib/services/remote-audit-client.d.ts +44 -1
  48. package/lib/services/remote-audit-client.js +106 -20
  49. package/lib/services/version-vuln-policy.d.ts +174 -0
  50. package/lib/services/version-vuln-policy.js +242 -0
  51. package/lib/types/ai-catalog.d.ts +63 -0
  52. package/lib/types/ai-catalog.js +82 -0
  53. package/lib/types/ask-proposals.js +6 -6
  54. package/lib/types/build-catalog.d.ts +154 -0
  55. package/lib/types/build-catalog.js +158 -0
  56. package/lib/types/common.d.ts +37 -3
  57. package/lib/types/common.js +20 -2
  58. package/lib/types/ecosystem-notifications.d.ts +5 -5
  59. package/lib/types/ecosystem-notifications.js +9 -3
  60. package/lib/types/error-codes.d.ts +13 -6
  61. package/lib/types/error-codes.js +18 -8
  62. package/lib/types/feature-flags.d.ts +71 -1
  63. package/lib/types/feature-flags.js +131 -11
  64. package/lib/types/index.d.ts +6 -4
  65. package/lib/types/index.js +12 -5
  66. package/lib/types/metadata-keys.d.ts +6 -0
  67. package/lib/types/metadata-keys.js +4 -1
  68. package/lib/types/permissions.d.ts +351 -3
  69. package/lib/types/permissions.js +610 -21
  70. package/lib/types/pipeline.d.ts +39 -0
  71. package/lib/types/pipeline.js +57 -1
  72. package/lib/types/plugin-health.d.ts +0 -2
  73. package/lib/types/plugin-health.js +1 -11
  74. package/lib/types/plugin-scan.d.ts +192 -42
  75. package/lib/types/plugin-scan.js +159 -43
  76. package/lib/types/quota-catalog.d.ts +247 -0
  77. package/lib/types/quota-catalog.js +122 -0
  78. package/lib/types/quota-tiers.d.ts +150 -0
  79. package/lib/types/quota-tiers.js +167 -2
  80. package/lib/types/remote-audit-actions.d.ts +1 -1
  81. package/lib/types/remote-audit-actions.js +217 -4
  82. package/lib/types/wire-vocabulary.js +8 -1
  83. package/lib/utils/index.d.ts +1 -1
  84. package/lib/utils/index.js +2 -2
  85. package/lib/utils/response.d.ts +35 -2
  86. package/lib/utils/response.js +42 -3
  87. package/lib/validation/ai-schemas.d.ts +27 -0
  88. package/lib/validation/ai-schemas.js +31 -5
  89. package/lib/validation/plugin-schemas.d.ts +15 -0
  90. package/lib/validation/plugin-schemas.js +28 -1
  91. package/package.json +31 -2
@@ -11,10 +11,123 @@ import { envBool, envInt, envStr } from '../utils/env.js';
11
11
  *
12
12
  * `storageBytes` is the aggregate registry cap per org. Sized
13
13
  * around plugin-image realities: a typical plugin image is 200500 MB;
14
- * Developer's 2 GB holds ~4 versions × ~500 MB, Pro's 50 GB covers a
14
+ * Developer's 2 GB holds ~4 versions × ~500 MB, Pro's 25 GB covers a
15
15
  * mature catalog. Operators can override per-org via the quota CRUD API.
16
16
  */
17
17
  const GB = 1024 * 1024 * 1024;
18
+ /**
19
+ * How the `automationCalls` defaults are sized — written down so the next
20
+ * person to touch them argues with the arithmetic, not with the numbers.
21
+ *
22
+ * Every call an org's automation keys make in one pipeline RUN, itemized (the
23
+ * earlier sizing counted only the plugin lookups and hand-waved the rest as
24
+ * "×2"):
25
+ *
26
+ * plugin lookups 12 one per plugin step (self-mutating pipeline)
27
+ * synth 1 the synth step fetching the pipeline config
28
+ * runtime check 1 the pre-deploy runtime-check call
29
+ * security-report upload 1 the scan step posting its report
30
+ * registry register 1 pipeline-register stamping the deployed version
31
+ * reporting ingest batches 12 the event forwarder posts ~one batch per action
32
+ * --
33
+ * 28 calls per run
34
+ *
35
+ * Per default period (`QUOTA_RESET_DAYS`, 3 days) one active pipeline running
36
+ * hourly makes 28 × 24 × 3 = 2,016 calls. An org keeps far more pipelines alive
37
+ * than it CREATES in a period (`pipelines` is a creation rate), so active
38
+ * pipelines are taken as 4× the tier's `pipelines`. On top sits a per-ORG
39
+ * constant that does not scale with pipelines: the ingest-health heartbeat
40
+ * (≤ 1/minute → 1,440/day → 4,320/period). The sum gets 25% headroom (retries,
41
+ * registry pushes, ad-hoc CI scripts on keys) and rounds UP to the next 10,000:
42
+ *
43
+ * developer 2×4×2016 + 4320 = 20,448 × 1.25 = 25,560 → 30,000
44
+ * pro 5×4×2016 + 4320 = 44,640 × 1.25 = 55,800 → 60,000
45
+ * team 10×4×2016 + 4320 = 84,960 × 1.25 = 106,200 → 110,000
46
+ * business 20×4×2016 + 4320 = 165,600 × 1.25 = 207,000 → 210,000
47
+ * enterprise 30×4×2016 + 4320 = 246,240 × 1.25 = 307,800 → 310,000
48
+ *
49
+ * {@link automationCallsFor} computes exactly this, and the tier tests hold the
50
+ * table to it. Over the cap the 429 is SOFT for a band ({@link quotaGracePct}):
51
+ * a self-mutating pipeline that hard-stopped at 100% stayed stopped until the
52
+ * period reset, up to 3 days. The limits are PER PERIOD: an operator who
53
+ * lengthens `QUOTA_RESET_DAYS` should scale `QUOTA_TIER_<TIER>_AUTOMATION_CALLS`
54
+ * by the same factor.
55
+ */
56
+ export const AUTOMATION_CALLS_SIZING = {
57
+ callsPerRun: {
58
+ pluginLookups: 12,
59
+ synth: 1,
60
+ runtimeCheck: 1,
61
+ securityReportUpload: 1,
62
+ registryRegister: 1,
63
+ ingestBatches: 12,
64
+ },
65
+ runsPerDay: 24,
66
+ activePipelinesPerCreation: 4,
67
+ /** Ingest-health heartbeats per org per day (≤ one a minute). */
68
+ heartbeatsPerDay: 1440,
69
+ /** Multiplier on the itemized total. */
70
+ headroom: 1.25,
71
+ /** Defaults round UP to a multiple of this. */
72
+ roundTo: 10_000,
73
+ };
74
+ /** The {@link AUTOMATION_CALLS_SIZING} formula for a tier creating `pipelines` per period. */
75
+ export function automationCallsFor(pipelines, periodDays = 3) {
76
+ const s = AUTOMATION_CALLS_SIZING;
77
+ const perRun = Object.values(s.callsPerRun).reduce((a, b) => a + b, 0);
78
+ const perPipeline = perRun * s.runsPerDay * periodDays;
79
+ const total = (pipelines * s.activePipelinesPerCreation * perPipeline + s.heartbeatsPerDay * periodDays) * s.headroom;
80
+ return Math.ceil(total / s.roundTo) * s.roundTo;
81
+ }
82
+ /**
83
+ * The SOFT band above a quota's cap, per type, in percent of the limit. A type
84
+ * absent from this map has NO band and stops hard at 100%.
85
+ *
86
+ * At 100% the account gets the "reached" notice and keeps running; the refusal
87
+ * starts only past `limit × (100 + pct) / 100`. Reads still REPORT the nominal
88
+ * limit, so usage shows above 100% while inside the band.
89
+ *
90
+ * Two types qualify, for the same reason stated two ways — a hard stop exactly
91
+ * at 100% is worse than a short overrun when the caller cannot simply wait:
92
+ *
93
+ * - `automationCalls` (`QUOTA_AUTOMATION_GRACE_PCT`): the caller is a pipeline
94
+ * mid-deploy, not a person, and the counter would stay full for the rest of
95
+ * the period.
96
+ * - `storageBytes` (`QUOTA_STORAGE_GRACE_PCT`): storage is a STOCK — it does
97
+ * not reset, so without a band a downgrade or a cancelled pack flips an
98
+ * account from working to refused with no buffer at all, and the remedy
99
+ * (prune, or buy capacity) takes time the band is there to provide. Note the
100
+ * band on a stock is a ONE-TIME buffer rather than a per-period one; that is
101
+ * its purpose here, not a limitation of it.
102
+ *
103
+ * Every other type stays hard. This was a hardcoded `quotaType !==
104
+ * 'automationCalls'` comparison, which is why storage had nothing: the
105
+ * mechanism existed and only the predicate excluded it.
106
+ */
107
+ const QUOTA_GRACE_PCT = {
108
+ automationCalls: envInt('QUOTA_AUTOMATION_GRACE_PCT', 10, { min: 0, max: 100 }),
109
+ storageBytes: envInt('QUOTA_STORAGE_GRACE_PCT', 10, { min: 0, max: 100 }),
110
+ };
111
+ /** The soft band for `quotaType` in percent, or 0 for a type that stops hard. */
112
+ export function quotaGracePct(quotaType) {
113
+ return QUOTA_GRACE_PCT[quotaType] ?? 0;
114
+ }
115
+ /**
116
+ * The limit enforcement actually binds on for `quotaType`: the nominal limit,
117
+ * plus the type's {@link quotaGracePct} band where it has one. Unlimited (-1)
118
+ * and zero ("none") limits are returned unchanged — a 0 cap is a deliberate
119
+ * refusal, not a budget to overrun.
120
+ *
121
+ * {@link QUOTA_GRACE_PCT} decides WHETHER a type has a band; `gracePct` only
122
+ * sizes it. So an explicit percentage passed for an unbanded type still yields
123
+ * the nominal limit, rather than quietly granting a band the type is not meant
124
+ * to have.
125
+ */
126
+ export function enforcedQuotaLimit(quotaType, limit, gracePct = quotaGracePct(quotaType)) {
127
+ if (limit <= 0 || gracePct <= 0 || quotaGracePct(quotaType) <= 0)
128
+ return limit;
129
+ return Math.floor((limit * (100 + gracePct)) / 100);
130
+ }
18
131
  /**
19
132
  * Code-default limits per tier — the fallback when no env override is set.
20
133
  * -1 means unlimited. (Counts sized to "comfortably enough for one team, not
@@ -30,7 +143,9 @@ const DEFAULT_TIER_LIMITS = {
30
143
  plugins: 10,
31
144
  pipelines: 2,
32
145
  apiCalls: 25_000,
146
+ automationCalls: 30_000,
33
147
  aiCalls: 20,
148
+ cpuCredits: 4_500,
34
149
  storageBytes: 2 * GB,
35
150
  dashboards: 20,
36
151
  alertRules: 50,
@@ -38,6 +153,8 @@ const DEFAULT_TIER_LIMITS = {
38
153
  idpConfigs: 1,
39
154
  listings: 3,
40
155
  seats: 1,
156
+ supportContacts: 0,
157
+ supportPremiumContacts: 0,
41
158
  eventRetentionDays: 30,
42
159
  doraRetentionDays: 180,
43
160
  },
@@ -49,7 +166,9 @@ const DEFAULT_TIER_LIMITS = {
49
166
  plugins: 25,
50
167
  pipelines: 5,
51
168
  apiCalls: 100_000,
169
+ automationCalls: 60_000,
52
170
  aiCalls: 200,
171
+ cpuCredits: 11_250,
53
172
  storageBytes: 25 * GB,
54
173
  dashboards: 200,
55
174
  alertRules: 500,
@@ -57,6 +176,8 @@ const DEFAULT_TIER_LIMITS = {
57
176
  idpConfigs: 5,
58
177
  listings: 10,
59
178
  seats: 1,
179
+ supportContacts: 0,
180
+ supportPremiumContacts: 0,
60
181
  eventRetentionDays: 30,
61
182
  doraRetentionDays: 180,
62
183
  },
@@ -68,7 +189,9 @@ const DEFAULT_TIER_LIMITS = {
68
189
  plugins: 50,
69
190
  pipelines: 10,
70
191
  apiCalls: 300_000,
192
+ automationCalls: 110_000,
71
193
  aiCalls: 600,
194
+ cpuCredits: 22_500,
72
195
  storageBytes: 60 * GB,
73
196
  dashboards: -1,
74
197
  alertRules: -1,
@@ -76,6 +199,8 @@ const DEFAULT_TIER_LIMITS = {
76
199
  idpConfigs: 5,
77
200
  listings: 25,
78
201
  seats: 3,
202
+ supportContacts: 0,
203
+ supportPremiumContacts: 0,
79
204
  eventRetentionDays: 30,
80
205
  doraRetentionDays: 180,
81
206
  },
@@ -89,7 +214,9 @@ const DEFAULT_TIER_LIMITS = {
89
214
  plugins: 100,
90
215
  pipelines: 20,
91
216
  apiCalls: 800_000,
217
+ automationCalls: 210_000,
92
218
  aiCalls: 1_600,
219
+ cpuCredits: 45_000,
93
220
  storageBytes: 120 * GB,
94
221
  dashboards: -1,
95
222
  alertRules: -1,
@@ -97,6 +224,8 @@ const DEFAULT_TIER_LIMITS = {
97
224
  idpConfigs: 10,
98
225
  listings: 50,
99
226
  seats: 8,
227
+ supportContacts: 0,
228
+ supportPremiumContacts: 0,
100
229
  eventRetentionDays: 30,
101
230
  doraRetentionDays: 180,
102
231
  },
@@ -108,7 +237,9 @@ const DEFAULT_TIER_LIMITS = {
108
237
  plugins: 150,
109
238
  pipelines: 30,
110
239
  apiCalls: 1_500_000,
240
+ automationCalls: 310_000,
111
241
  aiCalls: 3_000,
242
+ cpuCredits: 67_500,
112
243
  storageBytes: 250 * GB,
113
244
  dashboards: -1,
114
245
  alertRules: -1,
@@ -116,6 +247,8 @@ const DEFAULT_TIER_LIMITS = {
116
247
  idpConfigs: -1,
117
248
  listings: 100,
118
249
  seats: 15,
250
+ supportContacts: 0,
251
+ supportPremiumContacts: 0,
119
252
  eventRetentionDays: 30,
120
253
  doraRetentionDays: 180,
121
254
  },
@@ -125,7 +258,9 @@ const DEFAULT_TIER_LIMITS = {
125
258
  plugins: -1,
126
259
  pipelines: -1,
127
260
  apiCalls: -1,
261
+ automationCalls: -1,
128
262
  aiCalls: -1,
263
+ cpuCredits: -1,
129
264
  storageBytes: -1,
130
265
  dashboards: -1,
131
266
  alertRules: -1,
@@ -133,6 +268,8 @@ const DEFAULT_TIER_LIMITS = {
133
268
  idpConfigs: -1,
134
269
  listings: -1,
135
270
  seats: -1,
271
+ supportContacts: -1,
272
+ supportPremiumContacts: -1,
136
273
  eventRetentionDays: -1,
137
274
  doraRetentionDays: -1,
138
275
  },
@@ -171,14 +308,18 @@ function tierLimits(tier) {
171
308
  plugins: tierLimitEnv(`QUOTA_TIER_${T}_PLUGINS`, d.plugins),
172
309
  pipelines: tierLimitEnv(`QUOTA_TIER_${T}_PIPELINES`, d.pipelines),
173
310
  apiCalls: tierLimitEnv(`QUOTA_TIER_${T}_API_CALLS`, d.apiCalls),
311
+ automationCalls: tierLimitEnv(`QUOTA_TIER_${T}_AUTOMATION_CALLS`, d.automationCalls),
174
312
  aiCalls: tierLimitEnv(`QUOTA_TIER_${T}_AI_CALLS`, d.aiCalls),
175
313
  storageBytes: tierLimitEnv(`QUOTA_TIER_${T}_STORAGE_BYTES`, d.storageBytes),
314
+ cpuCredits: tierLimitEnv(`QUOTA_TIER_${T}_CPU_CREDITS`, d.cpuCredits),
176
315
  dashboards: tierLimitEnv(`QUOTA_TIER_${T}_DASHBOARDS`, d.dashboards),
177
316
  alertRules: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_RULES`, d.alertRules),
178
317
  alertDestinations: tierLimitEnv(`QUOTA_TIER_${T}_ALERT_DESTINATIONS`, d.alertDestinations),
179
318
  idpConfigs: tierLimitEnv(`QUOTA_TIER_${T}_IDP_CONFIGS`, d.idpConfigs),
180
319
  listings: tierLimitEnv(`QUOTA_TIER_${T}_LISTINGS`, d.listings),
181
320
  seats: tierLimitEnv(`QUOTA_TIER_${T}_SEATS`, d.seats),
321
+ supportContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_CONTACTS`, d.supportContacts),
322
+ supportPremiumContacts: tierLimitEnv(`QUOTA_TIER_${T}_SUPPORT_PREMIUM_CONTACTS`, d.supportPremiumContacts),
182
323
  eventRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_EVENT_RETENTION_DAYS`, d.eventRetentionDays),
183
324
  doraRetentionDays: tierLimitEnv(`QUOTA_TIER_${T}_DORA_RETENTION_DAYS`, d.doraRetentionDays),
184
325
  };
@@ -259,10 +400,34 @@ export function getTierLimits(tier) {
259
400
  */
260
401
  export const QUOTA_RESET_DAYS = envInt('QUOTA_RESET_DAYS', 3, { min: 1 });
261
402
  /** The next quota reset: local midnight `days` from `now`. */
403
+ /**
404
+ * The `cpuCredits` period, in days. A MONTH rather than the global three-day
405
+ * window, because build demand is bursty in a way API traffic is not: a full
406
+ * catalogue rebuild is a day's work that arrives on one day, and a three-day
407
+ * window refuses it while the account holds most of a month's budget unspent.
408
+ */
409
+ export const CPU_CREDITS_PERIOD_DAYS = envInt('QUOTA_CPU_CREDITS_PERIOD_DAYS', 30, { min: 1 });
410
+ /**
411
+ * The usage period for ONE quota type, in days.
412
+ *
413
+ * Every flow quota but `cpuCredits` rolls on the global {@link QUOTA_RESET_DAYS}.
414
+ * Credits are monthly, which makes the period a PER-TYPE fact — so anything that
415
+ * computes a reset date, a "resets in N days" line or a burn-rate forecast has
416
+ * to ask for the type's own period rather than reading the global constant. A
417
+ * forecast against the wrong window is wrong by a factor of ten.
418
+ *
419
+ * Stocks (`storageBytes` and the resource counts) have no period at all; this
420
+ * returns the global window for them because callers gate on
421
+ * `quotaAccrual(type) === 'stock'` before using it, and returning a figure is
422
+ * less disruptive than making every caller handle a null. Check the accrual.
423
+ */
424
+ export function quotaPeriodDays(type) {
425
+ return type === 'cpuCredits' ? CPU_CREDITS_PERIOD_DAYS : QUOTA_RESET_DAYS;
426
+ }
262
427
  export function nextQuotaResetDate(days = QUOTA_RESET_DAYS, now = new Date()) {
263
428
  const date = new Date(now);
264
429
  date.setDate(date.getDate() + days);
265
430
  date.setHours(0, 0, 0, 0);
266
431
  return date;
267
432
  }
268
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQTZEMUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7OztHQU1HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBdUM7SUFDOUQsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSw4RUFBOEU7SUFDOUUsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxTQUFTLEVBQUUsQ0FBQztRQUNaLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLE9BQU8sRUFBRSxFQUFFO1FBQ1gsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFO1FBQ3BCLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLFVBQVUsRUFBRSxDQUFDO1FBQ2IsUUFBUSxFQUFFLENBQUM7UUFDWCxLQUFLLEVBQUUsQ0FBQztRQUNSLGtCQUFrQixFQUFFLEVBQUU7UUFDdEIsaUJBQWlCLEVBQUUsR0FBRztLQUN2QjtJQUNELCtFQUErRTtJQUMvRSxnRkFBZ0Y7SUFDaEYsZ0ZBQWdGO0lBQ2hGLDhFQUE4RTtJQUM5RSxHQUFHLEVBQUU7UUFDSCxPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxDQUFDO1FBQ1osUUFBUSxFQUFFLE9BQU87UUFDakIsT0FBTyxFQUFFLEdBQUc7UUFDWixZQUFZLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDckIsVUFBVSxFQUFFLEdBQUc7UUFDZixVQUFVLEVBQUUsR0FBRztRQUNmLGlCQUFpQixFQUFFLEVB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QVUsa0JBQWtCLENBQUMsSUFBSSxHQUFXLGdCQUFnQixFQUFFLEdBQUcsR0FBUyxJQUFJLElBQUksRUFBRTtJQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5cbi8qKiBBdmFpbGFibGUgcXVvdGEgdGllciBpZGVudGlmaWVycy5cbiAqXG4gKiBgdW5saW1pdGVkYCBpcyBhIHNwZWNpYWwgdGllcjogZXZlcnkgcXVvdGEgaXMgYC0xYCAodW5jYXBwZWQpIGFuZCBpdCBpbmNsdWRlc1xuICogZXZlcnkgZmVhdHVyZS9hZGQtb24gYnVuZGxlLiBJdCBpcyB0aGUgREVGQVVMVCB3aGVuIGJpbGxpbmcgaXMgZGlzYWJsZWQgKG5vXG4gKiBtZXRlcmluZy9lbmZvcmNlbWVudCBzdXJmYWNlIGV4aXN0cywgc28gbm90aGluZyBpcyBjYXBwZWQpLCBhbmQgaXQgaXMgTkVWRVJcbiAqIHNob3duIG9yIHNlbGVjdGFibGUgd2hlbiBiaWxsaW5nIGlzIGVuYWJsZWQg4oCUIHNlZSBgU1RBTkRBUkRfVElFUlNgLiAqL1xuZXhwb3J0IHR5cGUgUXVvdGFUaWVyID0gJ2RldmVsb3BlcicgfCAncHJvJyB8ICd0ZWFtJyB8ICdidXNpbmVzcycgfCAnZW50ZXJwcmlzZScgfCAndW5saW1pdGVkJztcblxuLyoqIExpbWl0IHZhbHVlcyBmb3IgZWFjaCBxdW90YSB0eXBlIHdpdGhpbiBhIHRpZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1b3RhVGllckxpbWl0cyB7XG4gIHBsdWdpbnM6IG51bWJlcjtcbiAgcGlwZWxpbmVzOiBudW1iZXI7XG4gIGFwaUNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKiBDb3VudC1xdW90YXMgb24gdGhlIHVzZXItZWRpdGFibGUgZmVhdHVyZSB0YWJsZXMgYWRkZWQgdG8gY2xvc2UgcGVyLW9yZ1xuICAgKiAgRG9TIHZpYSBzcGFtLiAtMSBtZWFucyB1bmxpbWl0ZWQuICovXG4gIGRhc2hib2FyZHM6IG51bWJlcjtcbiAgYWxlcnRSdWxlczogbnVtYmVyO1xuICBhbGVydERlc3RpbmF0aW9uczogbnVtYmVyO1xuICBpZHBDb25maWdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBY3RpdmUsIG5vbi1zdXNwZW5kZWQgcGx1Z2luLWVjb3N5c3RlbSBsaXN0aW5ncyB0aGUgb3JnIHB1Ymxpc2hlc1xuICAgKiAoZG9jcy9wbHVnaW4taW5zdGFsbGluZy5tZCkuIEEgQ09VTlQgcXVvdGEg4oCUIGluc3RhbGxzIG5ldmVyXG4gICAqIGNvdW50LiAtMSA9IHVubGltaXRlZC4gRXh0ZW5kYWJsZSB2aWEgdGhlIGBsaXN0aW5nX3BhY2tgIGFkZC1vbiBidW5kbGUuXG4gICAqL1xuICBsaXN0aW5nczogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IG9yZyBtZW1iZXJzIChhY3RpdmUgdXNlcnMgLyBzZWF0cykuIC0xID0gdW5saW1pdGVkLiBUaGlzIGlzIHRoZSBcIlRlYW1cIlxuICAgKiB0aWVyIGRpZmZlcmVudGlhdG9yIOKAlCBlbmZvcmNlZCBhdCBtZW1iZXItaW52aXRlIHRpbWUgKGFuIGludml0ZSBpcyBibG9ja2VkXG4gICAqIHdoZW4gYWN0aXZlIG1lbWJlcnMgKyBwZW5kaW5nIGludml0ZXMgd291bGQgZXhjZWVkIHRoaXMpLlxuICAgKi9cbiAgc2VhdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDUwIEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMTAsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYWlDYWxsczogMjAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgbGlzdGluZ3M6IDMsXG4gICAgc2VhdHM6IDEsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDI1LFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMTAwXzAwMCxcbiAgICBhaUNhbGxzOiAyMDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyNSAqIEdCLFxuICAgIGRhc2hib2FyZHM6IDIwMCxcbiAgICBhbGVydFJ1bGVzOiA1MDAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDUwLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDEwLFxuICAgIHNlYXRzOiAxLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gVGVhbSA9IGNvbGxhYm9yYXRpb24gdGllcjsgdGhlIHNlYXQgbGltaXQgKDMpIGlzIHRoZSByZWFsIGRpZmZlcmVudGlhdG9yIG92ZXJcbiAgLy8gUHJvIChzaW5nbGUtc2VhdCkg4oCUIGl0J3MgdGhlIG11bHRpLXNlYXQgY29sbGFib3JhdGlvbiBmbG9vci4gTGVhbiBiYXNlICgkNzkpOlxuICAvLyBncm93dGggcmlkZXMgdGhlIHNlYXQvcGlwZWxpbmUvZXRjIGFkZC1vbnMgKGxhbmQtYW5kLWV4cGFuZCkuIExpbWl0cyBzaXRcbiAgLy8gYmV0d2VlbiBQcm8gYW5kIEVudGVycHJpc2UuXG4gIHRlYW06IHtcbiAgICBwbHVnaW5zOiA1MCxcbiAgICBwaXBlbGluZXM6IDEwLFxuICAgIGFwaUNhbGxzOiAzMDBfMDAwLFxuICAgIGFpQ2FsbHM6IDYwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDYwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDI1LFxuICAgIHNlYXRzOiAzLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gQnVzaW5lc3MgKCQyNDkpOiB0aGUgc3RlcCB0aGUgJDc5IC0+ICQ1OTkgY2xpZmYgd2FzIG1pc3NpbmcuIDggc2VhdHMsIDIwXG4gIC8vIHBpcGVsaW5lcywgYW5kIERPUkEgKGFkdmFuY2VkX3JlcG9ydGluZykgaW5jbHVkZWQgcmF0aGVyIHRoYW4gYW4gYWRkLW9uLlxuICAvLyBFdmVyeSBjb3N0IGRyaXZlciBpcyAxMDAsMDAwIGFwaUNhbGxzIGFuZCAyMDAgYWlDYWxscyBQRVIgU0VBVCwgdGhlIHNhbWVcbiAgLy8gcGVyLXNlYXQgcmF0ZSBhcyBQcm8vVGVhbS9FbnRlcnByaXNlLCBzbyB0aGUgbGFkZGVyIHJlYWRzIGNvbnNpc3RlbnRseSB0byBhXG4gIC8vIGJ1eWVyIHdobyBkaXZpZGVzIGJ5IGhlYWRjb3VudC4gQ291bnQtcXVvdGFzIHRoYXQgVGVhbSBhbHJlYWR5IHVuY2FwcyBzdGF5XG4gIC8vIC0xOyBgaWRwQ29uZmlnc2Agc2l0cyBiZXR3ZWVuIFRlYW0ncyA1IGFuZCBFbnRlcnByaXNlJ3MgdW5saW1pdGVkLlxuICBidXNpbmVzczoge1xuICAgIHBsdWdpbnM6IDEwMCxcbiAgICBwaXBlbGluZXM6IDIwLFxuICAgIGFwaUNhbGxzOiA4MDBfMDAwLFxuICAgIGFpQ2FsbHM6IDFfNjAwLFxuICAgIHN0b3JhZ2VCeXRlczogMTIwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDEwLFxuICAgIGxpc3RpbmdzOiA1MCxcbiAgICBzZWF0czogOCxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIEVudGVycHJpc2UgKCQ1OTksIGhlbGQpOiB0aGUgYWxsLWluY2x1c2l2ZSB0aWVyIOKAlCAxNSBzZWF0cywgMzAgcGlwZWxpbmVzLCBBTExcbiAgLy8gcHJlbWl1bSBmZWF0dXJlcyBpbmNsdWRlZCAoc2VlIFRJRVJfRkVBVFVSRVMpLiBGQUlSLVVTRSDigJQgY29zdCBkcml2ZXJzIChhcGlDYWxscyxcbiAgLy8gYWlDYWxscywgc3RvcmFnZUJ5dGVzKSBjYXBwZWQgc28gb25lIGFjY291bnQgY2FuJ3QgcnVuIHVwIHVuYm91bmRlZFxuICAvLyBjb21wdXRlL3Byb3ZpZGVyL3N0b3JhZ2UgY29zdCBvbiBhIGZsYXQgcHJpY2U7IGNoZWFwIGNvdW50LXF1b3RhcyBzdGF5IC0xLlxuICBlbnRlcnByaXNlOiB7XG4gICAgcGx1Z2luczogMTUwLFxuICAgIHBpcGVsaW5lczogMzAsXG4gICAgYXBpQ2FsbHM6IDFfNTAwXzAwMCxcbiAgICBhaUNhbGxzOiAzXzAwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDI1MCAqIEdCLFxuICAgIGRhc2hib2FyZHM6IC0xLFxuICAgIGFsZXJ0UnVsZXM6IC0xLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiAtMSxcbiAgICBpZHBDb25maWdzOiAtMSxcbiAgICBsaXN0aW5nczogMTAwLFxuICAgIHNlYXRzOiAxNSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFVubGltaXRlZDogRVZFUlkgcXVvdGEgdW5jYXBwZWQgKC0xKS4gVGhlIGRlZmF1bHQgd2hlbiBiaWxsaW5nIGlzIGRpc2FibGVkXG4gIC8vIChubyBlbmZvcmNlbWVudCBzdXJmYWNlKSDigJQgbmV2ZXIgc2hvd24vc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZC5cbiAgdW5saW1pdGVkOiB7XG4gICAgcGx1Z2luczogLTEsXG4gICAgcGlwZWxpbmVzOiAtMSxcbiAgICBhcGlDYWxsczogLTEsXG4gICAgYWlDYWxsczogLTEsXG4gICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IC0xLFxuICAgIHNlYXRzOiAtMSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IC0xLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAtMSxcbiAgfSxcbn07XG5cbi8qKlxuICogUmVhZCBhIHRpZXIgTElNSVQgZW52IHZhci4gYC0xYCA9IHVubGltaXRlZDsgYW55dGhpbmcgYmVsb3cgdGhhdCBpcyBub25zZW5zZVxuICogKGEgYC01YCBsaW1pdCB3b3VsZCBzaGlwIGEgYnJva2VuIGZpbml0ZSBjYXApLCBzbyBpdCBmYWxscyBiYWNrIHRvIHRoZSBjb2RlXG4gKiBkZWZhdWx0IHJhdGhlciB0aGFuIGNsYW1waW5nIHVwIHRvIGAtMWAuIFRoZSBwYXJzaW5nIGl0c2VsZiBpcyBhcGktY29yZSdzXG4gKiBzaGFyZWQgYGVudkludGAg4oCUIHN0cmljdCBhYm91dCBkZWNpbWFscy9nYXJiYWdlIOKAlCBub3QgYSBsb2NhbCByZS1kZXJpdmF0aW9uLlxuICovXG5mdW5jdGlvbiB0aWVyTGltaXRFbnYobmFtZTogc3RyaW5nLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbiA9IGVudkludChuYW1lLCBmYWxsYmFjayk7XG4gIHJldHVybiBuIDwgLTEgPyBmYWxsYmFjayA6IG47XG59XG5cbi8qKlxuICogUGVyLXRpZXIgbGltaXRzLCBlYWNoIG92ZXJyaWRhYmxlIHZpYSBgUVVPVEFfVElFUl88VElFUj5fPExJTUlUPmAgZW52IHZhcnNcbiAqIChlLmcuIGBRVU9UQV9USUVSX1BST19QSVBFTElORVM9MjUwYCwgYFFVT1RBX1RJRVJfREVWRUxPUEVSX1NUT1JBR0VfQllURVM9Li4uYCkuXG4gKiBVbnNldC9lbXB0eSDihpIgdGhlIGNvZGUgZGVmYXVsdC4gYC0xYCA9IHVubGltaXRlZC4gUmVhZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlFxuICogb24gazhzIHRoZXNlIGZsb3cgaW4gdmlhIHRoZSBgYXBwLWVudmAgQ29uZmlnTWFwIChidWlsdCBmcm9tIGAuZW52YCkuXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdHModGllcjogUXVvdGFUaWVyKTogUXVvdGFUaWVyTGltaXRzIHtcbiAgLy8gYHVubGltaXRlZGAgaXMgdW5jYXBwZWQgQlkgREVGSU5JVElPTjogRVZFUlkgcXVvdGEgaXMgLTEgYW5kIGl0IGlzIE5PVFxuICAvLyBlbnYtb3ZlcnJpZGFibGUuIFJlYWRpbmcgUVVPVEFfVElFUl9VTkxJTUlURURfKiBoZXJlIHdvdWxkIGxldCBhIHN0cmF5IGVudlxuICAvLyB2YXIgc2lsZW50bHkgY2FwIHRoZSBiaWxsaW5nLURJU0FCTEVEIGRlZmF1bHQgdGllciDigJQgc3VyZmFjaW5nIGFzIGEgc3B1cmlvdXNcbiAgLy8gXCJxdW90YSBleGNlZWRlZFwiIG9uIGEgZGVwbG95IHRoYXQgbWV0ZXJzIG5vdGhpbmcuIERlcml2ZSAtMSBmb3IgZXZlcnkgZmllbGRcbiAgLy8gZnJvbSB0aGUgbGltaXRzIHNoYXBlIHNvIGEgbmV3bHktYWRkZWQgcXVvdGEgaXMgdW5jYXBwZWQgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICBpZiAodGllciA9PT0gJ3VubGltaXRlZCcpIHtcbiAgICBjb25zdCB1bmNhcHBlZCA9IHsgLi4uREVGQVVMVF9USUVSX0xJTUlUUy51bmxpbWl0ZWQgfTtcbiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXModW5jYXBwZWQpIGFzIChrZXlvZiBRdW90YVRpZXJMaW1pdHMpW10pIHVuY2FwcGVkW2tdID0gLTE7XG4gICAgcmV0dXJuIHVuY2FwcGVkO1xuICB9XG4gIGNvbnN0IGQgPSBERUZBVUxUX1RJRVJfTElNSVRTW3RpZXJdO1xuICBjb25zdCBUID0gdGllci50b1VwcGVyQ2FzZSgpO1xuICByZXR1cm4ge1xuICAgIHBsdWdpbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1BMVUdJTlNgLCBkLnBsdWdpbnMpLFxuICAgIHBpcGVsaW5lczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fUElQRUxJTkVTYCwgZC5waXBlbGluZXMpLFxuICAgIGFwaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BUElfQ0FMTFNgLCBkLmFwaUNhbGxzKSxcbiAgICBhaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGRhc2hib2FyZHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0RBU0hCT0FSRFNgLCBkLmRhc2hib2FyZHMpLFxuICAgIGFsZXJ0UnVsZXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX1JVTEVTYCwgZC5hbGVydFJ1bGVzKSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQUxFUlRfREVTVElOQVRJT05TYCwgZC5hbGVydERlc3RpbmF0aW9ucyksXG4gICAgaWRwQ29uZmlnczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fSURQX0NPTkZJR1NgLCBkLmlkcENvbmZpZ3MpLFxuICAgIGxpc3RpbmdzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9MSVNUSU5HU2AsIGQubGlzdGluZ3MpLFxuICAgIHNlYXRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TRUFUU2AsIGQuc2VhdHMpLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fRVZFTlRfUkVURU5USU9OX0RBWVNgLCBkLmV2ZW50UmV0ZW50aW9uRGF5cyksXG4gICAgZG9yYVJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0RPUkFfUkVURU5USU9OX0RBWVNgLCBkLmRvcmFSZXRlbnRpb25EYXlzKSxcbiAgfTtcbn1cblxuLy8gTGFiZWxzIGFyZSBvdmVycmlkYWJsZSB2aWEgYFFVT1RBX1RJRVJfPFRJRVI+X0xBQkVMYCAoZGlzcGxheSBuYW1lIG9ubHkpLlxuZXhwb3J0IGNvbnN0IFFVT1RBX1RJRVJTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJQcmVzZXQ+ID0ge1xuICBkZXZlbG9wZXI6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9ERVZFTE9QRVJfTEFCRUwnLCAnRGV2ZWxvcGVyJyksIGxpbWl0czogdGllckxpbWl0cygnZGV2ZWxvcGVyJykgfSxcbiAgcHJvOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfUFJPX0xBQkVMJywgJ1BybycpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3BybycpIH0sXG4gIHRlYW06IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9URUFNX0xBQkVMJywgJ1RlYW0nKSwgbGltaXRzOiB0aWVyTGltaXRzKCd0ZWFtJykgfSxcbiAgYnVzaW5lc3M6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9CVVNJTkVTU19MQUJFTCcsICdCdXNpbmVzcycpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2J1c2luZXNzJykgfSxcbiAgZW50ZXJwcmlzZTogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX0VOVEVSUFJJU0VfTEFCRUwnLCAnRW50ZXJwcmlzZScpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2VudGVycHJpc2UnKSB9LFxuICB1bmxpbWl0ZWQ6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9VTkxJTUlURURfTEFCRUwnLCAnVW5saW1pdGVkJyksIGxpbWl0czogdGllckxpbWl0cygndW5saW1pdGVkJykgfSxcbn07XG5cbi8qKiBBbGwgdmFsaWQgdGllciBuYW1lcyAoaW5jbC4gYHVubGltaXRlZGApLiBVc2VkIGZvciB2YWxpZGF0aW9uIG9mIGEgKnN0b3JlZCpcbiAqICB0aWVyIOKAlCBgdW5saW1pdGVkYCBpcyBhIHZhbGlkIHZhbHVlIGV2ZW4gdGhvdWdoIGl0J3MgbmV2ZXIgb2ZmZXJlZCBmb3Igc2FsZS4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRF9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBPYmplY3Qua2V5cyhRVU9UQV9USUVSUykgYXMgUXVvdGFUaWVyW107XG5cbi8qKiBUaGUgc3RhbmRhcmQsIGJpbGxpbmctc2VsZWN0YWJsZSB0aWVycyDigJQgdGhlIG9uZXMgb2ZmZXJlZCBhcyBwdXJjaGFzYWJsZSBwbGFuc1xuICogIGFuZCBzaG93biBpbiB0aWVyIHBpY2tlcnMuIERlcml2ZWQgYXMgXCJldmVyeSB2YWxpZCB0aWVyIGV4Y2VwdCBgdW5saW1pdGVkYFwiLFxuICogIHdoaWNoIGlzIHRoZSBiaWxsaW5nLURJU0FCTEVEIGRlZmF1bHQgYW5kIGlzIG5ldmVyIGRpc3BsYXllZC9zZWxlY3RhYmxlIHdoZW5cbiAqICBiaWxsaW5nIGlzIGVuYWJsZWQuIEtlcHQgRFJZIG9mZiBgVkFMSURfVElFUlNgIHNvIGFkZGluZyBhIHRpZXIgZmxvd3MgdGhyb3VnaC4gKi9cbmV4cG9ydCBjb25zdCBTVEFOREFSRF9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBWQUxJRF9USUVSUy5maWx0ZXIoKHQpID0+IHQgIT09ICd1bmxpbWl0ZWQnKTtcblxuLyoqIFRpZXJzIHRoYXQgcGVybWl0IHRoZSBvcmcg4oaSIHRlYW0gaGllcmFyY2h5IChuZXN0aW5nIHRlYW1zIHVuZGVyIGEgcm9vdCkuIFRoZVxuICogIGJpbGxpbmctb2ZmIGB1bmxpbWl0ZWRgIHRpZXIgaXMgdGVhbS1jYXBhYmxlIChpdCdzIHRoZSBtb3N0IHBlcm1pc3NpdmUpOyB0aGVcbiAqICBlbnRyeS1sZXZlbCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBhcmUgbm90LiBTaW5nbGUgc291cmNlIGZvciB0aGUgcGFyZW50LVxuICogIGVsaWdpYmlsaXR5ICsgZG93bmdyYWRlLW92ZXJjYXAgY2hlY2tzIHNvIHRoZXkgY2FuJ3QgZHJpZnQuICovXG5leHBvcnQgY29uc3QgVEVBTV9DQVBBQkxFX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJywgJ3VubGltaXRlZCddO1xuZXhwb3J0IGZ1bmN0aW9uIHRpZXJBbGxvd3NUZWFtcyh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXRpZXIgJiYgKFRFQU1fQ0FQQUJMRV9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModGllcik7XG59XG5cbi8qKiBUaWVycyB0aGF0IG1heSBidXkgZXh0cmEgc2VhdHMg4oCUIGJpbGxpbmcncyBwZXItc2VhdCBgc2VhdGAgYWRkLW9uLiBTZWF0cyBhcmVcbiAqICB0aGUgVGVhbSBkaWZmZXJlbnRpYXRvciwgc28gdGhlIHNpbmdsZS1zZWF0IGBkZXZlbG9wZXJgL2Bwcm9gIHRpZXJzIGNhbm5vdFxuICogIHN0YWNrIHRoZW0gYW5kIG11c3QgdXBncmFkZSBpbnN0ZWFkOyBgdW5saW1pdGVkYCBoYXMgbm8gc2VhdCBjYXAgYXQgYWxsLlxuICogIFNpbmdsZSBzb3VyY2UgZm9yIHRoZSBiaWxsaW5nIGNhdGFsb2cgYW5kIGV2ZXJ5IFwib3V0IG9mIHNlYXRzXCIgbWVzc2FnZS4gKi9cbmV4cG9ydCBjb25zdCBTRUFUX1BBQ0tfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gWyd0ZWFtJywgJ2J1c2luZXNzJywgJ2VudGVycHJpc2UnXTtcblxuLyoqIEhvdyBhbiBhY2NvdW50IHRoYXQgaGFzIHVzZWQgZXZlcnkgc2VhdCBjYW4gZ2V0IGFub3RoZXIuICovXG5leHBvcnQgdHlwZSBTZWF0UmVtZWR5ID0gJ3VwZ3JhZGUnIHwgJ3NlYXRfcGFjayc7XG5cbi8qKlxuICogVGhlIHJlbWVkeSB0byBvZmZlciBhbiBhY2NvdW50IGF0IGl0cyBzZWF0IGNhcCwgZnJvbSB0aGUgQUNDT1VOVCdzIChyb290KSB0aWVyOlxuICogYHNlYXRfcGFja2Agd2hlcmUgc2VhdHMgY2FuIGJlIGJvdWdodCwgYHVwZ3JhZGVgIG9uIHRoZSBzaW5nbGUtc2VhdCB0aWVycy5cbiAqIGBudWxsYCB3aGVuIHRoZSB0aWVyIGlzIHVua25vd24gb3IgaGFzIG5vIGNhcCDigJQgc2F5IG5vdGhpbmcgcmF0aGVyIHRoYW4gZ3Vlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWF0UmVtZWR5KHRpZXI6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBTZWF0UmVtZWR5IHwgbnVsbCB7XG4gIGlmICghdGllciB8fCAhaXNWYWxpZFRpZXIodGllcikgfHwgdGllciA9PT0gJ3VubGltaXRlZCcpIHJldHVybiBudWxsO1xuICByZXR1cm4gKFNFQVRfUEFDS19USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModGllcikgPyAnc2VhdF9wYWNrJyA6ICd1cGdyYWRlJztcbn1cblxuLyoqIFdoZXRoZXIgdGhlIGJpbGxpbmcgc2VydmljZSBpcyBlbmFibGVkIGluIHRoaXMgZGVwbG95bWVudCAoYEJJTExJTkdfRU5BQkxFRGAsXG4gKiAgb3B0LW91dCBkZWZhdWx0LW9uIOKAlCBtaXJyb3JzIHRoZSBiaWxsaW5nL3BsYXRmb3JtIGNvbmZpZ3MpLiBXaXRoIGJpbGxpbmcgT0ZGXG4gKiAgdGhlcmUncyBubyBtZXRlcmluZy9lbmZvcmNlbWVudCBzdXJmYWNlLCBzbyB0aGUgZGVmYXVsdCB0aWVyIGlzIGB1bmxpbWl0ZWRgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmlsbGluZ0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbnZCb29sKCdCSUxMSU5HX0VOQUJMRUQnLCB0cnVlKTtcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHRpZXIgYXNzaWduZWQgdG8gbmV3IG9yZ2FuaXphdGlvbnMuXG4gKiAtIEJpbGxpbmcgRElTQUJMRUQg4oaSIGB1bmxpbWl0ZWRgIChub3RoaW5nIGlzIG1ldGVyZWQsIHNvIGV2ZXJ5dGhpbmcgaXMgdW5jYXBwZWQpLlxuICogLSBCaWxsaW5nIEVOQUJMRUQgIOKGkiBgREVGQVVMVF9RVU9UQV9USUVSYCBpZiBpdCdzIGEgdmFsaWQgc3RhbmRhcmQgdGllciwgZWxzZSBgZGV2ZWxvcGVyYC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVElFUjogUXVvdGFUaWVyID0gIWlzQmlsbGluZ0VuYWJsZWQoKVxuICA/ICd1bmxpbWl0ZWQnXG4gIDogKGlzVmFsaWRUaWVyKHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiA/PyAnJykgJiYgcHJvY2Vzcy5lbnYuREVGQVVMVF9RVU9UQV9USUVSICE9PSAndW5saW1pdGVkJ1xuICAgID8gKHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiBhcyBRdW90YVRpZXIpXG4gICAgOiAnZGV2ZWxvcGVyJyk7XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUXVvdGFUaWVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRUaWVyKHZhbHVlOiBzdHJpbmcpOiB2YWx1ZSBpcyBRdW90YVRpZXIge1xuICAvLyBVc2UgdGhlIGV4cGxpY2l0IHR1cGxlLCBub3QgYHZhbHVlIGluIFFVT1RBX1RJRVJTYDogYGluYCB3YWxrcyB0aGUgcHJvdG90eXBlXG4gIC8vIGNoYWluLCBzbyBpbmhlcml0ZWQgT2JqZWN0IGtleXMgKCd0b1N0cmluZycsICdjb25zdHJ1Y3RvcicsIOKApikgd291bGQgcmV0dXJuXG4gIC8vIHRydWUgYW5kIHRoZW4gYGdldFRpZXJMaW1pdHNgIHdvdWxkIHJlYWQgYC5saW1pdHNgIG9mZiBhIGZ1bmN0aW9uIOKGkiBjcmFzaC5cbiAgLy8gYHRpZXJgIGlzIGF0dGFja2VyLWluZmx1ZW5jZWFibGUgKEpXVCAvIHJlcXVlc3QgYm9keSAvIERFRkFVTFRfUVVPVEFfVElFUiBlbnYpLlxuICByZXR1cm4gKFZBTElEX1RJRVJTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKiBHZXQgdGhlIGRlZmF1bHQgbGltaXRzIGZvciBhIGdpdmVuIHRpZXIgKGZhbGxzIGJhY2sgdG8gZGV2ZWxvcGVyKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWVyTGltaXRzKHRpZXI6IHN0cmluZyk6IFF1b3RhVGllckxpbWl0cyB7XG4gIHJldHVybiBpc1ZhbGlkVGllcih0aWVyKSA/IFFVT1RBX1RJRVJTW3RpZXJdLmxpbWl0czogUVVPVEFfVElFUlMuZGV2ZWxvcGVyLmxpbWl0cztcbn1cblxuLyoqXG4gKiBUaGUgcGVyaW9kIChkYXlzKSBldmVyeSB1c2FnZSBjb3VudGVyIHJvbGxzIG92ZXIgb24uIEFsbCBxdW90YXMgYXJlIHBlci1wZXJpb2RcbiAqIEZMT1cgY291bnRlcnMgb24gb25lIHNoYXJlZCBwZXJpb2Q6IHRoZSBxdW90YSBzZXJ2aWNlIHJlc2V0cyBhIGNvdW50ZXIgdGhpc1xuICogbWFueSBkYXlzIGFmdGVyIGl0IGV4cGlyZXMsIGFuZCBwbGF0Zm9ybSBzZWVkcyBhIG5ldyBvcmcncyBjb3VudGVycyB3aXRoIHRoZVxuICogc2FtZSB3aW5kb3cgKGBRVU9UQV9SRVNFVF9EQVlTYCwgZGVmYXVsdCAzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFFVT1RBX1JFU0VUX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX1JFU0VUX0RBWVMnLCAzLCB7IG1pbjogMSB9KTtcblxuLyoqIFRoZSBuZXh0IHF1b3RhIHJlc2V0OiBsb2NhbCBtaWRuaWdodCBgZGF5c2AgZnJvbSBgbm93YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0UXVvdGFSZXNldERhdGUoZGF5czogbnVtYmVyID0gUVVPVEFfUkVTRVRfREFZUywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IERhdGUge1xuICBjb25zdCBkYXRlID0gbmV3IERhdGUobm93KTtcbiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlO1xufVxuIl19
433
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtdGllcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcXVvdGEtdGllcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQXFIMUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRztJQUNyQyxXQUFXLEVBQUU7UUFDWCxhQUFhLEVBQUUsRUFBRTtRQUNqQixLQUFLLEVBQUUsQ0FBQztRQUNSLFlBQVksRUFBRSxDQUFDO1FBQ2Ysb0JBQW9CLEVBQUUsQ0FBQztRQUN2QixnQkFBZ0IsRUFBRSxDQUFDO1FBQ25CLGFBQWEsRUFBRSxFQUFFO0tBQ2xCO0lBQ0QsVUFBVSxFQUFFLEVBQUU7SUFDZCwwQkFBMEIsRUFBRSxDQUFDO0lBQzdCLGlFQUFpRTtJQUNqRSxnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLHdDQUF3QztJQUN4QyxRQUFRLEVBQUUsSUFBSTtJQUNkLCtDQUErQztJQUMvQyxPQUFPLEVBQUUsTUFBTTtDQUNQLENBQUM7QUFFWCw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQWlCLEVBQUUsVUFBVSxHQUFXLENBQUM7SUFDMUUsTUFBTSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFD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RTtJQUN4RixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBlbnZCb29sLCBlbnZJbnQsIGVudlN0ciB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1b3RhVHlwZSB9IGZyb20gJy4vY29tbW9uLmpzJztcblxuLyoqIEF2YWlsYWJsZSBxdW90YSB0aWVyIGlkZW50aWZpZXJzLlxuICpcbiAqIGB1bmxpbWl0ZWRgIGlzIGEgc3BlY2lhbCB0aWVyOiBldmVyeSBxdW90YSBpcyBgLTFgICh1bmNhcHBlZCkgYW5kIGl0IGluY2x1ZGVzXG4gKiBldmVyeSBmZWF0dXJlL2FkZC1vbiBidW5kbGUuIEl0IGlzIHRoZSBERUZBVUxUIHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZCAobm9cbiAqIG1ldGVyaW5nL2VuZm9yY2VtZW50IHN1cmZhY2UgZXhpc3RzLCBzbyBub3RoaW5nIGlzIGNhcHBlZCksIGFuZCBpdCBpcyBORVZFUlxuICogc2hvd24gb3Igc2VsZWN0YWJsZSB3aGVuIGJpbGxpbmcgaXMgZW5hYmxlZCDigJQgc2VlIGBTVEFOREFSRF9USUVSU2AuICovXG5leHBvcnQgdHlwZSBRdW90YVRpZXIgPSAnZGV2ZWxvcGVyJyB8ICdwcm8nIHwgJ3RlYW0nIHwgJ2J1c2luZXNzJyB8ICdlbnRlcnByaXNlJyB8ICd1bmxpbWl0ZWQnO1xuXG4vKiogTGltaXQgdmFsdWVzIGZvciBlYWNoIHF1b3RhIHR5cGUgd2l0aGluIGEgdGllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyTGltaXRzIHtcbiAgcGx1Z2luczogbnVtYmVyO1xuICBwaXBlbGluZXM6IG51bWJlcjtcbiAgYXBpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE1ldGVyZWQgQVBJIGNhbGxzIG1hZGUgYnkgT1JHIFNFUlZJQ0UgQUNDT1VOVFMgKGF1dG9tYXRpb24pLCBjb3VudGVkXG4gICAqIGluc3RlYWQgb2YgYGFwaUNhbGxzYCBzbyBwaXBlbGluZXMgY2FuJ3Qgc3RhcnZlIHRoZSBvcmcncyBwZW9wbGUuIFNlZVxuICAgKiB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvciBob3cgdGhlIGRlZmF1bHRzIGFyZSBkZXJpdmVkLlxuICAgKi9cbiAgYXV0b21hdGlvbkNhbGxzOiBudW1iZXI7XG4gIGFpQ2FsbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFnZ3JlZ2F0ZSByZWdpc3RyeSBzdG9yYWdlIGNhcCBpbiBCWVRFUy4gQ291bnRlZCBhY3Jvc3MgZXZlcnkgcmVwb1xuICAgKiB1bmRlciB0aGUgb3JnJ3MgYG9yZy17b3JnSWR9L2AgbmFtZXNwYWNlLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gICAqIHB1c2gtZ2F0ZSByZWFkcyB0aGlzOyB0aGUgaW1hZ2UtcmVnaXN0cnkgcmVqZWN0cyB0b2tlbiBpc3N1YW5jZSBmb3JcbiAgICogYHB1c2hgIHNjb3BlIHdoZW4gdGhlIG9yZydzIG1lYXN1cmVkIHVzYWdlIGV4Y2VlZHMgdGhlIGxpbWl0LlxuICAgKi9cbiAgc3RvcmFnZUJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiB2Q1BVLU1JTlVURVMgb2YgcGx1Z2luLWJ1aWxkIGNvbXB1dGUgcGVyIE1PTlRIIOKAlCB0aGUgb25lIHF1b3RhIG9uIGEgcGVyaW9kXG4gICAqIG9mIGl0cyBvd24gKGV2ZXJ5IG90aGVyIGZsb3cgcXVvdGEgcm9sbHMgb24gYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpLlxuICAgKlxuICAgKiBEZXJpdmVkIGZyb20gdGhlIGBwbHVnaW5zYCBjYXAgcmF0aGVyIHRoYW4gZ3Vlc3NlZDogYHBsdWdpbnMgeCAxMGAgYnVpbGRzIGFcbiAgICogbW9udGgsIGF0IGEgZmxhdCAzMCB3YWxsLW1pbnV0ZXMgYSBidWlsZCBhbmQgMS41IHZDUFUgb2YgYnVpbGRraXRkLCBzb1xuICAgKiBgY3JlZGl0cyA9IGJ1aWxkcyB4IDQ1YC4gVGhlIGZsYXQgcGVyLWJ1aWxkIGZpZ3VyZSBpcyBkZWxpYmVyYXRlIOKAlCBzY2FsaW5nXG4gICAqIEJPVEggdGhlIGJ1aWxkIGNvdW50IGFuZCB0aGUgcGVyLWJ1aWxkIGNvc3QgYnkgdGllciBtYWRlIGNyZWRpdHNcbiAgICogc3VwZXJsaW5lYXIgaW4gdGllciBvbiB0aGUgc3RyZW5ndGggb2YgYW4gdW5tZWFzdXJlZCBjbGFpbSwgYW5kIGl0IG1hZGUgYVxuICAgKiBwYWNrJ3MgY3JlZGl0IGdyYW50IHRpZXItZGVwZW5kZW50LCB3aGljaCB0aGUgY2F0YWxvZ3VlJ3MgZ3JhbnQgc2hhcGUgY2Fubm90XG4gICAqIGV4cHJlc3MuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGZpcnN0IGRpbWVuc2lvbiB3aXRoIGdlbnVpbmUgcGVyLXVuaXQgbWFyZ2luYWwgY29zdDogZXZlcnkgb3RoZXJcbiAgICogcXVvdGEgaXMgYSByYXRlIGxpbWl0IHByb3RlY3Rpbmcgc2hhcmVkIGluZnJhc3RydWN0dXJlLCB0aGlzIG9uZSBpcyBjb21wdXRlXG4gICAqIHRoZSBwbGF0Zm9ybSBwYXlzIGZvci4gU2VlIGBkb2NzL3BsYW5zL2NwdS1jcmVkaXRzLm1kYC5cbiAgICovXG4gIGNwdUNyZWRpdHM6IG51bWJlcjtcbiAgLyoqIENvdW50LXF1b3RhcyBvbiB0aGUgdXNlci1lZGl0YWJsZSBmZWF0dXJlIHRhYmxlcyBhZGRlZCB0byBjbG9zZSBwZXItb3JnXG4gICAqICBEb1MgdmlhIHNwYW0uIC0xIG1lYW5zIHVubGltaXRlZC4gKi9cbiAgZGFzaGJvYXJkczogbnVtYmVyO1xuICBhbGVydFJ1bGVzOiBudW1iZXI7XG4gIGFsZXJ0RGVzdGluYXRpb25zOiBudW1iZXI7XG4gIGlkcENvbmZpZ3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFjdGl2ZSwgbm9uLXN1c3BlbmRlZCBwbHVnaW4tZWNvc3lzdGVtIGxpc3RpbmdzIHRoZSBvcmcgcHVibGlzaGVzXG4gICAqIChkb2NzL3BsdWdpbi1pbnN0YWxsaW5nLm1kKS4gQSBDT1VOVCBxdW90YSDigJQgaW5zdGFsbHMgbmV2ZXJcbiAgICogY291bnQuIC0xID0gdW5saW1pdGVkLiBFeHRlbmRhYmxlIHZpYSB0aGUgYGxpc3RpbmdfcGFja2AgYWRkLW9uIGJ1bmRsZS5cbiAgICovXG4gIGxpc3RpbmdzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXggb3JnIG1lbWJlcnMgKGFjdGl2ZSB1c2VycyAvIHNlYXRzKS4gLTEgPSB1bmxpbWl0ZWQuIFRoaXMgaXMgdGhlIFwiVGVhbVwiXG4gICAqIHRpZXIgZGlmZmVyZW50aWF0b3Ig4oCUIGVuZm9yY2VkIGF0IG1lbWJlci1pbnZpdGUgdGltZSAoYW4gaW52aXRlIGlzIGJsb2NrZWRcbiAgICogd2hlbiBhY3RpdmUgbWVtYmVycyArIHBlbmRpbmcgaW52aXRlcyB3b3VsZCBleGNlZWQgdGhpcykuXG4gICAqL1xuICBzZWF0czogbnVtYmVyO1xuICAvKipcbiAgICogTWF4IGRlc2lnbmF0ZWQgU1VQUE9SVCBDT05UQUNUUyDigJQgdGhlIG1lbWJlcnMgYXV0aG9yaXNlZCB0byBvcGVuIHN1cHBvcnRcbiAgICogY2FzZXMuIC0xID0gdW5saW1pdGVkLiBCYXNlIGlzICoqMCBvbiBldmVyeSB0aWVyKio6IHN1cHBvcnQgaXMgYW4gYWRkLW9uIGF0XG4gICAqIGV2ZXJ5IHRpZXIgYW5kIGluY2x1ZGVkIGluIG5vbmUsIHNvIGFuIG9yZyB3aXRoIG5vIHN1cHBvcnQgYnVuZGxlIGhhcyBub1xuICAgKiBjb250YWN0cyBhbmQgY2Fubm90IG9wZW4gYSBjYXNlLiBUaGF0IG1ha2VzIHRoZSBzdXBwb3J0IHBheXdhbGwgYSBxdW90YVxuICAgKiBjaGVjayByYXRoZXIgdGhhbiBhIGZlYXR1cmUgZmxhZy5cbiAgICpcbiAgICogTGlrZSBgc2VhdHNgIHRoaXMgaXMgYSB0aWVyIExJTUlULCBub3QgYSB0cmFja2VkIGNvdW50ZXIg4oCUIGVuZm9yY2VkIGxpdmUgYXRcbiAgICogZGVzaWduYXRpb24gdGltZSBhZ2FpbnN0IGN1cnJlbnQgZGVzaWduYXRpb25zIGFjcm9zcyB0aGUgb3JnIHN1YnRyZWUuXG4gICAqIEV4dGVuZGVkIHBlciB1bml0IGJ5IHRoZSBgc3VwcG9ydF9zdGFuZGFyZGAgLyBgc3VwcG9ydF9wcmlvcml0eWAgQkFTRUxJTkVcbiAgICogYnVuZGxlcywgd2hpY2ggYXJlIHByaWNlZCBwZXIgY29udGFjdC5cbiAgICovXG4gIHN1cHBvcnRDb250YWN0czogbnVtYmVyO1xuICAvKipcbiAgICogSG93IG1hbnkgb2YgdGhvc2UgY29udGFjdHMgbWF5IGJlIFVQR1JBREVEIHRvIHByZW1pdW0gKDI0w5c3LCA4LWhvdXJcbiAgICogcmVzcG9uc2UsIGFuZCB0aGUgb25seSBvbmVzIHdobyBtYXkgZGVjbGFyZSBgdXJnZW50YCkuXG4gICAqXG4gICAqIEEgc2Vjb25kIGRpbWVuc2lvbiByYXRoZXIgdGhhbiBhIHRoaXJkIGJhc2VsaW5lIGxldmVsLCBiZWNhdXNlIHByZW1pdW0gaXMgYW5cbiAgICogVVBHUkFERSBhbmQgbm90IGFuIGFsdGVybmF0aXZlLiBUaGUgc2hhcGUgaXQgZW5jb2RlczogYW4gb3JnIGJ1eXMgTiBiYXNlbGluZVxuICAgKiBjb250YWN0cyBhbmQgdXBncmFkZXMgTSBvZiB0aGVtLCBNIOKJpCBOLiBUaGF0IGlzIHdoYXQgbGV0cyBhIDEwMC1zZWF0XG4gICAqIGN1c3RvbWVyIGdpdmUgYnVzaW5lc3MtaG91cnMgc3VwcG9ydCB0byBpdHMgdGhyZWUgbmFtZWQgY29udGFjdHMgYW5kIDI0w5c3XG4gICAqIHRvIHRoZSBvbmUgd2hvIGNhcnJpZXMgdGhlIHBhZ2VyIOKAlCB0aGUgY2FzZSB0aGUgbXV0dWFsbHktZXhjbHVzaXZlIGxhZGRlclxuICAgKiBjb3VsZCBub3QgZXhwcmVzcyBhdCBhbGwsIHdoZXJlIGJ1eWluZyBcIjk5IHN0YW5kYXJkICsgMSBwcmVtaXVtXCIgY2hhcmdlZCBmb3JcbiAgICogMTAwIHVuaXRzIGFuZCBncmFudGVkIG9uZSBjb250YWN0LlxuICAgKlxuICAgKiBBRERJVElWRSwgZGVsaWJlcmF0ZWx5LiBBIHByZW1pdW0gY29udGFjdCBjb3N0cyB0aGUgYmFzZWxpbmUgdW5pdCBQTFVTIHRoZVxuICAgKiB1cGdyYWRlICgkMTkuOTkgKyAkOTkuOTkpLCBiZWNhdXNlIGl0IGlzIHNlcnZlZCBkdXJpbmcgYnVzaW5lc3MgaG91cnNcbiAgICogdGhyb3VnaCB0aGUgYmFzZWxpbmUgYW5kIG92ZXJuaWdodCB0aHJvdWdoIHRoZSB1cGdyYWRlOyBwcmljaW5nIHRoZSB1cGdyYWRlXG4gICAqIGFzIGEgZGVsdGEgd291bGQgcHJldGVuZCB0aGUgYmFzZWxpbmUgd2VyZSBmcmVlLiBCYXNlIDAgb24gZXZlcnkgdGllciwgbGlrZVxuICAgKiBgc3VwcG9ydENvbnRhY3RzYCwgc28gdGhlIHBheXdhbGwgc3RheXMgYSBxdW90YSBjaGVjay5cbiAgICovXG4gIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcG9ydGluZyByZXRlbnRpb24gaW4gREFZUyDigJQgTk9UIGEgZmxvdyBxdW90YSAobmV2ZXIgZGVjcmVtZW50ZWQsIGFic2VudFxuICAgKiBmcm9tIGBWQUxJRF9RVU9UQV9UWVBFU2ApOiB0aGVzZSByaWRlIHRoZSB0aWVyLWJhc2VsaW5lICsgYnVuZGxlLWdyYW50IG1hdGhcbiAgICogcHVyZWx5IGFzIGFuIGVudGl0bGVtZW50IHRoZSBiaWxsaW5nIHNlcnZpY2Ugc3luY3MgdG8gcmVwb3J0aW5nJ3NcbiAgICogYGRvcmFfc2V0dGluZ3NgLiAtMSA9IHVubGltaXRlZCAodGhlIHN3ZWVwIHNraXBzIHRoZSBvcmcgZW50aXJlbHkpLlxuICAgKiAgIGBldmVudFJldGVudGlvbkRheXNgIOKAlCBub24tZGVwbG95IGBwaXBlbGluZV9ldmVudHNgIChTVEFHRS9BQ1RJT04vYnVpbGQpLlxuICAgKiAgIGBkb3JhUmV0ZW50aW9uRGF5c2AgIOKAlCBkZXBsb3kgZXZlbnRzICsgYGRlcGxveW1lbnRfb3V0Y29tZXNgICsgYGluY2lkZW50c2AsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHBlci1vcmcgcmVwb3J0LXF1ZXJ5IHdpbmRvdyBmb3IgRE9SQSByb3V0ZXMuXG4gICAqIEV4dGVuZGFibGUgdmlhIHRoZSBgcmV0ZW50aW9uX3BhY2tgIC8gYGRvcmFfaGlzdG9yeV9wYWNrYCBhZGQtb24gYnVuZGxlcy5cbiAgICovXG4gIGV2ZW50UmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBkb3JhUmV0ZW50aW9uRGF5czogbnVtYmVyO1xufVxuXG4vKiogRnVsbCBwcmVzZXQgZm9yIGEgc2luZ2xlIHRpZXIgKGxhYmVsICsgbGltaXRzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVvdGFUaWVyUHJlc2V0IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgbGltaXRzOiBRdW90YVRpZXJMaW1pdHM7XG59XG5cbi8qKlxuICogUHJlc2V0IGxpbWl0cyBmb3IgZWFjaCB0aWVyLiAtMSBtZWFucyB1bmxpbWl0ZWQuXG4gKlxuICogQUkgY2FsbHMgYXJlIHNpemVkIG11Y2ggc21hbGxlciB0aGFuIGBhcGlDYWxsc2AgYmVjYXVzZSBlYWNoIGNhbGwgaGFzXG4gKiBleHRlcm5hbCBwcm92aWRlciBjb3N0ICh+JDAuMDEkMC4xMC9jYWxsKS4gRGV2ZWxvcGVyIHRpZXIgYWxsb3dzIGxpZ2h0XG4gKiBleHBsb3JhdGlvbiAoNTAvcGVyaW9kKTsgUHJvIGxpZnRzIHRvIDIsNTAwOyBFbnRlcnByaXNlIGlzIGNhcHBlZCBoaWdoXG4gKiAoMjUsMDAwKSDigJQgZmFpci11c2UsIG5vdCBsaXRlcmFsbHkgdW5saW1pdGVkLlxuICpcbiAqIGBzdG9yYWdlQnl0ZXNgIGlzIHRoZSBhZ2dyZWdhdGUgcmVnaXN0cnkgY2FwIHBlciBvcmcuIFNpemVkXG4gKiBhcm91bmQgcGx1Z2luLWltYWdlIHJlYWxpdGllczogYSB0eXBpY2FsIHBsdWdpbiBpbWFnZSBpcyAyMDA1MDAgTUI7XG4gKiBEZXZlbG9wZXIncyAyIEdCIGhvbGRzIH40IHZlcnNpb25zIMOXIH41MDAgTUIsIFBybydzIDI1IEdCIGNvdmVycyBhXG4gKiBtYXR1cmUgY2F0YWxvZy4gT3BlcmF0b3JzIGNhbiBvdmVycmlkZSBwZXItb3JnIHZpYSB0aGUgcXVvdGEgQ1JVRCBBUEkuXG4gKi9cbmNvbnN0IEdCID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyB0aGUgYGF1dG9tYXRpb25DYWxsc2AgZGVmYXVsdHMgYXJlIHNpemVkIOKAlCB3cml0dGVuIGRvd24gc28gdGhlIG5leHRcbiAqIHBlcnNvbiB0byB0b3VjaCB0aGVtIGFyZ3VlcyB3aXRoIHRoZSBhcml0aG1ldGljLCBub3Qgd2l0aCB0aGUgbnVtYmVycy5cbiAqXG4gKiBFdmVyeSBjYWxsIGFuIG9yZydzIGF1dG9tYXRpb24ga2V5cyBtYWtlIGluIG9uZSBwaXBlbGluZSBSVU4sIGl0ZW1pemVkICh0aGVcbiAqIGVhcmxpZXIgc2l6aW5nIGNvdW50ZWQgb25seSB0aGUgcGx1Z2luIGxvb2t1cHMgYW5kIGhhbmQtd2F2ZWQgdGhlIHJlc3QgYXNcbiAqIFwiw5cyXCIpOlxuICpcbiAqICAgcGx1Z2luIGxvb2t1cHMgICAgICAgICAgICAxMiAgIG9uZSBwZXIgcGx1Z2luIHN0ZXAgKHNlbGYtbXV0YXRpbmcgcGlwZWxpbmUpXG4gKiAgIHN5bnRoICAgICAgICAgICAgICAgICAgICAgIDEgICB0aGUgc3ludGggc3RlcCBmZXRjaGluZyB0aGUgcGlwZWxpbmUgY29uZmlnXG4gKiAgIHJ1bnRpbWUgY2hlY2sgICAgICAgICAgICAgIDEgICB0aGUgcHJlLWRlcGxveSBydW50aW1lLWNoZWNrIGNhbGxcbiAqICAgc2VjdXJpdHktcmVwb3J0IHVwbG9hZCAgICAgMSAgIHRoZSBzY2FuIHN0ZXAgcG9zdGluZyBpdHMgcmVwb3J0XG4gKiAgIHJlZ2lzdHJ5IHJlZ2lzdGVyICAgICAgICAgIDEgICBwaXBlbGluZS1yZWdpc3RlciBzdGFtcGluZyB0aGUgZGVwbG95ZWQgdmVyc2lvblxuICogICByZXBvcnRpbmcgaW5nZXN0IGJhdGNoZXMgIDEyICAgdGhlIGV2ZW50IGZvcndhcmRlciBwb3N0cyB+b25lIGJhdGNoIHBlciBhY3Rpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ICAgY2FsbHMgcGVyIHJ1blxuICpcbiAqIFBlciBkZWZhdWx0IHBlcmlvZCAoYFFVT1RBX1JFU0VUX0RBWVNgLCAzIGRheXMpIG9uZSBhY3RpdmUgcGlwZWxpbmUgcnVubmluZ1xuICogaG91cmx5IG1ha2VzIDI4IMOXIDI0IMOXIDMgPSAyLDAxNiBjYWxscy4gQW4gb3JnIGtlZXBzIGZhciBtb3JlIHBpcGVsaW5lcyBhbGl2ZVxuICogdGhhbiBpdCBDUkVBVEVTIGluIGEgcGVyaW9kIChgcGlwZWxpbmVzYCBpcyBhIGNyZWF0aW9uIHJhdGUpLCBzbyBhY3RpdmVcbiAqIHBpcGVsaW5lcyBhcmUgdGFrZW4gYXMgNMOXIHRoZSB0aWVyJ3MgYHBpcGVsaW5lc2AuIE9uIHRvcCBzaXRzIGEgcGVyLU9SR1xuICogY29uc3RhbnQgdGhhdCBkb2VzIG5vdCBzY2FsZSB3aXRoIHBpcGVsaW5lczogdGhlIGluZ2VzdC1oZWFsdGggaGVhcnRiZWF0XG4gKiAo4omkIDEvbWludXRlIOKGkiAxLDQ0MC9kYXkg4oaSIDQsMzIwL3BlcmlvZCkuIFRoZSBzdW0gZ2V0cyAyNSUgaGVhZHJvb20gKHJldHJpZXMsXG4gKiByZWdpc3RyeSBwdXNoZXMsIGFkLWhvYyBDSSBzY3JpcHRzIG9uIGtleXMpIGFuZCByb3VuZHMgVVAgdG8gdGhlIG5leHQgMTAsMDAwOlxuICpcbiAqICAgZGV2ZWxvcGVyICAgMsOXNMOXMjAxNiArIDQzMjAgPSAgMjAsNDQ4IMOXIDEuMjUgPSAgMjUsNTYwIOKGkiAgMzAsMDAwXG4gKiAgIHBybyAgICAgICAgIDXDlzTDlzIwMTYgKyA0MzIwID0gIDQ0LDY0MCDDlyAxLjI1ID0gIDU1LDgwMCDihpIgIDYwLDAwMFxuICogICB0ZWFtICAgICAgIDEww5c0w5cyMDE2ICsgNDMyMCA9ICA4NCw5NjAgw5cgMS4yNSA9IDEwNiwyMDAg4oaSIDExMCwwMDBcbiAqICAgYnVzaW5lc3MgICAyMMOXNMOXMjAxNiArIDQzMjAgPSAxNjUsNjAwIMOXIDEuMjUgPSAyMDcsMDAwIOKGkiAyMTAsMDAwXG4gKiAgIGVudGVycHJpc2UgMzDDlzTDlzIwMTYgKyA0MzIwID0gMjQ2LDI0MCDDlyAxLjI1ID0gMzA3LDgwMCDihpIgMzEwLDAwMFxuICpcbiAqIHtAbGluayBhdXRvbWF0aW9uQ2FsbHNGb3J9IGNvbXB1dGVzIGV4YWN0bHkgdGhpcywgYW5kIHRoZSB0aWVyIHRlc3RzIGhvbGQgdGhlXG4gKiB0YWJsZSB0byBpdC4gT3ZlciB0aGUgY2FwIHRoZSA0MjkgaXMgU09GVCBmb3IgYSBiYW5kICh7QGxpbmsgcXVvdGFHcmFjZVBjdH0pOlxuICogYSBzZWxmLW11dGF0aW5nIHBpcGVsaW5lIHRoYXQgaGFyZC1zdG9wcGVkIGF0IDEwMCUgc3RheWVkIHN0b3BwZWQgdW50aWwgdGhlXG4gKiBwZXJpb2QgcmVzZXQsIHVwIHRvIDMgZGF5cy4gVGhlIGxpbWl0cyBhcmUgUEVSIFBFUklPRDogYW4gb3BlcmF0b3Igd2hvXG4gKiBsZW5ndGhlbnMgYFFVT1RBX1JFU0VUX0RBWVNgIHNob3VsZCBzY2FsZSBgUVVPVEFfVElFUl88VElFUj5fQVVUT01BVElPTl9DQUxMU2BcbiAqIGJ5IHRoZSBzYW1lIGZhY3Rvci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFVVE9NQVRJT05fQ0FMTFNfU0laSU5HID0ge1xuICBjYWxsc1BlclJ1bjoge1xuICAgIHBsdWdpbkxvb2t1cHM6IDEyLFxuICAgIHN5bnRoOiAxLFxuICAgIHJ1bnRpbWVDaGVjazogMSxcbiAgICBzZWN1cml0eVJlcG9ydFVwbG9hZDogMSxcbiAgICByZWdpc3RyeVJlZ2lzdGVyOiAxLFxuICAgIGluZ2VzdEJhdGNoZXM6IDEyLFxuICB9LFxuICBydW5zUGVyRGF5OiAyNCxcbiAgYWN0aXZlUGlwZWxpbmVzUGVyQ3JlYXRpb246IDQsXG4gIC8qKiBJbmdlc3QtaGVhbHRoIGhlYXJ0YmVhdHMgcGVyIG9yZyBwZXIgZGF5ICjiiaQgb25lIGEgbWludXRlKS4gKi9cbiAgaGVhcnRiZWF0c1BlckRheTogMTQ0MCxcbiAgLyoqIE11bHRpcGxpZXIgb24gdGhlIGl0ZW1pemVkIHRvdGFsLiAqL1xuICBoZWFkcm9vbTogMS4yNSxcbiAgLyoqIERlZmF1bHRzIHJvdW5kIFVQIHRvIGEgbXVsdGlwbGUgb2YgdGhpcy4gKi9cbiAgcm91bmRUbzogMTBfMDAwLFxufSBhcyBjb25zdDtcblxuLyoqIFRoZSB7QGxpbmsgQVVUT01BVElPTl9DQUxMU19TSVpJTkd9IGZvcm11bGEgZm9yIGEgdGllciBjcmVhdGluZyBgcGlwZWxpbmVzYCBwZXIgcGVyaW9kLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dG9tYXRpb25DYWxsc0ZvcihwaXBlbGluZXM6IG51bWJlciwgcGVyaW9kRGF5czogbnVtYmVyID0gMyk6IG51bWJlciB7XG4gIGNvbnN0IHMgPSBBVVRPTUFUSU9OX0NBTExTX1NJWklORztcbiAgY29uc3QgcGVyUnVuID0gT2JqZWN0LnZhbHVlcyhzLmNhbGxzUGVyUnVuKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgY29uc3QgcGVyUGlwZWxpbmUgPSBwZXJSdW4gKiBzLnJ1bnNQZXJEYXkgKiBwZXJpb2REYXlzO1xuICBjb25zdCB0b3RhbCA9IChwaXBlbGluZXMgKiBzLmFjdGl2ZVBpcGVsaW5lc1BlckNyZWF0aW9uICogcGVyUGlwZWxpbmUgKyBzLmhlYXJ0YmVhdHNQZXJEYXkgKiBwZXJpb2REYXlzKSAqIHMuaGVhZHJvb207XG4gIHJldHVybiBNYXRoLmNlaWwodG90YWwgLyBzLnJvdW5kVG8pICogcy5yb3VuZFRvO1xufVxuXG4vKipcbiAqIFRoZSBTT0ZUIGJhbmQgYWJvdmUgYSBxdW90YSdzIGNhcCwgcGVyIHR5cGUsIGluIHBlcmNlbnQgb2YgdGhlIGxpbWl0LiBBIHR5cGVcbiAqIGFic2VudCBmcm9tIHRoaXMgbWFwIGhhcyBOTyBiYW5kIGFuZCBzdG9wcyBoYXJkIGF0IDEwMCUuXG4gKlxuICogQXQgMTAwJSB0aGUgYWNjb3VudCBnZXRzIHRoZSBcInJlYWNoZWRcIiBub3RpY2UgYW5kIGtlZXBzIHJ1bm5pbmc7IHRoZSByZWZ1c2FsXG4gKiBzdGFydHMgb25seSBwYXN0IGBsaW1pdCDDlyAoMTAwICsgcGN0KSAvIDEwMGAuIFJlYWRzIHN0aWxsIFJFUE9SVCB0aGUgbm9taW5hbFxuICogbGltaXQsIHNvIHVzYWdlIHNob3dzIGFib3ZlIDEwMCUgd2hpbGUgaW5zaWRlIHRoZSBiYW5kLlxuICpcbiAqIFR3byB0eXBlcyBxdWFsaWZ5LCBmb3IgdGhlIHNhbWUgcmVhc29uIHN0YXRlZCB0d28gd2F5cyDigJQgYSBoYXJkIHN0b3AgZXhhY3RseVxuICogYXQgMTAwJSBpcyB3b3JzZSB0aGFuIGEgc2hvcnQgb3ZlcnJ1biB3aGVuIHRoZSBjYWxsZXIgY2Fubm90IHNpbXBseSB3YWl0OlxuICpcbiAqIC0gYGF1dG9tYXRpb25DYWxsc2AgKGBRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVGApOiB0aGUgY2FsbGVyIGlzIGEgcGlwZWxpbmVcbiAqICAgbWlkLWRlcGxveSwgbm90IGEgcGVyc29uLCBhbmQgdGhlIGNvdW50ZXIgd291bGQgc3RheSBmdWxsIGZvciB0aGUgcmVzdCBvZlxuICogICB0aGUgcGVyaW9kLlxuICogLSBgc3RvcmFnZUJ5dGVzYCAoYFFVT1RBX1NUT1JBR0VfR1JBQ0VfUENUYCk6IHN0b3JhZ2UgaXMgYSBTVE9DSyDigJQgaXQgZG9lc1xuICogICBub3QgcmVzZXQsIHNvIHdpdGhvdXQgYSBiYW5kIGEgZG93bmdyYWRlIG9yIGEgY2FuY2VsbGVkIHBhY2sgZmxpcHMgYW5cbiAqICAgYWNjb3VudCBmcm9tIHdvcmtpbmcgdG8gcmVmdXNlZCB3aXRoIG5vIGJ1ZmZlciBhdCBhbGwsIGFuZCB0aGUgcmVtZWR5XG4gKiAgIChwcnVuZSwgb3IgYnV5IGNhcGFjaXR5KSB0YWtlcyB0aW1lIHRoZSBiYW5kIGlzIHRoZXJlIHRvIHByb3ZpZGUuIE5vdGUgdGhlXG4gKiAgIGJhbmQgb24gYSBzdG9jayBpcyBhIE9ORS1USU1FIGJ1ZmZlciByYXRoZXIgdGhhbiBhIHBlci1wZXJpb2Qgb25lOyB0aGF0IGlzXG4gKiAgIGl0cyBwdXJwb3NlIGhlcmUsIG5vdCBhIGxpbWl0YXRpb24gb2YgaXQuXG4gKlxuICogRXZlcnkgb3RoZXIgdHlwZSBzdGF5cyBoYXJkLiBUaGlzIHdhcyBhIGhhcmRjb2RlZCBgcXVvdGFUeXBlICE9PVxuICogJ2F1dG9tYXRpb25DYWxscydgIGNvbXBhcmlzb24sIHdoaWNoIGlzIHdoeSBzdG9yYWdlIGhhZCBub3RoaW5nOiB0aGVcbiAqIG1lY2hhbmlzbSBleGlzdGVkIGFuZCBvbmx5IHRoZSBwcmVkaWNhdGUgZXhjbHVkZWQgaXQuXG4gKi9cbmNvbnN0IFFVT1RBX0dSQUNFX1BDVDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7XG4gIGF1dG9tYXRpb25DYWxsczogZW52SW50KCdRVU9UQV9BVVRPTUFUSU9OX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG4gIHN0b3JhZ2VCeXRlczogZW52SW50KCdRVU9UQV9TVE9SQUdFX0dSQUNFX1BDVCcsIDEwLCB7IG1pbjogMCwgbWF4OiAxMDAgfSksXG59O1xuXG4vKiogVGhlIHNvZnQgYmFuZCBmb3IgYHF1b3RhVHlwZWAgaW4gcGVyY2VudCwgb3IgMCBmb3IgYSB0eXBlIHRoYXQgc3RvcHMgaGFyZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdW90YUdyYWNlUGN0KHF1b3RhVHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIFFVT1RBX0dSQUNFX1BDVFtxdW90YVR5cGVdID8/IDA7XG59XG5cbi8qKlxuICogVGhlIGxpbWl0IGVuZm9yY2VtZW50IGFjdHVhbGx5IGJpbmRzIG9uIGZvciBgcXVvdGFUeXBlYDogdGhlIG5vbWluYWwgbGltaXQsXG4gKiBwbHVzIHRoZSB0eXBlJ3Mge0BsaW5rIHF1b3RhR3JhY2VQY3R9IGJhbmQgd2hlcmUgaXQgaGFzIG9uZS4gVW5saW1pdGVkICgtMSlcbiAqIGFuZCB6ZXJvIChcIm5vbmVcIikgbGltaXRzIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQg4oCUIGEgMCBjYXAgaXMgYSBkZWxpYmVyYXRlXG4gKiByZWZ1c2FsLCBub3QgYSBidWRnZXQgdG8gb3ZlcnJ1bi5cbiAqXG4gKiB7QGxpbmsgUVVPVEFfR1JBQ0VfUENUfSBkZWNpZGVzIFdIRVRIRVIgYSB0eXBlIGhhcyBhIGJhbmQ7IGBncmFjZVBjdGAgb25seVxuICogc2l6ZXMgaXQuIFNvIGFuIGV4cGxpY2l0IHBlcmNlbnRhZ2UgcGFzc2VkIGZvciBhbiB1bmJhbmRlZCB0eXBlIHN0aWxsIHlpZWxkc1xuICogdGhlIG5vbWluYWwgbGltaXQsIHJhdGhlciB0aGFuIHF1aWV0bHkgZ3JhbnRpbmcgYSBiYW5kIHRoZSB0eXBlIGlzIG5vdCBtZWFudFxuICogdG8gaGF2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuZm9yY2VkUXVvdGFMaW1pdChxdW90YVR5cGU6IHN0cmluZywgbGltaXQ6IG51bWJlciwgZ3JhY2VQY3Q6IG51bWJlciA9IHF1b3RhR3JhY2VQY3QocXVvdGFUeXBlKSk6IG51bWJlciB7XG4gIGlmIChsaW1pdCA8PSAwIHx8IGdyYWNlUGN0IDw9IDAgfHwgcXVvdGFHcmFjZVBjdChxdW90YVR5cGUpIDw9IDApIHJldHVybiBsaW1pdDtcbiAgcmV0dXJuIE1hdGguZmxvb3IoKGxpbWl0ICogKDEwMCArIGdyYWNlUGN0KSkgLyAxMDApO1xufVxuXG4vKipcbiAqIENvZGUtZGVmYXVsdCBsaW1pdHMgcGVyIHRpZXIg4oCUIHRoZSBmYWxsYmFjayB3aGVuIG5vIGVudiBvdmVycmlkZSBpcyBzZXQuXG4gKiAtMSBtZWFucyB1bmxpbWl0ZWQuIChDb3VudHMgc2l6ZWQgdG8gXCJjb21mb3J0YWJseSBlbm91Z2ggZm9yIG9uZSB0ZWFtLCBub3RcbiAqIHNjcmlwdCBzcGFtXCI6IDIwIGRhc2hib2FyZHMsIDUwIGFsZXJ0IHJ1bGVzLCAxMCBkZXN0aW5hdGlvbnMsIDEgSWRQIGNvbmZpZ1xuICogZm9yIERldmVsb3Blcjsgc2NhbGVkIHVwIGZvciBQcm87IC0xICh1bmNhcHBlZCkgZm9yIHRoZSBjaGVhcCBjb3VudC1xdW90YXNcbiAqIG9uIFRlYW0vRW50ZXJwcmlzZSB3aGlsZSBjb3N0LWRyaXZpbmcgcXVvdGFzIOKAlCBpbmNsLiBhcGlDYWxscyDigJQgc3RheSBmaW5pdGUuKVxuICovXG5jb25zdCBERUZBVUxUX1RJRVJfTElNSVRTOiBSZWNvcmQ8UXVvdGFUaWVyLCBRdW90YVRpZXJMaW1pdHM+ID0ge1xuICAvLyBGcmVlIHRpZXI6IHNpbmdsZSBzZWF0LCAyIHBpcGVsaW5lcywgYXBpQ2FsbHMgQ0FQUEVEICh3YXMgdW5saW1pdGVkIOKAlCBhXG4gIC8vIERvUy9hYnVzZSBob2xlIG9uIGEgc2hhcmVkIHJlc291cmNlKTsgYWlDYWxscyBzbWFsbCAoZWFjaCBoYXMgfiQwLjAxLTAuMTBcbiAgLy8gZXh0ZXJuYWwgY29zdCkuIExlYW4gYmFzZSDigJQgZ3Jvd3RoIGhhcHBlbnMgYnkgdXBncmFkaW5nLCBub3Qgc3RhY2tpbmcgaGVyZS5cbiAgZGV2ZWxvcGVyOiB7XG4gICAgcGx1Z2luczogMTAsXG4gICAgcGlwZWxpbmVzOiAyLFxuICAgIGFwaUNhbGxzOiAyNV8wMDAsXG4gICAgYXV0b21hdGlvbkNhbGxzOiAzMF8wMDAsXG4gICAgYWlDYWxsczogMjAsXG4gICAgY3B1Q3JlZGl0czogNF81MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyICogR0IsXG4gICAgZGFzaGJvYXJkczogMjAsXG4gICAgYWxlcnRSdWxlczogNTAsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IDEwLFxuICAgIGlkcENvbmZpZ3M6IDEsXG4gICAgbGlzdGluZ3M6IDMsXG4gICAgc2VhdHM6IDEsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBQcm8gPSBpbmRpdmlkdWFsIHBvd2VyIHVzZXIsIHNpbmdsZSBzZWF0LCBpbmRpdmlkdWFsIHByaWNpbmcuIEEgMm5kIHNlYXQgKG9yXG4gIC8vIHRlYW0gY29sbGFib3JhdGlvbikgcmVxdWlyZXMgdGhlIFRlYW0gdGllciDigJQgdGhlIGBzZWF0YCBhZGQtb24gaXMgVGVhbSsgb25seSxcbiAgLy8ga2VlcGluZyBUZWFtIHRoZSBjb2xsYWJvcmF0aW9uIHRpZXIuIFBybydzIHZhbHVlIG92ZXIgRGV2ZWxvcGVyIGlzIGl0cyByaWNoZXJcbiAgLy8gY2FsbC9zdG9yYWdlL3BsdWdpbiBjZWlsaW5ncyArIGZlYXR1cmUgYWRkLW9ucyAoU1NPL2F1ZGl0L0RPUkEpLCBub3Qgc2VhdHMuXG4gIHBybzoge1xuICAgIHBsdWdpbnM6IDI1LFxuICAgIHBpcGVsaW5lczogNSxcbiAgICBhcGlDYWxsczogMTAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDYwXzAwMCxcbiAgICBhaUNhbGxzOiAyMDAsXG4gICAgY3B1Q3JlZGl0czogMTFfMjUwLFxuICAgIHN0b3JhZ2VCeXRlczogMjUgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAyMDAsXG4gICAgYWxlcnRSdWxlczogNTAwLFxuICAgIGFsZXJ0RGVzdGluYXRpb25zOiA1MCxcbiAgICBpZHBDb25maWdzOiA1LFxuICAgIGxpc3RpbmdzOiAxMCxcbiAgICBzZWF0czogMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IDAsXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogMCxcbiAgICBldmVudFJldGVudGlvbkRheXM6IDMwLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiAxODAsXG4gIH0sXG4gIC8vIFRlYW0gPSBjb2xsYWJvcmF0aW9uIHRpZXI7IHRoZSBzZWF0IGxpbWl0ICgzKSBpcyB0aGUgcmVhbCBkaWZmZXJlbnRpYXRvciBvdmVyXG4gIC8vIFBybyAoc2luZ2xlLXNlYXQpIOKAlCBpdCdzIHRoZSBtdWx0aS1zZWF0IGNvbGxhYm9yYXRpb24gZmxvb3IuIExlYW4gYmFzZSAoJDc5KTpcbiAgLy8gZ3Jvd3RoIHJpZGVzIHRoZSBzZWF0L3BpcGVsaW5lL2V0YyBhZGQtb25zIChsYW5kLWFuZC1leHBhbmQpLiBMaW1pdHMgc2l0XG4gIC8vIGJldHdlZW4gUHJvIGFuZCBFbnRlcnByaXNlLlxuICB0ZWFtOiB7XG4gICAgcGx1Z2luczogNTAsXG4gICAgcGlwZWxpbmVzOiAxMCxcbiAgICBhcGlDYWxsczogMzAwXzAwMCxcbiAgICBhdXRvbWF0aW9uQ2FsbHM6IDExMF8wMDAsXG4gICAgYWlDYWxsczogNjAwLFxuICAgIGNwdUNyZWRpdHM6IDIyXzUwMCxcbiAgICBzdG9yYWdlQnl0ZXM6IDYwICogR0IsXG4gICAgZGFzaGJvYXJkczogLTEsXG4gICAgYWxlcnRSdWxlczogLTEsXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IC0xLFxuICAgIGlkcENvbmZpZ3M6IDUsXG4gICAgbGlzdGluZ3M6IDI1LFxuICAgIHNlYXRzOiAzLFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gQnVzaW5lc3MgKCQyNDkpOiB0aGUgc3RlcCB0aGUgJDc5IC0+ICQ1OTkgY2xpZmYgd2FzIG1pc3NpbmcuIDggc2VhdHMsIDIwXG4gIC8vIHBpcGVsaW5lcywgYW5kIERPUkEgKGFkdmFuY2VkX3JlcG9ydGluZykgaW5jbHVkZWQgcmF0aGVyIHRoYW4gYW4gYWRkLW9uLlxuICAvLyBFdmVyeSBjb3N0IGRyaXZlciBpcyAxMDAsMDAwIGFwaUNhbGxzIGFuZCAyMDAgYWlDYWxscyBQRVIgU0VBVCwgdGhlIHNhbWVcbiAgLy8gcGVyLXNlYXQgcmF0ZSBhcyBQcm8vVGVhbS9FbnRlcnByaXNlLCBzbyB0aGUgbGFkZGVyIHJlYWRzIGNvbnNpc3RlbnRseSB0byBhXG4gIC8vIGJ1eWVyIHdobyBkaXZpZGVzIGJ5IGhlYWRjb3VudC4gQ291bnQtcXVvdGFzIHRoYXQgVGVhbSBhbHJlYWR5IHVuY2FwcyBzdGF5XG4gIC8vIC0xOyBgaWRwQ29uZmlnc2Agc2l0cyBiZXR3ZWVuIFRlYW0ncyA1IGFuZCBFbnRlcnByaXNlJ3MgdW5saW1pdGVkLlxuICBidXNpbmVzczoge1xuICAgIHBsdWdpbnM6IDEwMCxcbiAgICBwaXBlbGluZXM6IDIwLFxuICAgIGFwaUNhbGxzOiA4MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMjEwXzAwMCxcbiAgICBhaUNhbGxzOiAxXzYwMCxcbiAgICBjcHVDcmVkaXRzOiA0NV8wMDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAxMjAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogMTAsXG4gICAgbGlzdGluZ3M6IDUwLFxuICAgIHNlYXRzOiA4LFxuICAgIHN1cHBvcnRDb250YWN0czogMCxcbiAgICBzdXBwb3J0UHJlbWl1bUNvbnRhY3RzOiAwLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogMzAsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IDE4MCxcbiAgfSxcbiAgLy8gRW50ZXJwcmlzZSAoJDU5OSwgaGVsZCk6IHRoZSBhbGwtaW5jbHVzaXZlIHRpZXIg4oCUIDE1IHNlYXRzLCAzMCBwaXBlbGluZXMsIEFMTFxuICAvLyBwcmVtaXVtIGZlYXR1cmVzIGluY2x1ZGVkIChzZWUgVElFUl9GRUFUVVJFUykuIEZBSVItVVNFIOKAlCBjb3N0IGRyaXZlcnMgKGFwaUNhbGxzLFxuICAvLyBhaUNhbGxzLCBzdG9yYWdlQnl0ZXMpIGNhcHBlZCBzbyBvbmUgYWNjb3VudCBjYW4ndCBydW4gdXAgdW5ib3VuZGVkXG4gIC8vIGNvbXB1dGUvcHJvdmlkZXIvc3RvcmFnZSBjb3N0IG9uIGEgZmxhdCBwcmljZTsgY2hlYXAgY291bnQtcXVvdGFzIHN0YXkgLTEuXG4gIGVudGVycHJpc2U6IHtcbiAgICBwbHVnaW5zOiAxNTAsXG4gICAgcGlwZWxpbmVzOiAzMCxcbiAgICBhcGlDYWxsczogMV81MDBfMDAwLFxuICAgIGF1dG9tYXRpb25DYWxsczogMzEwXzAwMCxcbiAgICBhaUNhbGxzOiAzXzAwMCxcbiAgICBjcHVDcmVkaXRzOiA2N181MDAsXG4gICAgc3RvcmFnZUJ5dGVzOiAyNTAgKiBHQixcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IDEwMCxcbiAgICBzZWF0czogMTUsXG4gICAgc3VwcG9ydENvbnRhY3RzOiAwLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IDAsXG4gICAgZXZlbnRSZXRlbnRpb25EYXlzOiAzMCxcbiAgICBkb3JhUmV0ZW50aW9uRGF5czogMTgwLFxuICB9LFxuICAvLyBVbmxpbWl0ZWQ6IEVWRVJZIHF1b3RhIHVuY2FwcGVkICgtMSkuIFRoZSBkZWZhdWx0IHdoZW4gYmlsbGluZyBpcyBkaXNhYmxlZFxuICAvLyAobm8gZW5mb3JjZW1lbnQgc3VyZmFjZSkg4oCUIG5ldmVyIHNob3duL3NlbGVjdGFibGUgd2hlbiBiaWxsaW5nIGlzIGVuYWJsZWQuXG4gIHVubGltaXRlZDoge1xuICAgIHBsdWdpbnM6IC0xLFxuICAgIHBpcGVsaW5lczogLTEsXG4gICAgYXBpQ2FsbHM6IC0xLFxuICAgIGF1dG9tYXRpb25DYWxsczogLTEsXG4gICAgYWlDYWxsczogLTEsXG4gICAgY3B1Q3JlZGl0czogLTEsXG4gICAgc3RvcmFnZUJ5dGVzOiAtMSxcbiAgICBkYXNoYm9hcmRzOiAtMSxcbiAgICBhbGVydFJ1bGVzOiAtMSxcbiAgICBhbGVydERlc3RpbmF0aW9uczogLTEsXG4gICAgaWRwQ29uZmlnczogLTEsXG4gICAgbGlzdGluZ3M6IC0xLFxuICAgIHNlYXRzOiAtMSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IC0xLFxuICAgIHN1cHBvcnRQcmVtaXVtQ29udGFjdHM6IC0xLFxuICAgIGV2ZW50UmV0ZW50aW9uRGF5czogLTEsXG4gICAgZG9yYVJldGVudGlvbkRheXM6IC0xLFxuICB9LFxufTtcblxuLyoqXG4gKiBSZWFkIGEgdGllciBMSU1JVCBlbnYgdmFyLiBgLTFgID0gdW5saW1pdGVkOyBhbnl0aGluZyBiZWxvdyB0aGF0IGlzIG5vbnNlbnNlXG4gKiAoYSBgLTVgIGxpbWl0IHdvdWxkIHNoaXAgYSBicm9rZW4gZmluaXRlIGNhcCksIHNvIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNvZGVcbiAqIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2xhbXBpbmcgdXAgdG8gYC0xYC4gVGhlIHBhcnNpbmcgaXRzZWxmIGlzIGFwaS1jb3JlJ3NcbiAqIHNoYXJlZCBgZW52SW50YCDigJQgc3RyaWN0IGFib3V0IGRlY2ltYWxzL2dhcmJhZ2Ug4oCUIG5vdCBhIGxvY2FsIHJlLWRlcml2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIHRpZXJMaW1pdEVudihuYW1lOiBzdHJpbmcsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gZW52SW50KG5hbWUsIGZhbGxiYWNrKTtcbiAgcmV0dXJuIG4gPCAtMSA/IGZhbGxiYWNrIDogbjtcbn1cblxuLyoqXG4gKiBQZXItdGllciBsaW1pdHMsIGVhY2ggb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl88TElNSVQ+YCBlbnYgdmFyc1xuICogKGUuZy4gYFFVT1RBX1RJRVJfUFJPX1BJUEVMSU5FUz0yNTBgLCBgUVVPVEFfVElFUl9ERVZFTE9QRVJfU1RPUkFHRV9CWVRFUz0uLi5gKS5cbiAqIFVuc2V0L2VtcHR5IOKGkiB0aGUgY29kZSBkZWZhdWx0LiBgLTFgID0gdW5saW1pdGVkLiBSZWFkIG9uY2UgYXQgbW9kdWxlIGxvYWQg4oCUXG4gKiBvbiBrOHMgdGhlc2UgZmxvdyBpbiB2aWEgdGhlIGBhcHAtZW52YCBDb25maWdNYXAgKGJ1aWx0IGZyb20gYC5lbnZgKS5cbiAqL1xuZnVuY3Rpb24gdGllckxpbWl0cyh0aWVyOiBRdW90YVRpZXIpOiBRdW90YVRpZXJMaW1pdHMge1xuICAvLyBgdW5saW1pdGVkYCBpcyB1bmNhcHBlZCBCWSBERUZJTklUSU9OOiBFVkVSWSBxdW90YSBpcyAtMSBhbmQgaXQgaXMgTk9UXG4gIC8vIGVudi1vdmVycmlkYWJsZS4gUmVhZGluZyBRVU9UQV9USUVSX1VOTElNSVRFRF8qIGhlcmUgd291bGQgbGV0IGEgc3RyYXkgZW52XG4gIC8vIHZhciBzaWxlbnRseSBjYXAgdGhlIGJpbGxpbmctRElTQUJMRUQgZGVmYXVsdCB0aWVyIOKAlCBzdXJmYWNpbmcgYXMgYSBzcHVyaW91c1xuICAvLyBcInF1b3RhIGV4Y2VlZGVkXCIgb24gYSBkZXBsb3kgdGhhdCBtZXRlcnMgbm90aGluZy4gRGVyaXZlIC0xIGZvciBldmVyeSBmaWVsZFxuICAvLyBmcm9tIHRoZSBsaW1pdHMgc2hhcGUgc28gYSBuZXdseS1hZGRlZCBxdW90YSBpcyB1bmNhcHBlZCBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gIGlmICh0aWVyID09PSAndW5saW1pdGVkJykge1xuICAgIGNvbnN0IHVuY2FwcGVkID0geyAuLi5ERUZBVUxUX1RJRVJfTElNSVRTLnVubGltaXRlZCB9O1xuICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh1bmNhcHBlZCkgYXMgKGtleW9mIFF1b3RhVGllckxpbWl0cylbXSkgdW5jYXBwZWRba10gPSAtMTtcbiAgICByZXR1cm4gdW5jYXBwZWQ7XG4gIH1cbiAgY29uc3QgZCA9IERFRkFVTFRfVElFUl9MSU1JVFNbdGllcl07XG4gIGNvbnN0IFQgPSB0aWVyLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiB7XG4gICAgcGx1Z2luczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fUExVR0lOU2AsIGQucGx1Z2lucyksXG4gICAgcGlwZWxpbmVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9QSVBFTElORVNgLCBkLnBpcGVsaW5lcyksXG4gICAgYXBpQ2FsbHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FQSV9DQUxMU2AsIGQuYXBpQ2FsbHMpLFxuICAgIGF1dG9tYXRpb25DYWxsczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fQVVUT01BVElPTl9DQUxMU2AsIGQuYXV0b21hdGlvbkNhbGxzKSxcbiAgICBhaUNhbGxzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BSV9DQUxMU2AsIGQuYWlDYWxscyksXG4gICAgc3RvcmFnZUJ5dGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9TVE9SQUdFX0JZVEVTYCwgZC5zdG9yYWdlQnl0ZXMpLFxuICAgIGNwdUNyZWRpdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0NQVV9DUkVESVRTYCwgZC5jcHVDcmVkaXRzKSxcbiAgICBkYXNoYm9hcmRzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9EQVNIQk9BUkRTYCwgZC5kYXNoYm9hcmRzKSxcbiAgICBhbGVydFJ1bGVzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9BTEVSVF9SVUxFU2AsIGQuYWxlcnRSdWxlcyksXG4gICAgYWxlcnREZXN0aW5hdGlvbnM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0FMRVJUX0RFU1RJTkFUSU9OU2AsIGQuYWxlcnREZXN0aW5hdGlvbnMpLFxuICAgIGlkcENvbmZpZ3M6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0lEUF9DT05GSUdTYCwgZC5pZHBDb25maWdzKSxcbiAgICBsaXN0aW5nczogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fTElTVElOR1NgLCBkLmxpc3RpbmdzKSxcbiAgICBzZWF0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU0VBVFNgLCBkLnNlYXRzKSxcbiAgICBzdXBwb3J0Q29udGFjdHM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X1NVUFBPUlRfQ09OVEFDVFNgLCBkLnN1cHBvcnRDb250YWN0cyksXG4gICAgc3VwcG9ydFByZW1pdW1Db250YWN0czogdGllckxpbWl0RW52KGBRVU9UQV9USUVSXyR7VH1fU1VQUE9SVF9QUkVNSVVNX0NPTlRBQ1RTYCwgZC5zdXBwb3J0UHJlbWl1bUNvbnRhY3RzKSxcbiAgICBldmVudFJldGVudGlvbkRheXM6IHRpZXJMaW1pdEVudihgUVVPVEFfVElFUl8ke1R9X0VWRU5UX1JFVEVOVElPTl9EQVlTYCwgZC5ldmVudFJldGVudGlvbkRheXMpLFxuICAgIGRvcmFSZXRlbnRpb25EYXlzOiB0aWVyTGltaXRFbnYoYFFVT1RBX1RJRVJfJHtUfV9ET1JBX1JFVEVOVElPTl9EQVlTYCwgZC5kb3JhUmV0ZW50aW9uRGF5cyksXG4gIH07XG59XG5cbi8vIExhYmVscyBhcmUgb3ZlcnJpZGFibGUgdmlhIGBRVU9UQV9USUVSXzxUSUVSPl9MQUJFTGAgKGRpc3BsYXkgbmFtZSBvbmx5KS5cbmV4cG9ydCBjb25zdCBRVU9UQV9USUVSUzogUmVjb3JkPFF1b3RhVGllciwgUXVvdGFUaWVyUHJlc2V0PiA9IHtcbiAgZGV2ZWxvcGVyOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfREVWRUxPUEVSX0xBQkVMJywgJ0RldmVsb3BlcicpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ2RldmVsb3BlcicpIH0sXG4gIHBybzogeyBsYWJlbDogZW52U3RyKCdRVU9UQV9USUVSX1BST19MQUJFTCcsICdQcm8nKSwgbGltaXRzOiB0aWVyTGltaXRzKCdwcm8nKSB9LFxuICB0ZWFtOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVEVBTV9MQUJFTCcsICdUZWFtJyksIGxpbWl0czogdGllckxpbWl0cygndGVhbScpIH0sXG4gIGJ1c2luZXNzOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfQlVTSU5FU1NfTEFCRUwnLCAnQnVzaW5lc3MnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdidXNpbmVzcycpIH0sXG4gIGVudGVycHJpc2U6IHsgbGFiZWw6IGVudlN0cignUVVPVEFfVElFUl9FTlRFUlBSSVNFX0xBQkVMJywgJ0VudGVycHJpc2UnKSwgbGltaXRzOiB0aWVyTGltaXRzKCdlbnRlcnByaXNlJykgfSxcbiAgdW5saW1pdGVkOiB7IGxhYmVsOiBlbnZTdHIoJ1FVT1RBX1RJRVJfVU5MSU1JVEVEX0xBQkVMJywgJ1VubGltaXRlZCcpLCBsaW1pdHM6IHRpZXJMaW1pdHMoJ3VubGltaXRlZCcpIH0sXG59O1xuXG4vKiogQWxsIHZhbGlkIHRpZXIgbmFtZXMgKGluY2wuIGB1bmxpbWl0ZWRgKS4gVXNlZCBmb3IgdmFsaWRhdGlvbiBvZiBhICpzdG9yZWQqXG4gKiAgdGllciDigJQgYHVubGltaXRlZGAgaXMgYSB2YWxpZCB2YWx1ZSBldmVuIHRob3VnaCBpdCdzIG5ldmVyIG9mZmVyZWQgZm9yIHNhbGUuICovXG5leHBvcnQgY29uc3QgVkFMSURfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gT2JqZWN0LmtleXMoUVVPVEFfVElFUlMpIGFzIFF1b3RhVGllcltdO1xuXG4vKiogVGhlIHN0YW5kYXJkLCBiaWxsaW5nLXNlbGVjdGFibGUgdGllcnMg4oCUIHRoZSBvbmVzIG9mZmVyZWQgYXMgcHVyY2hhc2FibGUgcGxhbnNcbiAqICBhbmQgc2hvd24gaW4gdGllciBwaWNrZXJzLiBEZXJpdmVkIGFzIFwiZXZlcnkgdmFsaWQgdGllciBleGNlcHQgYHVubGltaXRlZGBcIixcbiAqICB3aGljaCBpcyB0aGUgYmlsbGluZy1ESVNBQkxFRCBkZWZhdWx0IGFuZCBpcyBuZXZlciBkaXNwbGF5ZWQvc2VsZWN0YWJsZSB3aGVuXG4gKiAgYmlsbGluZyBpcyBlbmFibGVkLiBLZXB0IERSWSBvZmYgYFZBTElEX1RJRVJTYCBzbyBhZGRpbmcgYSB0aWVyIGZsb3dzIHRocm91Z2guICovXG5leHBvcnQgY29uc3QgU1RBTkRBUkRfVElFUlM6IHJlYWRvbmx5IFF1b3RhVGllcltdID0gVkFMSURfVElFUlMuZmlsdGVyKCh0KSA9PiB0ICE9PSAndW5saW1pdGVkJyk7XG5cbi8qKiBUaWVycyB0aGF0IHBlcm1pdCB0aGUgb3JnIOKGkiB0ZWFtIGhpZXJhcmNoeSAobmVzdGluZyB0ZWFtcyB1bmRlciBhIHJvb3QpLiBUaGVcbiAqICBiaWxsaW5nLW9mZiBgdW5saW1pdGVkYCB0aWVyIGlzIHRlYW0tY2FwYWJsZSAoaXQncyB0aGUgbW9zdCBwZXJtaXNzaXZlKTsgdGhlXG4gKiAgZW50cnktbGV2ZWwgYGRldmVsb3BlcmAvYHByb2AgdGllcnMgYXJlIG5vdC4gU2luZ2xlIHNvdXJjZSBmb3IgdGhlIHBhcmVudC1cbiAqICBlbGlnaWJpbGl0eSArIGRvd25ncmFkZS1vdmVyY2FwIGNoZWNrcyBzbyB0aGV5IGNhbid0IGRyaWZ0LiAqL1xuZXhwb3J0IGNvbnN0IFRFQU1fQ0FQQUJMRV9USUVSUzogcmVhZG9ubHkgUXVvdGFUaWVyW10gPSBbJ3RlYW0nLCAnYnVzaW5lc3MnLCAnZW50ZXJwcmlzZScsICd1bmxpbWl0ZWQnXTtcbmV4cG9ydCBmdW5jdGlvbiB0aWVyQWxsb3dzVGVhbXModGllcjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF0aWVyICYmIChURUFNX0NBUEFCTEVfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpO1xufVxuXG4vKiogVGllcnMgdGhhdCBtYXkgYnV5IGV4dHJhIHNlYXRzIOKAlCBiaWxsaW5nJ3MgcGVyLXNlYXQgYHNlYXRgIGFkZC1vbi4gU2VhdHMgYXJlXG4gKiAgdGhlIFRlYW0gZGlmZmVyZW50aWF0b3IsIHNvIHRoZSBzaW5nbGUtc2VhdCBgZGV2ZWxvcGVyYC9gcHJvYCB0aWVycyBjYW5ub3RcbiAqICBzdGFjayB0aGVtIGFuZCBtdXN0IHVwZ3JhZGUgaW5zdGVhZDsgYHVubGltaXRlZGAgaGFzIG5vIHNlYXQgY2FwIGF0IGFsbC5cbiAqICBTaW5nbGUgc291cmNlIGZvciB0aGUgYmlsbGluZyBjYXRhbG9nIGFuZCBldmVyeSBcIm91dCBvZiBzZWF0c1wiIG1lc3NhZ2UuICovXG5leHBvcnQgY29uc3QgU0VBVF9QQUNLX1RJRVJTOiByZWFkb25seSBRdW90YVRpZXJbXSA9IFsndGVhbScsICdidXNpbmVzcycsICdlbnRlcnByaXNlJ107XG5cbi8qKiBIb3cgYW4gYWNjb3VudCB0aGF0IGhhcyB1c2VkIGV2ZXJ5IHNlYXQgY2FuIGdldCBhbm90aGVyLiAqL1xuZXhwb3J0IHR5cGUgU2VhdFJlbWVkeSA9ICd1cGdyYWRlJyB8ICdzZWF0X3BhY2snO1xuXG4vKipcbiAqIFRoZSByZW1lZHkgdG8gb2ZmZXIgYW4gYWNjb3VudCBhdCBpdHMgc2VhdCBjYXAsIGZyb20gdGhlIEFDQ09VTlQncyAocm9vdCkgdGllcjpcbiAqIGBzZWF0X3BhY2tgIHdoZXJlIHNlYXRzIGNhbiBiZSBib3VnaHQsIGB1cGdyYWRlYCBvbiB0aGUgc2luZ2xlLXNlYXQgdGllcnMuXG4gKiBgbnVsbGAgd2hlbiB0aGUgdGllciBpcyB1bmtub3duIG9yIGhhcyBubyBjYXAg4oCUIHNheSBub3RoaW5nIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VhdFJlbWVkeSh0aWVyOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsKTogU2VhdFJlbWVkeSB8IG51bGwge1xuICBpZiAoIXRpZXIgfHwgIWlzVmFsaWRUaWVyKHRpZXIpIHx8IHRpZXIgPT09ICd1bmxpbWl0ZWQnKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChTRUFUX1BBQ0tfVElFUlMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHRpZXIpID8gJ3NlYXRfcGFjaycgOiAndXBncmFkZSc7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBiaWxsaW5nIHNlcnZpY2UgaXMgZW5hYmxlZCBpbiB0aGlzIGRlcGxveW1lbnQgKGBCSUxMSU5HX0VOQUJMRURgLFxuICogIG9wdC1vdXQgZGVmYXVsdC1vbiDigJQgbWlycm9ycyB0aGUgYmlsbGluZy9wbGF0Zm9ybSBjb25maWdzKS4gV2l0aCBiaWxsaW5nIE9GRlxuICogIHRoZXJlJ3Mgbm8gbWV0ZXJpbmcvZW5mb3JjZW1lbnQgc3VyZmFjZSwgc28gdGhlIGRlZmF1bHQgdGllciBpcyBgdW5saW1pdGVkYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0JpbGxpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZW52Qm9vbCgnQklMTElOR19FTkFCTEVEJywgdHJ1ZSk7XG59XG5cbi8qKlxuICogRGVmYXVsdCB0aWVyIGFzc2lnbmVkIHRvIG5ldyBvcmdhbml6YXRpb25zLlxuICogLSBCaWxsaW5nIERJU0FCTEVEIOKGkiBgdW5saW1pdGVkYCAobm90aGluZyBpcyBtZXRlcmVkLCBzbyBldmVyeXRoaW5nIGlzIHVuY2FwcGVkKS5cbiAqIC0gQmlsbGluZyBFTkFCTEVEICDihpIgYERFRkFVTFRfUVVPVEFfVElFUmAgaWYgaXQncyBhIHZhbGlkIHN0YW5kYXJkIHRpZXIsIGVsc2UgYGRldmVsb3BlcmAuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJRVI6IFF1b3RhVGllciA9ICFpc0JpbGxpbmdFbmFibGVkKClcbiAgPyAndW5saW1pdGVkJ1xuICA6IChpc1ZhbGlkVGllcihwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgPz8gJycpICYmIHByb2Nlc3MuZW52LkRFRkFVTFRfUVVPVEFfVElFUiAhPT0gJ3VubGltaXRlZCdcbiAgICA/IChwcm9jZXNzLmVudi5ERUZBVUxUX1FVT1RBX1RJRVIgYXMgUXVvdGFUaWVyKVxuICAgIDogJ2RldmVsb3BlcicpO1xuXG4vKiogQ2hlY2sgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFF1b3RhVGllci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGllcih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUXVvdGFUaWVyIHtcbiAgLy8gVXNlIHRoZSBleHBsaWNpdCB0dXBsZSwgbm90IGB2YWx1ZSBpbiBRVU9UQV9USUVSU2A6IGBpbmAgd2Fsa3MgdGhlIHByb3RvdHlwZVxuICAvLyBjaGFpbiwgc28gaW5oZXJpdGVkIE9iamVjdCBrZXlzICgndG9TdHJpbmcnLCAnY29uc3RydWN0b3InLCDigKYpIHdvdWxkIHJldHVyblxuICAvLyB0cnVlIGFuZCB0aGVuIGBnZXRUaWVyTGltaXRzYCB3b3VsZCByZWFkIGAubGltaXRzYCBvZmYgYSBmdW5jdGlvbiDihpIgY3Jhc2guXG4gIC8vIGB0aWVyYCBpcyBhdHRhY2tlci1pbmZsdWVuY2VhYmxlIChKV1QgLyByZXF1ZXN0IGJvZHkgLyBERUZBVUxUX1FVT1RBX1RJRVIgZW52KS5cbiAgcmV0dXJuIChWQUxJRF9USUVSUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vKiogR2V0IHRoZSBkZWZhdWx0IGxpbWl0cyBmb3IgYSBnaXZlbiB0aWVyIChmYWxscyBiYWNrIHRvIGRldmVsb3BlcikuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGllckxpbWl0cyh0aWVyOiBzdHJpbmcpOiBRdW90YVRpZXJMaW1pdHMge1xuICByZXR1cm4gaXNWYWxpZFRpZXIodGllcikgPyBRVU9UQV9USUVSU1t0aWVyXS5saW1pdHM6IFFVT1RBX1RJRVJTLmRldmVsb3Blci5saW1pdHM7XG59XG5cbi8qKlxuICogVGhlIHBlcmlvZCAoZGF5cykgZXZlcnkgdXNhZ2UgY291bnRlciByb2xscyBvdmVyIG9uLiBBbGwgcXVvdGFzIGFyZSBwZXItcGVyaW9kXG4gKiBGTE9XIGNvdW50ZXJzIG9uIG9uZSBzaGFyZWQgcGVyaW9kOiB0aGUgcXVvdGEgc2VydmljZSByZXNldHMgYSBjb3VudGVyIHRoaXNcbiAqIG1hbnkgZGF5cyBhZnRlciBpdCBleHBpcmVzLCBhbmQgcGxhdGZvcm0gc2VlZHMgYSBuZXcgb3JnJ3MgY291bnRlcnMgd2l0aCB0aGVcbiAqIHNhbWUgd2luZG93IChgUVVPVEFfUkVTRVRfREFZU2AsIGRlZmF1bHQgMykuXG4gKi9cbmV4cG9ydCBjb25zdCBRVU9UQV9SRVNFVF9EQVlTID0gZW52SW50KCdRVU9UQV9SRVNFVF9EQVlTJywgMywgeyBtaW46IDEgfSk7XG5cbi8qKiBUaGUgbmV4dCBxdW90YSByZXNldDogbG9jYWwgbWlkbmlnaHQgYGRheXNgIGZyb20gYG5vd2AuICovXG4vKipcbiAqIFRoZSBgY3B1Q3JlZGl0c2AgcGVyaW9kLCBpbiBkYXlzLiBBIE1PTlRIIHJhdGhlciB0aGFuIHRoZSBnbG9iYWwgdGhyZWUtZGF5XG4gKiB3aW5kb3csIGJlY2F1c2UgYnVpbGQgZGVtYW5kIGlzIGJ1cnN0eSBpbiBhIHdheSBBUEkgdHJhZmZpYyBpcyBub3Q6IGEgZnVsbFxuICogY2F0YWxvZ3VlIHJlYnVpbGQgaXMgYSBkYXkncyB3b3JrIHRoYXQgYXJyaXZlcyBvbiBvbmUgZGF5LCBhbmQgYSB0aHJlZS1kYXlcbiAqIHdpbmRvdyByZWZ1c2VzIGl0IHdoaWxlIHRoZSBhY2NvdW50IGhvbGRzIG1vc3Qgb2YgYSBtb250aCdzIGJ1ZGdldCB1bnNwZW50LlxuICovXG5leHBvcnQgY29uc3QgQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgPSBlbnZJbnQoJ1FVT1RBX0NQVV9DUkVESVRTX1BFUklPRF9EQVlTJywgMzAsIHsgbWluOiAxIH0pO1xuXG4vKipcbiAqIFRoZSB1c2FnZSBwZXJpb2QgZm9yIE9ORSBxdW90YSB0eXBlLCBpbiBkYXlzLlxuICpcbiAqIEV2ZXJ5IGZsb3cgcXVvdGEgYnV0IGBjcHVDcmVkaXRzYCByb2xscyBvbiB0aGUgZ2xvYmFsIHtAbGluayBRVU9UQV9SRVNFVF9EQVlTfS5cbiAqIENyZWRpdHMgYXJlIG1vbnRobHksIHdoaWNoIG1ha2VzIHRoZSBwZXJpb2QgYSBQRVItVFlQRSBmYWN0IOKAlCBzbyBhbnl0aGluZyB0aGF0XG4gKiBjb21wdXRlcyBhIHJlc2V0IGRhdGUsIGEgXCJyZXNldHMgaW4gTiBkYXlzXCIgbGluZSBvciBhIGJ1cm4tcmF0ZSBmb3JlY2FzdCBoYXNcbiAqIHRvIGFzayBmb3IgdGhlIHR5cGUncyBvd24gcGVyaW9kIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGdsb2JhbCBjb25zdGFudC4gQVxuICogZm9yZWNhc3QgYWdhaW5zdCB0aGUgd3Jvbmcgd2luZG93IGlzIHdyb25nIGJ5IGEgZmFjdG9yIG9mIHRlbi5cbiAqXG4gKiBTdG9ja3MgKGBzdG9yYWdlQnl0ZXNgIGFuZCB0aGUgcmVzb3VyY2UgY291bnRzKSBoYXZlIG5vIHBlcmlvZCBhdCBhbGw7IHRoaXNcbiAqIHJldHVybnMgdGhlIGdsb2JhbCB3aW5kb3cgZm9yIHRoZW0gYmVjYXVzZSBjYWxsZXJzIGdhdGUgb25cbiAqIGBxdW90YUFjY3J1YWwodHlwZSkgPT09ICdzdG9jaydgIGJlZm9yZSB1c2luZyBpdCwgYW5kIHJldHVybmluZyBhIGZpZ3VyZSBpc1xuICogbGVzcyBkaXNydXB0aXZlIHRoYW4gbWFraW5nIGV2ZXJ5IGNhbGxlciBoYW5kbGUgYSBudWxsLiBDaGVjayB0aGUgYWNjcnVhbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RhUGVyaW9kRGF5cyh0eXBlOiBRdW90YVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gdHlwZSA9PT0gJ2NwdUNyZWRpdHMnID8gQ1BVX0NSRURJVFNfUEVSSU9EX0RBWVMgOiBRVU9UQV9SRVNFVF9EQVlTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV4dFF1b3RhUmVzZXREYXRlKGRheXM6IG51bWJlciA9IFFVT1RBX1JFU0VUX0RBWVMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBEYXRlIHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKG5vdyk7XG4gIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIGRheXMpO1xuICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICByZXR1cm4gZGF0ZTtcbn1cbiJdfQ==
@@ -17,7 +17,7 @@
17
17
  * (`admin.superadmin.grant`, `org.ownership.transfer`, `user.login`, …). Keep
18
18
  * this list free of any platform-only action.
19
19
  */
20
- export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.unlist', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.collection.update', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.sla.update', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test'];
20
+ export declare const REMOTE_AUDIT_ACTIONS: readonly ['plugin.build.completed', 'plugin.build.failed', 'plugin.build.timeout', 'plugin.scan.skipped', 'plugin.vuln.waived', 'plugin.vuln.flagged', 'plugin.vuln.cleared', 'plugin.delete', 'plugin.restore', 'plugin.purge', 'plugin.update', 'plugin.upload', 'plugin.deploy', 'plugin.bulk.update', 'plugin.bulk.delete', 'plugin.dlq.purge', 'plugin.build.retry', 'plugin.dlq.replay', 'pipeline.create', 'pipeline.update', 'pipeline.delete', 'pipeline.restore', 'pipeline.purge', 'pipeline_template.create', 'pipeline_template.update', 'pipeline_template.delete', 'pipeline_template.restore', 'pipeline_template.purge', 'pipeline.execution.start', 'pipeline.execution.cancel', 'pipeline.registry.register', 'pipeline.registry.deregister', 'quota.reset', 'quota.limit.update', 'quota.delete', 'quota.notice_settings.update', 'compliance.exemption.approve', 'compliance.exemption.revoke', 'compliance.exemption.request', 'compliance.exemption.reject', 'compliance.rule.toggle', 'compliance.rule.create', 'compliance.rule.update', 'compliance.rule.delete', 'compliance.rule.restore', 'compliance.rule.purge', 'compliance.policy.create', 'compliance.policy.update', 'compliance.policy.delete', 'compliance.policy.restore', 'compliance.policy.purge', 'compliance.scan-schedule.create', 'compliance.scan-schedule.update', 'compliance.scan-schedule.delete', 'compliance.template.apply', 'compliance.scan.create', 'compliance.scan.cancel', 'compliance.scan.complete', 'compliance.subscription.auto-subscribe', 'compliance.notification-preference.update', 'registry.gc', 'registry.image.delete', 'registry.image.copy', 'registry.image.sign', 'registry.token.issue', 'registry.quarantine.credential.mint', 'message.announcement.create', 'message.delete', 'message.restore', 'message.purge', 'message.update', 'message.attachment.upload', 'message.notify.internal', 'message.org.purge', 'support.case.open', 'support.case.reply', 'support.case.status', 'support.case.severity', 'support.case.assign', 'support.case.transfer', 'support.oncall.acknowledged', 'support.oncall.escalated', 'support.oncall.test', 'support.oncall.paged', 'support.contact.designate', 'support.contact.revoke', 'support.contact.upgrade', 'support.contact.downgrade', 'support.case.note', 'support.canned.write', 'billing.subscription.create', 'billing.subscription.update', 'billing.subscription.reactivate', 'billing.subscription.cancel', 'billing.subscription.delete', 'billing.tier.override', 'billing.support-floor.override', 'billing.support-incident.grant', 'billing.addon.add', 'billing.addon.remove', 'billing.addon.prune', 'billing.discount.generate', 'billing.discount.issue', 'billing.discount.apply', 'billing.discount.remove', 'billing.discount.revoke', 'billing.campaign.create', 'billing.campaign.update', 'billing.campaign.end', 'billing.promotion.create', 'billing.promotion.update', 'billing.promotion.revoke', 'billing.promotion.grant', 'billing.promotion.activate', 'billing.credit.consumed', 'billing.credit.exhausted', 'billing.combo.expired', 'reporting.settings.update', 'reporting.deployment.outcome', 'reporting.retention.sync', 'reporting.report.definition.create', 'reporting.report.definition.update', 'reporting.report.definition.delete', 'reporting.report.ownership.transfer', 'reporting.report.published', 'reporting.report.republished', 'reporting.report.link.created', 'reporting.report.link.revoked', 'reporting.report.recipient.added', 'reporting.report.recipient.removed', 'reporting.report.policy.update', 'reporting.report.paused', 'reporting.report.resumed', 'reporting.report.run.compose', 'reporting.report.run.notes', 'reporting.report.run.summary', 'reporting.report.recipient.resend', 'reporting.report.recipient.verified', 'reporting.report.recipient.unsubscribed', 'reporting.ingest.batch', 'reporting.ingest.rejected', 'reporting.incident.record', 'authz.denied', 'ask.query', 'ask.agent.turn', 'ask.feedback', 'pipeline.ai.generate', 'plugin.ai.generate', 'publisher.create', 'publisher.update', 'publisher.terms.accept', 'publisher.verify.request', 'publisher.verify.approve', 'publisher.verify.reject', 'publisher.tier.change', 'publisher.suspend', 'publisher.unsuspend', 'publisher.transfer.request', 'publisher.transfer.accept', 'publisher.transfer.decline', 'publisher.transfer.approve', 'publisher.transfer.reject', 'publisher.profile-change.approve', 'publisher.profile-change.reject', 'plugin.request.submit', 'plugin.request.withdraw', 'plugin.request.approve', 'plugin.request.second-approve', 'plugin.request.reject', 'plugin.request.auto-approve', 'plugin.listing.publish', 'plugin.listing.update', 'plugin.listing.state.change', 'plugin.listing.pause', 'plugin.listing.unpause', 'plugin.version.pause', 'plugin.version.yank', 'plugin.version.unyank', 'plugin.version.deprecate', 'plugin.version.prune', 'ecosystem.auto-approval-rule.create', 'ecosystem.auto-approval-rule.update', 'ecosystem.auto-approval-rule.delete', 'ecosystem.reserved-name.update', 'ecosystem.bootstrap.open', 'ecosystem.bootstrap.close', 'registry.image.publish', 'registry.image.resign', 'registry.image.yank', 'registry.image.gc', 'plugin.install.request', 'plugin.install.approve', 'plugin.install.deny', 'plugin.install.create', 'plugin.install.upgrade', 'plugin.install.change-request', 'plugin.install.change-approve', 'plugin.install.change-reject', 'plugin.install.remove', 'org.plugin-install-policy.update', 'plugin.shadowing.denied', 'plugin.review.create', 'plugin.review.update', 'plugin.review.delete', 'plugin.review.report', 'plugin.review.hold', 'plugin.review.release', 'plugin.review.remove', 'plugin.review.anonymize', 'plugin.review.reply.create', 'plugin.review.reply.update', 'plugin.review.reply.delete', 'plugin.submission.create', 'plugin.submission.verify', 'plugin.submission.gate-fail', 'plugin.submission.approve', 'plugin.submission.reject', 'plugin.submission.claim', 'plugin.submission.expire', 'plugin.advisory.create', 'plugin.advisory.update', 'plugin.advisory.publish', 'plugin.advisory.withdraw', 'plugin.security_notifications.update', 'plugin.security_notifications.external_email.verify', 'plugin.security_notifications.test', 'plugin.setup_image.promoted', 'plugin.setup_image.promote_refused', 'plugin.setup_image.kept', 'plugin.setup_image.discarded', 'pipeline.vuln.accepted', 'pipeline.vuln.false_positive', 'pipeline.vuln.reopened', 'pipeline.runtime_check.flagged', 'pipeline.plugin.upgraded', 'pipeline.security_report.upload'];
21
21
  export type RemoteAuditAction = typeof REMOTE_AUDIT_ACTIONS[number];
22
22
  /** Whether `value` is an action a remote service may emit (the ingest allow-list). */
23
23
  export declare function isRemoteAuditAction(value: string): value is RemoteAuditAction;