@pipeline-builder/api-core 4.1.9 → 4.1.10

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.
@@ -148,6 +148,24 @@ export declare function isHumanPrincipal(claims: Pick<JwtPayload, 'principalType
148
148
  export interface AssuranceOptions {
149
149
  minAssurance: AssuranceLevel;
150
150
  maxAge?: number;
151
+ /**
152
+ * A NAMED carve-out for requests that cannot possibly satisfy the level and
153
+ * must still be served — today only one exists: the bootstrap-administrator
154
+ * window, where a fresh install's single admin has no factor yet and the setup
155
+ * calls that create the install's automation credential would otherwise be
156
+ * unreachable (see platform's `isBootstrapSetupRequest`).
157
+ *
158
+ * It is deliberately shaped as `{ reason, when }` rather than a bare predicate:
159
+ * the reason is counted (`assurance_exempted_total{reason}`) and published on
160
+ * the route table as `assuranceExempt`, so an exemption cannot be added without
161
+ * showing up in the generated table a reviewer reads. The gate keeps its
162
+ * `minAssurance` tag either way — the route still requires MFA-grade for
163
+ * everyone the carve-out does not name.
164
+ */
165
+ exempt?: {
166
+ reason: string;
167
+ when: (req: Request) => boolean;
168
+ };
151
169
  }
152
170
  /**
153
171
  * Standalone assurance gate, for a service whose own `requireAuth` is not
@@ -375,10 +375,22 @@ export function requireAssurance(options) {
375
375
  if (!req.user) {
376
376
  return sendError(res, HttpStatus.UNAUTHORIZED, 'Authentication required', ErrorCode.UNAUTHORIZED);
377
377
  }
378
+ // A named exemption is checked AFTER authentication and before the level, so
379
+ // it can never admit an unauthenticated caller, and it is counted every time
380
+ // it fires — an exemption nobody can see is how a gate quietly stops being one.
381
+ if (options.exempt?.when(req) === true) {
382
+ emitCounter('assurance_exempted_total', { service: serviceIdentity(), reason: options.exempt.reason });
383
+ return next();
384
+ }
378
385
  if (refuseForAssurance(options, req.user, req, res))
379
386
  return;
380
387
  next();
381
- }, { kind: 'assurance', minAssurance: options.minAssurance, ...(options.maxAge !== undefined ? { maxAge: options.maxAge } : {}) });
388
+ }, {
389
+ kind: 'assurance',
390
+ minAssurance: options.minAssurance,
391
+ ...(options.maxAge !== undefined ? { maxAge: options.maxAge } : {}),
392
+ ...(options.exempt ? { exempt: options.exempt.reason } : {}),
393
+ });
382
394
  }
383
395
  /**
384
396
  * Handler-level twin of {@link requireAssurance}, for a route where only SOME
@@ -937,4 +949,4 @@ export function verifyServicePrincipal(req) {
937
949
  return false;
938
950
  }
939
951
  }
940
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFrQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckcsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBd0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUs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QU0sQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUM1RCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBYSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hHLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN2SCw2RUFBNkU7UUFDN0UsZ0ZBQWdGO1FBQ2hGLHVFQUF1RTtRQUN2RSxPQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHRhZ1JvdXRlR2F0ZSwgdHlwZSBPcmdBZG1pbkFzc3VyYW5jZU1hY2hpbmVzIH0gZnJvbSAnLi9yb3V0ZS10YWJsZS5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB7IEp3a3NVbmF2YWlsYWJsZUVycm9yLCBVbmtub3duS2lkRXJyb3IsIHBsYXRmb3JtSndrc0NhY2hlIH0gZnJvbSAnLi4vc2VydmljZXMvandrcy1jYWNoZS5qcyc7XG5pbXBvcnQge1xuICBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLFxuICBTZXJ2aWNlS2V5RXJyb3IsXG4gIGlzU2VydmljZUtpZCxcbiAgc2VydmljZUlkZW50aXR5LFxuICBzaWduU2VydmljZUp3dCxcbiAgdmVyaWZ5U2VydmljZUp3dCxcbn0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IEFVVEhfTUVUSE9EUywgUFJJTkNJUEFMX1RZUEVTLCBUT0tFTl9VU0VTLCB0eXBlIEFzc3VyYW5jZUxldmVsLCB0eXBlIEp3dFBheWxvYWQgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIdHRwUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzL2h0dHAuanMnO1xuaW1wb3J0IHsgdHlwZSBQZXJtaXNzaW9uLCBoYXNQZXJtaXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMvcGVybWlzc2lvbnMuanMnO1xuaW1wb3J0IHsgaXNPcGFxdWVBcGlLZXkgfSBmcm9tICcuLi91dGlscy9hcGkta2V5LmpzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMuanMnO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHksIHR5cGUgUmVxdWVzdElkZW50aXR5IH0gZnJvbSAnLi4vdXRpbHMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgVVNFUl9UT0tFTl9BTEdPUklUSE0sIGRlY29kZUp3dEhlYWRlciB9IGZyb20gJy4uL3V0aWxzL2p3ay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXV0aC1taWRkbGV3YXJlJyk7XG5cbi8qKiBJc3N1ZXIvYXVkaWVuY2UgcGlubmluZywgd2hlbiB0aGUgZGVwbG95bWVudCBjb25maWd1cmVzIHRoZW0uIFNoYXJlZCBieSBib3RoIGNoYWlucy4gKi9cbmZ1bmN0aW9uIGlzc3VlckF1ZGllbmNlT3B0aW9ucygpOiB7IGlzc3Vlcj86IHN0cmluZzsgYXVkaWVuY2U/OiBzdHJpbmcgfSB7XG4gIHJldHVybiB7XG4gICAgLi4uKHByb2Nlc3MuZW52LkpXVF9JU1NVRVIgPyB7IGlzc3VlcjogcHJvY2Vzcy5lbnYuSldUX0lTU1VFUiB9IDoge30pLFxuICAgIC4uLihwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UgPyB7IGF1ZGllbmNlOiBwcm9jZXNzLmVudi5KV1RfQVVESUVOQ0UgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWZXJpZnkgYSB0b2tlbiB0aGF0IHNwZWFrcyBmb3IgYSBQRVJTT04g4oCUIGFjY2Vzcywgc3RlcC11cCwgYW5kIHRoZSB0b2tlbiBhblxuICogb3BhcXVlIGFjY2VzcyBrZXkgaXMgZXhjaGFuZ2VkIGZvciDigJQgYWdhaW5zdCBwbGF0Zm9ybSdzIHB1Ymxpc2hlZCBzaWduaW5nXG4gKiBrZXlzLlxuICpcbiAqIEVTMjU2IGFuZCBhIGBraWRgIGFyZSBib3RoIG1hbmRhdG9yeTogbm8gYGtpZGAgbWVhbnMgbm8gd2F5IHRvIHBpY2sgdGhlIHJpZ2h0XG4gKiBrZXkgYWNyb3NzIGEgcm90YXRpb24sIGFuZCBhbnkgb3RoZXIgYWxnb3JpdGhtIGlzIHJlZnVzZWQgb3V0cmlnaHQsIHdoaWNoIGlzXG4gKiB3aGF0IG1ha2VzIFwibm8gc2VydmljZSBhY2NlcHRzIGFuIEhTMjU2IHVzZXIgdG9rZW5cIiBhIHByb3BlcnR5IG9mIHRoZSBjb2RlXG4gKiByYXRoZXIgdGhhbiBhIGNvbnZlbnRpb24uIEtleSBsb29rdXAgZ29lcyB0aHJvdWdoIHRoZSBzaGFyZWQgSldLUyBjYWNoZVxuICogKDEwLW1pbnV0ZSByZWZyZXNoLCBvbmUgcmVmZXRjaCBvbiBhbiB1bmtub3duIGBraWRgLCBicmllZiBuZWdhdGl2ZSBjYWNoZSkuXG4gKlxuICogQHRocm93cyB7VW5rbm93bktpZEVycm9yfSB0aGUga2V5IHNldCBpcyBjdXJyZW50IGFuZCBoYXMgbm8gc3VjaCBrZXkg4oaSIDQwMS5cbiAqIEB0aHJvd3Mge0p3a3NVbmF2YWlsYWJsZUVycm9yfSB0aGUga2V5IHNldCBjb3VsZCBub3QgYmUgb2J0YWluZWQg4oaSIDUwMzsgYW5cbiAqICAgICAgICAgdW52ZXJpZmlhYmxlIHRva2VuIGlzIG5ldmVyIHRyZWF0ZWQgYXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlVc2VySnd0PFQgPSBKd3RQYXlsb2FkPih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcih0b2tlbik7XG4gIGlmIChoZWFkZXI/LmFsZyAhPT0gVVNFUl9UT0tFTl9BTEdPUklUSE0gfHwgIWhlYWRlci5raWQpIHtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKGBVc2VyIHRva2VucyBtdXN0IGJlIHNpZ25lZCB3aXRoICR7VVNFUl9UT0tFTl9BTEdPUklUSE19IGFuZCBjYXJyeSBhIGtpZGApO1xuICB9XG4gIGNvbnN0IGtleSA9IGF3YWl0IHBsYXRmb3JtSndrc0NhY2hlKCkuZ2V0S2V5KGhlYWRlci5raWQpO1xuICByZXR1cm4gand0LnZlcmlmeSh0b2tlbiwga2V5LCB7IGFsZ29yaXRobXM6IFtVU0VSX1RPS0VOX0FMR09SSVRITV0sIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pIGFzIFQ7XG59XG5cbi8qKlxuICogVmVyaWZ5IEFOWSBiZWFyZXIgdG9rZW4gYW5kIHJldHVybiBpdHMgY2xhaW1zLlxuICpcbiAqIFNpbmNlICMxNCB0aGVyZSBpcyBubyBzaGFyZWQgc2VjcmV0IGxlZnQ6IEJPVEggY2hhaW5zIGFyZSBFUzI1NiB3aXRoIGEgYGtpZGAsXG4gKiBzbyB0aGUgZGlzcGF0Y2ggaXMgYnkgKip3aG8gb3ducyB0aGUgYGtpZGAqKiByYXRoZXIgdGhhbiBieSBhbGdvcml0aG0g4oCUIGFuZFxuICogYmVjYXVzZSBhIGBraWRgIGlzIGFuIFJGQyA3NjM4IHRodW1icHJpbnQsIG93bmVyc2hpcCBpcyBhIGZhY3QgYWJvdXQgdGhlIGtleSxcbiAqIG5vdCBhIGNsYWltIHRoZSB0b2tlbiBtYWtlcyBhYm91dCBpdHNlbGY6XG4gKlxuICogLSBhIGBraWRgIHB1Ymxpc2hlZCBpbiB0aGUgcGVyLXNlcnZpY2Uga2V5IGJ1bmRsZSDihpIgYW4gSU5URVJOQUwgU0VSVklDRSB0b2tlblxuICogICAoe0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59KSwgdmVyaWZpZWQgd2l0aCB0aGF0IHNlcnZpY2UncyBrZXk7IGl0cyBgc3ViYCBtdXN0XG4gKiAgIG5hbWUgdGhlIHNhbWUgc2VydmljZSwgc28gb25lIHNlcnZpY2UgY2FuIG5ldmVyIHNwZWFrIGZvciBhbm90aGVyLlxuICogLSBhbnl0aGluZyBlbHNlIOKGkiBhIHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB2ZXJpZmllZCBhZ2FpbnN0IHBsYXRmb3JtJ3NcbiAqICAgcHVibGlzaGVkIEpXS1MuIEEgdG9rZW4gY2xhaW1pbmcgYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AgaXMgcmVmdXNlZFxuICogICBoZXJlOiBhbiBpbnRlcm5hbCBpZGVudGl0eSBtYXkgbm90IHJpZGUgdGhlIHVzZXIgc2lnbmluZyBrZXkuXG4gKlxuICogQW55dGhpbmcgdGhhdCBpcyBub3QgRVMyNTYgd2l0aCBhIGBraWRgIGZhaWxzIGluIGJvdGggY2hhaW5zLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBcIm5vIEhTMjU2IHRva2VuIGlzIGFjY2VwdGVkIGFueXdoZXJlXCIgYSBwcm9wZXJ0eSBvZiB0aGUgY29kZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlYXJlclRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEp3dFBheWxvYWQ+IHtcbiAgY29uc3QgaGVhZGVyID0gZGVjb2RlSnd0SGVhZGVyKHRva2VuKTtcbiAgaWYgKCFoZWFkZXI/LmFsZykgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcignTWFsZm9ybWVkIHRva2VuIGhlYWRlcicpO1xuXG4gIGlmIChoZWFkZXIua2lkICYmIGlzU2VydmljZUtpZChoZWFkZXIua2lkKSkge1xuICAgIGNvbnN0IGNsYWltcyA9IHZlcmlmeVNlcnZpY2VKd3Q8Snd0UGF5bG9hZD4odG9rZW4sIHsga2lkOiBoZWFkZXIua2lkLCAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSB9KTtcbiAgICBpZiAoY2xhaW1zLnByaW5jaXBhbFR5cGUgIT09ICdzZXJ2aWNlJykge1xuICAgICAgZW1pdENvdW50ZXIoJ3NlcnZpY2Vfa2V5X25vbl9zZXJ2aWNlX3Rva2VuX3JlamVjdGVkX3RvdGFsJywgeyBhbGc6IGhlYWRlci5hbGcgfSk7XG4gICAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKCdBIHNlcnZpY2Ugc2lnbmluZyBrZXkgbWF5IG9ubHkgbWludCBhIHNlcnZpY2UgcHJpbmNpcGFsJyk7XG4gICAgfVxuICAgIHJldHVybiBjbGFpbXM7XG4gIH1cblxuICBjb25zdCBjbGFpbXMgPSBhd2FpdCB2ZXJpZnlVc2VySnd0KHRva2VuKTtcbiAgaWYgKGNsYWltcy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZScpIHtcbiAgICB0aHJvdyBuZXcgand0Lkpzb25XZWJUb2tlbkVycm9yKCdTZXJ2aWNlIHByaW5jaXBhbHMgbWF5IG5vdCBiZSBzaWduZWQgd2l0aCB0aGUgdXNlciBzaWduaW5nIGtleScpO1xuICB9XG4gIHJldHVybiBjbGFpbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWlyZUF1dGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFsbG93IHgtb3JnLWlkL3gtb3JnLW5hbWUgaGVhZGVycyB0byBvdmVycmlkZSB0aGUgSldUJ3Mgb3JnYW5pemF0aW9uIGZpZWxkcy5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCB0aGUgYHgtb3JnLWlkYC9geC1vcmctbmFtZWAgaGVhZGVycyBvdmVycmlkZSB0aGUgY2FsbGVyJ3Mgb3JnXG4gICAqIOKAlCBidXQgT05MWSBmb3IgYSB2ZXJpZmllZCBTWVMtQURNSU4gKGBpc1N1cGVyQWRtaW5gIGNsYWltKS4gRm9yIGFueSBvcmRpbmFyeVxuICAgKiBhdXRoZW50aWNhdGVkIHVzZXIgdGhlIGhlYWRlcnMgYXJlIGlnbm9yZWQsIHNvIGVuYWJsaW5nIHRoaXMgY2FuIG5ldmVyIGxldCBhXG4gICAqIG5vcm1hbCB1c2VyIGltcGVyc29uYXRlIGFub3RoZXIgdGVuYW50J3Mgb3JnLiBVc2UgZm9yIGNyb3NzLW9yZyBhZG1pbiB0b29saW5nXG4gICAqIChlLmcuIGEgc3lzYWRtaW4gbWFuYWdpbmcgYSBnaXZlbiBvcmcncyBiaWxsaW5nKS4gSWYgdW5zdXJlLCBsZWF2ZSBpdCBkaXNhYmxlZC5cbiAgICovXG4gIGFsbG93T3JnSGVhZGVyT3ZlcnJpZGU/OiBib29sZWFuO1xuICAvKipcbiAgICogRGVtYW5kIHRoYXQgdGhlIHdob2xlIFNFU1NJT04gYmUgYXQgbGVhc3QgdGhpcyBhc3N1cmFuY2UgbGV2ZWwgKCM4KS5cbiAgICpcbiAgICogYG1pbkFzc3VyYW5jZTogMmAgbWVhbnMgdGhlIHBlcnNvbiBhdXRoZW50aWNhdGVkIHdpdGggYSBzZWNvbmQgZmFjdG9yIOKAlCBhXG4gICAqIHBhc3NrZXkgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzIGFuIGF1dGhlbnRpY2F0b3IgY29kZSwgb3JcbiAgICogU1NPIHRocm91Z2ggYW4gSWRQIHRoZSBvcmcgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuIEEgd2Vha2VyIHRva2VuIGdldHNcbiAgICogKio0MDEgYE1GQV9SRVFVSVJFRGAqKiwgd2hpY2ggdGhlIGNsaWVudCBhbnN3ZXJzIGJ5IHNlbmRpbmcgdGhlIHBlcnNvbiB0b1xuICAgKiBlbnJvbG1lbnQgb3IgdG8gYSBzdHJvbmdlciBzaWduLWluOyByZWZyZXNoaW5nIGNhbm5vdCBoZWxwLCBiZWNhdXNlIGBhYWxgXG4gICAqIGxpdmVzIG9uIHRoZSBzZXNzaW9uIHNsb3QgYW5kIGEgcmVmcmVzaCBuZXZlciByYWlzZXMgaXQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNFU1NJT04tbGV2ZWwgY291bnRlcnBhcnQgdG8ge0BsaW5rIHJlcXVpcmVTdGVwVXB9LCB3aGljaCBzdGF5c1xuICAgKiBhIGZyZXNoLCBwZXItYWN0aW9uIGNvbmZpcm1hdGlvbi4gVXNlIGJvdGggb24gdGhlIG1vc3QgZGFuZ2Vyb3VzIHJvdXRlcy5cbiAgICpcbiAgICogTUFDSElORVMgTkVWRVIgU0FUSVNGWSBJVC4gQSBzZXJ2aWNlIHByaW5jaXBhbCwgYW4gb3JnIHNlcnZpY2UgYWNjb3VudCBhbmRcbiAgICogYW4gZXhjaGFuZ2VkIGFjY2VzcyBrZXkgYWxsIGdldCAqKjQwMyBgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRGAqKiDigJQgdGhlcmUgaXNcbiAgICogbm8gcGVyc29uIGJlaGluZCB0aGVtIHRvIGhhdmUgcHJlc2VudGVkIGEgZmFjdG9yLCBzbyBcImFzc3VyYW5jZVwiIGlzIG5vdCBhXG4gICAqIHF1ZXN0aW9uIHRoZWlyIGNyZWRlbnRpYWwgY2FuIGFuc3dlci4gVGhhdCBpcyBkZWxpYmVyYXRlbHkgbm90IGEgc2lsZW50XG4gICAqIHBhc3MtdGhyb3VnaCBmb3IgaW50ZXJuYWwgc2VydmljZXM6IGEgcm91dGUgdGhhdCBkZW1hbmRzIE1GQSBpcyBhIHJvdXRlIGFcbiAgICogaHVtYW4gaXMgZG9pbmcgc29tZXRoaW5nIGRhbmdlcm91cyBvbi5cbiAgICovXG4gIG1pbkFzc3VyYW5jZT86IEFzc3VyYW5jZUxldmVsO1xuICAvKipcbiAgICogV2l0aCB7QGxpbmsgbWluQXNzdXJhbmNlfSwgYWRkaXRpb25hbGx5IGJvdW5kIGhvdyBsb25nIGFnbyB0aGF0IHNpZ24taW5cbiAgICogaGFwcGVuZWQgKHNlY29uZHMsIGNvbXBhcmVkIGFnYWluc3QgdGhlIHRva2VuJ3MgYGF1dGhfdGltZWApLiBBIHNlc3Npb24gdGhhdFxuICAgKiBpcyBNRkEtZ3JhZGUgYnV0IG9sZGVyIHRoYW4gdGhpcyBnZXRzICoqNDAxIGBSRUFVVEhfUkVRVUlSRURgKiouIElnbm9yZWRcbiAgICogd2l0aG91dCBgbWluQXNzdXJhbmNlYCDigJQgXCJob3cgcmVjZW50XCIgaXMgb25seSBtZWFuaW5nZnVsIG9uY2UgXCJob3cgc3Ryb25nXCJcbiAgICogaXMgYmVpbmcgYXNrZWQuXG4gICAqL1xuICBtYXhBZ2U/OiBudW1iZXI7XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIGNvbnN0IGdhdGUgPSB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9LCB7IGtpbmQ6ICdhdXRoJyB9KTtcbiAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlKSB7XG4gICAgdGFnUm91dGVHYXRlKGdhdGUsIHsga2luZDogJ2Fzc3VyYW5jZScsIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhdGU7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZUF1dGgsIHsga2luZDogJ2F1dGgnIH0pO1xuXG4vKipcbiAqIEEgc291cmNlIG9mIHRoZSBDVVJSRU5UIGB0b2tlblZlcnNpb25gIGZvciBhIHVzZXIsIGJhY2tlZCBieSBhIHN0b3JlIHRoZVxuICogc3RhdGVsZXNzIHNlcnZpY2VzIGNhbiByZWFkIChpbiBwcmFjdGljZSBhIFJlZGlzIGtleSB0aGUgcGxhdGZvcm0gcHVibGlzaGVzXG4gKiB0byBvbiBldmVyeSBwcml2aWxlZ2UgY2hhbmdlKS4gUmVnaXN0ZXJlZCB2aWEge0BsaW5rIHNldFRva2VuUmV2b2NhdGlvblN0b3JlfS5cbiAqXG4gKiBgZ2V0Q3VycmVudFZlcnNpb25gIHJldHVybnMgdGhlIHVzZXIncyBjdXJyZW50IHZlcnNpb24sIG9yIGBudWxsYCB3aGVuIHRoZVxuICogc3RvcmUgaGFzIG5vIGVudHJ5IOKAlCBhIG1pc3MgaXMgdHJlYXRlZCBhcyBcIm5vIGtub3duIHJldm9jYXRpb25cIiAoZmFpbC1vcGVuKTpcbiAqIHJldm9jYXRpb24gZW50cmllcyBhcmUgcHVibGlzaGVkIHdpdGggYSBUVEwgbWF0Y2hpbmcgdGhlIGFjY2Vzcy10b2tlblxuICogbGlmZXRpbWUsIHNvIGEgbWlzc2luZyBlbnRyeSBtZWFucyBhbnkgdG9rZW4gb2xkIGVub3VnaCB0byBwcmVkYXRlIGl0IGhhc1xuICogYWxyZWFkeSBleHBpcmVkIG9uIGl0cyBvd24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXZvY2F0aW9uU3RvcmUge1xuICBnZXRDdXJyZW50VmVyc2lvbih1c2VySWQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD47XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9uZSBJTVBFUlNPTkFUSU9OIHNlc3Npb24gKGJ5IHRva2VuIGBqdGlgKSBoYXMgYmVlbiBlbmRlZCBlYXJseS5cbiAgICpcbiAgICogT3B0aW9uYWwgc28gYSBzdG9yZSB0aGF0IHByZWRhdGVzIGl0IHN0aWxsIGxpbmtzIOKAlCBidXQgYSBzdG9yZSBXSVRIT1VUIGl0XG4gICAqIGNhbm5vdCBhbnN3ZXIsIGFuZCBhbiBpbXBlcnNvbmF0aW9uIHRva2VuIGlzIHRoZW4gUkVKRUNURUQuIFVubGlrZVxuICAgKiBgZ2V0Q3VycmVudFZlcnNpb25gLCB0aGlzIGlzIGRlbGliZXJhdGVseSBub3QgZmFpbC1vcGVuOiB0aGUgcGxhdGZvcm0gZW5kcyBhXG4gICAqIHNlc3Npb24gd2hlbiBzb21lb25lIHdpdGhkcmF3cyBjb25zZW50LCBhbmQgYSB3aXRoZHJhd24gY29uc2VudCB0aGF0IGtlZXBzXG4gICAqIHdvcmtpbmcgaW4gZXZlcnkgb3RoZXIgc2VydmljZSBpcyBub3Qgd2l0aGRyYXduLlxuICAgKi9cbiAgZ2V0U2Vzc2lvblJldm9jYXRpb24/KGp0aTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uUmV2b2NhdGlvblN0YXRlPjtcbn1cblxuLyoqXG4gKiBgcmV2b2tlZGAgICAgIOKAlCB0aGUgc2Vzc2lvbiB3YXMgZW5kZWQ7IHJlamVjdC5cbiAqIGBsaXZlYCAgICAgICAg4oCUIG5vIHJldm9jYXRpb24gcmVjb3JkZWQ7IGFsbG93LlxuICogYHVuYXZhaWxhYmxlYCDigJQgdGhlIHN0b3JlIGNvdWxkbid0IGJlIHJlYWQgb3IgY2FuJ3QgYW5zd2VyOyBSRUpFQ1QuIERpc3RpbmN0XG4gKiAgICAgICAgICAgICAgICAgZnJvbSBgbGl2ZWAgcHJlY2lzZWx5IHNvIGFuIG91dGFnZSBjYW4ndCByZWFkIGFzIFwibm90IHJldm9rZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgU2Vzc2lvblJldm9jYXRpb25TdGF0ZSA9ICdyZXZva2VkJyB8ICdsaXZlJyB8ICd1bmF2YWlsYWJsZSc7XG5cbmxldCB0b2tlblJldm9jYXRpb25TdG9yZTogVG9rZW5SZXZvY2F0aW9uU3RvcmUgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgKG9yIGNsZWFyLCB3aXRoIGB1bmRlZmluZWRgKSB0aGUgcHJvY2Vzcy13aWRlIHRva2VuLXJldm9jYXRpb24gc3RvcmUuXG4gKiBXaGVuIHVuc2V0ICh0aGUgZGVmYXVsdCksIGByZXF1aXJlQXV0aGAgcGVyZm9ybXMgTk8gcmV2b2NhdGlvbiBjaGVjayAoaXQgcmVsaWVzXG4gKiBvbiB0aGUgc2hvcnQgYWNjZXNzLXRva2VuIFRUTCk7IHNlcnZpY2VzIG9wdCBpbiBhdCBib290IGJ5IHdpcmluZyB0aGVpciBSZWRpc1xuICogY2xpZW50LiBQbGF0Zm9ybSBrZWVwcyBpdHMgb3duIE1vbmdvLWJhY2tlZCBjaGVjayBhbmQgbmVlZCBub3QgcmVnaXN0ZXIgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoc3RvcmU6IFRva2VuUmV2b2NhdGlvblN0b3JlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIHRva2VuUmV2b2NhdGlvblN0b3JlID0gc3RvcmU7XG4gIGlmIChzdG9yZSkgcmV2b2NhdGlvblN0b3JlTWlzc2luZ1dhcm5lZCA9IGZhbHNlOyAvLyByZS1hcm0gaWYgYSBzdG9yZSBpcyAocmUpcmVnaXN0ZXJlZFxufVxuXG4vKiogT25lLXNob3QgZ3VhcmQgc28gdGhlIFwicmV2b2NhdGlvbiBpbmFjdGl2ZVwiIHdhcm5pbmcgZG9lc24ndCBmbG9vZCB0aGUgbG9ncy4gKi9cbmxldCByZXZvY2F0aW9uU3RvcmVNaXNzaW5nV2FybmVkID0gZmFsc2U7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIHdoZW4gYGRlY29kZWRgIGhhcyBiZWVuIHJldm9rZWQgcGVyIHRoZSByZWdpc3RlcmVkIHN0b3JlOiBpdHNcbiAqIGVtYmVkZGVkIGB0b2tlblZlcnNpb25gIGlzIHN0cmljdGx5IGJlaGluZCB0aGUgc3RvcmUncyBjdXJyZW50IHZlcnNpb24uXG4gKiBGYWlsLW9wZW4g4oCUIGFueSBzdG9yZSBlcnJvciwgYSBtaXNzaW5nIGVudHJ5LCBvciBhIHRva2VuL3N0b3JlIHdpdGhvdXQgYVxuICogdXNhYmxlIHZlcnNpb24geWllbGRzIGBmYWxzZWAgKGFsbG93KS4gTmV2ZXIgdGhyb3dzLlxuICovXG5hc3luYyBmdW5jdGlvbiBpc1Rva2VuUmV2b2tlZChkZWNvZGVkOiBKd3RQYXlsb2FkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHN0b3JlID0gdG9rZW5SZXZvY2F0aW9uU3RvcmU7XG4gIGlmICghc3RvcmUpIHtcbiAgICAvLyBNYWtlIHRoZSBcInJldm9jYXRpb24gaXMgT0ZGXCIgc3RhdGUgT0JTRVJWQUJMRTogYSBzZXJ2aWNlIHRoYXQgdmVyaWZpZXMgdXNlclxuICAgIC8vIHRva2VucyBidXQgZm9yZ290IGBzZXRUb2tlblJldm9jYXRpb25TdG9yZSgpYCBzaWxlbnRseSBkaXNhYmxlcyB0aGUgc2Vzc2lvblxuICAgIC8vIGtpbGwtc3dpdGNoLiBXYXJuIE9OQ0UgKG9ubHkgZm9yIGEgcmV2b2NhYmxlIHVzZXIgdG9rZW4pIHNvIGEgbWlzY29uZmlndXJlZFxuICAgIC8vIGJvb3Qgc3VyZmFjZXMgaW4gdGhlIGxvZ3MgaW5zdGVhZCBvZiBmYWlsaW5nIG9wZW4gaW52aXNpYmx5LlxuICAgIGlmICghcmV2b2NhdGlvblN0b3JlTWlzc2luZ1dhcm5lZCAmJiBkZWNvZGVkLnN1YiAmJiB0eXBlb2YgZGVjb2RlZC50b2tlblZlcnNpb24gPT09ICdudW1iZXInKSB7XG4gICAgICByZXZvY2F0aW9uU3RvcmVNaXNzaW5nV2FybmVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiByZXZvY2F0aW9uIHN0b3JlIE5PVCByZWdpc3RlcmVkIOKAlCByZXZvY2F0aW9uIGNoZWNrcyBhcmUgSU5BQ1RJVkUgKHNldFRva2VuUmV2b2NhdGlvblN0b3JlIHdhcyBuZXZlciBjYWxsZWQpOyByZXZva2VkL2NvbXByb21pc2VkIHNlc3Npb25zIHN0YXkgdmFsaWQgdW50aWwgbmF0dXJhbCBUVEwnKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghZGVjb2RlZC5zdWIgfHwgdHlwZW9mIGRlY29kZWQudG9rZW5WZXJzaW9uICE9PSAnbnVtYmVyJykgcmV0dXJuIGZhbHNlO1xuICB0cnkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzdG9yZS5nZXRDdXJyZW50VmVyc2lvbihkZWNvZGVkLnN1Yik7XG4gICAgcmV0dXJuIGN1cnJlbnQgIT09IG51bGwgJiYgZGVjb2RlZC50b2tlblZlcnNpb24gPCBjdXJyZW50O1xuICB9IGNhdGNoIHtcbiAgICAvLyBGYWlsLW9wZW46IGEgcmV2b2NhdGlvbi1zdG9yZSBvdXRhZ2UgbXVzdCBub3QgbG9jayBldmVyeSB1c2VyIG91dC5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGltcGVyc29uYXRpb24gc2Vzc2lvbidzIHJldm9jYXRpb24gc3RhdGUuIE5ldmVyIHRocm93czogYW55IGZhaWx1cmVcbiAqIOKAlCBubyBzdG9yZSwgYSBzdG9yZSB0aGF0IGNhbid0IGFuc3dlciwgYSByZWFkIGVycm9yIOKAlCBpcyBgdW5hdmFpbGFibGVgLCB3aGljaFxuICogY2FsbGVycyB0cmVhdCBhcyByZXZva2VkLlxuICovXG5hc3luYyBmdW5jdGlvbiBzZXNzaW9uUmV2b2NhdGlvblN0YXRlKGp0aTogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uUmV2b2NhdGlvblN0YXRlPiB7XG4gIGNvbnN0IHN0b3JlID0gdG9rZW5SZXZvY2F0aW9uU3RvcmU7XG4gIGlmICghc3RvcmU/LmdldFNlc3Npb25SZXZvY2F0aW9uKSByZXR1cm4gJ3VuYXZhaWxhYmxlJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgc3RvcmUuZ2V0U2Vzc2lvblJldm9jYXRpb24oanRpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICd1bmF2YWlsYWJsZSc7XG4gIH1cbn1cblxuLyoqIEFuIGltcGVyc29uYXRpb24gc2Vzc2lvbiB0b2tlbjogaXQgbmFtZXMgdGhlIG9wZXJhdG9yIEFORCBjYXJyaWVzIGl0cyBvd24gc2Vzc2lvbiBpZC4gKi9cbmZ1bmN0aW9uIGlzSW1wZXJzb25hdGlvblNlc3Npb24oZGVjb2RlZDogeyBpbXBlcnNvbmF0b3JJZD86IHVua25vd247IGp0aT86IHVua25vd24gfSk6IGRlY29kZWQgaXMgeyBpbXBlcnNvbmF0b3JJZDogc3RyaW5nOyBqdGk6IHN0cmluZyB9IHtcbiAgcmV0dXJuIHR5cGVvZiBkZWNvZGVkLmltcGVyc29uYXRvcklkID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZGVjb2RlZC5qdGkgPT09ICdzdHJpbmcnICYmIGRlY29kZWQuanRpLmxlbmd0aCA+IDA7XG59XG5cbi8qKlxuICogUHVibGljIHJldm9jYXRpb24gY2hlY2sgZm9yIHJvdXRlcyB0aGF0IHZlcmlmeSBhIHBsYXRmb3JtIEpXVCBPVVRTSURFXG4gKiBgcmVxdWlyZUF1dGhgIChlLmcuIHRoZSBpbWFnZS1yZWdpc3RyeSBgL3Rva2VuYCBtaW50IHBhdGgsIHdoaWNoIHJlc29sdmVzXG4gKiBpZGVudGl0eSBpdHNlbGYpLiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgdG9rZW4ncyBgdG9rZW5WZXJzaW9uYCBpcyBzdHJpY3RseVxuICogYmVoaW5kIHRoZSBzdG9yZSdzIGN1cnJlbnQgdmVyc2lvbi4gRmFpbC1vcGVuIChuZXZlciB0aHJvd3MpIOKAlCBhIHN0b3JlIG91dGFnZVxuICogb3IgYSB0b2tlbi9zdG9yZSB3aXRob3V0IGEgdXNhYmxlIHZlcnNpb24geWllbGRzIGZhbHNlIChhbGxvdyksIG1hdGNoaW5nXG4gKiBgcmVxdWlyZUF1dGhgLiBQYXNzIHRoZSB2ZXJpZmllZCBKV1QgY2xhaW1zIChgc3ViYCwgYHRva2VuVmVyc2lvbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBY2Nlc3NUb2tlblJldm9rZWQoXG4gIGNsYWltczogeyBzdWI/OiBzdHJpbmc7IHRva2VuVmVyc2lvbj86IG51bWJlcjsganRpPzogc3RyaW5nOyBpbXBlcnNvbmF0b3JJZD86IHN0cmluZyB9LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIC8vIEFuIGltcGVyc29uYXRpb24gc2Vzc2lvbiBpcyByZXZva2VkIHVubGVzcyB0aGUgc3RvcmUgcG9zaXRpdmVseSBzYXlzIGxpdmUg4oCUXG4gIC8vIGluY2x1ZGluZyBvbiB0aGlzIG91dC1vZi1iYW5kIHBhdGgsIG9yIGEgcmV2b2tlZCBzZXNzaW9uIGNvdWxkIHN0aWxsIG1pbnRcbiAgLy8gcmVnaXN0cnkgdG9rZW5zLlxuICBpZiAoaXNJbXBlcnNvbmF0aW9uU2Vzc2lvbihjbGFpbXMpICYmIGF3YWl0IHNlc3Npb25SZXZvY2F0aW9uU3RhdGUoY2xhaW1zLmp0aSkgIT09ICdsaXZlJykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBpc1Rva2VuUmV2b2tlZChjbGFpbXMgYXMgSnd0UGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICAvLyBBbiBPUEFRVUUgQUNDRVNTIEtFWSAoYHBiX3BhdF/igKZgIC8gYHBiX3NhX+KApmApIGNhcnJpZXMgbm8gY2xhaW1zIGFuZCBub1xuICAvLyBzaWduYXR1cmUsIHNvIGl0IGNhbm5vdCBiZSB2ZXJpZmllZCBoZXJlLiBUcmFkZSBpdCBhdCBwbGF0Zm9ybSBmb3IgYVxuICAvLyBzaG9ydC1saXZlZCBKV1QgKGNhY2hlZCBpbi1wcm9jZXNzIHVudGlsIGl0IGV4cGlyZXMpIGFuZCB0aGVuIHZlcmlmeSB0aGF0XG4gIC8vIEpXVCBvbiB0aGUgbm9ybWFsIHBhdGgg4oCUIHNlcnZpY2VzIG5ldmVyIHJlYWQgYSBrZXkgaGFzaC4gU2VlXG4gIC8vIGBzZXJ2aWNlcy9hcGkta2V5LWV4Y2hhbmdlLnRzYC5cbiAgaWYgKGlzT3BhcXVlQXBpS2V5KHBhcnRzWzFdKSkge1xuICAgIHZvaWQgcmVzb2x2ZUFwaUtleShvcHRpb25zLCBwYXJ0c1sxXSwgcmVxLCByZXMsIG5leHQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gIC8vIEV4cHJlc3MncyBlcnJvciBtaWRkbGV3YXJlIOKAlCB2ZXJpZmljYXRpb24gaXRzZWxmIG5ldmVyIHJlamVjdHMgKGl0IG1hcHNcbiAgLy8gZXZlcnkgZmFpbHVyZSB0byBhIHJlc3BvbnNlKS5cbiAgdm9pZCB2ZXJpZnlBbmRBdHRhY2gob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KS5jYXRjaChuZXh0KTtcbn1cblxuLyoqXG4gKiBFeGNoYW5nZSBhbiBvcGFxdWUga2V5IGZvciBhIEpXVCwgdGhlbiBjb250aW51ZSBvbiB0aGUgbm9ybWFsIHZlcmlmaWNhdGlvblxuICogcGF0aC4gQSByZWZ1c2VkIGtleSBpcyBhIDQwMTsgYW4gdW5yZWFjaGFibGUgcGxhdGZvcm0gaXMgYSA1MDMgKG5ldmVyIGEgcGFzcyDigJRcbiAqIGFuIHVudmVyaWZpYWJsZSBjcmVkZW50aWFsIGlzIG5vdCBhbiBpZGVudGl0eSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlLZXkoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAga2V5OiBzdHJpbmcsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIExvYWRlZCBMQVpJTFksIG9uIHRoZSBmaXJzdCBrZXkgZXZlciBwcmVzZW50ZWQuIEEgc3RhdGljIGltcG9ydCB3b3VsZCBwdXRcbiAgLy8gdGhlIEhUVFAgY2xpZW50IChhbmQgcGxhdGZvcm0ncyBhZGRyZXNzKSBpbnRvIHRoZSBpbXBvcnQgZ3JhcGggb2YgZXZlcnlcbiAgLy8gbW9kdWxlIHRoYXQgbWVyZWx5IHVzZXMgYHJlcXVpcmVBdXRoYCwgd2hpY2ggYm90aCB3aWRlbnMgdGhlIGJvb3QgZ3JhcGggYW5kXG4gIC8vIGJyZWFrcyBhbnkgdGVzdCB0aGF0IG1vY2tzIGBodHRwLWNsaWVudC5qc2Agd2l0aCBhIHBhcnRpYWwgbW9kdWxlLlxuICBjb25zdCB7IGV4Y2hhbmdlQXBpS2V5LCBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS5qcycpO1xuICBsZXQgdG9rZW46IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0b2tlbiA9IGF3YWl0IGV4Y2hhbmdlQXBpS2V5KGtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ0FjY2Vzcy1rZXkgdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlOyBwbGVhc2UgcmV0cnknLFxuICAgICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgb3IgcmV2b2tlZCBhY2Nlc3Mga2V5JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG4gIGF3YWl0IHZlcmlmeUFuZEF0dGFjaChvcHRpb25zLCB0b2tlbiwgcmVxLCByZXMsIG5leHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBbmRBdHRhY2goXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmF3VG9rZW46IHN0cmluZyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBUd28gY2hhaW5zLCBvbmUgZW50cnkgcG9pbnQgKHNlZSBgdmVyaWZ5QmVhcmVyVG9rZW5gKTogYSB1c2VyIHRva2VuIG11c3RcbiAgICAvLyBiZSBFUzI1NiBzaWduZWQgYnkgcGxhdGZvcm0gYW5kIHZlcmlmaWVkIGFnYWluc3QgaXRzIHB1Ymxpc2hlZCBKV0tTOyBhblxuICAgIC8vIGludGVybmFsIHNlcnZpY2UgdG9rZW4gc3RheXMgb24gdGhlIHNoYXJlZCBzZWNyZXQgYW5kIG11c3QgZGVjbGFyZSBpdHNlbGZcbiAgICAvLyBhIHNlcnZpY2UgcHJpbmNpcGFsLiBCb3RoIHBpbiB0aGUgYWxnb3JpdGhtIChubyBhbGctY29uZnVzaW9uLCBub1xuICAgIC8vIGBhbGc6bm9uZWApIGFuZCBib3RoIGFwcGx5IHRoZSBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2UgYmluZGluZy5cbiAgICBjb25zdCBkZWNvZGVkID0gYXdhaXQgdmVyaWZ5QmVhcmVyVG9rZW4ocmF3VG9rZW4pO1xuXG4gICAgaWYgKGRlY29kZWQudHlwZSAhPT0gJ2FjY2VzcycpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ09ubHkgYWNjZXNzIHRva2VucyBjYW4gYmUgdXNlZCBmb3IgQVBJIHJlcXVlc3RzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIGlmICghZGVjb2RlZC5zdWIgfHwgIWRlY29kZWQucm9sZSB8fCAhaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkKSkge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgLy8gU2VydmljZS10b2tlbiBraWxsLXN3aXRjaDogcmVqZWN0IGEgc2VydmljZSBwcmluY2lwYWwgd2hvc2Ugc2VydmljZSBoYXNcbiAgICAvLyBiZWVuIGFkZGVkIHRvIHRoZSBkZW55bGlzdC4gUm90YXRpbmcgdGhlIHNoYXJlZCBKV1Qgc2VjcmV0IGlzIHRoZSBvbmx5XG4gICAgLy8gb3RoZXIgd2F5IHRvIGludmFsaWRhdGUgYSBzZXJ2aWNlIHRva2VuIGJlZm9yZSBpdHMgKHNob3J0KSBUVEwg4oCUIGJ1dCB0aGF0XG4gICAgLy8gbnVrZXMgRVZFUlkgc2VydmljZSB0b2tlbiBmbGVldC13aWRlLiBUaGlzIGxldHMgb25lIGNvbXByb21pc2VkL3JvZ3VlXG4gICAgLy8gc2VydmljZSBiZSBjdXQgb2ZmIHN1cmdpY2FsbHkuIE8oMSkgU2V0IGxvb2t1cCwgemVybyBjb3N0IHdoZW4gdGhlIGRlbnlsaXN0XG4gICAgLy8gaXMgZW1wdHkgKHRoZSBkZWZhdWx0KSwgc28gaXQgbmV2ZXIgdGF4ZXMgdGhlIFMyUyBob3QgcGF0aCB1bmxlc3MgYXJtZWQuXG4gICAgaWYgKGlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpKSB7XG4gICAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl9kZW5pZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lT2YoZGVjb2RlZCkgPz8gJ3Vua25vd24nIH0pO1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGVkIGRlbnlsaXN0ZWQgc2VydmljZSB0b2tlbicsIHsgc3ViOiBkZWNvZGVkLnN1YiB9KTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1NlcnZpY2UgdG9rZW4gcmV2b2tlZCcsIEVycm9yQ29kZS5UT0tFTl9SRVZPS0VEKTtcbiAgICB9XG5cbiAgICByZXEudXNlciA9IHsgLi4uZGVjb2RlZCB9O1xuXG4gICAgLy8gQk9PVFNUUkFQLUFETUlOIEVOUk9MTUVOVCBTRVNTSU9OICgjOCwgcmV2aXNpb24gNCkuIFN1Y2ggYSB0b2tlbiBleGlzdHMgc29cbiAgICAvLyB0aGUgaW5zdGFsbCdzIG9ubHkgYWRtaW4gY2FuIGVucm9sIGEgZmFjdG9yOyBpdCBpcyBgYWFsOiAxYCBhbmQgbXVzdCBub3RcbiAgICAvLyByZWFjaCBhbnl0aGluZyBlbHNlLiBQbGF0Zm9ybSDigJQgd2hpY2ggb3ducyB0aGUgZXhjZXB0aW9uIGFuZCBrbm93cyB3aGljaFxuICAgIC8vIG9mIGl0cyBvd24gcm91dGVzIGBpbml0LXBsYXRmb3JtLnNoYCBjYWxscyDigJQgYWxsb3dzIGFuIGV4cGxpY2l0IGZldyBiZWZvcmVcbiAgICAvLyB0aGlzIHBvaW50IChzZWUgaXRzIG93biBgcmVxdWlyZUF1dGhgKTsgaW4gRVZFUlkgb3RoZXIgc2VydmljZSB0aGUgYW5zd2VyXG4gICAgLy8gaXMgc2ltcGx5IG5vLCBzbyB0aGUgcmVhY2ggcmVzdHJpY3Rpb24gaG9sZHMgd2l0aG91dCBhIHBlci1zZXJ2aWNlXG4gICAgLy8gYWxsb3dsaXN0IHRvIGtlZXAgaW4gc3luYy5cbiAgICBpZiAoZGVjb2RlZC5tZmFFbnJvbGxtZW50UGVuZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgZW1pdENvdW50ZXIoJ21mYV9lbmZvcmNlbWVudF9yZWZ1c2VkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSwgcmVhc29uOiAnYm9vdHN0cmFwX3Nlc3Npb24nIH0pO1xuICAgICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnbWZhLWVucm9sbWVudCcpO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICAgJ0ZpbmlzaCBzZXR0aW5nIHVwIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gYmVmb3JlIHVzaW5nIHRoZSByZXN0IG9mIFBpcGVsaW5lIEJ1aWxkZXInLFxuICAgICAgICBFcnJvckNvZGUuTUZBX0VOUk9MTE1FTlRfUkVRVUlSRUQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNlc3Npb24tbGV2ZWwgYXNzdXJhbmNlIChgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UsIG1heEFnZSB9KWApLlxuICAgIGlmIChvcHRpb25zLm1pbkFzc3VyYW5jZVxuICAgICAgJiYgcmVmdXNlRm9yQXNzdXJhbmNlKHsgbWluQXNzdXJhbmNlOiBvcHRpb25zLm1pbkFzc3VyYW5jZSwgLi4uKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQgPyB7IG1heEFnZTogb3B0aW9ucy5tYXhBZ2UgfSA6IHt9KSB9LCBkZWNvZGVkLCByZXEsIHJlcykpIHJldHVybjtcblxuICAgIC8vIFRoZSB4LW9yZy1pZC94LW9yZy1uYW1lIG92ZXJyaWRlIGxldHMgYSBTWVMtQURNSU4gYWN0IG9uIGEgY2hvc2VuIG9yZ1xuICAgIC8vIChjcm9zcy1vcmcgYWRtaW4gdG9vbGluZykuIEl0IGlzIGdhdGVkIG9uIHRoZSB2ZXJpZmllZCBgaXNTdXBlckFkbWluYCBjbGFpbVxuICAgIC8vIGhlcmUgc28gdGhhdCBldmVuIGEgcm91dGUgd2hpY2ggbWlzdGFrZW5seSBlbmFibGVzIGBhbGxvd09yZ0hlYWRlck92ZXJyaWRlYFxuICAgIC8vIGNhbiBORVZFUiBsZXQgYW4gb3JkaW5hcnkgYXV0aGVudGljYXRlZCB1c2VyIHNwb29mIGFub3RoZXIgdGVuYW50J3Mgb3JnIHZpYVxuICAgIC8vIHRoZSBoZWFkZXIg4oCUIGRlZmVuY2UtaW4tZGVwdGggYWdhaW5zdCB0aGUgY3Jvc3MtdGVuYW50IGJyZWFrIHRoaXMgY2F1c2VkLlxuICAgIGlmIChvcHRpb25zLmFsbG93T3JnSGVhZGVyT3ZlcnJpZGUgJiYgZGVjb2RlZC5pc1N1cGVyQWRtaW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ0lkID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1pZCddKTtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ05hbWUgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLW5hbWUnXSk7XG4gICAgICBpZiAoaGVhZGVyT3JnSWQpIHJlcS51c2VyLm9yZ2FuaXphdGlvbklkID0gaGVhZGVyT3JnSWQ7XG4gICAgICBpZiAoaGVhZGVyT3JnTmFtZSkgcmVxLnVzZXIub3JnYW5pemF0aW9uTmFtZSA9IGhlYWRlck9yZ05hbWU7XG4gICAgfVxuXG4gICAgLy8gUmUtZGVyaXZlIHRoZSByZXF1ZXN0J3MgdGVuYW50IGlkZW50aXR5IGZyb20gdGhlIE5PVy12ZXJpZmllZCBKV1QuXG4gICAgLy9cbiAgICAvLyBgYXR0YWNoUmVxdWVzdENvbnRleHRgIHJ1bnMgYXMgYSBnbG9iYWwgbWlkZGxld2FyZSBCRUZPUkUgdGhpcyBwZXItcm91dGVcbiAgICAvLyBgcmVxdWlyZUF1dGhgLCBzbyBpdCBjYXB0dXJlZCBgcmVxLmNvbnRleHQuaWRlbnRpdHlgIHdoaWxlIGByZXEudXNlcmAgd2FzXG4gICAgLy8gc3RpbGwgdW5kZWZpbmVkIOKAlCBhdCB3aGljaCBwb2ludCBgZ2V0SWRlbnRpdHlgIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyxcbiAgICAvLyBjbGllbnQtc2V0dGFibGUgYHgtb3JnLWlkYC9geC11c2VyLWlkYCBoZWFkZXJzLiBFdmVyeSBkb3duc3RyZWFtIHRlbmFudC1cbiAgICAvLyBhdXRob3JpdHkgY29uc3VtZXIgKHJlcXVpcmVPcmdJZCwgd2l0aFRlbmFudENvbnRleHQncyBSTFMgc2NvcGUsIGNoZWNrUXVvdGEsXG4gICAgLy8gd2l0aFJvdXRlLCBhbmQgdGhlIGlkZW1wb3RlbmN5IG5hbWVzcGFjZSkgcmVhZHMgYHJlcS5jb250ZXh0LmlkZW50aXR5YCwgc29cbiAgICAvLyB0aGF0IGZyb3plbiBoZWFkZXItZGVyaXZlZCB2YWx1ZSDigJQgbm90IHRoZSBKV1Qg4oCUIHdhcyBnb3Zlcm5pbmcgdGVuYW5jeSBvblxuICAgIC8vIGFueSBub24tbmdpbnggcGF0aC4gUmVjb21wdXRpbmcgaGVyZSwgYXQgdGhlIHNpbmdsZSBwb3N0LXZlcmlmaWNhdGlvbiBjaG9rZVxuICAgIC8vIHBvaW50LCBtYWtlcyBgZ2V0SWRlbnRpdHlgIHByZWZlciB0aGUgdmVyaWZpZWQgYHJlcS51c2VyYCAoc2VlIGlkZW50aXR5LnRzKVxuICAgIC8vIHNvIHRlbmFuY3kgaXMgSldULWF1dGhvcml0YXRpdmUuIFRoZSBuZ2lueCBgeC1vcmctaWRgIG92ZXJ3cml0ZSBzdGF5cyBhc1xuICAgIC8vIGRlZmVuY2UtaW4tZGVwdGguIEd1YXJkZWQgb24gYHJlcS5jb250ZXh0YCBzbyBzZXJ2aWNlcy9wYXRocyB0aGF0IG5ldmVyXG4gICAgLy8gYXR0YWNoIGEgY29udGV4dCAob3IgcnVuIHJlcXVpcmVBdXRoIHByZS1jb250ZXh0KSBhcmUgdW5hZmZlY3RlZC5cbiAgICBjb25zdCByZXFDdHggPSAocmVxIGFzIFJlcXVlc3QgJiB7IGNvbnRleHQ/OiB7IGlkZW50aXR5OiBSZXF1ZXN0SWRlbnRpdHkgfSB9KS5jb250ZXh0O1xuICAgIGlmIChyZXFDdHgpIHtcbiAgICAgIHJlcUN0eC5pZGVudGl0eSA9IGdldElkZW50aXR5KHJlcSBhcyB1bmtub3duIGFzIEh0dHBSZXF1ZXN0KTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWludmFsaWRhdGlvbiBjaGVjayBmb3IgdGhlIHN0YXRlbGVzcyBzZXJ2aWNlczogcmVqZWN0IGEgdG9rZW5cbiAgICAvLyB3aG9zZSBgdG9rZW5WZXJzaW9uYCBpcyBiZWhpbmQgdGhlIHJldm9jYXRpb24gc3RvcmUncyBjdXJyZW50IHZhbHVlIChhXG4gICAgLy8gcHJpdmlsZWdlIGNoYW5nZSB0aGUgcGxhdGZvcm0gcHVibGlzaGVkKS4gTm8gc3RvcmUgcmVnaXN0ZXJlZCDih5IgdGhpcyBpcyBhXG4gICAgLy8gbm8tb3AgYW5kIGNvbnRyb2wgcGFzc2VzIHN0cmFpZ2h0IHRocm91Z2guIEZhaWwtb3BlbiBvbiBhbnkgc3RvcmUgZXJyb3IuXG4gICAgLy8gQW4gaW1wZXJzb25hdGlvbiBzZXNzaW9uIGlzIGNoZWNrZWQgZXZlbiB3aGVuIE5PIHN0b3JlIGlzIHJlZ2lzdGVyZWQ6IHRoZVxuICAgIC8vIHRva2VuVmVyc2lvbiBjaGVjayBiZWxvdyBpcyBhIG5vLW9wIHdpdGhvdXQgYSBzdG9yZSwgYnV0IGZvciBhIHNlc3Npb25cbiAgICAvLyB0aGF0IHdvdWxkIHNpbGVudGx5IG1lYW4gXCJuZXZlciByZXZva2VkXCIuIEhlcmUgbm8gc3RvcmUg4oeSIHVuYXZhaWxhYmxlIOKHklxuICAgIC8vIHJlamVjdGVkLiBTZWUgYFRva2VuUmV2b2NhdGlvblN0b3JlLmdldFNlc3Npb25SZXZvY2F0aW9uYC5cbiAgICBjb25zdCBpbXBlcnNvbmF0aW9uID0gaXNJbXBlcnNvbmF0aW9uU2Vzc2lvbihkZWNvZGVkKTtcbiAgICBpZiAoaW1wZXJzb25hdGlvbiB8fCAodG9rZW5SZXZvY2F0aW9uU3RvcmUgJiYgZGVjb2RlZC5zdWIgJiYgdHlwZW9mIGRlY29kZWQudG9rZW5WZXJzaW9uID09PSAnbnVtYmVyJykpIHtcbiAgICAgIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gICAgICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgd2l0aG91dCBpdCwgdGhhdCB0aHJvdyB3b3VsZCBzdXJmYWNlIGFzIGFuXG4gICAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9uICh0aGlzIGBuZXh0KClgIHJ1bnMgaW4gYSBtaWNyb3Rhc2ssIG91dHNpZGUgdGhlXG4gICAgICAvLyBzdXJyb3VuZGluZyB0cnkvY2F0Y2ggYW5kIEV4cHJlc3MncyBwZXItbGF5ZXIgZGlzcGF0Y2gpLiBUaGUgY2hlY2tzXG4gICAgICAvLyB0aGVtc2VsdmVzIG5ldmVyIHJlamVjdCwgc28gdGhlIGNhdGNoIG9ubHkgZXZlciBzZWVzIGEgZG93bnN0cmVhbSBlcnJvci5cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChpbXBlcnNvbmF0aW9uKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGUgPSBhd2FpdCBzZXNzaW9uUmV2b2NhdGlvblN0YXRlKGRlY29kZWQuanRpIGFzIHN0cmluZyk7XG4gICAgICAgICAgaWYgKHN0YXRlICE9PSAnbGl2ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgICAgICAgIHJlcyxcbiAgICAgICAgICAgICAgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsXG4gICAgICAgICAgICAgIHN0YXRlID09PSAncmV2b2tlZCdcbiAgICAgICAgICAgICAgICA/ICdUaGlzIGltcGVyc29uYXRpb24gc2Vzc2lvbiBoYXMgYmVlbiBlbmRlZCdcbiAgICAgICAgICAgICAgICA6ICdUaGlzIGltcGVyc29uYXRpb24gc2Vzc2lvbiBjb3VsZCBub3QgYmUgdmVyaWZpZWQnLFxuICAgICAgICAgICAgICBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlblJldm9jYXRpb25TdG9yZSAmJiBkZWNvZGVkLnN1YiAmJiB0eXBlb2YgZGVjb2RlZC50b2tlblZlcnNpb24gPT09ICdudW1iZXInICYmIGF3YWl0IGlzVG9rZW5SZXZva2VkKGRlY29kZWQpKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnU2Vzc2lvbiBoYXMgYmVlbiByZXZva2VkOyBwbGVhc2Ugc2lnbiBpbiBhZ2FpbicsIEVycm9yQ29kZS5UT0tFTl9SRVZPS0VEKTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0KCk7XG4gICAgICB9KSgpLmNhdGNoKG5leHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaWduaW5nIGtleXMgY291bGRuJ3QgYmUgZmV0Y2hlZCwgc28gdGhlIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTi5cbiAgICAvLyBGYWlsIENMT1NFRCB3aXRoIGEgcmV0cnlhYmxlIDUwMyDigJQgbmV2ZXIgYSBwYXNzLCBhbmQgbmV2ZXIgYSA0MDEgdGhhdFxuICAgIC8vIHdvdWxkIHNlbmQgYSBsZWdpdGltYXRlIGNsaWVudCBvZmYgdG8gcmUtYXV0aGVudGljYXRlIG92ZXIgb3VyIG91dGFnZS5cbiAgICAvLyBTYW1lIHJlYXNvbmluZyBmb3IgdGhlIFNFUlZJQ0UgY2hhaW46IG5vIHJlYWRhYmxlIGtleSBidW5kbGUgbWVhbnMgbm8gd2F5XG4gICAgLy8gdG8gdGVsbCBhIHBlZXIncyB0b2tlbiBmcm9tIGEgZm9yZ2VyeSwgc28gdGhlIHJlcXVlc3QgaXMgcmVmdXNlZCB3aXRoIGFcbiAgICAvLyByZXRyeWFibGUgNTAzIHJhdGhlciB0aGFuIGFkbWl0dGVkIG9yIGJvdW5jZWQgdG8gcmUtYXV0aGVudGljYXRlLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEp3a3NVbmF2YWlsYWJsZUVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgU2VydmljZUtleUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0aW5nIHJlcXVlc3Q6IHRva2VuIHNpZ25pbmcga2V5cyB1bmF2YWlsYWJsZScsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ1Rva2VuIHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZTsgcGxlYXNlIHJldHJ5JyxcbiAgICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVua25vd25LaWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBzZXQgb2YgdmVyaWZpZWQgY2xhaW1zIHNwZWFrcyBmb3IgYSBQRVJTT04ncyBvd24gc2Vzc2lvbiDigJQgdGhlIG9ubHlcbiAqIGtpbmQgb2YgY3JlZGVudGlhbCBhbiBhc3N1cmFuY2UgbGV2ZWwgY2FuIGJlIGFzc2VydGVkIGFib3V0LlxuICpcbiAqIEV4Y2x1ZGVzIGFsbCB0aHJlZSBtYWNoaW5lIHNoYXBlczogYW4gaW50ZXJuYWwgc2VydmljZSBwcmluY2lwYWwsIGFuIG9yZ1xuICogc2VydmljZSBhY2NvdW50LCBhbmQgYW55IGV4Y2hhbmdlZCBhY2Nlc3Mga2V5IChgdG9rZW5fdXNlOiAnYXBpX2tleSdgLCBpLmUuIGFcbiAqIFBBVCBvciBhIHNlcnZpY2UtYWNjb3VudCBrZXkpLCBlYWNoIG9mIHdoaWNoIGF1dGhlbnRpY2F0ZXMgYSBwcm9ncmFtIGhvbGRpbmcgYVxuICogc2VjcmV0IHJhdGhlciB0aGFuIGEgcGVyc29uIHByZXNlbnRpbmcgZmFjdG9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSHVtYW5QcmluY2lwYWwoY2xhaW1zOiBQaWNrPEp3dFBheWxvYWQsICdwcmluY2lwYWxUeXBlJyB8ICd0b2tlbl91c2UnPiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY2xhaW1zPy5wcmluY2lwYWxUeXBlID09PSAndXNlcicgJiYgY2xhaW1zLnRva2VuX3VzZSA9PT0gJ2FjY2Vzcyc7XG59XG5cbi8qKiBXaGF0IGFuIGFzc3VyYW5jZSBnYXRlIGRlbWFuZHMuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc3VyYW5jZU9wdGlvbnMge1xuICBtaW5Bc3N1cmFuY2U6IEFzc3VyYW5jZUxldmVsO1xuICBtYXhBZ2U/OiBudW1iZXI7XG59XG5cbi8qKlxuICogU3RhbmRhbG9uZSBhc3N1cmFuY2UgZ2F0ZSwgZm9yIGEgc2VydmljZSB3aG9zZSBvd24gYHJlcXVpcmVBdXRoYCBpcyBub3RcbiAqIGFwaS1jb3JlJ3MgKHBsYXRmb3JtJ3MgaXMgaXRzIG93biwgYmVjYXVzZSBpdCByZWFkcyBNb25nbykuIENvbXBvc2UgaXQgQUZURVJcbiAqIGF1dGhlbnRpY2F0aW9uOiBgcm91dGVyLmdldCgnL3gnLCByZXF1aXJlQXV0aCwgcmVxdWlyZUFzc3VyYW5jZSh7IG1pbkFzc3VyYW5jZTogMiB9KSwgaClgLlxuICpcbiAqIElkZW50aWNhbCBydWxlcyBhbmQgaWRlbnRpY2FsIHJlZnVzYWxzIHRvIGByZXF1aXJlQXV0aCh7IG1pbkFzc3VyYW5jZSB9KWAg4oCUXG4gKiB0aGF0IG9wdGlvbiBzaW1wbHkgY2FsbHMgdGhlIHNhbWUgY2hlY2sgaW5saW5lLCBzbyB0aGVyZSBpcyBvbmUgaW1wbGVtZW50YXRpb25cbiAqIG9mIFwiaXMgdGhpcyBzZXNzaW9uIE1GQS1ncmFkZVwiIGluIHRoZSBjb2RlYmFzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBc3N1cmFuY2Uob3B0aW9uczogQXNzdXJhbmNlT3B0aW9ucykge1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuICAgIGlmIChyZWZ1c2VGb3JBc3N1cmFuY2Uob3B0aW9ucywgcmVxLnVzZXIgYXMgSnd0UGF5bG9hZCwgcmVxLCByZXMpKSByZXR1cm47XG4gICAgbmV4dCgpO1xuICB9LCB7IGtpbmQ6ICdhc3N1cmFuY2UnLCBtaW5Bc3N1cmFuY2U6IG9wdGlvbnMubWluQXNzdXJhbmNlLCAuLi4ob3B0aW9ucy5tYXhBZ2UgIT09IHVuZGVmaW5lZCA/IHsgbWF4QWdlOiBvcHRpb25zLm1heEFnZSB9IDoge30pIH0pO1xufVxuXG4vKipcbiAqIEhhbmRsZXItbGV2ZWwgdHdpbiBvZiB7QGxpbmsgcmVxdWlyZUFzc3VyYW5jZX0sIGZvciBhIHJvdXRlIHdoZXJlIG9ubHkgU09NRVxuICogcmVxdWVzdHMgbXVzdCBiZSBNRkEtZ3JhZGUg4oCUIGUuZy4gYSBwb2xpY3kgcm91dGUgb24gd2hpY2ggVElHSFRFTklORyBhIHNldHRpbmdcbiAqIHN0YXlzIG9wZW4gdG8gYSBzaW5nbGUtZmFjdG9yIHNlc3Npb24gKHNvIGFuIGFkbWluIHdpdGhvdXQgTUZBIGNhbiBhZG9wdCBpdClcbiAqIGJ1dCBMT09TRU5JTkcgaXQgZG9lcyBub3QuIFNhbWUgcnVsZXMgYW5kIHRoZSBzYW1lIHRocmVlIHJlZnVzYWxzLiBSZXR1cm5zXG4gKiB0cnVlIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIFJFRlVTRUQgKGEgcmVzcG9uc2UgaGFzIGJlZW4gc2VudCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZ1c2VXZWFrU2Vzc2lvbihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG9wdGlvbnM6IEFzc3VyYW5jZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVmdXNlRm9yQXNzdXJhbmNlKG9wdGlvbnMsIHJlcS51c2VyIGFzIEp3dFBheWxvYWQsIHJlcSwgcmVzKTtcbn1cblxuLyoqIFdoYXQge0BsaW5rIHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZX0gZGVtYW5kcyBvZiBhIHJvdXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMge1xuICAvKiogV2hhdCBhIG1hY2hpbmUgY3JlZGVudGlhbCAoUEFULCBzZXJ2aWNlIGFjY291bnQsIG1hY2hpbmUgc2Vzc2lvbikgbWVldHMgb25cbiAgICogIHRoaXMgcm91dGUgd2hpbGUgdGhlIHBvbGljeSBpcyBvbiDigJQgc2VlIHtAbGluayBPcmdBZG1pbkFzc3VyYW5jZU1hY2hpbmVzfS5cbiAgICogIFJlcXVpcmVkLCBzbyBldmVyeSByb3V0ZSBzdGF0ZXMgaXRzIGRlY2lzaW9uIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgb25lLiAqL1xuICBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcztcbn1cblxuLyoqIGBkZXRhaWxzLnJlYXNvbmAgb24gYSByZWZ1c2FsIGJ5IHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9LCBzbyB0aGUgVUlcbiAqICBjYW4gc2F5IGl0IGlzIHRoZSBPUkcncyBwb2xpY3kgYXNraW5nLCBub3QgdGhlIHJvdXRlJ3Mgb3duIHJlcXVpcmVtZW50LiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BRE1JTl9NRkFfUkVBU09OID0gJ29yZ19hZG1pbl9wb2xpY3knO1xuXG4vKipcbiAqIFRoZSByZWZ1c2FsIHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9IHdvdWxkIHNlbmQgZm9yIHRoZXNlIGNsYWltcywgb3JcbiAqIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcXVlc3QgbWF5IHByb2NlZWQuIEV4cG9ydGVkIHNvIGEgaGFuZGxlciB3aG9zZSBwb2xpY3lcbiAqIGFwcGxpZXMgdG8gb25seSBQQVJUIG9mIGEgcm91dGUgKGUuZy4gYGdlbmVyYXRlLXRva2VuYCwgd2hlcmUgb3BlbmluZyBhIG5ld1xuICogbWFjaGluZSBjcmVkZW50aWFsIGlzIGdhdGVkIGJ1dCByZW5ld2luZyBhbiBleGlzdGluZyBvbmUgaXMgbm90KSBhcHBsaWVzIHRoZVxuICogZXhhY3Qgc2FtZSBydWxlIHJhdGhlciB0aGFuIGEgY29weSBvZiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yZ0FkbWluQXNzdXJhbmNlUmVmdXNhbChcbiAgY2xhaW1zOiBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMsXG4pOiB7IHN0YXR1czogbnVtYmVyOyBjb2RlOiBFcnJvckNvZGU7IG1lc3NhZ2U6IHN0cmluZzsgcmVhc29uOiAnbWFjaGluZV9wcmluY2lwYWwnIHwgJ3dlYWtfc2Vzc2lvbicgfSB8IHVuZGVmaW5lZCB7XG4gIC8vIFRoZSBjbGFpbSBpcyBvbmx5IGV2ZXIgYDJgLCBhbmQgb25seSB3aGVuIHRoZSBwb2xpY3kgaXMgb24gKHNlZSBKd3RQYXlsb2FkKS5cbiAgaWYgKCFjbGFpbXMgfHwgY2xhaW1zLm9yZ19hZG1pbl9hYWwgIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghaXNIdW1hblByaW5jaXBhbChjbGFpbXMpKSB7XG4gICAgaWYgKG9wdGlvbnMubWFjaGluZXMgPT09ICdhbGxvdycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBjb2RlOiBFcnJvckNvZGUuSFVNQU5fU0VTU0lPTl9SRVFVSVJFRCxcbiAgICAgIHJlYXNvbjogJ21hY2hpbmVfcHJpbmNpcGFsJyxcbiAgICAgIG1lc3NhZ2U6ICdZb3VyIG9yZ2FuaXphdGlvbiByZXF1aXJlcyB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGZvciB0aGlzIGFjdGlvbiDigJQgQVBJIGtleXMgYW5kIHNlcnZpY2UgYWNjb3VudHMgY2Fubm90IHBlcmZvcm0gaXQnLFxuICAgIH07XG4gIH1cbiAgaWYgKChjbGFpbXMuYWFsID8/IDEpID49IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICBjb2RlOiBFcnJvckNvZGUuTUZBX1JFUVVJUkVELFxuICAgIHJlYXNvbjogJ3dlYWtfc2Vzc2lvbicsXG4gICAgbWVzc2FnZTogJ1lvdXIgb3JnYW5pemF0aW9uIHJlcXVpcmVzIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gZm9yIGFkbWluaXN0cmF0aXZlIGFjdGlvbnMg4oCUIHNpZ24gaW4gYWdhaW4gd2l0aCBhIHBhc3NrZXkgb3IgYW4gYXV0aGVudGljYXRvciBjb2RlJyxcbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBseSB7QGxpbmsgb3JnQWRtaW5Bc3N1cmFuY2VSZWZ1c2FsfSBhbmQgc2VuZCBpdHMgcmVmdXNhbC4gUmV0dXJucyB0cnVlIHdoZW5cbiAqIHRoZSByZXF1ZXN0IHdhcyBSRUZVU0VEIChhIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQpLiBGb3IgaGFuZGxlci1sZXZlbCB1c2U7XG4gKiByb3V0ZXMgdXNlIHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmdXNlRm9yT3JnQWRtaW5Bc3N1cmFuY2UocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgcmVmdXNhbCA9IG9yZ0FkbWluQXNzdXJhbmNlUmVmdXNhbChyZXEudXNlciBhcyBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgaWYgKCFyZWZ1c2FsKSByZXR1cm4gZmFsc2U7XG4gIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogYG9yZ19hZG1pbl8ke3JlZnVzYWwucmVhc29ufWAgfSk7XG4gIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ2Fzc3VyYW5jZTpvcmctYWRtaW4nKTtcbiAgc2VuZEVycm9yKHJlcywgcmVmdXNhbC5zdGF0dXMsIHJlZnVzYWwubWVzc2FnZSwgcmVmdXNhbC5jb2RlLCB7IHJlYXNvbjogT1JHX0FETUlOX01GQV9SRUFTT04gfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFRoZSBvcmcgcG9saWN5IFwiYWRtaW5pc3RyYXRpdmUgYWN0aW9ucyByZXF1aXJlIE1GQVwiIChgYWRtaW5BY3Rpb25zUmVxdWlyZU1mYWApLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgcmVxdWlyZUFzc3VyYW5jZX0sIHRoZSByZXF1aXJlbWVudCBpcyB0aGUgT1JHJ3MgY2hvaWNlLCBub3QgdGhlXG4gKiByb3V0ZSdzOiB0aGUgZ2F0ZSByZWFkcyB0aGUgYG9yZ19hZG1pbl9hYWxgIGNsYWltLCBzZXQgYXQgdG9rZW4gaXNzdWUgZnJvbSB0aGVcbiAqIGFjdGl2ZSBvcmcncyBwb2xpY3kgKHN0cmljdGVzdCBhY3Jvc3MgaXRzIGFuY2VzdG9ycyksIHNvIGEgc2VydmljZSB0aGF0IGNhbm5vdFxuICogcmVhZCB0aGUgb3JnIGRvY3VtZW50IHN0aWxsIGVuZm9yY2VzIGl0LiBXaXRoIHRoZSBwb2xpY3kgb2ZmIHRoZSBnYXRlIGlzIGFcbiAqIG5vLW9wOyB3aXRoIGl0IG9uLCBhIHNpbmdsZS1mYWN0b3Igc2Vzc2lvbiBpcyByZWZ1c2VkIDQwMSBgTUZBX1JFUVVJUkVEYFxuICogKHdpdGggYGRldGFpbHMucmVhc29uOiAnb3JnX2FkbWluX3BvbGljeSdgKSDigJQgdGhlIHNhbWUgY29kZSB0aGUgY2xpZW50IGFscmVhZHlcbiAqIHR1cm5zIGludG8gXCJlbnJvbCBhIGZhY3RvciAvIHNpZ24gaW4gd2l0aCBpdFwiLCBuZXZlciBhIHNpZ24tb3V0LlxuICpcbiAqIGBtYWNoaW5lc2AgaXMgZGVjaWRlZCBwZXIgcm91dGUgKHNlZSB7QGxpbmsgT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lc30pOiB0aGVcbiAqIHBvbGljeSBpcyBhYm91dCBob3cgc3Ryb25nbHkgYSBQRVJTT04ncyBzZXNzaW9uIHdhcyBvcGVuZWQsIHNvIGF1dG9tYXRpb24gdGhhdFxuICogbGVnaXRpbWF0ZWx5IGRyaXZlcyBhIHJvdXRlIGtlZXBzIHdvcmtpbmcgKGBhbGxvd2ApLCB3aGlsZSBhIHJvdXRlIHRoYXQgbWludHNcbiAqIGEgZnVydGhlciBjcmVkZW50aWFsIHJlZnVzZXMgbWFjaGluZXMgb3V0cmlnaHQgKGByZWZ1c2VgLCA0MDNcbiAqIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCDigJQgdGhlIHNhbWUgcmVmdXNhbCBgcmVxdWlyZUFzc3VyYW5jZWAgZ2l2ZXMgdGhlbSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2Uob3B0aW9uczogT3JnQWRtaW5Bc3N1cmFuY2VPcHRpb25zKSB7XG4gIHJldHVybiB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyZXEudXNlcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICB9XG4gICAgaWYgKHJlZnVzZUZvck9yZ0FkbWluQXNzdXJhbmNlKHJlcSwgcmVzLCBvcHRpb25zKSkgcmV0dXJuO1xuICAgIG5leHQoKTtcbiAgfSwgeyBraW5kOiAnb3JnQWRtaW5Bc3N1cmFuY2UnLCBtYWNoaW5lczogb3B0aW9ucy5tYWNoaW5lcyB9KTtcbn1cblxuLyoqXG4gKiBFbmZvcmNlIGBtaW5Bc3N1cmFuY2VgIC8gYG1heEFnZWAgb24gYSB2ZXJpZmllZCB0b2tlbi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gKiByZXF1ZXN0IHdhcyBSRUZVU0VEIChhIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQpLlxuICpcbiAqIFRocmVlIGRpc3RpbmN0IHJlZnVzYWxzLCBiZWNhdXNlIHRoZSBjbGllbnQncyBuZXh0IG1vdmUgZGlmZmVycyBmb3IgZWFjaDpcbiAqIGEgbWFjaGluZSBtdXN0IHN0b3AgKDQwMyksIGEgd2VhayBzZXNzaW9uIG11c3QgZ2FpbiBhIGZhY3RvciAoNDAxXG4gKiBgTUZBX1JFUVVJUkVEYCDihpIgZW5yb2xtZW50LCBuZXZlciBhIHNpZ24tb3V0KSwgYW5kIGEgc3RhbGUgb25lIG11c3Qgc2ltcGx5XG4gKiBhdXRoZW50aWNhdGUgYWdhaW4gKDQwMSBgUkVBVVRIX1JFUVVJUkVEYCkuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUZvckFzc3VyYW5jZShcbiAgb3B0aW9uczogQXNzdXJhbmNlT3B0aW9ucyxcbiAgZGVjb2RlZDogSnd0UGF5bG9hZCxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1pbkFzc3VyYW5jZSA9IG9wdGlvbnMubWluQXNzdXJhbmNlO1xuICBjb25zdCByZWZ1c2UgPSAocmVhc29uOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSk6IHRydWUgPT4ge1xuICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbiB9KTtcbiAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsIGBhc3N1cmFuY2U6JHttaW5Bc3N1cmFuY2V9YCk7XG4gICAgc2VuZEVycm9yKHJlcywgc3RhdHVzLCBtZXNzYWdlLCBjb2RlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBpZiAoIWlzSHVtYW5QcmluY2lwYWwoZGVjb2RlZCkpIHtcbiAgICByZXR1cm4gcmVmdXNlKFxuICAgICAgJ21hY2hpbmVfcHJpbmNpcGFsJywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAnVGhpcyBhY3Rpb24gcmVxdWlyZXMgYSBwZXJzb24gc2lnbmVkIGluIHdpdGggdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiDigJQgQVBJIGtleXMgYW5kIHNlcnZpY2UgYWNjb3VudHMgY2Fubm90IHBlcmZvcm0gaXQnLFxuICAgICAgRXJyb3JDb2RlLkhVTUFOX1NFU1NJT05fUkVRVUlSRUQsXG4gICAgKTtcbiAgfVxuICBpZiAoKGRlY29kZWQuYWFsID8/IDEpIDwgbWluQXNzdXJhbmNlKSB7XG4gICAgcmV0dXJuIHJlZnVzZShcbiAgICAgICd3ZWFrX3Nlc3Npb24nLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICdUaGlzIGFjdGlvbiByZXF1aXJlcyB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIOKAlCBzaWduIGluIGFnYWluIHdpdGggYSBwYXNza2V5IG9yIGFuIGF1dGhlbnRpY2F0b3IgY29kZScsXG4gICAgICBFcnJvckNvZGUuTUZBX1JFUVVJUkVELFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhdXRoVGltZSA9IGRlY29kZWQuYXV0aF90aW1lO1xuICAgIC8vIE5vIGBhdXRoX3RpbWVgIGlzIG5vdCBcInJlY2VudCBlbm91Z2ggYnkgZGVmYXVsdFwiIOKAlCBgaGFzVmFsaWRJZGVudGl0eUNsYWltc2BcbiAgICAvLyBhbHJlYWR5IHJlcXVpcmVzIGl0IG9uIGEgdXNlciB0b2tlbiwgc28gYW4gYWJzZW50IG9uZSBtZWFucyBhIHRva2VuIHRoaXNcbiAgICAvLyBnYXRlIGNhbm5vdCByZWFzb24gYWJvdXQuIEZhaWwgY2xvc2VkLlxuICAgIGlmICh0eXBlb2YgYXV0aFRpbWUgIT09ICdudW1iZXInIHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApIC0gYXV0aFRpbWUgPiBvcHRpb25zLm1heEFnZSkge1xuICAgICAgcmV0dXJuIHJlZnVzZShcbiAgICAgICAgJ3N0YWxlX3Nlc3Npb24nLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICAgJ1RoaXMgYWN0aW9uIHJlcXVpcmVzIGEgcmVjZW50IHNpZ24taW4g4oCUIHBsZWFzZSBhdXRoZW50aWNhdGUgYWdhaW4nLFxuICAgICAgICBFcnJvckNvZGUuUkVBVVRIX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJpZmllZCB0b2tlbiBjYXJyaWVzIGEgd2VsbC1mb3JtZWQgaWRlbnRpdHk6IGEga25vd25cbiAqIGBwcmluY2lwYWxUeXBlYCBhbmQgYHRva2VuX3VzZWAsIGFuZCB0aGUgY2xhaW1zIHRoYXQga2luZCBvZiBwcmluY2lwYWwgbXVzdFxuICogaGF2ZS4gRmFpbHMgY2xvc2VkIOKAlCBhIHRva2VuIG1pbnRlZCBiZWZvcmUgdGhlc2UgY2xhaW1zIGV4aXN0ZWQsIG9yIG9uZSB3aXRoIGFcbiAqIGNvbnRyYWRpY3RvcnkgY29tYmluYXRpb24sIGlzIG5vdCBhbiBpZGVudGl0eSBhbnkgZ2F0ZSBzaG91bGQgcmVhc29uIGFib3V0LlxuICpcbiAqIC0gYHNlcnZpY2VgOiBgdG9rZW5fdXNlOiAnYWNjZXNzJ2AgYW5kIGEgYHNlcnZpY2U6PG5hbWU+YCBzdWJqZWN0ICh0aGUgbmFtZVxuICogICBmZWVkcyB0aGUgZGVueWxpc3QgYW5kIGF1ZGl0IGF0dHJpYnV0aW9uKS5cbiAqIC0gYHVzZXJgIC8gYHNlcnZpY2VfYWNjb3VudGA6IGBhbXJgIChrbm93biBtZXRob2RzKSwgYGFhbGAgYW5kIGBhdXRoX3RpbWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkOiBQYXJ0aWFsPEp3dFBheWxvYWQ+KTogYm9vbGVhbiB7XG4gIGlmICghZGVjb2RlZC5wcmluY2lwYWxUeXBlIHx8ICFQUklOQ0lQQUxfVFlQRVMuaW5jbHVkZXMoZGVjb2RlZC5wcmluY2lwYWxUeXBlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWRlY29kZWQudG9rZW5fdXNlIHx8ICFUT0tFTl9VU0VTLmluY2x1ZGVzKGRlY29kZWQudG9rZW5fdXNlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjb2RlZC5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZScpIHtcbiAgICByZXR1cm4gZGVjb2RlZC50b2tlbl91c2UgPT09ICdhY2Nlc3MnXG4gICAgICAmJiB0eXBlb2YgZGVjb2RlZC5zdWIgPT09ICdzdHJpbmcnXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5zdGFydHNXaXRoKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgpXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5sZW5ndGggPiBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShkZWNvZGVkLmFtcilcbiAgICAmJiBkZWNvZGVkLmFtci5ldmVyeSgobSkgPT4gQVVUSF9NRVRIT0RTLmluY2x1ZGVzKG0pKVxuICAgICYmIChkZWNvZGVkLmFhbCA9PT0gMSB8fCBkZWNvZGVkLmFhbCA9PT0gMilcbiAgICAmJiB0eXBlb2YgZGVjb2RlZC5hdXRoX3RpbWUgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcXVlc3QncyB1c2VyIGhvbGRzIGBwZXJtaXNzaW9uYC4gU3VwZXJhZG1pbnMgaW1wbGljaXRseSBob2xkXG4gKiBldmVyeSBwZXJtaXNzaW9uLiBSZWFkcyB0aGUgcmVzb2x2ZWQgYHBlcm1pc3Npb25zYCBjbGFpbSAoc2V0IGF0IHRva2VuIGlzc3VlLFxuICogb3IgcmUtZGVyaXZlZCBwZXIgcmVxdWVzdCBieSB0aGUgcGxhdGZvcm0pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckhhc1Blcm1pc3Npb24ocmVxOiBSZXF1ZXN0LCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNQZXJtaXNzaW9uKHJlcS51c2VyPy5wZXJtaXNzaW9ucywgcGVybWlzc2lvbiwgcmVxLnVzZXI/LmlzU3VwZXJBZG1pbik7XG59XG5cbi8qKlxuICogQ29udGV4dCBwYXNzZWQgdG8gYSByZWdpc3RlcmVkIGF1dGhvcml6YXRpb24tZGVuaWFsIGF1ZGl0b3Igd2hlbiBhXG4gKiBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IGlzIHJlamVjdGVkIGJ5IGByZXF1aXJlUGVybWlzc2lvbmAgL1xuICogYHJlcXVpcmVTeXN0ZW1BZG1pbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEZW5pYWxJbmZvIHtcbiAgLyoqIFRoZSBkZW5pZWQgdXNlcidzIGlkIChgc3ViYCksIGlmIGF1dGhlbnRpY2F0ZWQuICovXG4gIGFjdG9ySWQ/OiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdXNlcidzIGFjdGl2ZSBvcmcgYXQgZGVuaWFsIHRpbWUuICovXG4gIG9yZ0lkPzogc3RyaW5nO1xuICAvKiogSFRUUCBtZXRob2QgKyBwYXRoIG9mIHRoZSByZWplY3RlZCByZXF1ZXN0LiAqL1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICAvKiogV2hhdCB3YXMgcmVxdWlyZWQ6IHRoZSBtaXNzaW5nIHBlcm1pc3Npb24ocyksIG9yICdzeXN0ZW0tYWRtaW4nLiAqL1xuICByZXF1aXJlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHNpbmsgZm9yIGRlbmllZC1hdXRob3JpemF0aW9uIGV2ZW50cy4gTGVmdCB1bnNldCBieSBkZWZhdWx0IHNvXG4gKiBhcGktY29yZSBzdGF5cyBkZWNvdXBsZWQgZnJvbSBhbnkgYXVkaXQgdHJhbnNwb3J0IOKAlCBhIHNlcnZpY2UgcmVnaXN0ZXJzIG9uZVxuICogYXQgYm9vdCAodHlwaWNhbGx5IGZvcndhcmRpbmcgdG8gaXRzIGBSZW1vdGVBdWRpdENsaWVudGAgYXMgYW5cbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50LCBvciwgb24gcGxhdGZvcm0sIHRvIHRoZSBsb2NhbCBgYXVkaXQoKWAgaGVscGVyKS5cbiAqIE1VU1QgYmUgYmVzdC1lZmZvcnQ6IGl0IGlzIGludm9rZWQgaW5zaWRlIHRoZSByZXF1ZXN0IHBhdGgsIHNvIGl0IG11c3QgbmV2ZXJcbiAqIHRocm93IG9yIGJsb2NrICh0aGUgZ2F0ZSB3cmFwcyB0aGUgY2FsbCBpbiB0cnkvY2F0Y2ggcmVnYXJkbGVzcykuXG4gKi9cbmxldCBhdXRoekRlbmlhbEF1ZGl0b3I6ICgoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZWdpc3RlciAob3IgY2xlYXIsIHdpdGggYHVuZGVmaW5lZGApIHRoZSBwcm9jZXNzLXdpZGUgYXV0aG9yaXphdGlvbi1kZW5pYWxcbiAqIGF1ZGl0b3IuIElkZW1wb3RlbnQ7IHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiB3aW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXV0aHpEZW5pYWxBdWRpdG9yKGZuOiAoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gdm9pZCkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgYXV0aHpEZW5pYWxBdWRpdG9yID0gZm47XG59XG5cbi8qKlxuICogRW1pdCBhIGRlbmlhbCBldmVudCwgYmVzdC1lZmZvcnQuIE9ubHkgZmlyZXMgZm9yIHN0YXRlLWNoYW5naW5nIChub24tR0VULFxuICogbm9uLUhFQUQvT1BUSU9OUykgcmVxdWVzdHMg4oCUIGEgcmVqZWN0ZWQgR0VUIGlzIGxvdy1zaWduYWwgcHJvYmluZyBub2lzZSBhbmRcbiAqIHdvdWxkIGFtcGxpZnkgYXVkaXQgdm9sdW1lIHVuZGVyIGEgc2Nhbi4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIFRoZSBwZXJtaXNzaW9uIGdhdGVzIGhlcmUgY2FsbCBpdCB0aGVtc2VsdmVzLiBFeHBvcnQgaXQgZm9yIGRhdGEtZHJpdmVuIGNoZWNrc1xuICogYSByb3V0ZSBtYWtlcyBpbmxpbmUgKGNyb3NzLW9yZyBhY2Nlc3MsIHNlcnZpY2Utb25seSBlbmRwb2ludHMpLCBzbyB0aG9zZSA0MDNzXG4gKiByZWFjaCB0aGUgc2FtZSBgYXV0aHouZGVuaWVkYCB0cmFpbC4gYHJlcXVpcmVkYCBuYW1lcyB3aGF0IHdhcyBtaXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aHpEZW5pYWwocmVxOiBSZXF1ZXN0LCByZXF1aXJlZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGF1ZGl0b3IgPSBhdXRoekRlbmlhbEF1ZGl0b3I7XG4gIGlmICghYXVkaXRvcikgcmV0dXJuO1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IG1ldGhvZCA9PT0gJ09QVElPTlMnKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXVkaXRvcih7XG4gICAgICBhY3RvcklkOiByZXEudXNlcj8uc3ViLFxuICAgICAgYWN0b3JFbWFpbDogcmVxLnVzZXI/LmVtYWlsLFxuICAgICAgb3JnSWQ6IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIC8vIFN0cmlwIHRoZSBxdWVyeSBzdHJpbmcg4oCUIGEgZGVuaWVkIHJlcXVlc3QgbWF5IGNhcnJ5IGEgdG9rZW4vc2VjcmV0IGFzIGFcbiAgICAgIC8vIHF1ZXJ5IHBhcmFtLCBhbmQgdGhpcyBwYXRoIGlzIHBlcnNpc3RlZCB2ZXJiYXRpbSBpbnRvIHRoZSBhdWRpdCBsb2cuXG4gICAgICBwYXRoOiAocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpLnNwbGl0KCc/JylbMF0sXG4gICAgICByZXF1aXJlZCxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQg4oCUIGEgYnJva2VuIGF1ZGl0b3IgbXVzdCBuZXZlciBicmVhayB0aGUgYXV0aCBnYXRlLlxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgdGhhdCB0aGUgdXNlciBob2xkIEFUIExFQVNUIE9ORSBvZiB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgKG9yIGJlIGFcbiAqIHN1cGVyYWRtaW4pLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguIE1pcnJvcnMgYHJlcXVpcmVSb2xlYCdzIGFueS1vZiBzZW1hbnRpY3M7XG4gKiBwYXNzIGEgc2luZ2xlIHBlcm1pc3Npb24gZm9yIGEgc3BlY2lmaWMgYWN0aW9uLCBvciBzZXZlcmFsIHdoZW4gYW55IG9uZSBvZlxuICogdGhlbSBzaG91bGQgZ3JhbnQgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVBlcm1pc3Npb24oLi4ucGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSkge1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuICAgIC8vIHVzZXJIYXNQZXJtaXNzaW9uIOKGkiBoYXNQZXJtaXNzaW9uIGFscmVhZHkgZ3JhbnRzIHN1cGVyYWRtaW5zIGV2ZXJ5XG4gICAgLy8gcGVybWlzc2lvbiwgc28gdGhpcyBzaW5nbGUgY2hlY2sgY292ZXJzIGJvdGggdGhlIHN1cGVyYWRtaW4gYnlwYXNzIGFuZFxuICAgIC8vIHRoZSBhbnktb2YgbWVtYmVyc2hpcCB0ZXN0IHdpdGhvdXQgcmUtaW5saW5pbmcgZWl0aGVyLlxuICAgIGlmIChwZXJtaXNzaW9ucy5zb21lKChwKSA9PiB1c2VySGFzUGVybWlzc2lvbihyZXEsIHApKSkgcmV0dXJuIG5leHQoKTtcbiAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsIHBlcm1pc3Npb25zLmpvaW4oJyBvciAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke3Blcm1pc3Npb25zLmpvaW4oJyBvciAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9LCB7IGtpbmQ6ICdwZXJtaXNzaW9uJywgbW9kZTogJ2FueScsIHBlcm1pc3Npb25zIH0pO1xufVxuXG4vKipcbiAqIFJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgaG9sZCBFVkVSWSBvbmUgb2YgdGhlIGdpdmVuIHBlcm1pc3Npb25zIChvciBiZSBhXG4gKiBzdXBlcmFkbWluKSDigJQgdGhlIEFORCBjb3VudGVycGFydCB0byBgcmVxdWlyZVBlcm1pc3Npb25gJ3MgYW55LW9mLiBVc2UgZm9yIGFcbiAqIHNlbnNpdGl2ZSBhY3Rpb24gdGhhdCBsZWdpdGltYXRlbHkgZGVtYW5kcyB0d28gZGlzdGluY3QgY2FwYWJpbGl0aWVzIGF0IG9uY2VcbiAqIChlLmcuIGEgY3Jvc3Mtc3VyZmFjZSBvcGVyYXRpb24pLCBzbyB0aGUgZ3VhcmFudGVlIGlzIGV4cGxpY2l0IHJhdGhlciB0aGFuXG4gKiBhcHByb3hpbWF0ZWQgYnkgY2hhaW5pbmcgdHdvIGByZXF1aXJlUGVybWlzc2lvbmAgZ2F0ZXMuIFN1cGVyYWRtaW5zIGJ5cGFzc1xuICogKHRoZXkgaW1wbGljaXRseSBob2xkIGV2ZXJ5IHBlcm1pc3Npb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFsbFBlcm1pc3Npb25zKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nID0gcGVybWlzc2lvbnMuZmlsdGVyKChwKSA9PiAhdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwKSk7XG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke21pc3Npbmcuam9pbignIGFuZCAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9LCB7IGtpbmQ6ICdwZXJtaXNzaW9uJywgbW9kZTogJ2FsbCcsIHBlcm1pc3Npb25zIH0pO1xufVxuXG4vKipcbiAqIExpa2Uge0BsaW5rIHJlcXVpcmVQZXJtaXNzaW9ufSAoYW55LW9mKSBidXQgQUxTTyBhZG1pdHMgYW4gaW50ZXJuYWwgc2VydmljZVxuICogcHJpbmNpcGFsIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIEZvciBSRUFEIGVuZHBvaW50cyB0aGF0IEJPVEhcbiAqIGludGVyYWN0aXZlIHVzZXJzIOKAlCB3aG8gbXVzdCBob2xkIG9uZSBvZiB0aGUgYDpyZWFkYCBjYXBhYmlsaXRpZXMg4oCUIEFORFxuICogc2VydmljZS10by1zZXJ2aWNlIGNhbGxlcnMgbGVnaXRpbWF0ZWx5IGhpdDsgc2VydmljZSB0b2tlbnMgY2Fycnkgbm9cbiAqIHBlcm1pc3Npb24gY2xhaW1zICh0aGV5J3JlIGxlYXN0LXByaXZpbGVnZSBgcm9sZTptZW1iZXJgKSwgc28gYSBwbGFpblxuICogYHJlcXVpcmVQZXJtaXNzaW9uYCB3b3VsZCB3cm9uZ2x5IDQwMyB0aGVtLiBTdXBlcmFkbWlucyBwYXNzIHZpYVxuICogYHVzZXJIYXNQZXJtaXNzaW9uYCdzIGltcGxpY2l0LWFsbC4gVXNlIG9ubHkgd2hlcmUgYSBzZXJ2aWNlIGNhbGxlciBpcyBhIGtub3duLFxuICogaW50ZW5kZWQgY29uc3VtZXIgb2YgdGhlIHJvdXRlICh2ZXJpZnkgdGhlIGNhbGxlcnMpOyBwcmVmZXIgcGxhaW5cbiAqIGByZXF1aXJlUGVybWlzc2lvbmAgZm9yIHB1cmVseSB1c2VyLWZhY2luZyByZWFkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cbiAgICBpZiAoaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkgfHwgcGVybWlzc2lvbnMuc29tZSgocCkgPT4gdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwKSkpIHJldHVybiBuZXh0KCk7XG4gICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCBwZXJtaXNzaW9ucy5qb2luKCcgb3IgJykpO1xuICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGVybWlzc2lvbjogJHtwZXJtaXNzaW9ucy5qb2luKCcgb3IgJyl9YCxcbiAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgKTtcbiAgfSwgeyBraW5kOiAncGVybWlzc2lvbicsIG1vZGU6ICdhbnknLCBwZXJtaXNzaW9ucywgYWxsb3dTZXJ2aWNlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgYW4gZW5kcG9pbnQgdG8gaW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIGNhbGxlcnMgb25seSAoYVxuICogYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AgcHJpbmNpcGFsIG1pbnRlZCB2aWEge0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59IC8gYGdldFNlcnZpY2VBdXRoSGVhZGVyYCkuXG4gKiBSZWplY3RzIGFueSB1c2VyIHRva2VuLiBGb3IgTk9OLXVzZXItZmFjaW5nIGVuZHBvaW50cyDigJQgZW50aXR5LWV2ZW50IGluZ2VzdCxcbiAqIGF1dG8tc3Vic2NyaWJlLCBhbmQgc2ltaWxhciBwZWVyLXNlcnZpY2UgaG9va3Mg4oCUIHRoYXQgYSBicm93c2VyIG11c3QgbmV2ZXJcbiAqIHJlYWNoLiBDb21wb3NlIGFmdGVyIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyYCBpcyBwb3B1bGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQge1xuICBpZiAoIWlzU2VydmljZVByaW5jaXBhbChyZXEpKSB7XG4gICAgLy8gNDAzIChub3QgNDAwKSDigJQgdGhpcyBpcyBhbiBhdXRob3JpemF0aW9uIHJlZnVzYWw7IHN0YXR1cyBtdXN0IG1hdGNoIHRoZVxuICAgIC8vIElOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyBjb2RlIGFuZCB0aGUgc2libGluZyBnYXRlcyAocmVxdWlyZVBlcm1pc3Npb24sIGV0Yy4pLlxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTiwgJ0ludGVybmFsIHNlcnZpY2UgY2FsbHMgb25seScsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICB9XG4gIG5leHQoKTtcbn1cbnRhZ1JvdXRlR2F0ZShyZXF1aXJlU2VydmljZVByaW5jaXBhbCwgeyBraW5kOiAnc2VydmljZVByaW5jaXBhbCcgfSk7XG5cbi8qKlxuICogVEhFIGdhdGUgZm9yIGFuIElOVEVSTkFMIHJvdXRlICgjMTQpIOKAlCB0aGUgb25lIGV2ZXJ5IGAvaW50ZXJuYWwvKmAgcGF0aCwgdGhlXG4gKiBxdW90YSB1c2FnZSBjb3VudGVycywgdGhlIGVudGl0eS1ldmVudCBpbmdlc3QgYW5kIHRoZSBhdWRpdCBpbmdlc3QgZ28gdGhyb3VnaC5cbiAqXG4gKiBUd28gcnVsZXMsIGJvdGggZmFpbC1jbG9zZWQ6XG4gKlxuICogIDEuICoqTm8gdXNlciB0b2tlbiwgZXZlci4qKiBOb3QgYSBtZW1iZXIncywgbm90IGEgc3VwZXJhZG1pbidzLCBub3QgYVxuICogICAgIHNlcnZpY2UtYWNjb3VudCBrZXkncy4gQW4gaW50ZXJuYWwgcm91dGUgaXMgYSBwZWVyLXNlcnZpY2UgQVBJIHN1cmZhY2UsIHNvXG4gKiAgICAgXCJhIHN1ZmZpY2llbnRseSBwcml2aWxlZ2VkIGh1bWFuXCIgaXMgbm90IGFuIGFjY2VwdGFibGUgY2FsbGVyIOKAlCB0aGF0XG4gKiAgICAgZXF1aXZhbGVuY2UgaXMgZXhhY3RseSBob3cgYSBicm93c2VyLXJlYWNoYWJsZSBwYXRoIGJlY29tZXMgYSB0ZW5hbnRcbiAqICAgICBib3VuZGFyeSBidWcuIGByZXF1aXJlU2VydmljZVByaW5jaXBhbGAgYWxyZWFkeSByZWZ1c2VkIHVzZXJzOyB0aGlzIGFsc29cbiAqICAgICBjbG9zZXMgdGhlIGB8fCBpc1N5c3RlbUFkbWluKHJlcSlgIGVzY2FwZSBoYXRjaGVzIHRoYXQgaGFkIGdyb3duIGFyb3VuZFxuICogICAgIHRoZSBpbmRpdmlkdWFsIGludGVybmFsIHJvdXRlcy5cbiAqICAyLiAqKk9ubHkgdGhlIE5BTUVEIGNhbGxlcnMuKiogYGNhbGxlcnNgIGxpc3RzIHRoZSBzZXJ2aWNlcyB0aGF0IGxlZ2l0aW1hdGVseVxuICogICAgIGNhbGwgdGhpcyByb3V0ZSwgYW5kIHRoZSBuYW1lIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGJvdW5kIHRvIHRoZSBzaWduaW5nXG4gKiAgICAga2V5IChgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIHNvIHRoaXMgaXMgYW4gaWRlbnRpdHkgY2hlY2sgcmF0aGVyIHRoYW5cbiAqICAgICBhIGNsYWltIGNoZWNrLiBJdCBpcyB0aGUgc2FtZSBhbGxvdy1saXN0IHRoZSBtZXNoIHBvbGljeSBuYW1lcywgYXQgdGhlXG4gKiAgICAgbGF5ZXIgdGhhdCBhbHNvIGhvbGRzIGluIGRvY2tlciBjb21wb3NlLCB3aGVyZSB0aGVyZSBpcyBubyBtZXNoIGF0IGFsbCDigJRcbiAqICAgICB0aGUgSXN0aW8gYEF1dGhvcml6YXRpb25Qb2xpY3lgIGlzIGRlZmVuY2UgaW4gZGVwdGggb24gdG9wLCBuZXZlciB0aGVcbiAqICAgICBlbmZvcmNlbWVudC5cbiAqXG4gKiBDb21wb3NlIGFmdGVyIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyYCBpcyBwb3B1bGF0ZWQuIFJlZnVzYWxzIGFyZSBjb3VudGVkXG4gKiAoYGludGVybmFsX3JvdXRlX3JlZnVzZWRfdG90YWxgKSBhbmQgYXVkaXRlZCB0aHJvdWdoIHRoZSBzaGFyZWQgYGF1dGh6LmRlbmllZGBcbiAqIHNpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlKG9wdGlvbnM6IHsgY2FsbGVyczogcmVhZG9ubHkgc3RyaW5nW10gfSkge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChvcHRpb25zLmNhbGxlcnMpO1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlZnVzZSA9IChyZWFzb246ICd1bmF1dGhlbnRpY2F0ZWQnIHwgJ3VzZXJfdG9rZW4nIHwgJ3dyb25nX2NhbGxlcicpOiB2b2lkID0+IHtcbiAgICAgIGVtaXRDb3VudGVyKCdpbnRlcm5hbF9yb3V0ZV9yZWZ1c2VkX3RvdGFsJywge1xuICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSxcbiAgICAgICAgcm91dGU6IHJlcS5yb3V0ZT8ucGF0aCA/IGAke3JlcS5tZXRob2R9ICR7cmVxLmJhc2VVcmx9JHtyZXEucm91dGUucGF0aH1gIDogYCR7cmVxLm1ldGhvZH0gJHsocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpLnNwbGl0KCc/JylbMF19YCxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBjYWxsZXI6IHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID8/ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCBgaW50ZXJuYWwtc2VydmljZSAoJHtvcHRpb25zLmNhbGxlcnMuam9pbignLCAnKX0pYCk7XG4gICAgICBpZiAocmVhc29uID09PSAndW5hdXRoZW50aWNhdGVkJykge1xuICAgICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLndhcm4oJ1JlZnVzZWQgYW4gaW50ZXJuYWwgcm91dGUnLCB7IHJlYXNvbiwgcGF0aDogKHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsKS5zcGxpdCgnPycpWzBdLCBjYWxsZXI6IHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnSW50ZXJuYWwgc2VydmljZSBjYWxscyBvbmx5JywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gICAgfTtcblxuICAgIGlmICghcmVxLnVzZXIpIHJldHVybiByZWZ1c2UoJ3VuYXV0aGVudGljYXRlZCcpO1xuICAgIGlmICghaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkpIHJldHVybiByZWZ1c2UoJ3VzZXJfdG9rZW4nKTtcbiAgICBjb25zdCBjYWxsZXIgPSBzZXJ2aWNlTmFtZU9mKHJlcS51c2VyKTtcbiAgICBpZiAoIWNhbGxlciB8fCAhYWxsb3dlZC5oYXMoY2FsbGVyKSkgcmV0dXJuIHJlZnVzZSgnd3JvbmdfY2FsbGVyJyk7XG4gICAgbmV4dCgpO1xuICB9LCB7IGtpbmQ6ICdzZXJ2aWNlUHJpbmNpcGFsJyB9LCB7IGtpbmQ6ICdpbnRlcm5hbFNlcnZpY2UnLCBjYWxsZXJzOiBbLi4ub3B0aW9ucy5jYWxsZXJzXSB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc3lzdGVtIHRlbmFudCdzIGNhbm9uaWNhbCBvcmcgKippZCoqIOKAlCBhIGZpeGVkLCB3ZWxsLWtub3duIE9iamVjdElkIChOT1RcbiAqIHRoZSBzdHJpbmcgJ3N5c3RlbScpLiBUaGlzIGlzIHRoZSBzaW5nbGUga25vYiBldmVyeSBzZXJ2aWNlIHJlc29sdmVzIHRoZVxuICogc3lzdGVtIHRlbmFudCB0aHJvdWdoOyBvdmVycmlkZSB2aWEgdGhlIGBTWVNURU1fT1JHX0lEYCBlbnYgZm9yIGFsdGVybmF0ZVxuICogaW5zdGFsbHMuIFRoZSBzeXN0ZW0gb3JnJ3MgaHVtYW4gaWRlbnRpZmllciBzdGF5cyB0aGUgc2x1Zy9uYW1lICdzeXN0ZW0nXG4gKiAoc2VlIHtAbGluayBTWVNURU1fT1JHX1NMVUd9KTsgb25seSBpdHMgYF9pZGAgaXMgdGhpcyBPYmplY3RJZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfSUQgPSAocHJvY2Vzcy5lbnYuU1lTVEVNX09SR19JRCB8fCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJykudG9Mb3dlckNhc2UoKTtcblxuLyoqIFRoZSBzeXN0ZW0gb3JnJ3Mgd2VsbC1rbm93biBzbHVnL25hbWUgKHRoZSBodW1hbiBpZGVudGlmaWVyOyBpdHMgYF9pZGAgaXMge0BsaW5rIFNZU1RFTV9PUkdfSUR9KS4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX1NMVUcgPSAnc3lzdGVtJztcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBvcmdJZCBvciBvcmdOYW1lL3NsdWcgbWF0Y2hlcyB0aGUgc3lzdGVtIG9yZy4gVXNlIHRoaXMgaW5zdGVhZCBvZlxuICogY29tcGFyaW5nIGRpcmVjdGx5OiB0aGUgaWQgaXMgbm93IGFuIE9iamVjdElkICh7QGxpbmsgU1lTVEVNX09SR19JRH0pIHdoaWxlIHRoZVxuICogbmFtZS9zbHVnIGlzICdzeXN0ZW0nICh7QGxpbmsgU1lTVEVNX09SR19TTFVHfSksIHNvIHRoZSB0d28gYXJlIGNvbXBhcmVkIGFnYWluc3RcbiAqIHRoZWlyIHJlc3BlY3RpdmUgY2Fub25pY2FsIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtT3JnSWQob3JnSWQ/OiBzdHJpbmcsIG9yZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yZ0lkPy50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEIHx8IG9yZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfU0xVRztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGEgc3lzdGVtIGFkbWluLlxuICpcbiAqIEF1dGhvcml0eSBpcyBncmFudGVkIHNvbGVseSBieSB0aGUgdXNlci1sZXZlbCBgaXNTdXBlckFkbWluYCBmbGFnIGNhcnJpZWRcbiAqIGluIHRoZSBKV1QuIFRoZSBcIm1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gJ3N5c3RlbScgb3JnIHdpdGggcm9sZVxuICogYWRtaW4vb3duZXJcIiBwYXRoIHdhcyByZW1vdmVkIOKAlCBpdCBjb25mbGF0ZWQgYSBQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXG4gKiB3aXRoIGEgcmVhbCBjdXN0b21lciB0ZW5hbnQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCBtZWFudCBhbnkgdW5pbnRlbmRlZFxuICogd3JpdGUgdGhhdCBjcmVhdGVkIGEgJ3N5c3RlbSctbmFtZWQgb3JnIGNvdWxkIHF1aWV0bHkgZ3JhbnQgY3Jvc3Mtb3JnXG4gKiBhdXRob3JpdHkuIFRoZSBgc3lzdGVtYCBvcmcgc3RpbGwgZXhpc3RzIGFzIGEgKmNvbnRlbnQgaG9sZGVyKiBmb3Igc2hhcmVkXG4gKiBzYW1wbGUgZGF0YTsgaXQganVzdCBubyBsb25nZXIgY29uZmVycyBwcml2aWxlZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbUFkbWluKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZXF1ZXN0J3MgdG9rZW4gY2FycmllcyBhIHNwZWNpZmljIGNhcGFiaWxpdHkgYHNjb3BlYCAoZS5nLlxuICogYCdyZXBvcnRpbmc6aW5nZXN0J2ApLiBVc2VkIHRvIGdhdGUgZW5kcG9pbnRzIHRoYXQgYWNjZXB0IGEgbmFycm93IG1hY2hpbmVcbiAqIGlkZW50aXR5IOKAlCBhIG5vcm1hbCBpbnRlcmFjdGl2ZSB1c2VyIHRva2VuIGhhcyBubyBgc2NvcGVgIGFuZCByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzU2NvcGUocmVxOiBSZXF1ZXN0LCBzY29wZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8uc2NvcGUgPT09IHNjb3BlO1xufVxuXG4vKiogUmVxdWlyZXMgYSBzeXN0ZW0gYWRtaW4g4oCUIGdyYW50ZWQgc29sZWx5IGJ5IHRoZSBgaXNTdXBlckFkbWluYCB0b2tlbiBjbGFpbVxuICogICh0aGUgb3JnLW1lbWJlcnNoaXAgcGF0aCB3YXMgcmVtb3ZlZCkuIFVzZSBhZnRlciByZXF1aXJlQXV0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3lzdGVtQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghaXNTeXN0ZW1BZG1pbihyZXEpKSB7XG4gICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnc3lzdGVtLWFkbWluJyk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAnQWNjZXNzIGRlbmllZC4gT25seSBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgY2FuIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyxcbiAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgKTtcbiAgfVxuICBuZXh0KCk7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZVN5c3RlbUFkbWluLCB7IGtpbmQ6ICdzeXN0ZW1BZG1pbicgfSk7XG5cbi8qKlxuICogUmVxdWlyZSBhIHNwZWNpZmljIGZlYXR1cmUgZmxhZy4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLlxuICogQ2hlY2tzIHRoZSBgZmVhdHVyZXNgIGFycmF5IGluIHRoZSBKV1QgcGF5bG9hZCAoc2V0IGF0IHRva2VuIGlzc3VhbmNlKS5cbiAqIFN5c2FkbWlucyAoaXNTdXBlckFkbWluKSBieXBhc3Mg4oCUIHRoZXkgYWx3YXlzIGhhdmUgZXZlcnkgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVGZWF0dXJlKGZlYXR1cmU6IHN0cmluZykge1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuXG4gICAgLy8gU3lzYWRtaW5zIGdldCBhbGwgZmVhdHVyZXM7IHRoZSBgZmVhdHVyZXNgIGFycmF5IG9uIHRoZWlyIHRva2VuIGlzXG4gICAgLy8gcG9wdWxhdGVkIHdpdGggZXZlcnkgZmxhZyBhdCBpc3N1YW5jZSB0aW1lIGJ1dCB0aGUgYnlwYXNzIGhlcmUga2VlcHNcbiAgICAvLyB0aGUgcnVsZSBleHBsaWNpdCBhbmQgc3Vydml2ZXMgYSB0b2tlbiBpc3N1ZWQgYmVmb3JlIGEgbmV3IGZlYXR1cmVcbiAgICAvLyBmbGFnIHdhcyBhZGRlZC5cbiAgICBpZiAocmVxLnVzZXIuaXNTdXBlckFkbWluID09PSB0cnVlKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgaWYgKCFyZXEudXNlci5mZWF0dXJlcz8uaW5jbHVkZXMoZmVhdHVyZSkpIHtcbiAgICAgIC8vIFJvdXRlIGZlYXR1cmUtZ2F0ZSBkZW5pYWxzIHRocm91Z2ggdGhlIHNhbWUgYXVkaXQgc2luayBhc1xuICAgICAgLy8gcmVxdWlyZVBlcm1pc3Npb24gLyByZXF1aXJlU3lzdGVtQWRtaW4gc28gYSBwcm9iZSBmb3IgYW5cbiAgICAgIC8vIHVuZW50aXRsZWQgY2FwYWJpbGl0eSBsZWF2ZXMgYSB0cmFpbCAoc3RhdGUtY2hhbmdpbmcgbWV0aG9kcyBvbmx5KS5cbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgYGZlYXR1cmU6JHtmZWF0dXJlfWApO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICAgYFRoaXMgZmVhdHVyZSByZXF1aXJlcyBhIGhpZ2hlciBwbGFuICgke2ZlYXR1cmV9KWAsXG4gICAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSwgeyBraW5kOiAnZmVhdHVyZScsIGZlYXR1cmUgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBFUzI1NiBKV1Qgc2lnbmVkIHdpdGggVEhJUyBzZXJ2aWNlJ3Ncbi8vIE9XTiBrZXkgKHNlZSBgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIGNhcnJ5aW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgXG4vLyBhbmQgbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UgdmlhIGBzdWI6ICdzZXJ2aWNlOjxuYW1lPidgLiBHYXRlcyBicmFuY2ggb25cbi8vIHRoZSBjbGFpbTsgdGhlIHN1YmplY3QgbmFtZXMg4oCUIGFuZCBzaW5jZSAjMTQgdGhlIG5hbWUgaXMgY3J5cHRvZ3JhcGhpY2FsbHlcbi8vIGJvdW5kIHRvIHRoZSBzaWduaW5nIGtleSwgc28gaXQgY2FuIGFsc28gYmUgdHJ1c3RlZC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCBkb3duc3RyZWFtIGByZXF1aXJlT3JnYW5pemF0aW9uYCAvXG4vLyBgcmVxdWlyZVN5c3RlbUFkbWluYCByZWx5IG9uIHRoZSBvcmcvcm9sZSBlbWJlZGRlZCBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gVG9rZW5zIGRlZmF1bHQgdG8gNS1taW51dGUgVFRMIOKAlCBsb25nIGVub3VnaCB0byBzdXJ2aXZlIGEgYmFja2VuZCBob3AsXG4vLyBzaG9ydCBlbm91Z2ggdGhhdCBhIGxlYWtlZCB0b2tlbiBpcyBsb3ctdmFsdWUuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTID0gMzAwO1xuXG4vKipcbiAqIERlbnlsaXN0IG9mIHNlcnZpY2UgTkFNRVMgKHRoZSBgPG5hbWU+YCBpbiBgc3ViOiBzZXJ2aWNlOjxuYW1lPmApIHdob3NlIHRva2Vuc1xuICogYHJlcXVpcmVBdXRoYCBtdXN0IHJlamVjdC4gUmVhZCBmcm9tIGBTRVJWSUNFX1RPS0VOX0RFTllMSVNUYCAoY29tbWEtc2VwYXJhdGVkKVxuICogYXQgcHJvY2VzcyBzdGFydCwgc28gYXJtaW5nIGl0IGlzIGEgY29uZmlnIGNoYW5nZSArIHJvbGxvdXQg4oCUIGl0IGN1dHMgb2ZmIGFcbiAqIGNvbXByb21pc2VkIHNlcnZpY2UgV0lUSE9VVCByb3RhdGluZyBhbnkga2V5LCBhbmQgKHVubGlrZSB0aGUgcHJlLSMxNCBzaGFyZWRcbiAqIHNlY3JldCkgd2l0aG91dCBpbnZhbGlkYXRpbmcgZXZlcnkgb3RoZXIgc2VydmljZSdzIHRva2VucyBhcyBjb2xsYXRlcmFsLlxuICovXG5jb25zdCBzZXJ2aWNlVG9rZW5EZW55bGlzdCA9IG5ldyBTZXQoXG4gIChwcm9jZXNzLmVudi5TRVJWSUNFX1RPS0VOX0RFTllMSVNUIHx8ICcnKVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbik7XG5cbi8qKlxuICogVGhlIGNhbGxpbmcgc2VydmljZSdzIG5hbWUgZm9yIGEgU0VSVklDRSBwcmluY2lwYWwgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgKSxcbiAqIGVsc2UgYHVuZGVmaW5lZGAuIEEgdXNlciB0b2tlbiBuZXZlciB5aWVsZHMgYSBuYW1lLCB3aGF0ZXZlciBpdHMgYHN1YmAgc2F5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VOYW1lT2YoY2xhaW1zOiB7IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7IHN1Yj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNsYWltcz8ucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8IHR5cGVvZiBjbGFpbXMuc3ViICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjbGFpbXMuc3ViLnN0YXJ0c1dpdGgoU0VSVklDRV9TVUJKRUNUX1BSRUZJWCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjbGFpbXMuc3ViLnNsaWNlKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgubGVuZ3RoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIGNsYWltcyBhcmUgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGlzIG9uIHRoZSBkZW55bGlzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VUb2tlbkRlbmllZChjbGFpbXM6IHsgcHJpbmNpcGFsVHlwZT86IHN0cmluZzsgc3ViPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgaWYgKHNlcnZpY2VUb2tlbkRlbnlsaXN0LnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmFtZSA9IHNlcnZpY2VOYW1lT2YoY2xhaW1zKTtcbiAgcmV0dXJuIG5hbWUgIT09IHVuZGVmaW5lZCAmJiBzZXJ2aWNlVG9rZW5EZW55bGlzdC5oYXMobmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVRva2VuT3B0aW9ucyB7XG4gIC8qKiBDYWxsaW5nIHNlcnZpY2UgaWRlbnRpZmllciAoZS5nLiAnYmlsbGluZycsICdwbGF0Zm9ybScpLiBFbWJlZGRlZCBhcyBgc3ViOiBzZXJ2aWNlOjxuYW1lPmAuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIGNvbnRleHQgZm9yIHRoZSBjYWxsLiBVc2UgdGhlIHRhcmdldCB0ZW5hbnQncyBvcmcgaWQsIG9yIHRoZVxuICAgKiAgd2VsbC1rbm93biBgU1lTVEVNX09SR19JRGAgKGFuIE9iamVjdElkKSBmb3Igc3lzdGVtLXdpZGUgb3BzIOKAlCBOT1QgdGhlIHN0cmluZ1xuICAgKiAgJ3N5c3RlbScsIHdoaWNoIGlkLWJhc2VkIHN5c3RlbS1vcmcgY2hlY2tzIHdvbid0IHJlY29nbml6ZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gKipQYXNzIHRoZSBMT1dFU1RcbiAgICogcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZSBjYWxscykgc28gYVxuICAgKiBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldCBvcmcuXG4gICAqIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGNsYWltLiBQcmVmZXIgdGhpcyArIGByb2xlOiAnbWVtYmVyJ2Agb3ZlciBhXG4gICAqIGhpZ2ggcm9sZSB3aGVuIGEgY2FsbCBuZWVkcyBPTkUgc3BlY2lmaWMgY2FwYWJpbGl0eSAoZS5nLiBgWydwbHVnaW5zOndyaXRlJ11gXG4gICAqIHRvIHB1c2ggYSBwbHVnaW4gaW1hZ2UpIOKAlCB0aGUgdG9rZW4gdGhlbiBzYXRpc2ZpZXMgdGhhdCBwZXJtaXNzaW9uIGdhdGVcbiAgICogV0lUSE9VVCBjYXJyeWluZyBgaXNBZG1pbmAsIHNvIGEgbGVha2VkIHRva2VuIGNhbid0IHBlcmZvcm0gYWRtaW4gYWN0aW9ucy5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xufVxuXG4vKipcbiAqIE1pbnQgYSBKV1QgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZS4gVXNlZCBmb3IgaW50ZXItc2VydmljZSBIVFRQIGNhbGxzLlxuICogVGhlIHRva2VuIHNhdGlzZmllcyBgcmVxdWlyZUF1dGhgIGFuZCAod2hlbiBvcmdJZCBpcyBwcmVzZW50KSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAuXG4gKiBTY29wZSBpdCB3aXRoIGBvcHRzLnJvbGVgIOKAlCBsZWFzdCBwcml2aWxlZ2Uga2VlcHMgYSBsZWFrZWQgdG9rZW4gbG93LXZhbHVlLlxuICpcbiAqIGBvcHRzLnNlcnZpY2VOYW1lYCBtdXN0IGJlIFRISVMgcHJvY2VzcydzIG93biBpZGVudGl0eSAoYFNFUlZJQ0VfTkFNRWApOiBhXG4gKiBzZXJ2aWNlIGhvbGRzIG9ubHkgaXRzIG93biBzaWduaW5nIGtleSwgc28gbWludGluZyBhIHRva2VuIHRoYXQgbmFtZXMgYW5vdGhlclxuICogc2VydmljZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIG9uZSBldmVyeSBwZWVyIHdvdWxkIHJlamVjdC4gVGhhdCBpcyB0aGVcbiAqIG9uZSBiZWhhdmlvdXIgY2hhbmdlICMxNCBmb3JjZXMgb24gY2FsbGVycyDigJQgc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9sZSA9IG9wdHMucm9sZTtcbiAgY29uc3QgcGF5bG9hZDogT21pdDxKd3RQYXlsb2FkLCAnc3ViJz4gPSB7XG4gICAgdXNlcm5hbWU6IGAke29wdHMuc2VydmljZU5hbWV9LXNlcnZpY2VgLFxuICAgIGVtYWlsOiBgJHtvcHRzLnNlcnZpY2VOYW1lfUBpbnRlcm5hbGAsXG4gICAgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnLFxuICAgIHRva2VuX3VzZTogJ2FjY2VzcycsXG4gICAgcm9sZSxcbiAgICBpc0FkbWluOiByb2xlID09PSAnb3duZXInIHx8IHJvbGUgPT09ICdhZG1pbicsXG4gICAgdHlwZTogJ2FjY2VzcycsXG4gICAgb3JnYW5pemF0aW9uSWQ6IG9wdHMub3JnSWQsXG4gICAgb3JnYW5pemF0aW9uTmFtZTogb3B0cy5vcmdOYW1lID8/IG9wdHMub3JnSWQsXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBjb3JyZWxhdGlvbiBoYW5kbGVcbiAgICAvLyBmb3IgdHJhY2luZyB3aGljaCBtaW50IHBlcmZvcm1lZCBhIGNyb3NzLXNlcnZpY2UgYWN0aW9uLCBhbmQgdGhlIGJ1aWxkaW5nXG4gICAgLy8gYmxvY2sgZm9yIHJlcGxheSBkZXRlY3Rpb24gKGEgdmVyaWZpZXIgY2FuIHRyYWNrIHNlZW4ganRpcykuIEl0IGRvZXMgTk9UXG4gICAgLy8gYnkgaXRzZWxmIHByZXZlbnQgcmVwbGF5IHdpdGhpbiB0aGUgVFRMIHdpbmRvdy5cbiAgICBqdGk6IHJhbmRvbVVVSUQoKSxcbiAgICAvLyBMZWFzdC1wcml2aWxlZ2UgY2FwYWJpbGl0eSBjbGFpbSAob3B0aW9uYWwpIOKAlCBsZXRzIGEgbWVtYmVyLXJvbGUgdG9rZW5cbiAgICAvLyBzYXRpc2Z5IGEgc3BlY2lmaWMgcGVybWlzc2lvbiBnYXRlIHdpdGhvdXQgY2FycnlpbmcgaXNBZG1pbi5cbiAgICAuLi4ob3B0cy5wZXJtaXNzaW9ucyAmJiBvcHRzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgPyB7IHBlcm1pc3Npb25zOiBvcHRzLnBlcm1pc3Npb25zIH0gOiB7fSksXG4gIH07XG4gIC8vIGBzdWJgLCBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoXG4gIC8vIHZlcmlmaWVzIGFyZSBzdGFtcGVkIGJ5IHRoZSBzaWduZXIsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHBsYWNlIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGF0IGEgc2VydmljZSB0b2tlbiBzYXlzLlxuICByZXR1cm4gc2lnblNlcnZpY2VKd3QocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgIGV4cGlyZXNJblNlY29uZHM6IG9wdHMudHRsU2Vjb25kcyA/PyBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMsXG4gICAgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCksXG4gIH0pO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYSBzZXJ2aWNlIHByaW5jaXBhbCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AsIG1pbnRlZCBieSBgc2lnblNlcnZpY2VUb2tlbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZSc7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCAoYHByaW5jaXBhbFR5cGU6XG4gKiAnc2VydmljZV9hY2NvdW50J2ApIOKAlCBhIG5vbi1odW1hbiBwcmluY2lwYWwgb3duZWQgYnkgb25lIG9yZywgYXV0aGVudGljYXRpbmdcbiAqIHdpdGggYSBgcGJfc2Ff4oCmYCBrZXkgZXhjaGFuZ2VkIGF0IHBsYXRmb3JtLlxuICpcbiAqIEEgc2VydmljZSBhY2NvdW50IGlzIE5PVCBhbiBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgaG9sZHMgb3JnIFJvbGVzIGFuZFxuICogaXMgc3ViamVjdCB0byBldmVyeSBwZXJtaXNzaW9uIGdhdGUgYSBtZW1iZXIgaXMuIFdoYXQgaXQgY2FuIG5ldmVyIGRvIGlzXG4gKiBzYXRpc2Z5IGEgSFVNQU4tcHJlc2VuY2UgcmVxdWlyZW1lbnQg4oCUIHN0ZXAtdXAgKGFuZCBhbnkgbGF0ZXIgYXNzdXJhbmNlIGdhdGUpXG4gKiByZWZ1c2VzIGl0IG91dHJpZ2h0LCBiZWNhdXNlIHRoZXJlIGlzIG5vIHBlcnNvbiBiZWhpbmQgaXQgdG8gcmUtdmVyaWZ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZV9hY2NvdW50Jztcbn1cblxuLyoqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIHRoZSBuYW1lZCBpbnRlcm5hbCBzZXJ2aWNlIChlLmcuIGAnYmlsbGluZydgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZChyZXE6IFJlcXVlc3QsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID09PSBzZXJ2aWNlTmFtZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIFVubGlrZSB7QGxpbmsgaXNTZXJ2aWNlUHJpbmNpcGFsfVxuICogKHdoaWNoIHJlYWRzIHRoZSBhbHJlYWR5LXBvcHVsYXRlZCBgcmVxLnVzZXJgKSwgdGhpcyB2ZXJpZmllcyB0aGUgYmVhcmVyIHRva2VuXG4gKiBpdHNlbGYsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBCRUZPUkUgYHJlcXVpcmVBdXRoYCBydW5zIOKAlCBlLmcuIHRoZSBnbG9iYWwgcmF0ZVxuICogbGltaXRlcidzIGBza2lwYCwgd2hpY2ggbXVzdCBub3QgdHJ1c3QgdGhlIHNwb29mYWJsZSBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICogaGVhZGVyLiBNaXJyb3JzIGByZXF1aXJlQXV0aGAncyBTRVJWSUNFIGNoYWluIGV4YWN0bHkgKHRoZSBzaWduZXIncyBvd24ga2V5LFxuICogcmVzb2x2ZWQgYnkgYGtpZGAsIHdpdGggdGhlIGBzdWJgL3NpZ25lciBhZ3JlZW1lbnQgY2hlY2sgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW5cbiAqIOKAlCBpbmNsdWRpbmcgYW55IHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB3aG9zZSBga2lkYCBpcyBub3QgaW4gdGhlIHNlcnZpY2VcbiAqIGJ1bmRsZSBhdCBhbGwuIFN0YXlzIFNZTkNIUk9OT1VTLCB3aGljaCBpcyB3aHkgdGhlIHBlci1zZXJ2aWNlIHB1YmxpYyBrZXlzIGFyZVxuICogZGlzdHJpYnV0ZWQgYXMgYSBtb3VudGVkIGJ1bmRsZSByYXRoZXIgdGhhbiBmZXRjaGVkIG92ZXIgSFRUUC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKTtcbiAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVyID0gZGVjb2RlSnd0SGVhZGVyKHBhcnRzWzFdKTtcbiAgICBpZiAoIWhlYWRlcj8ua2lkIHx8ICFpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWNvZGVkID0gdmVyaWZ5U2VydmljZUp3dDxKd3RQYXlsb2FkPihwYXJ0c1sxXSwgeyBraWQ6IGhlYWRlci5raWQsIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pO1xuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnIHx8IGRlY29kZWQucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQSBkZW55bGlzdGVkIChraWxsZWQpIHNlcnZpY2UgbXVzdCBOT1QgYmUgdHJlYXRlZCBhcyBhIHRydXN0ZWQgcHJpbmNpcGFsIOKAlFxuICAgIC8vIG90aGVyd2lzZSBpdCBrZWVwcyB0aGUgcmF0ZS1saW1pdGVyIGV4ZW1wdGlvbiBldmVuIHRob3VnaCByZXF1aXJlQXV0aCByZWplY3RzXG4gICAgLy8gaXQgb24gcmVhbCByb3V0ZXMuIEZvbGQgdGhlIGtpbGwtc3dpdGNoIGludG8gdGhlIHByZS1hdXRoIGNoZWNrIHRvby5cbiAgICByZXR1cm4gIWlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
952
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXBDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUFrQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckcsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBQ2YsWUFBWSxFQUNaLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBQ3JILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBd0IsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUs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Q2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsR0FBWTtJQUNqRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hFLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQWEsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssU0FBUyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdkgsNkVBQTZFO1FBQzdFLGdGQUFnRjtRQUNoRix1RUFBdUU7UUFDdkUsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyB0YWdSb3V0ZUdhdGUsIHR5cGUgT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcyB9IGZyb20gJy4vcm91dGUtdGFibGUuanMnO1xuaW1wb3J0IHsgSHR0cFN0YXR1cyB9IGZyb20gJy4uL2NvbnN0YW50cy9odHRwLXN0YXR1cy5qcyc7XG5pbXBvcnQgeyBKd2tzVW5hdmFpbGFibGVFcnJvciwgVW5rbm93bktpZEVycm9yLCBwbGF0Zm9ybUp3a3NDYWNoZSB9IGZyb20gJy4uL3NlcnZpY2VzL2p3a3MtY2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgU0VSVklDRV9TVUJKRUNUX1BSRUZJWCxcbiAgU2VydmljZUtleUVycm9yLFxuICBpc1NlcnZpY2VLaWQsXG4gIHNlcnZpY2VJZGVudGl0eSxcbiAgc2lnblNlcnZpY2VKd3QsXG4gIHZlcmlmeVNlcnZpY2VKd3QsXG59IGZyb20gJy4uL3NlcnZpY2VzL3NlcnZpY2Uta2V5cy5qcyc7XG5pbXBvcnQgeyBBVVRIX01FVEhPRFMsIFBSSU5DSVBBTF9UWVBFUywgVE9LRU5fVVNFUywgdHlwZSBBc3N1cmFuY2VMZXZlbCwgdHlwZSBKd3RQYXlsb2FkIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB0eXBlIHsgSHR0cFJlcXVlc3QgfSBmcm9tICcuLi90eXBlcy9odHRwLmpzJztcbmltcG9ydCB7IHR5cGUgUGVybWlzc2lvbiwgaGFzUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcbmltcG9ydCB7IGlzT3BhcXVlQXBpS2V5IH0gZnJvbSAnLi4vdXRpbHMvYXBpLWtleS5qcyc7XG5pbXBvcnQgeyBnZXRIZWFkZXJTdHJpbmcgfSBmcm9tICcuLi91dGlscy9oZWFkZXJzLmpzJztcbmltcG9ydCB7IGdldElkZW50aXR5LCB0eXBlIFJlcXVlc3RJZGVudGl0eSB9IGZyb20gJy4uL3V0aWxzL2lkZW50aXR5LmpzJztcbmltcG9ydCB7IFVTRVJfVE9LRU5fQUxHT1JJVEhNLCBkZWNvZGVKd3RIZWFkZXIgfSBmcm9tICcuLi91dGlscy9qd2suanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuXG4vKiogSXNzdWVyL2F1ZGllbmNlIHBpbm5pbmcsIHdoZW4gdGhlIGRlcGxveW1lbnQgY29uZmlndXJlcyB0aGVtLiBTaGFyZWQgYnkgYm90aCBjaGFpbnMuICovXG5mdW5jdGlvbiBpc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKTogeyBpc3N1ZXI/OiBzdHJpbmc7IGF1ZGllbmNlPzogc3RyaW5nIH0ge1xuICByZXR1cm4ge1xuICAgIC4uLihwcm9jZXNzLmVudi5KV1RfSVNTVUVSID8geyBpc3N1ZXI6IHByb2Nlc3MuZW52LkpXVF9JU1NVRVIgfSA6IHt9KSxcbiAgICAuLi4ocHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFID8geyBhdWRpZW5jZTogcHJvY2Vzcy5lbnYuSldUX0FVRElFTkNFIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKlxuICogVmVyaWZ5IGEgdG9rZW4gdGhhdCBzcGVha3MgZm9yIGEgUEVSU09OIOKAlCBhY2Nlc3MsIHN0ZXAtdXAsIGFuZCB0aGUgdG9rZW4gYW5cbiAqIG9wYXF1ZSBhY2Nlc3Mga2V5IGlzIGV4Y2hhbmdlZCBmb3Ig4oCUIGFnYWluc3QgcGxhdGZvcm0ncyBwdWJsaXNoZWQgc2lnbmluZ1xuICoga2V5cy5cbiAqXG4gKiBFUzI1NiBhbmQgYSBga2lkYCBhcmUgYm90aCBtYW5kYXRvcnk6IG5vIGBraWRgIG1lYW5zIG5vIHdheSB0byBwaWNrIHRoZSByaWdodFxuICoga2V5IGFjcm9zcyBhIHJvdGF0aW9uLCBhbmQgYW55IG90aGVyIGFsZ29yaXRobSBpcyByZWZ1c2VkIG91dHJpZ2h0LCB3aGljaCBpc1xuICogd2hhdCBtYWtlcyBcIm5vIHNlcnZpY2UgYWNjZXB0cyBhbiBIUzI1NiB1c2VyIHRva2VuXCIgYSBwcm9wZXJ0eSBvZiB0aGUgY29kZVxuICogcmF0aGVyIHRoYW4gYSBjb252ZW50aW9uLiBLZXkgbG9va3VwIGdvZXMgdGhyb3VnaCB0aGUgc2hhcmVkIEpXS1MgY2FjaGVcbiAqICgxMC1taW51dGUgcmVmcmVzaCwgb25lIHJlZmV0Y2ggb24gYW4gdW5rbm93biBga2lkYCwgYnJpZWYgbmVnYXRpdmUgY2FjaGUpLlxuICpcbiAqIEB0aHJvd3Mge1Vua25vd25LaWRFcnJvcn0gdGhlIGtleSBzZXQgaXMgY3VycmVudCBhbmQgaGFzIG5vIHN1Y2gga2V5IOKGkiA0MDEuXG4gKiBAdGhyb3dzIHtKd2tzVW5hdmFpbGFibGVFcnJvcn0gdGhlIGtleSBzZXQgY291bGQgbm90IGJlIG9idGFpbmVkIOKGkiA1MDM7IGFuXG4gKiAgICAgICAgIHVudmVyaWZpYWJsZSB0b2tlbiBpcyBuZXZlciB0cmVhdGVkIGFzIHZhbGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VXNlckp3dDxUID0gSnd0UGF5bG9hZD4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCBoZWFkZXIgPSBkZWNvZGVKd3RIZWFkZXIodG9rZW4pO1xuICBpZiAoaGVhZGVyPy5hbGcgIT09IFVTRVJfVE9LRU5fQUxHT1JJVEhNIHx8ICFoZWFkZXIua2lkKSB7XG4gICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcihgVXNlciB0b2tlbnMgbXVzdCBiZSBzaWduZWQgd2l0aCAke1VTRVJfVE9LRU5fQUxHT1JJVEhNfSBhbmQgY2FycnkgYSBraWRgKTtcbiAgfVxuICBjb25zdCBrZXkgPSBhd2FpdCBwbGF0Zm9ybUp3a3NDYWNoZSgpLmdldEtleShoZWFkZXIua2lkKTtcbiAgcmV0dXJuIGp3dC52ZXJpZnkodG9rZW4sIGtleSwgeyBhbGdvcml0aG1zOiBbVVNFUl9UT0tFTl9BTEdPUklUSE1dLCAuLi5pc3N1ZXJBdWRpZW5jZU9wdGlvbnMoKSB9KSBhcyBUO1xufVxuXG4vKipcbiAqIFZlcmlmeSBBTlkgYmVhcmVyIHRva2VuIGFuZCByZXR1cm4gaXRzIGNsYWltcy5cbiAqXG4gKiBTaW5jZSAjMTQgdGhlcmUgaXMgbm8gc2hhcmVkIHNlY3JldCBsZWZ0OiBCT1RIIGNoYWlucyBhcmUgRVMyNTYgd2l0aCBhIGBraWRgLFxuICogc28gdGhlIGRpc3BhdGNoIGlzIGJ5ICoqd2hvIG93bnMgdGhlIGBraWRgKiogcmF0aGVyIHRoYW4gYnkgYWxnb3JpdGhtIOKAlCBhbmRcbiAqIGJlY2F1c2UgYSBga2lkYCBpcyBhbiBSRkMgNzYzOCB0aHVtYnByaW50LCBvd25lcnNoaXAgaXMgYSBmYWN0IGFib3V0IHRoZSBrZXksXG4gKiBub3QgYSBjbGFpbSB0aGUgdG9rZW4gbWFrZXMgYWJvdXQgaXRzZWxmOlxuICpcbiAqIC0gYSBga2lkYCBwdWJsaXNoZWQgaW4gdGhlIHBlci1zZXJ2aWNlIGtleSBidW5kbGUg4oaSIGFuIElOVEVSTkFMIFNFUlZJQ0UgdG9rZW5cbiAqICAgKHtAbGluayBzaWduU2VydmljZVRva2VufSksIHZlcmlmaWVkIHdpdGggdGhhdCBzZXJ2aWNlJ3Mga2V5OyBpdHMgYHN1YmAgbXVzdFxuICogICBuYW1lIHRoZSBzYW1lIHNlcnZpY2UsIHNvIG9uZSBzZXJ2aWNlIGNhbiBuZXZlciBzcGVhayBmb3IgYW5vdGhlci5cbiAqIC0gYW55dGhpbmcgZWxzZSDihpIgYSBwbGF0Zm9ybS1zaWduZWQgVVNFUiB0b2tlbiwgdmVyaWZpZWQgYWdhaW5zdCBwbGF0Zm9ybSdzXG4gKiAgIHB1Ymxpc2hlZCBKV0tTLiBBIHRva2VuIGNsYWltaW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgIGlzIHJlZnVzZWRcbiAqICAgaGVyZTogYW4gaW50ZXJuYWwgaWRlbnRpdHkgbWF5IG5vdCByaWRlIHRoZSB1c2VyIHNpZ25pbmcga2V5LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgaXMgbm90IEVTMjU2IHdpdGggYSBga2lkYCBmYWlscyBpbiBib3RoIGNoYWlucywgd2hpY2ggaXMgd2hhdFxuICogbWFrZXMgXCJubyBIUzI1NiB0b2tlbiBpcyBhY2NlcHRlZCBhbnl3aGVyZVwiIGEgcHJvcGVydHkgb2YgdGhlIGNvZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlCZWFyZXJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxKd3RQYXlsb2FkPiB7XG4gIGNvbnN0IGhlYWRlciA9IGRlY29kZUp3dEhlYWRlcih0b2tlbik7XG4gIGlmICghaGVhZGVyPy5hbGcpIHRocm93IG5ldyBqd3QuSnNvbldlYlRva2VuRXJyb3IoJ01hbGZvcm1lZCB0b2tlbiBoZWFkZXInKTtcblxuICBpZiAoaGVhZGVyLmtpZCAmJiBpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHtcbiAgICBjb25zdCBjbGFpbXMgPSB2ZXJpZnlTZXJ2aWNlSnd0PEp3dFBheWxvYWQ+KHRva2VuLCB7IGtpZDogaGVhZGVyLmtpZCwgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCkgfSk7XG4gICAgaWYgKGNsYWltcy5wcmluY2lwYWxUeXBlICE9PSAnc2VydmljZScpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX2tleV9ub25fc2VydmljZV90b2tlbl9yZWplY3RlZF90b3RhbCcsIHsgYWxnOiBoZWFkZXIuYWxnIH0pO1xuICAgICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcignQSBzZXJ2aWNlIHNpZ25pbmcga2V5IG1heSBvbmx5IG1pbnQgYSBzZXJ2aWNlIHByaW5jaXBhbCcpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhaW1zO1xuICB9XG5cbiAgY29uc3QgY2xhaW1zID0gYXdhaXQgdmVyaWZ5VXNlckp3dCh0b2tlbik7XG4gIGlmIChjbGFpbXMucHJpbmNpcGFsVHlwZSA9PT0gJ3NlcnZpY2UnKSB7XG4gICAgdGhyb3cgbmV3IGp3dC5Kc29uV2ViVG9rZW5FcnJvcignU2VydmljZSBwcmluY2lwYWxzIG1heSBub3QgYmUgc2lnbmVkIHdpdGggdGhlIHVzZXIgc2lnbmluZyBrZXknKTtcbiAgfVxuICByZXR1cm4gY2xhaW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGB4LW9yZy1pZGAvYHgtb3JnLW5hbWVgIGhlYWRlcnMgb3ZlcnJpZGUgdGhlIGNhbGxlcidzIG9yZ1xuICAgKiDigJQgYnV0IE9OTFkgZm9yIGEgdmVyaWZpZWQgU1lTLUFETUlOIChgaXNTdXBlckFkbWluYCBjbGFpbSkuIEZvciBhbnkgb3JkaW5hcnlcbiAgICogYXV0aGVudGljYXRlZCB1c2VyIHRoZSBoZWFkZXJzIGFyZSBpZ25vcmVkLCBzbyBlbmFibGluZyB0aGlzIGNhbiBuZXZlciBsZXQgYVxuICAgKiBub3JtYWwgdXNlciBpbXBlcnNvbmF0ZSBhbm90aGVyIHRlbmFudCdzIG9yZy4gVXNlIGZvciBjcm9zcy1vcmcgYWRtaW4gdG9vbGluZ1xuICAgKiAoZS5nLiBhIHN5c2FkbWluIG1hbmFnaW5nIGEgZ2l2ZW4gb3JnJ3MgYmlsbGluZykuIElmIHVuc3VyZSwgbGVhdmUgaXQgZGlzYWJsZWQuXG4gICAqL1xuICBhbGxvd09yZ0hlYWRlck92ZXJyaWRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlbWFuZCB0aGF0IHRoZSB3aG9sZSBTRVNTSU9OIGJlIGF0IGxlYXN0IHRoaXMgYXNzdXJhbmNlIGxldmVsICgjOCkuXG4gICAqXG4gICAqIGBtaW5Bc3N1cmFuY2U6IDJgIG1lYW5zIHRoZSBwZXJzb24gYXV0aGVudGljYXRlZCB3aXRoIGEgc2Vjb25kIGZhY3RvciDigJQgYVxuICAgKiBwYXNza2V5IHdpdGggdXNlciB2ZXJpZmljYXRpb24sIGEgcGFzc3dvcmQgcGx1cyBhbiBhdXRoZW50aWNhdG9yIGNvZGUsIG9yXG4gICAqIFNTTyB0aHJvdWdoIGFuIElkUCB0aGUgb3JnIG1hcmtlZCBhcyBlbmZvcmNpbmcgTUZBLiBBIHdlYWtlciB0b2tlbiBnZXRzXG4gICAqICoqNDAxIGBNRkFfUkVRVUlSRURgKiosIHdoaWNoIHRoZSBjbGllbnQgYW5zd2VycyBieSBzZW5kaW5nIHRoZSBwZXJzb24gdG9cbiAgICogZW5yb2xtZW50IG9yIHRvIGEgc3Ryb25nZXIgc2lnbi1pbjsgcmVmcmVzaGluZyBjYW5ub3QgaGVscCwgYmVjYXVzZSBgYWFsYFxuICAgKiBsaXZlcyBvbiB0aGUgc2Vzc2lvbiBzbG90IGFuZCBhIHJlZnJlc2ggbmV2ZXIgcmFpc2VzIGl0LlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBTRVNTSU9OLWxldmVsIGNvdW50ZXJwYXJ0IHRvIHtAbGluayByZXF1aXJlU3RlcFVwfSwgd2hpY2ggc3RheXNcbiAgICogYSBmcmVzaCwgcGVyLWFjdGlvbiBjb25maXJtYXRpb24uIFVzZSBib3RoIG9uIHRoZSBtb3N0IGRhbmdlcm91cyByb3V0ZXMuXG4gICAqXG4gICAqIE1BQ0hJTkVTIE5FVkVSIFNBVElTRlkgSVQuIEEgc2VydmljZSBwcmluY2lwYWwsIGFuIG9yZyBzZXJ2aWNlIGFjY291bnQgYW5kXG4gICAqIGFuIGV4Y2hhbmdlZCBhY2Nlc3Mga2V5IGFsbCBnZXQgKio0MDMgYEhVTUFOX1NFU1NJT05fUkVRVUlSRURgKiog4oCUIHRoZXJlIGlzXG4gICAqIG5vIHBlcnNvbiBiZWhpbmQgdGhlbSB0byBoYXZlIHByZXNlbnRlZCBhIGZhY3Rvciwgc28gXCJhc3N1cmFuY2VcIiBpcyBub3QgYVxuICAgKiBxdWVzdGlvbiB0aGVpciBjcmVkZW50aWFsIGNhbiBhbnN3ZXIuIFRoYXQgaXMgZGVsaWJlcmF0ZWx5IG5vdCBhIHNpbGVudFxuICAgKiBwYXNzLXRocm91Z2ggZm9yIGludGVybmFsIHNlcnZpY2VzOiBhIHJvdXRlIHRoYXQgZGVtYW5kcyBNRkEgaXMgYSByb3V0ZSBhXG4gICAqIGh1bWFuIGlzIGRvaW5nIHNvbWV0aGluZyBkYW5nZXJvdXMgb24uXG4gICAqL1xuICBtaW5Bc3N1cmFuY2U/OiBBc3N1cmFuY2VMZXZlbDtcbiAgLyoqXG4gICAqIFdpdGgge0BsaW5rIG1pbkFzc3VyYW5jZX0sIGFkZGl0aW9uYWxseSBib3VuZCBob3cgbG9uZyBhZ28gdGhhdCBzaWduLWluXG4gICAqIGhhcHBlbmVkIChzZWNvbmRzLCBjb21wYXJlZCBhZ2FpbnN0IHRoZSB0b2tlbidzIGBhdXRoX3RpbWVgKS4gQSBzZXNzaW9uIHRoYXRcbiAgICogaXMgTUZBLWdyYWRlIGJ1dCBvbGRlciB0aGFuIHRoaXMgZ2V0cyAqKjQwMSBgUkVBVVRIX1JFUVVJUkVEYCoqLiBJZ25vcmVkXG4gICAqIHdpdGhvdXQgYG1pbkFzc3VyYW5jZWAg4oCUIFwiaG93IHJlY2VudFwiIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbmNlIFwiaG93IHN0cm9uZ1wiXG4gICAqIGlzIGJlaW5nIGFza2VkLlxuICAgKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xufVxuXG4vKiogSldUIGF1dGggbWlkZGxld2FyZS4gVXNlIGRpcmVjdGx5IG9yIGNhbGwgd2l0aCBvcHRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM/OiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4pOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcU9yT3B0aW9ucz86IFJlcXVlc3QgfCBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJlcz86IFJlc3BvbnNlLFxuICBuZXh0PzogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB8ICgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHZvaWQpIHtcbiAgaWYgKHJlcU9yT3B0aW9ucyAmJiByZXMgJiYgbmV4dCAmJiAnaGVhZGVycycgaW4gcmVxT3JPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9yZXF1aXJlQXV0aCh7fSwgcmVxT3JPcHRpb25zIGFzIFJlcXVlc3QsIHJlcywgbmV4dCk7XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gKHJlcU9yT3B0aW9ucyBhcyBSZXF1aXJlQXV0aE9wdGlvbnMpIHx8IHt9O1xuICBjb25zdCBnYXRlID0gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlc0lubmVyOiBSZXNwb25zZSwgbmV4dElubmVyOiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBfcmVxdWlyZUF1dGgob3B0aW9ucywgcmVxLCByZXNJbm5lciwgbmV4dElubmVyKTtcbiAgfSwgeyBraW5kOiAnYXV0aCcgfSk7XG4gIGlmIChvcHRpb25zLm1pbkFzc3VyYW5jZSkge1xuICAgIHRhZ1JvdXRlR2F0ZShnYXRlLCB7IGtpbmQ6ICdhc3N1cmFuY2UnLCBtaW5Bc3N1cmFuY2U6IG9wdGlvbnMubWluQXNzdXJhbmNlLCAuLi4ob3B0aW9ucy5tYXhBZ2UgIT09IHVuZGVmaW5lZCA/IHsgbWF4QWdlOiBvcHRpb25zLm1heEFnZSB9IDoge30pIH0pO1xuICB9XG4gIHJldHVybiBnYXRlO1xufVxudGFnUm91dGVHYXRlKHJlcXVpcmVBdXRoLCB7IGtpbmQ6ICdhdXRoJyB9KTtcblxuLyoqXG4gKiBBIHNvdXJjZSBvZiB0aGUgQ1VSUkVOVCBgdG9rZW5WZXJzaW9uYCBmb3IgYSB1c2VyLCBiYWNrZWQgYnkgYSBzdG9yZSB0aGVcbiAqIHN0YXRlbGVzcyBzZXJ2aWNlcyBjYW4gcmVhZCAoaW4gcHJhY3RpY2UgYSBSZWRpcyBrZXkgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlc1xuICogdG8gb24gZXZlcnkgcHJpdmlsZWdlIGNoYW5nZSkuIFJlZ2lzdGVyZWQgdmlhIHtAbGluayBzZXRUb2tlblJldm9jYXRpb25TdG9yZX0uXG4gKlxuICogYGdldEN1cnJlbnRWZXJzaW9uYCByZXR1cm5zIHRoZSB1c2VyJ3MgY3VycmVudCB2ZXJzaW9uLCBvciBgbnVsbGAgd2hlbiB0aGVcbiAqIHN0b3JlIGhhcyBubyBlbnRyeSDigJQgYSBtaXNzIGlzIHRyZWF0ZWQgYXMgXCJubyBrbm93biByZXZvY2F0aW9uXCIgKGZhaWwtb3Blbik6XG4gKiByZXZvY2F0aW9uIGVudHJpZXMgYXJlIHB1Ymxpc2hlZCB3aXRoIGEgVFRMIG1hdGNoaW5nIHRoZSBhY2Nlc3MtdG9rZW5cbiAqIGxpZmV0aW1lLCBzbyBhIG1pc3NpbmcgZW50cnkgbWVhbnMgYW55IHRva2VuIG9sZCBlbm91Z2ggdG8gcHJlZGF0ZSBpdCBoYXNcbiAqIGFscmVhZHkgZXhwaXJlZCBvbiBpdHMgb3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmV2b2NhdGlvblN0b3JlIHtcbiAgZ2V0Q3VycmVudFZlcnNpb24odXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlciB8IG51bGw+O1xuICAvKipcbiAgICogV2hldGhlciBvbmUgSU1QRVJTT05BVElPTiBzZXNzaW9uIChieSB0b2tlbiBganRpYCkgaGFzIGJlZW4gZW5kZWQgZWFybHkuXG4gICAqXG4gICAqIE9wdGlvbmFsIHNvIGEgc3RvcmUgdGhhdCBwcmVkYXRlcyBpdCBzdGlsbCBsaW5rcyDigJQgYnV0IGEgc3RvcmUgV0lUSE9VVCBpdFxuICAgKiBjYW5ub3QgYW5zd2VyLCBhbmQgYW4gaW1wZXJzb25hdGlvbiB0b2tlbiBpcyB0aGVuIFJFSkVDVEVELiBVbmxpa2VcbiAgICogYGdldEN1cnJlbnRWZXJzaW9uYCwgdGhpcyBpcyBkZWxpYmVyYXRlbHkgbm90IGZhaWwtb3BlbjogdGhlIHBsYXRmb3JtIGVuZHMgYVxuICAgKiBzZXNzaW9uIHdoZW4gc29tZW9uZSB3aXRoZHJhd3MgY29uc2VudCwgYW5kIGEgd2l0aGRyYXduIGNvbnNlbnQgdGhhdCBrZWVwc1xuICAgKiB3b3JraW5nIGluIGV2ZXJ5IG90aGVyIHNlcnZpY2UgaXMgbm90IHdpdGhkcmF3bi5cbiAgICovXG4gIGdldFNlc3Npb25SZXZvY2F0aW9uPyhqdGk6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvblJldm9jYXRpb25TdGF0ZT47XG59XG5cbi8qKlxuICogYHJldm9rZWRgICAgICDigJQgdGhlIHNlc3Npb24gd2FzIGVuZGVkOyByZWplY3QuXG4gKiBgbGl2ZWAgICAgICAgIOKAlCBubyByZXZvY2F0aW9uIHJlY29yZGVkOyBhbGxvdy5cbiAqIGB1bmF2YWlsYWJsZWAg4oCUIHRoZSBzdG9yZSBjb3VsZG4ndCBiZSByZWFkIG9yIGNhbid0IGFuc3dlcjsgUkVKRUNULiBEaXN0aW5jdFxuICogICAgICAgICAgICAgICAgIGZyb20gYGxpdmVgIHByZWNpc2VseSBzbyBhbiBvdXRhZ2UgY2FuJ3QgcmVhZCBhcyBcIm5vdCByZXZva2VkXCIuXG4gKi9cbmV4cG9ydCB0eXBlIFNlc3Npb25SZXZvY2F0aW9uU3RhdGUgPSAncmV2b2tlZCcgfCAnbGl2ZScgfCAndW5hdmFpbGFibGUnO1xuXG5sZXQgdG9rZW5SZXZvY2F0aW9uU3RvcmU6IFRva2VuUmV2b2NhdGlvblN0b3JlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFJlZ2lzdGVyIChvciBjbGVhciwgd2l0aCBgdW5kZWZpbmVkYCkgdGhlIHByb2Nlc3Mtd2lkZSB0b2tlbi1yZXZvY2F0aW9uIHN0b3JlLlxuICogV2hlbiB1bnNldCAodGhlIGRlZmF1bHQpLCBgcmVxdWlyZUF1dGhgIHBlcmZvcm1zIE5PIHJldm9jYXRpb24gY2hlY2sgKGl0IHJlbGllc1xuICogb24gdGhlIHNob3J0IGFjY2Vzcy10b2tlbiBUVEwpOyBzZXJ2aWNlcyBvcHQgaW4gYXQgYm9vdCBieSB3aXJpbmcgdGhlaXIgUmVkaXNcbiAqIGNsaWVudC4gUGxhdGZvcm0ga2VlcHMgaXRzIG93biBNb25nby1iYWNrZWQgY2hlY2sgYW5kIG5lZWQgbm90IHJlZ2lzdGVyIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRva2VuUmV2b2NhdGlvblN0b3JlKHN0b3JlOiBUb2tlblJldm9jYXRpb25TdG9yZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICB0b2tlblJldm9jYXRpb25TdG9yZSA9IHN0b3JlO1xuICBpZiAoc3RvcmUpIHJldm9jYXRpb25TdG9yZU1pc3NpbmdXYXJuZWQgPSBmYWxzZTsgLy8gcmUtYXJtIGlmIGEgc3RvcmUgaXMgKHJlKXJlZ2lzdGVyZWRcbn1cblxuLyoqIE9uZS1zaG90IGd1YXJkIHNvIHRoZSBcInJldm9jYXRpb24gaW5hY3RpdmVcIiB3YXJuaW5nIGRvZXNuJ3QgZmxvb2QgdGhlIGxvZ3MuICovXG5sZXQgcmV2b2NhdGlvblN0b3JlTWlzc2luZ1dhcm5lZCA9IGZhbHNlO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIGBkZWNvZGVkYCBoYXMgYmVlbiByZXZva2VkIHBlciB0aGUgcmVnaXN0ZXJlZCBzdG9yZTogaXRzXG4gKiBlbWJlZGRlZCBgdG9rZW5WZXJzaW9uYCBpcyBzdHJpY3RseSBiZWhpbmQgdGhlIHN0b3JlJ3MgY3VycmVudCB2ZXJzaW9uLlxuICogRmFpbC1vcGVuIOKAlCBhbnkgc3RvcmUgZXJyb3IsIGEgbWlzc2luZyBlbnRyeSwgb3IgYSB0b2tlbi9zdG9yZSB3aXRob3V0IGFcbiAqIHVzYWJsZSB2ZXJzaW9uIHlpZWxkcyBgZmFsc2VgIChhbGxvdykuIE5ldmVyIHRocm93cy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNUb2tlblJldm9rZWQoZGVjb2RlZDogSnd0UGF5bG9hZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzdG9yZSA9IHRva2VuUmV2b2NhdGlvblN0b3JlO1xuICBpZiAoIXN0b3JlKSB7XG4gICAgLy8gTWFrZSB0aGUgXCJyZXZvY2F0aW9uIGlzIE9GRlwiIHN0YXRlIE9CU0VSVkFCTEU6IGEgc2VydmljZSB0aGF0IHZlcmlmaWVzIHVzZXJcbiAgICAvLyB0b2tlbnMgYnV0IGZvcmdvdCBgc2V0VG9rZW5SZXZvY2F0aW9uU3RvcmUoKWAgc2lsZW50bHkgZGlzYWJsZXMgdGhlIHNlc3Npb25cbiAgICAvLyBraWxsLXN3aXRjaC4gV2FybiBPTkNFIChvbmx5IGZvciBhIHJldm9jYWJsZSB1c2VyIHRva2VuKSBzbyBhIG1pc2NvbmZpZ3VyZWRcbiAgICAvLyBib290IHN1cmZhY2VzIGluIHRoZSBsb2dzIGluc3RlYWQgb2YgZmFpbGluZyBvcGVuIGludmlzaWJseS5cbiAgICBpZiAoIXJldm9jYXRpb25TdG9yZU1pc3NpbmdXYXJuZWQgJiYgZGVjb2RlZC5zdWIgJiYgdHlwZW9mIGRlY29kZWQudG9rZW5WZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgICAgcmV2b2NhdGlvblN0b3JlTWlzc2luZ1dhcm5lZCA9IHRydWU7XG4gICAgICBsb2dnZXIud2FybignVG9rZW4gcmV2b2NhdGlvbiBzdG9yZSBOT1QgcmVnaXN0ZXJlZCDigJQgcmV2b2NhdGlvbiBjaGVja3MgYXJlIElOQUNUSVZFIChzZXRUb2tlblJldm9jYXRpb25TdG9yZSB3YXMgbmV2ZXIgY2FsbGVkKTsgcmV2b2tlZC9jb21wcm9taXNlZCBzZXNzaW9ucyBzdGF5IHZhbGlkIHVudGlsIG5hdHVyYWwgVFRMJyk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoIWRlY29kZWQuc3ViIHx8IHR5cGVvZiBkZWNvZGVkLnRva2VuVmVyc2lvbiAhPT0gJ251bWJlcicpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgc3RvcmUuZ2V0Q3VycmVudFZlcnNpb24oZGVjb2RlZC5zdWIpO1xuICAgIHJldHVybiBjdXJyZW50ICE9PSBudWxsICYmIGRlY29kZWQudG9rZW5WZXJzaW9uIDwgY3VycmVudDtcbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFpbC1vcGVuOiBhIHJldm9jYXRpb24tc3RvcmUgb3V0YWdlIG11c3Qgbm90IGxvY2sgZXZlcnkgdXNlciBvdXQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24ncyByZXZvY2F0aW9uIHN0YXRlLiBOZXZlciB0aHJvd3M6IGFueSBmYWlsdXJlXG4gKiDigJQgbm8gc3RvcmUsIGEgc3RvcmUgdGhhdCBjYW4ndCBhbnN3ZXIsIGEgcmVhZCBlcnJvciDigJQgaXMgYHVuYXZhaWxhYmxlYCwgd2hpY2hcbiAqIGNhbGxlcnMgdHJlYXQgYXMgcmV2b2tlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2Vzc2lvblJldm9jYXRpb25TdGF0ZShqdGk6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvblJldm9jYXRpb25TdGF0ZT4ge1xuICBjb25zdCBzdG9yZSA9IHRva2VuUmV2b2NhdGlvblN0b3JlO1xuICBpZiAoIXN0b3JlPy5nZXRTZXNzaW9uUmV2b2NhdGlvbikgcmV0dXJuICd1bmF2YWlsYWJsZSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHN0b3JlLmdldFNlc3Npb25SZXZvY2F0aW9uKGp0aSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAndW5hdmFpbGFibGUnO1xuICB9XG59XG5cbi8qKiBBbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24gdG9rZW46IGl0IG5hbWVzIHRoZSBvcGVyYXRvciBBTkQgY2FycmllcyBpdHMgb3duIHNlc3Npb24gaWQuICovXG5mdW5jdGlvbiBpc0ltcGVyc29uYXRpb25TZXNzaW9uKGRlY29kZWQ6IHsgaW1wZXJzb25hdG9ySWQ/OiB1bmtub3duOyBqdGk/OiB1bmtub3duIH0pOiBkZWNvZGVkIGlzIHsgaW1wZXJzb25hdG9ySWQ6IHN0cmluZzsganRpOiBzdHJpbmcgfSB7XG4gIHJldHVybiB0eXBlb2YgZGVjb2RlZC5pbXBlcnNvbmF0b3JJZCA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGRlY29kZWQuanRpID09PSAnc3RyaW5nJyAmJiBkZWNvZGVkLmp0aS5sZW5ndGggPiAwO1xufVxuXG4vKipcbiAqIFB1YmxpYyByZXZvY2F0aW9uIGNoZWNrIGZvciByb3V0ZXMgdGhhdCB2ZXJpZnkgYSBwbGF0Zm9ybSBKV1QgT1VUU0lERVxuICogYHJlcXVpcmVBdXRoYCAoZS5nLiB0aGUgaW1hZ2UtcmVnaXN0cnkgYC90b2tlbmAgbWludCBwYXRoLCB3aGljaCByZXNvbHZlc1xuICogaWRlbnRpdHkgaXRzZWxmKS4gUmV0dXJucyB0cnVlIHdoZW4gdGhlIHRva2VuJ3MgYHRva2VuVmVyc2lvbmAgaXMgc3RyaWN0bHlcbiAqIGJlaGluZCB0aGUgc3RvcmUncyBjdXJyZW50IHZlcnNpb24uIEZhaWwtb3BlbiAobmV2ZXIgdGhyb3dzKSDigJQgYSBzdG9yZSBvdXRhZ2VcbiAqIG9yIGEgdG9rZW4vc3RvcmUgd2l0aG91dCBhIHVzYWJsZSB2ZXJzaW9uIHlpZWxkcyBmYWxzZSAoYWxsb3cpLCBtYXRjaGluZ1xuICogYHJlcXVpcmVBdXRoYC4gUGFzcyB0aGUgdmVyaWZpZWQgSldUIGNsYWltcyAoYHN1YmAsIGB0b2tlblZlcnNpb25gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlzQWNjZXNzVG9rZW5SZXZva2VkKFxuICBjbGFpbXM6IHsgc3ViPzogc3RyaW5nOyB0b2tlblZlcnNpb24/OiBudW1iZXI7IGp0aT86IHN0cmluZzsgaW1wZXJzb25hdG9ySWQ/OiBzdHJpbmcgfSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBBbiBpbXBlcnNvbmF0aW9uIHNlc3Npb24gaXMgcmV2b2tlZCB1bmxlc3MgdGhlIHN0b3JlIHBvc2l0aXZlbHkgc2F5cyBsaXZlIOKAlFxuICAvLyBpbmNsdWRpbmcgb24gdGhpcyBvdXQtb2YtYmFuZCBwYXRoLCBvciBhIHJldm9rZWQgc2Vzc2lvbiBjb3VsZCBzdGlsbCBtaW50XG4gIC8vIHJlZ2lzdHJ5IHRva2Vucy5cbiAgaWYgKGlzSW1wZXJzb25hdGlvblNlc3Npb24oY2xhaW1zKSAmJiBhd2FpdCBzZXNzaW9uUmV2b2NhdGlvblN0YXRlKGNsYWltcy5qdGkpICE9PSAnbGl2ZScpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaXNUb2tlblJldm9rZWQoY2xhaW1zIGFzIEp3dFBheWxvYWQpO1xufVxuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgLy8gQW4gT1BBUVVFIEFDQ0VTUyBLRVkgKGBwYl9wYXRf4oCmYCAvIGBwYl9zYV/igKZgKSBjYXJyaWVzIG5vIGNsYWltcyBhbmQgbm9cbiAgLy8gc2lnbmF0dXJlLCBzbyBpdCBjYW5ub3QgYmUgdmVyaWZpZWQgaGVyZS4gVHJhZGUgaXQgYXQgcGxhdGZvcm0gZm9yIGFcbiAgLy8gc2hvcnQtbGl2ZWQgSldUIChjYWNoZWQgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzKSBhbmQgdGhlbiB2ZXJpZnkgdGhhdFxuICAvLyBKV1Qgb24gdGhlIG5vcm1hbCBwYXRoIOKAlCBzZXJ2aWNlcyBuZXZlciByZWFkIGEga2V5IGhhc2guIFNlZVxuICAvLyBgc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS50c2AuXG4gIGlmIChpc09wYXF1ZUFwaUtleShwYXJ0c1sxXSkpIHtcbiAgICB2b2lkIHJlc29sdmVBcGlLZXkob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdmVyaWZpY2F0aW9uIGl0c2VsZiBuZXZlciByZWplY3RzIChpdCBtYXBzXG4gIC8vIGV2ZXJ5IGZhaWx1cmUgdG8gYSByZXNwb25zZSkuXG4gIHZvaWQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHBhcnRzWzFdLCByZXEsIHJlcywgbmV4dCkuY2F0Y2gobmV4dCk7XG59XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gb3BhcXVlIGtleSBmb3IgYSBKV1QsIHRoZW4gY29udGludWUgb24gdGhlIG5vcm1hbCB2ZXJpZmljYXRpb25cbiAqIHBhdGguIEEgcmVmdXNlZCBrZXkgaXMgYSA0MDE7IGFuIHVucmVhY2hhYmxlIHBsYXRmb3JtIGlzIGEgNTAzIChuZXZlciBhIHBhc3Mg4oCUXG4gKiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpS2V5KFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMb2FkZWQgTEFaSUxZLCBvbiB0aGUgZmlyc3Qga2V5IGV2ZXIgcHJlc2VudGVkLiBBIHN0YXRpYyBpbXBvcnQgd291bGQgcHV0XG4gIC8vIHRoZSBIVFRQIGNsaWVudCAoYW5kIHBsYXRmb3JtJ3MgYWRkcmVzcykgaW50byB0aGUgaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5XG4gIC8vIG1vZHVsZSB0aGF0IG1lcmVseSB1c2VzIGByZXF1aXJlQXV0aGAsIHdoaWNoIGJvdGggd2lkZW5zIHRoZSBib290IGdyYXBoIGFuZFxuICAvLyBicmVha3MgYW55IHRlc3QgdGhhdCBtb2NrcyBgaHR0cC1jbGllbnQuanNgIHdpdGggYSBwYXJ0aWFsIG1vZHVsZS5cbiAgY29uc3QgeyBleGNoYW5nZUFwaUtleSwgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UuanMnKTtcbiAgbGV0IHRva2VuOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdG9rZW4gPSBhd2FpdCBleGNoYW5nZUFwaUtleShrZXkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICAgICdBY2Nlc3Mta2V5IHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZTsgcGxlYXNlIHJldHJ5JyxcbiAgICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIG9yIHJldm9rZWQgYWNjZXNzIGtleScsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgfVxuICBhd2FpdCB2ZXJpZnlBbmRBdHRhY2gob3B0aW9ucywgdG9rZW4sIHJlcSwgcmVzLCBuZXh0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QW5kQXR0YWNoKFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJhd1Rva2VuOiBzdHJpbmcsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gVHdvIGNoYWlucywgb25lIGVudHJ5IHBvaW50IChzZWUgYHZlcmlmeUJlYXJlclRva2VuYCk6IGEgdXNlciB0b2tlbiBtdXN0XG4gICAgLy8gYmUgRVMyNTYgc2lnbmVkIGJ5IHBsYXRmb3JtIGFuZCB2ZXJpZmllZCBhZ2FpbnN0IGl0cyBwdWJsaXNoZWQgSldLUzsgYW5cbiAgICAvLyBpbnRlcm5hbCBzZXJ2aWNlIHRva2VuIHN0YXlzIG9uIHRoZSBzaGFyZWQgc2VjcmV0IGFuZCBtdXN0IGRlY2xhcmUgaXRzZWxmXG4gICAgLy8gYSBzZXJ2aWNlIHByaW5jaXBhbC4gQm90aCBwaW4gdGhlIGFsZ29yaXRobSAobm8gYWxnLWNvbmZ1c2lvbiwgbm9cbiAgICAvLyBgYWxnOm5vbmVgKSBhbmQgYm90aCBhcHBseSB0aGUgb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlIGJpbmRpbmcuXG4gICAgY29uc3QgZGVjb2RlZCA9IGF3YWl0IHZlcmlmeUJlYXJlclRva2VuKHJhd1Rva2VuKTtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUgfHwgIWhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZCkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIC8vIFNlcnZpY2UtdG9rZW4ga2lsbC1zd2l0Y2g6IHJlamVjdCBhIHNlcnZpY2UgcHJpbmNpcGFsIHdob3NlIHNlcnZpY2UgaGFzXG4gICAgLy8gYmVlbiBhZGRlZCB0byB0aGUgZGVueWxpc3QuIFJvdGF0aW5nIHRoZSBzaGFyZWQgSldUIHNlY3JldCBpcyB0aGUgb25seVxuICAgIC8vIG90aGVyIHdheSB0byBpbnZhbGlkYXRlIGEgc2VydmljZSB0b2tlbiBiZWZvcmUgaXRzIChzaG9ydCkgVFRMIOKAlCBidXQgdGhhdFxuICAgIC8vIG51a2VzIEVWRVJZIHNlcnZpY2UgdG9rZW4gZmxlZXQtd2lkZS4gVGhpcyBsZXRzIG9uZSBjb21wcm9taXNlZC9yb2d1ZVxuICAgIC8vIHNlcnZpY2UgYmUgY3V0IG9mZiBzdXJnaWNhbGx5LiBPKDEpIFNldCBsb29rdXAsIHplcm8gY29zdCB3aGVuIHRoZSBkZW55bGlzdFxuICAgIC8vIGlzIGVtcHR5ICh0aGUgZGVmYXVsdCksIHNvIGl0IG5ldmVyIHRheGVzIHRoZSBTMlMgaG90IHBhdGggdW5sZXNzIGFybWVkLlxuICAgIGlmIChpc1NlcnZpY2VUb2tlbkRlbmllZChkZWNvZGVkKSkge1xuICAgICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fZGVuaWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZU9mKGRlY29kZWQpID8/ICd1bmtub3duJyB9KTtcbiAgICAgIGxvZ2dlci53YXJuKCdSZWplY3RlZCBkZW55bGlzdGVkIHNlcnZpY2UgdG9rZW4nLCB7IHN1YjogZGVjb2RlZC5zdWIgfSk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdTZXJ2aWNlIHRva2VuIHJldm9rZWQnLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgfVxuXG4gICAgcmVxLnVzZXIgPSB7IC4uLmRlY29kZWQgfTtcblxuICAgIC8vIEJPT1RTVFJBUC1BRE1JTiBFTlJPTE1FTlQgU0VTU0lPTiAoIzgsIHJldmlzaW9uIDQpLiBTdWNoIGEgdG9rZW4gZXhpc3RzIHNvXG4gICAgLy8gdGhlIGluc3RhbGwncyBvbmx5IGFkbWluIGNhbiBlbnJvbCBhIGZhY3RvcjsgaXQgaXMgYGFhbDogMWAgYW5kIG11c3Qgbm90XG4gICAgLy8gcmVhY2ggYW55dGhpbmcgZWxzZS4gUGxhdGZvcm0g4oCUIHdoaWNoIG93bnMgdGhlIGV4Y2VwdGlvbiBhbmQga25vd3Mgd2hpY2hcbiAgICAvLyBvZiBpdHMgb3duIHJvdXRlcyBgaW5pdC1wbGF0Zm9ybS5zaGAgY2FsbHMg4oCUIGFsbG93cyBhbiBleHBsaWNpdCBmZXcgYmVmb3JlXG4gICAgLy8gdGhpcyBwb2ludCAoc2VlIGl0cyBvd24gYHJlcXVpcmVBdXRoYCk7IGluIEVWRVJZIG90aGVyIHNlcnZpY2UgdGhlIGFuc3dlclxuICAgIC8vIGlzIHNpbXBseSBubywgc28gdGhlIHJlYWNoIHJlc3RyaWN0aW9uIGhvbGRzIHdpdGhvdXQgYSBwZXItc2VydmljZVxuICAgIC8vIGFsbG93bGlzdCB0byBrZWVwIGluIHN5bmMuXG4gICAgaWYgKGRlY29kZWQubWZhRW5yb2xsbWVudFBlbmRpbmcgPT09IHRydWUpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogJ2Jvb3RzdHJhcF9zZXNzaW9uJyB9KTtcbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ21mYS1lbnJvbG1lbnQnKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdGaW5pc2ggc2V0dGluZyB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSB1c2luZyB0aGUgcmVzdCBvZiBQaXBlbGluZSBCdWlsZGVyJyxcbiAgICAgICAgRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWxldmVsIGFzc3VyYW5jZSAoYHJlcXVpcmVBdXRoKHsgbWluQXNzdXJhbmNlLCBtYXhBZ2UgfSlgKS5cbiAgICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2VcbiAgICAgICYmIHJlZnVzZUZvckFzc3VyYW5jZSh7IG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSwgZGVjb2RlZCwgcmVxLCByZXMpKSByZXR1cm47XG5cbiAgICAvLyBUaGUgeC1vcmctaWQveC1vcmctbmFtZSBvdmVycmlkZSBsZXRzIGEgU1lTLUFETUlOIGFjdCBvbiBhIGNob3NlbiBvcmdcbiAgICAvLyAoY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmcpLiBJdCBpcyBnYXRlZCBvbiB0aGUgdmVyaWZpZWQgYGlzU3VwZXJBZG1pbmAgY2xhaW1cbiAgICAvLyBoZXJlIHNvIHRoYXQgZXZlbiBhIHJvdXRlIHdoaWNoIG1pc3Rha2VubHkgZW5hYmxlcyBgYWxsb3dPcmdIZWFkZXJPdmVycmlkZWBcbiAgICAvLyBjYW4gTkVWRVIgbGV0IGFuIG9yZGluYXJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBzcG9vZiBhbm90aGVyIHRlbmFudCdzIG9yZyB2aWFcbiAgICAvLyB0aGUgaGVhZGVyIOKAlCBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgdGhlIGNyb3NzLXRlbmFudCBicmVhayB0aGlzIGNhdXNlZC5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlICYmIGRlY29kZWQuaXNTdXBlckFkbWluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlLWRlcml2ZSB0aGUgcmVxdWVzdCdzIHRlbmFudCBpZGVudGl0eSBmcm9tIHRoZSBOT1ctdmVyaWZpZWQgSldULlxuICAgIC8vXG4gICAgLy8gYGF0dGFjaFJlcXVlc3RDb250ZXh0YCBydW5zIGFzIGEgZ2xvYmFsIG1pZGRsZXdhcmUgQkVGT1JFIHRoaXMgcGVyLXJvdXRlXG4gICAgLy8gYHJlcXVpcmVBdXRoYCwgc28gaXQgY2FwdHVyZWQgYHJlcS5jb250ZXh0LmlkZW50aXR5YCB3aGlsZSBgcmVxLnVzZXJgIHdhc1xuICAgIC8vIHN0aWxsIHVuZGVmaW5lZCDigJQgYXQgd2hpY2ggcG9pbnQgYGdldElkZW50aXR5YCBmYWxscyBiYWNrIHRvIHRoZSByYXcsXG4gICAgLy8gY2xpZW50LXNldHRhYmxlIGB4LW9yZy1pZGAvYHgtdXNlci1pZGAgaGVhZGVycy4gRXZlcnkgZG93bnN0cmVhbSB0ZW5hbnQtXG4gICAgLy8gYXV0aG9yaXR5IGNvbnN1bWVyIChyZXF1aXJlT3JnSWQsIHdpdGhUZW5hbnRDb250ZXh0J3MgUkxTIHNjb3BlLCBjaGVja1F1b3RhLFxuICAgIC8vIHdpdGhSb3V0ZSwgYW5kIHRoZSBpZGVtcG90ZW5jeSBuYW1lc3BhY2UpIHJlYWRzIGByZXEuY29udGV4dC5pZGVudGl0eWAsIHNvXG4gICAgLy8gdGhhdCBmcm96ZW4gaGVhZGVyLWRlcml2ZWQgdmFsdWUg4oCUIG5vdCB0aGUgSldUIOKAlCB3YXMgZ292ZXJuaW5nIHRlbmFuY3kgb25cbiAgICAvLyBhbnkgbm9uLW5naW54IHBhdGguIFJlY29tcHV0aW5nIGhlcmUsIGF0IHRoZSBzaW5nbGUgcG9zdC12ZXJpZmljYXRpb24gY2hva2VcbiAgICAvLyBwb2ludCwgbWFrZXMgYGdldElkZW50aXR5YCBwcmVmZXIgdGhlIHZlcmlmaWVkIGByZXEudXNlcmAgKHNlZSBpZGVudGl0eS50cylcbiAgICAvLyBzbyB0ZW5hbmN5IGlzIEpXVC1hdXRob3JpdGF0aXZlLiBUaGUgbmdpbnggYHgtb3JnLWlkYCBvdmVyd3JpdGUgc3RheXMgYXNcbiAgICAvLyBkZWZlbmNlLWluLWRlcHRoLiBHdWFyZGVkIG9uIGByZXEuY29udGV4dGAgc28gc2VydmljZXMvcGF0aHMgdGhhdCBuZXZlclxuICAgIC8vIGF0dGFjaCBhIGNvbnRleHQgKG9yIHJ1biByZXF1aXJlQXV0aCBwcmUtY29udGV4dCkgYXJlIHVuYWZmZWN0ZWQuXG4gICAgY29uc3QgcmVxQ3R4ID0gKHJlcSBhcyBSZXF1ZXN0ICYgeyBjb250ZXh0PzogeyBpZGVudGl0eTogUmVxdWVzdElkZW50aXR5IH0gfSkuY29udGV4dDtcbiAgICBpZiAocmVxQ3R4KSB7XG4gICAgICByZXFDdHguaWRlbnRpdHkgPSBnZXRJZGVudGl0eShyZXEgYXMgdW5rbm93biBhcyBIdHRwUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbi1pbnZhbGlkYXRpb24gY2hlY2sgZm9yIHRoZSBzdGF0ZWxlc3Mgc2VydmljZXM6IHJlamVjdCBhIHRva2VuXG4gICAgLy8gd2hvc2UgYHRva2VuVmVyc2lvbmAgaXMgYmVoaW5kIHRoZSByZXZvY2F0aW9uIHN0b3JlJ3MgY3VycmVudCB2YWx1ZSAoYVxuICAgIC8vIHByaXZpbGVnZSBjaGFuZ2UgdGhlIHBsYXRmb3JtIHB1Ymxpc2hlZCkuIE5vIHN0b3JlIHJlZ2lzdGVyZWQg4oeSIHRoaXMgaXMgYVxuICAgIC8vIG5vLW9wIGFuZCBjb250cm9sIHBhc3NlcyBzdHJhaWdodCB0aHJvdWdoLiBGYWlsLW9wZW4gb24gYW55IHN0b3JlIGVycm9yLlxuICAgIC8vIEFuIGltcGVyc29uYXRpb24gc2Vzc2lvbiBpcyBjaGVja2VkIGV2ZW4gd2hlbiBOTyBzdG9yZSBpcyByZWdpc3RlcmVkOiB0aGVcbiAgICAvLyB0b2tlblZlcnNpb24gY2hlY2sgYmVsb3cgaXMgYSBuby1vcCB3aXRob3V0IGEgc3RvcmUsIGJ1dCBmb3IgYSBzZXNzaW9uXG4gICAgLy8gdGhhdCB3b3VsZCBzaWxlbnRseSBtZWFuIFwibmV2ZXIgcmV2b2tlZFwiLiBIZXJlIG5vIHN0b3JlIOKHkiB1bmF2YWlsYWJsZSDih5JcbiAgICAvLyByZWplY3RlZC4gU2VlIGBUb2tlblJldm9jYXRpb25TdG9yZS5nZXRTZXNzaW9uUmV2b2NhdGlvbmAuXG4gICAgY29uc3QgaW1wZXJzb25hdGlvbiA9IGlzSW1wZXJzb25hdGlvblNlc3Npb24oZGVjb2RlZCk7XG4gICAgaWYgKGltcGVyc29uYXRpb24gfHwgKHRva2VuUmV2b2NhdGlvblN0b3JlICYmIGRlY29kZWQuc3ViICYmIHR5cGVvZiBkZWNvZGVkLnRva2VuVmVyc2lvbiA9PT0gJ251bWJlcicpKSB7XG4gICAgICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAgICAgLy8gRXhwcmVzcydzIGVycm9yIG1pZGRsZXdhcmUg4oCUIHdpdGhvdXQgaXQsIHRoYXQgdGhyb3cgd291bGQgc3VyZmFjZSBhcyBhblxuICAgICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbiAodGhpcyBgbmV4dCgpYCBydW5zIGluIGEgbWljcm90YXNrLCBvdXRzaWRlIHRoZVxuICAgICAgLy8gc3Vycm91bmRpbmcgdHJ5L2NhdGNoIGFuZCBFeHByZXNzJ3MgcGVyLWxheWVyIGRpc3BhdGNoKS4gVGhlIGNoZWNrc1xuICAgICAgLy8gdGhlbXNlbHZlcyBuZXZlciByZWplY3QsIHNvIHRoZSBjYXRjaCBvbmx5IGV2ZXIgc2VlcyBhIGRvd25zdHJlYW0gZXJyb3IuXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoaW1wZXJzb25hdGlvbikge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gYXdhaXQgc2Vzc2lvblJldm9jYXRpb25TdGF0ZShkZWNvZGVkLmp0aSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gJ2xpdmUnKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICAgICAgICByZXMsXG4gICAgICAgICAgICAgIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELFxuICAgICAgICAgICAgICBzdGF0ZSA9PT0gJ3Jldm9rZWQnXG4gICAgICAgICAgICAgICAgPyAnVGhpcyBpbXBlcnNvbmF0aW9uIHNlc3Npb24gaGFzIGJlZW4gZW5kZWQnXG4gICAgICAgICAgICAgICAgOiAnVGhpcyBpbXBlcnNvbmF0aW9uIHNlc3Npb24gY291bGQgbm90IGJlIHZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW5SZXZvY2F0aW9uU3RvcmUgJiYgZGVjb2RlZC5zdWIgJiYgdHlwZW9mIGRlY29kZWQudG9rZW5WZXJzaW9uID09PSAnbnVtYmVyJyAmJiBhd2FpdCBpc1Rva2VuUmV2b2tlZChkZWNvZGVkKSkge1xuICAgICAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Nlc3Npb24gaGFzIGJlZW4gcmV2b2tlZDsgcGxlYXNlIHNpZ24gaW4gYWdhaW4nLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dCgpO1xuICAgICAgfSkoKS5jYXRjaChuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygand0LlRva2VuRXhwaXJlZEVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBoYXMgZXhwaXJlZCcsIEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2lnbmluZyBrZXlzIGNvdWxkbid0IGJlIGZldGNoZWQsIHNvIHRoZSB0b2tlbidzIHZhbGlkaXR5IGlzIFVOS05PV04uXG4gICAgLy8gRmFpbCBDTE9TRUQgd2l0aCBhIHJldHJ5YWJsZSA1MDMg4oCUIG5ldmVyIGEgcGFzcywgYW5kIG5ldmVyIGEgNDAxIHRoYXRcbiAgICAvLyB3b3VsZCBzZW5kIGEgbGVnaXRpbWF0ZSBjbGllbnQgb2ZmIHRvIHJlLWF1dGhlbnRpY2F0ZSBvdmVyIG91ciBvdXRhZ2UuXG4gICAgLy8gU2FtZSByZWFzb25pbmcgZm9yIHRoZSBTRVJWSUNFIGNoYWluOiBubyByZWFkYWJsZSBrZXkgYnVuZGxlIG1lYW5zIG5vIHdheVxuICAgIC8vIHRvIHRlbGwgYSBwZWVyJ3MgdG9rZW4gZnJvbSBhIGZvcmdlcnksIHNvIHRoZSByZXF1ZXN0IGlzIHJlZnVzZWQgd2l0aCBhXG4gICAgLy8gcmV0cnlhYmxlIDUwMyByYXRoZXIgdGhhbiBhZG1pdHRlZCBvciBib3VuY2VkIHRvIHJlLWF1dGhlbnRpY2F0ZS5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBKd2tzVW5hdmFpbGFibGVFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIFNlcnZpY2VLZXlFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGluZyByZXF1ZXN0OiB0b2tlbiBzaWduaW5nIGtleXMgdW5hdmFpbGFibGUnLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICAgICdUb2tlbiB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmtub3duS2lkRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBqd3QuSnNvbldlYlRva2VuRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgdG9rZW4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gZmFpbGVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgc2V0IG9mIHZlcmlmaWVkIGNsYWltcyBzcGVha3MgZm9yIGEgUEVSU09OJ3Mgb3duIHNlc3Npb24g4oCUIHRoZSBvbmx5XG4gKiBraW5kIG9mIGNyZWRlbnRpYWwgYW4gYXNzdXJhbmNlIGxldmVsIGNhbiBiZSBhc3NlcnRlZCBhYm91dC5cbiAqXG4gKiBFeGNsdWRlcyBhbGwgdGhyZWUgbWFjaGluZSBzaGFwZXM6IGFuIGludGVybmFsIHNlcnZpY2UgcHJpbmNpcGFsLCBhbiBvcmdcbiAqIHNlcnZpY2UgYWNjb3VudCwgYW5kIGFueSBleGNoYW5nZWQgYWNjZXNzIGtleSAoYHRva2VuX3VzZTogJ2FwaV9rZXknYCwgaS5lLiBhXG4gKiBQQVQgb3IgYSBzZXJ2aWNlLWFjY291bnQga2V5KSwgZWFjaCBvZiB3aGljaCBhdXRoZW50aWNhdGVzIGEgcHJvZ3JhbSBob2xkaW5nIGFcbiAqIHNlY3JldCByYXRoZXIgdGhhbiBhIHBlcnNvbiBwcmVzZW50aW5nIGZhY3RvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0h1bWFuUHJpbmNpcGFsKGNsYWltczogUGljazxKd3RQYXlsb2FkLCAncHJpbmNpcGFsVHlwZScgfCAndG9rZW5fdXNlJz4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNsYWltcz8ucHJpbmNpcGFsVHlwZSA9PT0gJ3VzZXInICYmIGNsYWltcy50b2tlbl91c2UgPT09ICdhY2Nlc3MnO1xufVxuXG4vKiogV2hhdCBhbiBhc3N1cmFuY2UgZ2F0ZSBkZW1hbmRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3N1cmFuY2VPcHRpb25zIHtcbiAgbWluQXNzdXJhbmNlOiBBc3N1cmFuY2VMZXZlbDtcbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogQSBOQU1FRCBjYXJ2ZS1vdXQgZm9yIHJlcXVlc3RzIHRoYXQgY2Fubm90IHBvc3NpYmx5IHNhdGlzZnkgdGhlIGxldmVsIGFuZFxuICAgKiBtdXN0IHN0aWxsIGJlIHNlcnZlZCDigJQgdG9kYXkgb25seSBvbmUgZXhpc3RzOiB0aGUgYm9vdHN0cmFwLWFkbWluaXN0cmF0b3JcbiAgICogd2luZG93LCB3aGVyZSBhIGZyZXNoIGluc3RhbGwncyBzaW5nbGUgYWRtaW4gaGFzIG5vIGZhY3RvciB5ZXQgYW5kIHRoZSBzZXR1cFxuICAgKiBjYWxscyB0aGF0IGNyZWF0ZSB0aGUgaW5zdGFsbCdzIGF1dG9tYXRpb24gY3JlZGVudGlhbCB3b3VsZCBvdGhlcndpc2UgYmVcbiAgICogdW5yZWFjaGFibGUgKHNlZSBwbGF0Zm9ybSdzIGBpc0Jvb3RzdHJhcFNldHVwUmVxdWVzdGApLlxuICAgKlxuICAgKiBJdCBpcyBkZWxpYmVyYXRlbHkgc2hhcGVkIGFzIGB7IHJlYXNvbiwgd2hlbiB9YCByYXRoZXIgdGhhbiBhIGJhcmUgcHJlZGljYXRlOlxuICAgKiB0aGUgcmVhc29uIGlzIGNvdW50ZWQgKGBhc3N1cmFuY2VfZXhlbXB0ZWRfdG90YWx7cmVhc29ufWApIGFuZCBwdWJsaXNoZWQgb25cbiAgICogdGhlIHJvdXRlIHRhYmxlIGFzIGBhc3N1cmFuY2VFeGVtcHRgLCBzbyBhbiBleGVtcHRpb24gY2Fubm90IGJlIGFkZGVkIHdpdGhvdXRcbiAgICogc2hvd2luZyB1cCBpbiB0aGUgZ2VuZXJhdGVkIHRhYmxlIGEgcmV2aWV3ZXIgcmVhZHMuIFRoZSBnYXRlIGtlZXBzIGl0c1xuICAgKiBgbWluQXNzdXJhbmNlYCB0YWcgZWl0aGVyIHdheSDigJQgdGhlIHJvdXRlIHN0aWxsIHJlcXVpcmVzIE1GQS1ncmFkZSBmb3JcbiAgICogZXZlcnlvbmUgdGhlIGNhcnZlLW91dCBkb2VzIG5vdCBuYW1lLlxuICAgKi9cbiAgZXhlbXB0PzogeyByZWFzb246IHN0cmluZzsgd2hlbjogKHJlcTogUmVxdWVzdCkgPT4gYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFN0YW5kYWxvbmUgYXNzdXJhbmNlIGdhdGUsIGZvciBhIHNlcnZpY2Ugd2hvc2Ugb3duIGByZXF1aXJlQXV0aGAgaXMgbm90XG4gKiBhcGktY29yZSdzIChwbGF0Zm9ybSdzIGlzIGl0cyBvd24sIGJlY2F1c2UgaXQgcmVhZHMgTW9uZ28pLiBDb21wb3NlIGl0IEFGVEVSXG4gKiBhdXRoZW50aWNhdGlvbjogYHJvdXRlci5nZXQoJy94JywgcmVxdWlyZUF1dGgsIHJlcXVpcmVBc3N1cmFuY2UoeyBtaW5Bc3N1cmFuY2U6IDIgfSksIGgpYC5cbiAqXG4gKiBJZGVudGljYWwgcnVsZXMgYW5kIGlkZW50aWNhbCByZWZ1c2FscyB0byBgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UgfSlgIOKAlFxuICogdGhhdCBvcHRpb24gc2ltcGx5IGNhbGxzIHRoZSBzYW1lIGNoZWNrIGlubGluZSwgc28gdGhlcmUgaXMgb25lIGltcGxlbWVudGF0aW9uXG4gKiBvZiBcImlzIHRoaXMgc2Vzc2lvbiBNRkEtZ3JhZGVcIiBpbiB0aGUgY29kZWJhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXNzdXJhbmNlKG9wdGlvbnM6IEFzc3VyYW5jZU9wdGlvbnMpIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cbiAgICAvLyBBIG5hbWVkIGV4ZW1wdGlvbiBpcyBjaGVja2VkIEFGVEVSIGF1dGhlbnRpY2F0aW9uIGFuZCBiZWZvcmUgdGhlIGxldmVsLCBzb1xuICAgIC8vIGl0IGNhbiBuZXZlciBhZG1pdCBhbiB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyLCBhbmQgaXQgaXMgY291bnRlZCBldmVyeSB0aW1lXG4gICAgLy8gaXQgZmlyZXMg4oCUIGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIHNlZSBpcyBob3cgYSBnYXRlIHF1aWV0bHkgc3RvcHMgYmVpbmcgb25lLlxuICAgIGlmIChvcHRpb25zLmV4ZW1wdD8ud2hlbihyZXEpID09PSB0cnVlKSB7XG4gICAgICBlbWl0Q291bnRlcignYXNzdXJhbmNlX2V4ZW1wdGVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSwgcmVhc29uOiBvcHRpb25zLmV4ZW1wdC5yZWFzb24gfSk7XG4gICAgICByZXR1cm4gbmV4dCgpO1xuICAgIH1cbiAgICBpZiAocmVmdXNlRm9yQXNzdXJhbmNlKG9wdGlvbnMsIHJlcS51c2VyIGFzIEp3dFBheWxvYWQsIHJlcSwgcmVzKSkgcmV0dXJuO1xuICAgIG5leHQoKTtcbiAgfSwge1xuICAgIGtpbmQ6ICdhc3N1cmFuY2UnLFxuICAgIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsXG4gICAgLi4uKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQgPyB7IG1heEFnZTogb3B0aW9ucy5tYXhBZ2UgfSA6IHt9KSxcbiAgICAuLi4ob3B0aW9ucy5leGVtcHQgPyB7IGV4ZW1wdDogb3B0aW9ucy5leGVtcHQucmVhc29uIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIEhhbmRsZXItbGV2ZWwgdHdpbiBvZiB7QGxpbmsgcmVxdWlyZUFzc3VyYW5jZX0sIGZvciBhIHJvdXRlIHdoZXJlIG9ubHkgU09NRVxuICogcmVxdWVzdHMgbXVzdCBiZSBNRkEtZ3JhZGUg4oCUIGUuZy4gYSBwb2xpY3kgcm91dGUgb24gd2hpY2ggVElHSFRFTklORyBhIHNldHRpbmdcbiAqIHN0YXlzIG9wZW4gdG8gYSBzaW5nbGUtZmFjdG9yIHNlc3Npb24gKHNvIGFuIGFkbWluIHdpdGhvdXQgTUZBIGNhbiBhZG9wdCBpdClcbiAqIGJ1dCBMT09TRU5JTkcgaXQgZG9lcyBub3QuIFNhbWUgcnVsZXMgYW5kIHRoZSBzYW1lIHRocmVlIHJlZnVzYWxzLiBSZXR1cm5zXG4gKiB0cnVlIHdoZW4gdGhlIHJlcXVlc3Qgd2FzIFJFRlVTRUQgKGEgcmVzcG9uc2UgaGFzIGJlZW4gc2VudCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZ1c2VXZWFrU2Vzc2lvbihyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG9wdGlvbnM6IEFzc3VyYW5jZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKCFyZXEudXNlcikge1xuICAgIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmVmdXNlRm9yQXNzdXJhbmNlKG9wdGlvbnMsIHJlcS51c2VyIGFzIEp3dFBheWxvYWQsIHJlcSwgcmVzKTtcbn1cblxuLyoqIFdoYXQge0BsaW5rIHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZX0gZGVtYW5kcyBvZiBhIHJvdXRlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMge1xuICAvKiogV2hhdCBhIG1hY2hpbmUgY3JlZGVudGlhbCAoUEFULCBzZXJ2aWNlIGFjY291bnQsIG1hY2hpbmUgc2Vzc2lvbikgbWVldHMgb25cbiAgICogIHRoaXMgcm91dGUgd2hpbGUgdGhlIHBvbGljeSBpcyBvbiDigJQgc2VlIHtAbGluayBPcmdBZG1pbkFzc3VyYW5jZU1hY2hpbmVzfS5cbiAgICogIFJlcXVpcmVkLCBzbyBldmVyeSByb3V0ZSBzdGF0ZXMgaXRzIGRlY2lzaW9uIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgb25lLiAqL1xuICBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcztcbn1cblxuLyoqIGBkZXRhaWxzLnJlYXNvbmAgb24gYSByZWZ1c2FsIGJ5IHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9LCBzbyB0aGUgVUlcbiAqICBjYW4gc2F5IGl0IGlzIHRoZSBPUkcncyBwb2xpY3kgYXNraW5nLCBub3QgdGhlIHJvdXRlJ3Mgb3duIHJlcXVpcmVtZW50LiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BRE1JTl9NRkFfUkVBU09OID0gJ29yZ19hZG1pbl9wb2xpY3knO1xuXG4vKipcbiAqIFRoZSByZWZ1c2FsIHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9IHdvdWxkIHNlbmQgZm9yIHRoZXNlIGNsYWltcywgb3JcbiAqIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcXVlc3QgbWF5IHByb2NlZWQuIEV4cG9ydGVkIHNvIGEgaGFuZGxlciB3aG9zZSBwb2xpY3lcbiAqIGFwcGxpZXMgdG8gb25seSBQQVJUIG9mIGEgcm91dGUgKGUuZy4gYGdlbmVyYXRlLXRva2VuYCwgd2hlcmUgb3BlbmluZyBhIG5ld1xuICogbWFjaGluZSBjcmVkZW50aWFsIGlzIGdhdGVkIGJ1dCByZW5ld2luZyBhbiBleGlzdGluZyBvbmUgaXMgbm90KSBhcHBsaWVzIHRoZVxuICogZXhhY3Qgc2FtZSBydWxlIHJhdGhlciB0aGFuIGEgY29weSBvZiBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9yZ0FkbWluQXNzdXJhbmNlUmVmdXNhbChcbiAgY2xhaW1zOiBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMsXG4pOiB7IHN0YXR1czogbnVtYmVyOyBjb2RlOiBFcnJvckNvZGU7IG1lc3NhZ2U6IHN0cmluZzsgcmVhc29uOiAnbWFjaGluZV9wcmluY2lwYWwnIHwgJ3dlYWtfc2Vzc2lvbicgfSB8IHVuZGVmaW5lZCB7XG4gIC8vIFRoZSBjbGFpbSBpcyBvbmx5IGV2ZXIgYDJgLCBhbmQgb25seSB3aGVuIHRoZSBwb2xpY3kgaXMgb24gKHNlZSBKd3RQYXlsb2FkKS5cbiAgaWYgKCFjbGFpbXMgfHwgY2xhaW1zLm9yZ19hZG1pbl9hYWwgIT09IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICghaXNIdW1hblByaW5jaXBhbChjbGFpbXMpKSB7XG4gICAgaWYgKG9wdGlvbnMubWFjaGluZXMgPT09ICdhbGxvdycpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBjb2RlOiBFcnJvckNvZGUuSFVNQU5fU0VTU0lPTl9SRVFVSVJFRCxcbiAgICAgIHJlYXNvbjogJ21hY2hpbmVfcHJpbmNpcGFsJyxcbiAgICAgIG1lc3NhZ2U6ICdZb3VyIG9yZ2FuaXphdGlvbiByZXF1aXJlcyB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGZvciB0aGlzIGFjdGlvbiDigJQgQVBJIGtleXMgYW5kIHNlcnZpY2UgYWNjb3VudHMgY2Fubm90IHBlcmZvcm0gaXQnLFxuICAgIH07XG4gIH1cbiAgaWYgKChjbGFpbXMuYWFsID8/IDEpID49IDIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICBjb2RlOiBFcnJvckNvZGUuTUZBX1JFUVVJUkVELFxuICAgIHJlYXNvbjogJ3dlYWtfc2Vzc2lvbicsXG4gICAgbWVzc2FnZTogJ1lvdXIgb3JnYW5pemF0aW9uIHJlcXVpcmVzIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gZm9yIGFkbWluaXN0cmF0aXZlIGFjdGlvbnMg4oCUIHNpZ24gaW4gYWdhaW4gd2l0aCBhIHBhc3NrZXkgb3IgYW4gYXV0aGVudGljYXRvciBjb2RlJyxcbiAgfTtcbn1cblxuLyoqXG4gKiBBcHBseSB7QGxpbmsgb3JnQWRtaW5Bc3N1cmFuY2VSZWZ1c2FsfSBhbmQgc2VuZCBpdHMgcmVmdXNhbC4gUmV0dXJucyB0cnVlIHdoZW5cbiAqIHRoZSByZXF1ZXN0IHdhcyBSRUZVU0VEIChhIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQpLiBGb3IgaGFuZGxlci1sZXZlbCB1c2U7XG4gKiByb3V0ZXMgdXNlIHtAbGluayByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmdXNlRm9yT3JnQWRtaW5Bc3N1cmFuY2UocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBvcHRpb25zOiBPcmdBZG1pbkFzc3VyYW5jZU9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgcmVmdXNhbCA9IG9yZ0FkbWluQXNzdXJhbmNlUmVmdXNhbChyZXEudXNlciBhcyBKd3RQYXlsb2FkIHwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgaWYgKCFyZWZ1c2FsKSByZXR1cm4gZmFsc2U7XG4gIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogYG9yZ19hZG1pbl8ke3JlZnVzYWwucmVhc29ufWAgfSk7XG4gIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ2Fzc3VyYW5jZTpvcmctYWRtaW4nKTtcbiAgc2VuZEVycm9yKHJlcywgcmVmdXNhbC5zdGF0dXMsIHJlZnVzYWwubWVzc2FnZSwgcmVmdXNhbC5jb2RlLCB7IHJlYXNvbjogT1JHX0FETUlOX01GQV9SRUFTT04gfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFRoZSBvcmcgcG9saWN5IFwiYWRtaW5pc3RyYXRpdmUgYWN0aW9ucyByZXF1aXJlIE1GQVwiIChgYWRtaW5BY3Rpb25zUmVxdWlyZU1mYWApLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgcmVxdWlyZUFzc3VyYW5jZX0sIHRoZSByZXF1aXJlbWVudCBpcyB0aGUgT1JHJ3MgY2hvaWNlLCBub3QgdGhlXG4gKiByb3V0ZSdzOiB0aGUgZ2F0ZSByZWFkcyB0aGUgYG9yZ19hZG1pbl9hYWxgIGNsYWltLCBzZXQgYXQgdG9rZW4gaXNzdWUgZnJvbSB0aGVcbiAqIGFjdGl2ZSBvcmcncyBwb2xpY3kgKHN0cmljdGVzdCBhY3Jvc3MgaXRzIGFuY2VzdG9ycyksIHNvIGEgc2VydmljZSB0aGF0IGNhbm5vdFxuICogcmVhZCB0aGUgb3JnIGRvY3VtZW50IHN0aWxsIGVuZm9yY2VzIGl0LiBXaXRoIHRoZSBwb2xpY3kgb2ZmIHRoZSBnYXRlIGlzIGFcbiAqIG5vLW9wOyB3aXRoIGl0IG9uLCBhIHNpbmdsZS1mYWN0b3Igc2Vzc2lvbiBpcyByZWZ1c2VkIDQwMSBgTUZBX1JFUVVJUkVEYFxuICogKHdpdGggYGRldGFpbHMucmVhc29uOiAnb3JnX2FkbWluX3BvbGljeSdgKSDigJQgdGhlIHNhbWUgY29kZSB0aGUgY2xpZW50IGFscmVhZHlcbiAqIHR1cm5zIGludG8gXCJlbnJvbCBhIGZhY3RvciAvIHNpZ24gaW4gd2l0aCBpdFwiLCBuZXZlciBhIHNpZ24tb3V0LlxuICpcbiAqIGBtYWNoaW5lc2AgaXMgZGVjaWRlZCBwZXIgcm91dGUgKHNlZSB7QGxpbmsgT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lc30pOiB0aGVcbiAqIHBvbGljeSBpcyBhYm91dCBob3cgc3Ryb25nbHkgYSBQRVJTT04ncyBzZXNzaW9uIHdhcyBvcGVuZWQsIHNvIGF1dG9tYXRpb24gdGhhdFxuICogbGVnaXRpbWF0ZWx5IGRyaXZlcyBhIHJvdXRlIGtlZXBzIHdvcmtpbmcgKGBhbGxvd2ApLCB3aGlsZSBhIHJvdXRlIHRoYXQgbWludHNcbiAqIGEgZnVydGhlciBjcmVkZW50aWFsIHJlZnVzZXMgbWFjaGluZXMgb3V0cmlnaHQgKGByZWZ1c2VgLCA0MDNcbiAqIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCDigJQgdGhlIHNhbWUgcmVmdXNhbCBgcmVxdWlyZUFzc3VyYW5jZWAgZ2l2ZXMgdGhlbSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2Uob3B0aW9uczogT3JnQWRtaW5Bc3N1cmFuY2VPcHRpb25zKSB7XG4gIHJldHVybiB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgaWYgKCFyZXEudXNlcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgICB9XG4gICAgaWYgKHJlZnVzZUZvck9yZ0FkbWluQXNzdXJhbmNlKHJlcSwgcmVzLCBvcHRpb25zKSkgcmV0dXJuO1xuICAgIG5leHQoKTtcbiAgfSwgeyBraW5kOiAnb3JnQWRtaW5Bc3N1cmFuY2UnLCBtYWNoaW5lczogb3B0aW9ucy5tYWNoaW5lcyB9KTtcbn1cblxuLyoqXG4gKiBFbmZvcmNlIGBtaW5Bc3N1cmFuY2VgIC8gYG1heEFnZWAgb24gYSB2ZXJpZmllZCB0b2tlbi4gUmV0dXJucyB0cnVlIHdoZW4gdGhlXG4gKiByZXF1ZXN0IHdhcyBSRUZVU0VEIChhIHJlc3BvbnNlIGhhcyBiZWVuIHNlbnQpLlxuICpcbiAqIFRocmVlIGRpc3RpbmN0IHJlZnVzYWxzLCBiZWNhdXNlIHRoZSBjbGllbnQncyBuZXh0IG1vdmUgZGlmZmVycyBmb3IgZWFjaDpcbiAqIGEgbWFjaGluZSBtdXN0IHN0b3AgKDQwMyksIGEgd2VhayBzZXNzaW9uIG11c3QgZ2FpbiBhIGZhY3RvciAoNDAxXG4gKiBgTUZBX1JFUVVJUkVEYCDihpIgZW5yb2xtZW50LCBuZXZlciBhIHNpZ24tb3V0KSwgYW5kIGEgc3RhbGUgb25lIG11c3Qgc2ltcGx5XG4gKiBhdXRoZW50aWNhdGUgYWdhaW4gKDQwMSBgUkVBVVRIX1JFUVVJUkVEYCkuXG4gKi9cbmZ1bmN0aW9uIHJlZnVzZUZvckFzc3VyYW5jZShcbiAgb3B0aW9uczogQXNzdXJhbmNlT3B0aW9ucyxcbiAgZGVjb2RlZDogSnd0UGF5bG9hZCxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1pbkFzc3VyYW5jZSA9IG9wdGlvbnMubWluQXNzdXJhbmNlO1xuICBjb25zdCByZWZ1c2UgPSAocmVhc29uOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSk6IHRydWUgPT4ge1xuICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbiB9KTtcbiAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsIGBhc3N1cmFuY2U6JHttaW5Bc3N1cmFuY2V9YCk7XG4gICAgc2VuZEVycm9yKHJlcywgc3RhdHVzLCBtZXNzYWdlLCBjb2RlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBpZiAoIWlzSHVtYW5QcmluY2lwYWwoZGVjb2RlZCkpIHtcbiAgICByZXR1cm4gcmVmdXNlKFxuICAgICAgJ21hY2hpbmVfcHJpbmNpcGFsJywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAnVGhpcyBhY3Rpb24gcmVxdWlyZXMgYSBwZXJzb24gc2lnbmVkIGluIHdpdGggdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiDigJQgQVBJIGtleXMgYW5kIHNlcnZpY2UgYWNjb3VudHMgY2Fubm90IHBlcmZvcm0gaXQnLFxuICAgICAgRXJyb3JDb2RlLkhVTUFOX1NFU1NJT05fUkVRVUlSRUQsXG4gICAgKTtcbiAgfVxuICBpZiAoKGRlY29kZWQuYWFsID8/IDEpIDwgbWluQXNzdXJhbmNlKSB7XG4gICAgcmV0dXJuIHJlZnVzZShcbiAgICAgICd3ZWFrX3Nlc3Npb24nLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICdUaGlzIGFjdGlvbiByZXF1aXJlcyB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIOKAlCBzaWduIGluIGFnYWluIHdpdGggYSBwYXNza2V5IG9yIGFuIGF1dGhlbnRpY2F0b3IgY29kZScsXG4gICAgICBFcnJvckNvZGUuTUZBX1JFUVVJUkVELFxuICAgICk7XG4gIH1cbiAgaWYgKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhdXRoVGltZSA9IGRlY29kZWQuYXV0aF90aW1lO1xuICAgIC8vIE5vIGBhdXRoX3RpbWVgIGlzIG5vdCBcInJlY2VudCBlbm91Z2ggYnkgZGVmYXVsdFwiIOKAlCBgaGFzVmFsaWRJZGVudGl0eUNsYWltc2BcbiAgICAvLyBhbHJlYWR5IHJlcXVpcmVzIGl0IG9uIGEgdXNlciB0b2tlbiwgc28gYW4gYWJzZW50IG9uZSBtZWFucyBhIHRva2VuIHRoaXNcbiAgICAvLyBnYXRlIGNhbm5vdCByZWFzb24gYWJvdXQuIEZhaWwgY2xvc2VkLlxuICAgIGlmICh0eXBlb2YgYXV0aFRpbWUgIT09ICdudW1iZXInIHx8IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApIC0gYXV0aFRpbWUgPiBvcHRpb25zLm1heEFnZSkge1xuICAgICAgcmV0dXJuIHJlZnVzZShcbiAgICAgICAgJ3N0YWxlX3Nlc3Npb24nLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCxcbiAgICAgICAgJ1RoaXMgYWN0aW9uIHJlcXVpcmVzIGEgcmVjZW50IHNpZ24taW4g4oCUIHBsZWFzZSBhdXRoZW50aWNhdGUgYWdhaW4nLFxuICAgICAgICBFcnJvckNvZGUuUkVBVVRIX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSB2ZXJpZmllZCB0b2tlbiBjYXJyaWVzIGEgd2VsbC1mb3JtZWQgaWRlbnRpdHk6IGEga25vd25cbiAqIGBwcmluY2lwYWxUeXBlYCBhbmQgYHRva2VuX3VzZWAsIGFuZCB0aGUgY2xhaW1zIHRoYXQga2luZCBvZiBwcmluY2lwYWwgbXVzdFxuICogaGF2ZS4gRmFpbHMgY2xvc2VkIOKAlCBhIHRva2VuIG1pbnRlZCBiZWZvcmUgdGhlc2UgY2xhaW1zIGV4aXN0ZWQsIG9yIG9uZSB3aXRoIGFcbiAqIGNvbnRyYWRpY3RvcnkgY29tYmluYXRpb24sIGlzIG5vdCBhbiBpZGVudGl0eSBhbnkgZ2F0ZSBzaG91bGQgcmVhc29uIGFib3V0LlxuICpcbiAqIC0gYHNlcnZpY2VgOiBgdG9rZW5fdXNlOiAnYWNjZXNzJ2AgYW5kIGEgYHNlcnZpY2U6PG5hbWU+YCBzdWJqZWN0ICh0aGUgbmFtZVxuICogICBmZWVkcyB0aGUgZGVueWxpc3QgYW5kIGF1ZGl0IGF0dHJpYnV0aW9uKS5cbiAqIC0gYHVzZXJgIC8gYHNlcnZpY2VfYWNjb3VudGA6IGBhbXJgIChrbm93biBtZXRob2RzKSwgYGFhbGAgYW5kIGBhdXRoX3RpbWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkOiBQYXJ0aWFsPEp3dFBheWxvYWQ+KTogYm9vbGVhbiB7XG4gIGlmICghZGVjb2RlZC5wcmluY2lwYWxUeXBlIHx8ICFQUklOQ0lQQUxfVFlQRVMuaW5jbHVkZXMoZGVjb2RlZC5wcmluY2lwYWxUeXBlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIWRlY29kZWQudG9rZW5fdXNlIHx8ICFUT0tFTl9VU0VTLmluY2x1ZGVzKGRlY29kZWQudG9rZW5fdXNlKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGVjb2RlZC5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZScpIHtcbiAgICByZXR1cm4gZGVjb2RlZC50b2tlbl91c2UgPT09ICdhY2Nlc3MnXG4gICAgICAmJiB0eXBlb2YgZGVjb2RlZC5zdWIgPT09ICdzdHJpbmcnXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5zdGFydHNXaXRoKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgpXG4gICAgICAmJiBkZWNvZGVkLnN1Yi5sZW5ndGggPiBTRVJWSUNFX1NVQkpFQ1RfUFJFRklYLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gQXJyYXkuaXNBcnJheShkZWNvZGVkLmFtcilcbiAgICAmJiBkZWNvZGVkLmFtci5ldmVyeSgobSkgPT4gQVVUSF9NRVRIT0RTLmluY2x1ZGVzKG0pKVxuICAgICYmIChkZWNvZGVkLmFhbCA9PT0gMSB8fCBkZWNvZGVkLmFhbCA9PT0gMilcbiAgICAmJiB0eXBlb2YgZGVjb2RlZC5hdXRoX3RpbWUgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHJlcXVlc3QncyB1c2VyIGhvbGRzIGBwZXJtaXNzaW9uYC4gU3VwZXJhZG1pbnMgaW1wbGljaXRseSBob2xkXG4gKiBldmVyeSBwZXJtaXNzaW9uLiBSZWFkcyB0aGUgcmVzb2x2ZWQgYHBlcm1pc3Npb25zYCBjbGFpbSAoc2V0IGF0IHRva2VuIGlzc3VlLFxuICogb3IgcmUtZGVyaXZlZCBwZXIgcmVxdWVzdCBieSB0aGUgcGxhdGZvcm0pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckhhc1Blcm1pc3Npb24ocmVxOiBSZXF1ZXN0LCBwZXJtaXNzaW9uOiBQZXJtaXNzaW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBoYXNQZXJtaXNzaW9uKHJlcS51c2VyPy5wZXJtaXNzaW9ucywgcGVybWlzc2lvbiwgcmVxLnVzZXI/LmlzU3VwZXJBZG1pbik7XG59XG5cbi8qKlxuICogQ29udGV4dCBwYXNzZWQgdG8gYSByZWdpc3RlcmVkIGF1dGhvcml6YXRpb24tZGVuaWFsIGF1ZGl0b3Igd2hlbiBhXG4gKiBzdGF0ZS1jaGFuZ2luZyByZXF1ZXN0IGlzIHJlamVjdGVkIGJ5IGByZXF1aXJlUGVybWlzc2lvbmAgL1xuICogYHJlcXVpcmVTeXN0ZW1BZG1pbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEZW5pYWxJbmZvIHtcbiAgLyoqIFRoZSBkZW5pZWQgdXNlcidzIGlkIChgc3ViYCksIGlmIGF1dGhlbnRpY2F0ZWQuICovXG4gIGFjdG9ySWQ/OiBzdHJpbmc7XG4gIGFjdG9yRW1haWw/OiBzdHJpbmc7XG4gIC8qKiBUaGUgdXNlcidzIGFjdGl2ZSBvcmcgYXQgZGVuaWFsIHRpbWUuICovXG4gIG9yZ0lkPzogc3RyaW5nO1xuICAvKiogSFRUUCBtZXRob2QgKyBwYXRoIG9mIHRoZSByZWplY3RlZCByZXF1ZXN0LiAqL1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICAvKiogV2hhdCB3YXMgcmVxdWlyZWQ6IHRoZSBtaXNzaW5nIHBlcm1pc3Npb24ocyksIG9yICdzeXN0ZW0tYWRtaW4nLiAqL1xuICByZXF1aXJlZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHNpbmsgZm9yIGRlbmllZC1hdXRob3JpemF0aW9uIGV2ZW50cy4gTGVmdCB1bnNldCBieSBkZWZhdWx0IHNvXG4gKiBhcGktY29yZSBzdGF5cyBkZWNvdXBsZWQgZnJvbSBhbnkgYXVkaXQgdHJhbnNwb3J0IOKAlCBhIHNlcnZpY2UgcmVnaXN0ZXJzIG9uZVxuICogYXQgYm9vdCAodHlwaWNhbGx5IGZvcndhcmRpbmcgdG8gaXRzIGBSZW1vdGVBdWRpdENsaWVudGAgYXMgYW5cbiAqIGBhdXRoei5kZW5pZWRgIGV2ZW50LCBvciwgb24gcGxhdGZvcm0sIHRvIHRoZSBsb2NhbCBgYXVkaXQoKWAgaGVscGVyKS5cbiAqIE1VU1QgYmUgYmVzdC1lZmZvcnQ6IGl0IGlzIGludm9rZWQgaW5zaWRlIHRoZSByZXF1ZXN0IHBhdGgsIHNvIGl0IG11c3QgbmV2ZXJcbiAqIHRocm93IG9yIGJsb2NrICh0aGUgZ2F0ZSB3cmFwcyB0aGUgY2FsbCBpbiB0cnkvY2F0Y2ggcmVnYXJkbGVzcykuXG4gKi9cbmxldCBhdXRoekRlbmlhbEF1ZGl0b3I6ICgoaW5mbzogQXV0aHpEZW5pYWxJbmZvKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZWdpc3RlciAob3IgY2xlYXIsIHdpdGggYHVuZGVmaW5lZGApIHRoZSBwcm9jZXNzLXdpZGUgYXV0aG9yaXphdGlvbi1kZW5pYWxcbiAqIGF1ZGl0b3IuIElkZW1wb3RlbnQ7IHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiB3aW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXV0aHpEZW5pYWxBdWRpdG9yKGZuOiAoKGluZm86IEF1dGh6RGVuaWFsSW5mbykgPT4gdm9pZCkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgYXV0aHpEZW5pYWxBdWRpdG9yID0gZm47XG59XG5cbi8qKlxuICogRW1pdCBhIGRlbmlhbCBldmVudCwgYmVzdC1lZmZvcnQuIE9ubHkgZmlyZXMgZm9yIHN0YXRlLWNoYW5naW5nIChub24tR0VULFxuICogbm9uLUhFQUQvT1BUSU9OUykgcmVxdWVzdHMg4oCUIGEgcmVqZWN0ZWQgR0VUIGlzIGxvdy1zaWduYWwgcHJvYmluZyBub2lzZSBhbmRcbiAqIHdvdWxkIGFtcGxpZnkgYXVkaXQgdm9sdW1lIHVuZGVyIGEgc2Nhbi4gTmV2ZXIgdGhyb3dzLlxuICpcbiAqIFRoZSBwZXJtaXNzaW9uIGdhdGVzIGhlcmUgY2FsbCBpdCB0aGVtc2VsdmVzLiBFeHBvcnQgaXQgZm9yIGRhdGEtZHJpdmVuIGNoZWNrc1xuICogYSByb3V0ZSBtYWtlcyBpbmxpbmUgKGNyb3NzLW9yZyBhY2Nlc3MsIHNlcnZpY2Utb25seSBlbmRwb2ludHMpLCBzbyB0aG9zZSA0MDNzXG4gKiByZWFjaCB0aGUgc2FtZSBgYXV0aHouZGVuaWVkYCB0cmFpbC4gYHJlcXVpcmVkYCBuYW1lcyB3aGF0IHdhcyBtaXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkQXV0aHpEZW5pYWwocmVxOiBSZXF1ZXN0LCByZXF1aXJlZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGF1ZGl0b3IgPSBhdXRoekRlbmlhbEF1ZGl0b3I7XG4gIGlmICghYXVkaXRvcikgcmV0dXJuO1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnIHx8IG1ldGhvZCA9PT0gJ09QVElPTlMnKSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXVkaXRvcih7XG4gICAgICBhY3RvcklkOiByZXEudXNlcj8uc3ViLFxuICAgICAgYWN0b3JFbWFpbDogcmVxLnVzZXI/LmVtYWlsLFxuICAgICAgb3JnSWQ6IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCxcbiAgICAgIG1ldGhvZCxcbiAgICAgIC8vIFN0cmlwIHRoZSBxdWVyeSBzdHJpbmcg4oCUIGEgZGVuaWVkIHJlcXVlc3QgbWF5IGNhcnJ5IGEgdG9rZW4vc2VjcmV0IGFzIGFcbiAgICAgIC8vIHF1ZXJ5IHBhcmFtLCBhbmQgdGhpcyBwYXRoIGlzIHBlcnNpc3RlZCB2ZXJiYXRpbSBpbnRvIHRoZSBhdWRpdCBsb2cuXG4gICAgICBwYXRoOiAocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpLnNwbGl0KCc/JylbMF0sXG4gICAgICByZXF1aXJlZCxcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQg4oCUIGEgYnJva2VuIGF1ZGl0b3IgbXVzdCBuZXZlciBicmVhayB0aGUgYXV0aCBnYXRlLlxuICB9XG59XG5cbi8qKlxuICogUmVxdWlyZXMgdGhhdCB0aGUgdXNlciBob2xkIEFUIExFQVNUIE9ORSBvZiB0aGUgZ2l2ZW4gcGVybWlzc2lvbnMgKG9yIGJlIGFcbiAqIHN1cGVyYWRtaW4pLiBVc2UgYWZ0ZXIgcmVxdWlyZUF1dGguIE1pcnJvcnMgYHJlcXVpcmVSb2xlYCdzIGFueS1vZiBzZW1hbnRpY3M7XG4gKiBwYXNzIGEgc2luZ2xlIHBlcm1pc3Npb24gZm9yIGEgc3BlY2lmaWMgYWN0aW9uLCBvciBzZXZlcmFsIHdoZW4gYW55IG9uZSBvZlxuICogdGhlbSBzaG91bGQgZ3JhbnQgYWNjZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVBlcm1pc3Npb24oLi4ucGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSkge1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuICAgIC8vIHVzZXJIYXNQZXJtaXNzaW9uIOKGkiBoYXNQZXJtaXNzaW9uIGFscmVhZHkgZ3JhbnRzIHN1cGVyYWRtaW5zIGV2ZXJ5XG4gICAgLy8gcGVybWlzc2lvbiwgc28gdGhpcyBzaW5nbGUgY2hlY2sgY292ZXJzIGJvdGggdGhlIHN1cGVyYWRtaW4gYnlwYXNzIGFuZFxuICAgIC8vIHRoZSBhbnktb2YgbWVtYmVyc2hpcCB0ZXN0IHdpdGhvdXQgcmUtaW5saW5pbmcgZWl0aGVyLlxuICAgIGlmIChwZXJtaXNzaW9ucy5zb21lKChwKSA9PiB1c2VySGFzUGVybWlzc2lvbihyZXEsIHApKSkgcmV0dXJuIG5leHQoKTtcbiAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsIHBlcm1pc3Npb25zLmpvaW4oJyBvciAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke3Blcm1pc3Npb25zLmpvaW4oJyBvciAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9LCB7IGtpbmQ6ICdwZXJtaXNzaW9uJywgbW9kZTogJ2FueScsIHBlcm1pc3Npb25zIH0pO1xufVxuXG4vKipcbiAqIFJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgaG9sZCBFVkVSWSBvbmUgb2YgdGhlIGdpdmVuIHBlcm1pc3Npb25zIChvciBiZSBhXG4gKiBzdXBlcmFkbWluKSDigJQgdGhlIEFORCBjb3VudGVycGFydCB0byBgcmVxdWlyZVBlcm1pc3Npb25gJ3MgYW55LW9mLiBVc2UgZm9yIGFcbiAqIHNlbnNpdGl2ZSBhY3Rpb24gdGhhdCBsZWdpdGltYXRlbHkgZGVtYW5kcyB0d28gZGlzdGluY3QgY2FwYWJpbGl0aWVzIGF0IG9uY2VcbiAqIChlLmcuIGEgY3Jvc3Mtc3VyZmFjZSBvcGVyYXRpb24pLCBzbyB0aGUgZ3VhcmFudGVlIGlzIGV4cGxpY2l0IHJhdGhlciB0aGFuXG4gKiBhcHByb3hpbWF0ZWQgYnkgY2hhaW5pbmcgdHdvIGByZXF1aXJlUGVybWlzc2lvbmAgZ2F0ZXMuIFN1cGVyYWRtaW5zIGJ5cGFzc1xuICogKHRoZXkgaW1wbGljaXRseSBob2xkIGV2ZXJ5IHBlcm1pc3Npb24pLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFsbFBlcm1pc3Npb25zKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nID0gcGVybWlzc2lvbnMuZmlsdGVyKChwKSA9PiAhdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwKSk7XG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV4dCgpO1xuICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgcGVybWlzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICBgTWlzc2luZyByZXF1aXJlZCBwZXJtaXNzaW9uOiAke21pc3Npbmcuam9pbignIGFuZCAnKX1gLFxuICAgICAgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyxcbiAgICApO1xuICB9LCB7IGtpbmQ6ICdwZXJtaXNzaW9uJywgbW9kZTogJ2FsbCcsIHBlcm1pc3Npb25zIH0pO1xufVxuXG4vKipcbiAqIExpa2Uge0BsaW5rIHJlcXVpcmVQZXJtaXNzaW9ufSAoYW55LW9mKSBidXQgQUxTTyBhZG1pdHMgYW4gaW50ZXJuYWwgc2VydmljZVxuICogcHJpbmNpcGFsIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIEZvciBSRUFEIGVuZHBvaW50cyB0aGF0IEJPVEhcbiAqIGludGVyYWN0aXZlIHVzZXJzIOKAlCB3aG8gbXVzdCBob2xkIG9uZSBvZiB0aGUgYDpyZWFkYCBjYXBhYmlsaXRpZXMg4oCUIEFORFxuICogc2VydmljZS10by1zZXJ2aWNlIGNhbGxlcnMgbGVnaXRpbWF0ZWx5IGhpdDsgc2VydmljZSB0b2tlbnMgY2Fycnkgbm9cbiAqIHBlcm1pc3Npb24gY2xhaW1zICh0aGV5J3JlIGxlYXN0LXByaXZpbGVnZSBgcm9sZTptZW1iZXJgKSwgc28gYSBwbGFpblxuICogYHJlcXVpcmVQZXJtaXNzaW9uYCB3b3VsZCB3cm9uZ2x5IDQwMyB0aGVtLiBTdXBlcmFkbWlucyBwYXNzIHZpYVxuICogYHVzZXJIYXNQZXJtaXNzaW9uYCdzIGltcGxpY2l0LWFsbC4gVXNlIG9ubHkgd2hlcmUgYSBzZXJ2aWNlIGNhbGxlciBpcyBhIGtub3duLFxuICogaW50ZW5kZWQgY29uc3VtZXIgb2YgdGhlIHJvdXRlICh2ZXJpZnkgdGhlIGNhbGxlcnMpOyBwcmVmZXIgcGxhaW5cbiAqIGByZXF1aXJlUGVybWlzc2lvbmAgZm9yIHB1cmVseSB1c2VyLWZhY2luZyByZWFkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVQZXJtaXNzaW9uT3JTZXJ2aWNlKC4uLnBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10pIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICBpZiAoIXJlcS51c2VyKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgIH1cbiAgICBpZiAoaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkgfHwgcGVybWlzc2lvbnMuc29tZSgocCkgPT4gdXNlckhhc1Blcm1pc3Npb24ocmVxLCBwKSkpIHJldHVybiBuZXh0KCk7XG4gICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCBwZXJtaXNzaW9ucy5qb2luKCcgb3IgJykpO1xuICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGVybWlzc2lvbjogJHtwZXJtaXNzaW9ucy5qb2luKCcgb3IgJyl9YCxcbiAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgKTtcbiAgfSwgeyBraW5kOiAncGVybWlzc2lvbicsIG1vZGU6ICdhbnknLCBwZXJtaXNzaW9ucywgYWxsb3dTZXJ2aWNlOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgYW4gZW5kcG9pbnQgdG8gaW50ZXJuYWwgc2VydmljZS10by1zZXJ2aWNlIGNhbGxlcnMgb25seSAoYVxuICogYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AgcHJpbmNpcGFsIG1pbnRlZCB2aWEge0BsaW5rIHNpZ25TZXJ2aWNlVG9rZW59IC8gYGdldFNlcnZpY2VBdXRoSGVhZGVyYCkuXG4gKiBSZWplY3RzIGFueSB1c2VyIHRva2VuLiBGb3IgTk9OLXVzZXItZmFjaW5nIGVuZHBvaW50cyDigJQgZW50aXR5LWV2ZW50IGluZ2VzdCxcbiAqIGF1dG8tc3Vic2NyaWJlLCBhbmQgc2ltaWxhciBwZWVyLXNlcnZpY2UgaG9va3Mg4oCUIHRoYXQgYSBicm93c2VyIG11c3QgbmV2ZXJcbiAqIHJlYWNoLiBDb21wb3NlIGFmdGVyIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyYCBpcyBwb3B1bGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQge1xuICBpZiAoIWlzU2VydmljZVByaW5jaXBhbChyZXEpKSB7XG4gICAgLy8gNDAzIChub3QgNDAwKSDigJQgdGhpcyBpcyBhbiBhdXRob3JpemF0aW9uIHJlZnVzYWw7IHN0YXR1cyBtdXN0IG1hdGNoIHRoZVxuICAgIC8vIElOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyBjb2RlIGFuZCB0aGUgc2libGluZyBnYXRlcyAocmVxdWlyZVBlcm1pc3Npb24sIGV0Yy4pLlxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTiwgJ0ludGVybmFsIHNlcnZpY2UgY2FsbHMgb25seScsIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpO1xuICB9XG4gIG5leHQoKTtcbn1cbnRhZ1JvdXRlR2F0ZShyZXF1aXJlU2VydmljZVByaW5jaXBhbCwgeyBraW5kOiAnc2VydmljZVByaW5jaXBhbCcgfSk7XG5cbi8qKlxuICogVEhFIGdhdGUgZm9yIGFuIElOVEVSTkFMIHJvdXRlICgjMTQpIOKAlCB0aGUgb25lIGV2ZXJ5IGAvaW50ZXJuYWwvKmAgcGF0aCwgdGhlXG4gKiBxdW90YSB1c2FnZSBjb3VudGVycywgdGhlIGVudGl0eS1ldmVudCBpbmdlc3QgYW5kIHRoZSBhdWRpdCBpbmdlc3QgZ28gdGhyb3VnaC5cbiAqXG4gKiBUd28gcnVsZXMsIGJvdGggZmFpbC1jbG9zZWQ6XG4gKlxuICogIDEuICoqTm8gdXNlciB0b2tlbiwgZXZlci4qKiBOb3QgYSBtZW1iZXIncywgbm90IGEgc3VwZXJhZG1pbidzLCBub3QgYVxuICogICAgIHNlcnZpY2UtYWNjb3VudCBrZXkncy4gQW4gaW50ZXJuYWwgcm91dGUgaXMgYSBwZWVyLXNlcnZpY2UgQVBJIHN1cmZhY2UsIHNvXG4gKiAgICAgXCJhIHN1ZmZpY2llbnRseSBwcml2aWxlZ2VkIGh1bWFuXCIgaXMgbm90IGFuIGFjY2VwdGFibGUgY2FsbGVyIOKAlCB0aGF0XG4gKiAgICAgZXF1aXZhbGVuY2UgaXMgZXhhY3RseSBob3cgYSBicm93c2VyLXJlYWNoYWJsZSBwYXRoIGJlY29tZXMgYSB0ZW5hbnRcbiAqICAgICBib3VuZGFyeSBidWcuIGByZXF1aXJlU2VydmljZVByaW5jaXBhbGAgYWxyZWFkeSByZWZ1c2VkIHVzZXJzOyB0aGlzIGFsc29cbiAqICAgICBjbG9zZXMgdGhlIGB8fCBpc1N5c3RlbUFkbWluKHJlcSlgIGVzY2FwZSBoYXRjaGVzIHRoYXQgaGFkIGdyb3duIGFyb3VuZFxuICogICAgIHRoZSBpbmRpdmlkdWFsIGludGVybmFsIHJvdXRlcy5cbiAqICAyLiAqKk9ubHkgdGhlIE5BTUVEIGNhbGxlcnMuKiogYGNhbGxlcnNgIGxpc3RzIHRoZSBzZXJ2aWNlcyB0aGF0IGxlZ2l0aW1hdGVseVxuICogICAgIGNhbGwgdGhpcyByb3V0ZSwgYW5kIHRoZSBuYW1lIGlzIGNyeXB0b2dyYXBoaWNhbGx5IGJvdW5kIHRvIHRoZSBzaWduaW5nXG4gKiAgICAga2V5IChgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIHNvIHRoaXMgaXMgYW4gaWRlbnRpdHkgY2hlY2sgcmF0aGVyIHRoYW5cbiAqICAgICBhIGNsYWltIGNoZWNrLiBJdCBpcyB0aGUgc2FtZSBhbGxvdy1saXN0IHRoZSBtZXNoIHBvbGljeSBuYW1lcywgYXQgdGhlXG4gKiAgICAgbGF5ZXIgdGhhdCBhbHNvIGhvbGRzIGluIGRvY2tlciBjb21wb3NlLCB3aGVyZSB0aGVyZSBpcyBubyBtZXNoIGF0IGFsbCDigJRcbiAqICAgICB0aGUgSXN0aW8gYEF1dGhvcml6YXRpb25Qb2xpY3lgIGlzIGRlZmVuY2UgaW4gZGVwdGggb24gdG9wLCBuZXZlciB0aGVcbiAqICAgICBlbmZvcmNlbWVudC5cbiAqXG4gKiBDb21wb3NlIGFmdGVyIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyYCBpcyBwb3B1bGF0ZWQuIFJlZnVzYWxzIGFyZSBjb3VudGVkXG4gKiAoYGludGVybmFsX3JvdXRlX3JlZnVzZWRfdG90YWxgKSBhbmQgYXVkaXRlZCB0aHJvdWdoIHRoZSBzaGFyZWQgYGF1dGh6LmRlbmllZGBcbiAqIHNpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlKG9wdGlvbnM6IHsgY2FsbGVyczogcmVhZG9ubHkgc3RyaW5nW10gfSkge1xuICBjb25zdCBhbGxvd2VkID0gbmV3IFNldChvcHRpb25zLmNhbGxlcnMpO1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHJlZnVzZSA9IChyZWFzb246ICd1bmF1dGhlbnRpY2F0ZWQnIHwgJ3VzZXJfdG9rZW4nIHwgJ3dyb25nX2NhbGxlcicpOiB2b2lkID0+IHtcbiAgICAgIGVtaXRDb3VudGVyKCdpbnRlcm5hbF9yb3V0ZV9yZWZ1c2VkX3RvdGFsJywge1xuICAgICAgICBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSxcbiAgICAgICAgcm91dGU6IHJlcS5yb3V0ZT8ucGF0aCA/IGAke3JlcS5tZXRob2R9ICR7cmVxLmJhc2VVcmx9JHtyZXEucm91dGUucGF0aH1gIDogYCR7cmVxLm1ldGhvZH0gJHsocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpLnNwbGl0KCc/JylbMF19YCxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBjYWxsZXI6IHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID8/ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCBgaW50ZXJuYWwtc2VydmljZSAoJHtvcHRpb25zLmNhbGxlcnMuam9pbignLCAnKX0pYCk7XG4gICAgICBpZiAocmVhc29uID09PSAndW5hdXRoZW50aWNhdGVkJykge1xuICAgICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiByZXF1aXJlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLndhcm4oJ1JlZnVzZWQgYW4gaW50ZXJuYWwgcm91dGUnLCB7IHJlYXNvbiwgcGF0aDogKHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsKS5zcGxpdCgnPycpWzBdLCBjYWxsZXI6IHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLCAnSW50ZXJuYWwgc2VydmljZSBjYWxscyBvbmx5JywgRXJyb3JDb2RlLklOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyk7XG4gICAgfTtcblxuICAgIGlmICghcmVxLnVzZXIpIHJldHVybiByZWZ1c2UoJ3VuYXV0aGVudGljYXRlZCcpO1xuICAgIGlmICghaXNTZXJ2aWNlUHJpbmNpcGFsKHJlcSkpIHJldHVybiByZWZ1c2UoJ3VzZXJfdG9rZW4nKTtcbiAgICBjb25zdCBjYWxsZXIgPSBzZXJ2aWNlTmFtZU9mKHJlcS51c2VyKTtcbiAgICBpZiAoIWNhbGxlciB8fCAhYWxsb3dlZC5oYXMoY2FsbGVyKSkgcmV0dXJuIHJlZnVzZSgnd3JvbmdfY2FsbGVyJyk7XG4gICAgbmV4dCgpO1xuICB9LCB7IGtpbmQ6ICdzZXJ2aWNlUHJpbmNpcGFsJyB9LCB7IGtpbmQ6ICdpbnRlcm5hbFNlcnZpY2UnLCBjYWxsZXJzOiBbLi4ub3B0aW9ucy5jYWxsZXJzXSB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc3lzdGVtIHRlbmFudCdzIGNhbm9uaWNhbCBvcmcgKippZCoqIOKAlCBhIGZpeGVkLCB3ZWxsLWtub3duIE9iamVjdElkIChOT1RcbiAqIHRoZSBzdHJpbmcgJ3N5c3RlbScpLiBUaGlzIGlzIHRoZSBzaW5nbGUga25vYiBldmVyeSBzZXJ2aWNlIHJlc29sdmVzIHRoZVxuICogc3lzdGVtIHRlbmFudCB0aHJvdWdoOyBvdmVycmlkZSB2aWEgdGhlIGBTWVNURU1fT1JHX0lEYCBlbnYgZm9yIGFsdGVybmF0ZVxuICogaW5zdGFsbHMuIFRoZSBzeXN0ZW0gb3JnJ3MgaHVtYW4gaWRlbnRpZmllciBzdGF5cyB0aGUgc2x1Zy9uYW1lICdzeXN0ZW0nXG4gKiAoc2VlIHtAbGluayBTWVNURU1fT1JHX1NMVUd9KTsgb25seSBpdHMgYF9pZGAgaXMgdGhpcyBPYmplY3RJZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNZU1RFTV9PUkdfSUQgPSAocHJvY2Vzcy5lbnYuU1lTVEVNX09SR19JRCB8fCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJykudG9Mb3dlckNhc2UoKTtcblxuLyoqIFRoZSBzeXN0ZW0gb3JnJ3Mgd2VsbC1rbm93biBzbHVnL25hbWUgKHRoZSBodW1hbiBpZGVudGlmaWVyOyBpdHMgYF9pZGAgaXMge0BsaW5rIFNZU1RFTV9PUkdfSUR9KS4gKi9cbmV4cG9ydCBjb25zdCBTWVNURU1fT1JHX1NMVUcgPSAnc3lzdGVtJztcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBvcmdJZCBvciBvcmdOYW1lL3NsdWcgbWF0Y2hlcyB0aGUgc3lzdGVtIG9yZy4gVXNlIHRoaXMgaW5zdGVhZCBvZlxuICogY29tcGFyaW5nIGRpcmVjdGx5OiB0aGUgaWQgaXMgbm93IGFuIE9iamVjdElkICh7QGxpbmsgU1lTVEVNX09SR19JRH0pIHdoaWxlIHRoZVxuICogbmFtZS9zbHVnIGlzICdzeXN0ZW0nICh7QGxpbmsgU1lTVEVNX09SR19TTFVHfSksIHNvIHRoZSB0d28gYXJlIGNvbXBhcmVkIGFnYWluc3RcbiAqIHRoZWlyIHJlc3BlY3RpdmUgY2Fub25pY2FsIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3lzdGVtT3JnSWQob3JnSWQ/OiBzdHJpbmcsIG9yZ05hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9yZ0lkPy50b0xvd2VyQ2FzZSgpID09PSBTWVNURU1fT1JHX0lEIHx8IG9yZ05hbWU/LnRvTG93ZXJDYXNlKCkgPT09IFNZU1RFTV9PUkdfU0xVRztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBmcm9tIGEgc3lzdGVtIGFkbWluLlxuICpcbiAqIEF1dGhvcml0eSBpcyBncmFudGVkIHNvbGVseSBieSB0aGUgdXNlci1sZXZlbCBgaXNTdXBlckFkbWluYCBmbGFnIGNhcnJpZWRcbiAqIGluIHRoZSBKV1QuIFRoZSBcIm1lbWJlcnNoaXAgaW4gdGhlIHdlbGwta25vd24gJ3N5c3RlbScgb3JnIHdpdGggcm9sZVxuICogYWRtaW4vb3duZXJcIiBwYXRoIHdhcyByZW1vdmVkIOKAlCBpdCBjb25mbGF0ZWQgYSBQaXBlbGluZSBCdWlsZGVyIG9wZXJhdG9yXG4gKiB3aXRoIGEgcmVhbCBjdXN0b21lciB0ZW5hbnQgaW4gdGhlIGRhdGEgbW9kZWwsIGFuZCBtZWFudCBhbnkgdW5pbnRlbmRlZFxuICogd3JpdGUgdGhhdCBjcmVhdGVkIGEgJ3N5c3RlbSctbmFtZWQgb3JnIGNvdWxkIHF1aWV0bHkgZ3JhbnQgY3Jvc3Mtb3JnXG4gKiBhdXRob3JpdHkuIFRoZSBgc3lzdGVtYCBvcmcgc3RpbGwgZXhpc3RzIGFzIGEgKmNvbnRlbnQgaG9sZGVyKiBmb3Igc2hhcmVkXG4gKiBzYW1wbGUgZGF0YTsgaXQganVzdCBubyBsb25nZXIgY29uZmVycyBwcml2aWxlZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5c3RlbUFkbWluKHJlcTogUmVxdWVzdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVxLnVzZXI/LmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRoZSByZXF1ZXN0J3MgdG9rZW4gY2FycmllcyBhIHNwZWNpZmljIGNhcGFiaWxpdHkgYHNjb3BlYCAoZS5nLlxuICogYCdyZXBvcnRpbmc6aW5nZXN0J2ApLiBVc2VkIHRvIGdhdGUgZW5kcG9pbnRzIHRoYXQgYWNjZXB0IGEgbmFycm93IG1hY2hpbmVcbiAqIGlkZW50aXR5IOKAlCBhIG5vcm1hbCBpbnRlcmFjdGl2ZSB1c2VyIHRva2VuIGhhcyBubyBgc2NvcGVgIGFuZCByZXR1cm5zIGZhbHNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzU2NvcGUocmVxOiBSZXF1ZXN0LCBzY29wZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZXEudXNlcj8uc2NvcGUgPT09IHNjb3BlO1xufVxuXG4vKiogUmVxdWlyZXMgYSBzeXN0ZW0gYWRtaW4g4oCUIGdyYW50ZWQgc29sZWx5IGJ5IHRoZSBgaXNTdXBlckFkbWluYCB0b2tlbiBjbGFpbVxuICogICh0aGUgb3JnLW1lbWJlcnNoaXAgcGF0aCB3YXMgcmVtb3ZlZCkuIFVzZSBhZnRlciByZXF1aXJlQXV0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlU3lzdGVtQWRtaW4oXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIGlmICghaXNTeXN0ZW1BZG1pbihyZXEpKSB7XG4gICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnc3lzdGVtLWFkbWluJyk7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAnQWNjZXNzIGRlbmllZC4gT25seSBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgY2FuIHBlcmZvcm0gdGhpcyBhY3Rpb24uJyxcbiAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgKTtcbiAgfVxuICBuZXh0KCk7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZVN5c3RlbUFkbWluLCB7IGtpbmQ6ICdzeXN0ZW1BZG1pbicgfSk7XG5cbi8qKlxuICogUmVxdWlyZSBhIHNwZWNpZmljIGZlYXR1cmUgZmxhZy4gVXNlIGFmdGVyIHJlcXVpcmVBdXRoLlxuICogQ2hlY2tzIHRoZSBgZmVhdHVyZXNgIGFycmF5IGluIHRoZSBKV1QgcGF5bG9hZCAoc2V0IGF0IHRva2VuIGlzc3VhbmNlKS5cbiAqIFN5c2FkbWlucyAoaXNTdXBlckFkbWluKSBieXBhc3Mg4oCUIHRoZXkgYWx3YXlzIGhhdmUgZXZlcnkgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVGZWF0dXJlKGZlYXR1cmU6IHN0cmluZykge1xuICByZXR1cm4gdGFnUm91dGVHYXRlKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgIGlmICghcmVxLnVzZXIpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIHJlcXVpcmVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gICAgfVxuXG4gICAgLy8gU3lzYWRtaW5zIGdldCBhbGwgZmVhdHVyZXM7IHRoZSBgZmVhdHVyZXNgIGFycmF5IG9uIHRoZWlyIHRva2VuIGlzXG4gICAgLy8gcG9wdWxhdGVkIHdpdGggZXZlcnkgZmxhZyBhdCBpc3N1YW5jZSB0aW1lIGJ1dCB0aGUgYnlwYXNzIGhlcmUga2VlcHNcbiAgICAvLyB0aGUgcnVsZSBleHBsaWNpdCBhbmQgc3Vydml2ZXMgYSB0b2tlbiBpc3N1ZWQgYmVmb3JlIGEgbmV3IGZlYXR1cmVcbiAgICAvLyBmbGFnIHdhcyBhZGRlZC5cbiAgICBpZiAocmVxLnVzZXIuaXNTdXBlckFkbWluID09PSB0cnVlKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgaWYgKCFyZXEudXNlci5mZWF0dXJlcz8uaW5jbHVkZXMoZmVhdHVyZSkpIHtcbiAgICAgIC8vIFJvdXRlIGZlYXR1cmUtZ2F0ZSBkZW5pYWxzIHRocm91Z2ggdGhlIHNhbWUgYXVkaXQgc2luayBhc1xuICAgICAgLy8gcmVxdWlyZVBlcm1pc3Npb24gLyByZXF1aXJlU3lzdGVtQWRtaW4gc28gYSBwcm9iZSBmb3IgYW5cbiAgICAgIC8vIHVuZW50aXRsZWQgY2FwYWJpbGl0eSBsZWF2ZXMgYSB0cmFpbCAoc3RhdGUtY2hhbmdpbmcgbWV0aG9kcyBvbmx5KS5cbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgYGZlYXR1cmU6JHtmZWF0dXJlfWApO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICAgYFRoaXMgZmVhdHVyZSByZXF1aXJlcyBhIGhpZ2hlciBwbGFuICgke2ZlYXR1cmV9KWAsXG4gICAgICAgIEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMsXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHQoKTtcbiAgfSwgeyBraW5kOiAnZmVhdHVyZScsIGZlYXR1cmUgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VydmljZS10by1zZXJ2aWNlIHRva2Vuc1xuLy9cbi8vIEludGVyLXNlcnZpY2UgSFRUUCBjYWxscyAoYmlsbGluZyDihpIgbWVzc2FnZSwgcGxhdGZvcm0g4oaSIGNvbXBsaWFuY2UsIGV0Yy4pXG4vLyBuZWVkIHRvIHNhdGlzZnkgdGhlIHNhbWUgYHJlcXVpcmVBdXRoYCBtaWRkbGV3YXJlIGFzIHVzZXIgcmVxdWVzdHMuXG4vLyBgc2lnblNlcnZpY2VUb2tlbmAgbWludHMgYSBzaG9ydC1saXZlZCBFUzI1NiBKV1Qgc2lnbmVkIHdpdGggVEhJUyBzZXJ2aWNlJ3Ncbi8vIE9XTiBrZXkgKHNlZSBgc2VydmljZXMvc2VydmljZS1rZXlzLnRzYCksIGNhcnJ5aW5nIGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgXG4vLyBhbmQgbmFtaW5nIHRoZSBjYWxsaW5nIHNlcnZpY2UgdmlhIGBzdWI6ICdzZXJ2aWNlOjxuYW1lPidgLiBHYXRlcyBicmFuY2ggb25cbi8vIHRoZSBjbGFpbTsgdGhlIHN1YmplY3QgbmFtZXMg4oCUIGFuZCBzaW5jZSAjMTQgdGhlIG5hbWUgaXMgY3J5cHRvZ3JhcGhpY2FsbHlcbi8vIGJvdW5kIHRvIHRoZSBzaWduaW5nIGtleSwgc28gaXQgY2FuIGFsc28gYmUgdHJ1c3RlZC5cbi8vIGByZXF1aXJlQXV0aGAgYWNjZXB0cyB0aGVzZSB0b2tlbnMgdHJhbnNwYXJlbnRseSDigJQgdGhleSBwYXNzIGBkZWNvZGVkLnN1YmBcbi8vIGFuZCBgZGVjb2RlZC5yb2xlYCBjaGVja3MsIGFuZCBkb3duc3RyZWFtIGByZXF1aXJlT3JnYW5pemF0aW9uYCAvXG4vLyBgcmVxdWlyZVN5c3RlbUFkbWluYCByZWx5IG9uIHRoZSBvcmcvcm9sZSBlbWJlZGRlZCBpbiB0aGUgdG9rZW4uXG4vL1xuLy8gVG9rZW5zIGRlZmF1bHQgdG8gNS1taW51dGUgVFRMIOKAlCBsb25nIGVub3VnaCB0byBzdXJ2aXZlIGEgYmFja2VuZCBob3AsXG4vLyBzaG9ydCBlbm91Z2ggdGhhdCBhIGxlYWtlZCB0b2tlbiBpcyBsb3ctdmFsdWUuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgREVGQVVMVF9TRVJWSUNFX1RPS0VOX1RUTF9TRUNPTkRTID0gMzAwO1xuXG4vKipcbiAqIERlbnlsaXN0IG9mIHNlcnZpY2UgTkFNRVMgKHRoZSBgPG5hbWU+YCBpbiBgc3ViOiBzZXJ2aWNlOjxuYW1lPmApIHdob3NlIHRva2Vuc1xuICogYHJlcXVpcmVBdXRoYCBtdXN0IHJlamVjdC4gUmVhZCBmcm9tIGBTRVJWSUNFX1RPS0VOX0RFTllMSVNUYCAoY29tbWEtc2VwYXJhdGVkKVxuICogYXQgcHJvY2VzcyBzdGFydCwgc28gYXJtaW5nIGl0IGlzIGEgY29uZmlnIGNoYW5nZSArIHJvbGxvdXQg4oCUIGl0IGN1dHMgb2ZmIGFcbiAqIGNvbXByb21pc2VkIHNlcnZpY2UgV0lUSE9VVCByb3RhdGluZyBhbnkga2V5LCBhbmQgKHVubGlrZSB0aGUgcHJlLSMxNCBzaGFyZWRcbiAqIHNlY3JldCkgd2l0aG91dCBpbnZhbGlkYXRpbmcgZXZlcnkgb3RoZXIgc2VydmljZSdzIHRva2VucyBhcyBjb2xsYXRlcmFsLlxuICovXG5jb25zdCBzZXJ2aWNlVG9rZW5EZW55bGlzdCA9IG5ldyBTZXQoXG4gIChwcm9jZXNzLmVudi5TRVJWSUNFX1RPS0VOX0RFTllMSVNUIHx8ICcnKVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSxcbik7XG5cbi8qKlxuICogVGhlIGNhbGxpbmcgc2VydmljZSdzIG5hbWUgZm9yIGEgU0VSVklDRSBwcmluY2lwYWwgKGBwcmluY2lwYWxUeXBlOiAnc2VydmljZSdgKSxcbiAqIGVsc2UgYHVuZGVmaW5lZGAuIEEgdXNlciB0b2tlbiBuZXZlciB5aWVsZHMgYSBuYW1lLCB3aGF0ZXZlciBpdHMgYHN1YmAgc2F5cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcnZpY2VOYW1lT2YoY2xhaW1zOiB7IHByaW5jaXBhbFR5cGU/OiBzdHJpbmc7IHN1Yj86IHN0cmluZyB9IHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNsYWltcz8ucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8IHR5cGVvZiBjbGFpbXMuc3ViICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFjbGFpbXMuc3ViLnN0YXJ0c1dpdGgoU0VSVklDRV9TVUJKRUNUX1BSRUZJWCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBjbGFpbXMuc3ViLnNsaWNlKFNFUlZJQ0VfU1VCSkVDVF9QUkVGSVgubGVuZ3RoKSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIGNsYWltcyBhcmUgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGlzIG9uIHRoZSBkZW55bGlzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VUb2tlbkRlbmllZChjbGFpbXM6IHsgcHJpbmNpcGFsVHlwZT86IHN0cmluZzsgc3ViPzogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgaWYgKHNlcnZpY2VUb2tlbkRlbnlsaXN0LnNpemUgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmFtZSA9IHNlcnZpY2VOYW1lT2YoY2xhaW1zKTtcbiAgcmV0dXJuIG5hbWUgIT09IHVuZGVmaW5lZCAmJiBzZXJ2aWNlVG9rZW5EZW55bGlzdC5oYXMobmFtZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVRva2VuT3B0aW9ucyB7XG4gIC8qKiBDYWxsaW5nIHNlcnZpY2UgaWRlbnRpZmllciAoZS5nLiAnYmlsbGluZycsICdwbGF0Zm9ybScpLiBFbWJlZGRlZCBhcyBgc3ViOiBzZXJ2aWNlOjxuYW1lPmAuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIGNvbnRleHQgZm9yIHRoZSBjYWxsLiBVc2UgdGhlIHRhcmdldCB0ZW5hbnQncyBvcmcgaWQsIG9yIHRoZVxuICAgKiAgd2VsbC1rbm93biBgU1lTVEVNX09SR19JRGAgKGFuIE9iamVjdElkKSBmb3Igc3lzdGVtLXdpZGUgb3BzIOKAlCBOT1QgdGhlIHN0cmluZ1xuICAgKiAgJ3N5c3RlbScsIHdoaWNoIGlkLWJhc2VkIHN5c3RlbS1vcmcgY2hlY2tzIHdvbid0IHJlY29nbml6ZS4gKi9cbiAgb3JnSWQ/OiBzdHJpbmc7XG4gIC8qKiBBY3RpdmUgb3JnIG5hbWUuIERlZmF1bHRzIHRvIG9yZ0lkLiAqL1xuICBvcmdOYW1lPzogc3RyaW5nO1xuICAvKiogVFRMIGluIHNlY29uZHMgKGRlZmF1bHQgMzAwKS4gKi9cbiAgdHRsU2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJvbGUgdGhlIHRva2VuIGNhcnJpZXMgKHJlcXVpcmVkIOKAlCBubyBpbXBsaWNpdCBkZWZhdWx0KS4gKipQYXNzIHRoZSBMT1dFU1RcbiAgICogcm9sZSB0aGUgY2FsbCBhY3R1YWxseSBuZWVkcyoqIChgJ21lbWJlcidgIGZvciByZWFkIC8gZGF0YS1wbGFuZSBjYWxscykgc28gYVxuICAgKiBsZWFrZWQgc2VydmljZSB0b2tlbiBjYW4ndCBwZXJmb3JtIGFkbWluIGFjdGlvbnMgaW4gdGhlIHRhcmdldCBvcmcuXG4gICAqIGBpc0FkbWluYCBpcyBkZXJpdmVkIGZyb20gdGhpcyAoYWRtaW58b3duZXIg4oaSIHRydWUpLlxuICAgKi9cbiAgcm9sZTogJ293bmVyJyB8ICdhZG1pbicgfCAnbWVtYmVyJztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbmUtZ3JhaW5lZCBwZXJtaXNzaW9uIGNsYWltLiBQcmVmZXIgdGhpcyArIGByb2xlOiAnbWVtYmVyJ2Agb3ZlciBhXG4gICAqIGhpZ2ggcm9sZSB3aGVuIGEgY2FsbCBuZWVkcyBPTkUgc3BlY2lmaWMgY2FwYWJpbGl0eSAoZS5nLiBgWydwbHVnaW5zOndyaXRlJ11gXG4gICAqIHRvIHB1c2ggYSBwbHVnaW4gaW1hZ2UpIOKAlCB0aGUgdG9rZW4gdGhlbiBzYXRpc2ZpZXMgdGhhdCBwZXJtaXNzaW9uIGdhdGVcbiAgICogV0lUSE9VVCBjYXJyeWluZyBgaXNBZG1pbmAsIHNvIGEgbGVha2VkIHRva2VuIGNhbid0IHBlcmZvcm0gYWRtaW4gYWN0aW9ucy5cbiAgICovXG4gIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdO1xufVxuXG4vKipcbiAqIE1pbnQgYSBKV1QgaWRlbnRpZnlpbmcgdGhlIGNhbGxpbmcgc2VydmljZS4gVXNlZCBmb3IgaW50ZXItc2VydmljZSBIVFRQIGNhbGxzLlxuICogVGhlIHRva2VuIHNhdGlzZmllcyBgcmVxdWlyZUF1dGhgIGFuZCAod2hlbiBvcmdJZCBpcyBwcmVzZW50KSBgcmVxdWlyZU9yZ2FuaXphdGlvbmAuXG4gKiBTY29wZSBpdCB3aXRoIGBvcHRzLnJvbGVgIOKAlCBsZWFzdCBwcml2aWxlZ2Uga2VlcHMgYSBsZWFrZWQgdG9rZW4gbG93LXZhbHVlLlxuICpcbiAqIGBvcHRzLnNlcnZpY2VOYW1lYCBtdXN0IGJlIFRISVMgcHJvY2VzcydzIG93biBpZGVudGl0eSAoYFNFUlZJQ0VfTkFNRWApOiBhXG4gKiBzZXJ2aWNlIGhvbGRzIG9ubHkgaXRzIG93biBzaWduaW5nIGtleSwgc28gbWludGluZyBhIHRva2VuIHRoYXQgbmFtZXMgYW5vdGhlclxuICogc2VydmljZSB0aHJvd3MgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIG9uZSBldmVyeSBwZWVyIHdvdWxkIHJlamVjdC4gVGhhdCBpcyB0aGVcbiAqIG9uZSBiZWhhdmlvdXIgY2hhbmdlICMxNCBmb3JjZXMgb24gY2FsbGVycyDigJQgc2VlIGBzZXJ2aWNlcy9zZXJ2aWNlLWtleXMudHNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnblNlcnZpY2VUb2tlbihvcHRzOiBTZXJ2aWNlVG9rZW5PcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3Qgcm9sZSA9IG9wdHMucm9sZTtcbiAgY29uc3QgcGF5bG9hZDogT21pdDxKd3RQYXlsb2FkLCAnc3ViJz4gPSB7XG4gICAgdXNlcm5hbWU6IGAke29wdHMuc2VydmljZU5hbWV9LXNlcnZpY2VgLFxuICAgIGVtYWlsOiBgJHtvcHRzLnNlcnZpY2VOYW1lfUBpbnRlcm5hbGAsXG4gICAgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnLFxuICAgIHRva2VuX3VzZTogJ2FjY2VzcycsXG4gICAgcm9sZSxcbiAgICBpc0FkbWluOiByb2xlID09PSAnb3duZXInIHx8IHJvbGUgPT09ICdhZG1pbicsXG4gICAgdHlwZTogJ2FjY2VzcycsXG4gICAgb3JnYW5pemF0aW9uSWQ6IG9wdHMub3JnSWQsXG4gICAgb3JnYW5pemF0aW9uTmFtZTogb3B0cy5vcmdOYW1lID8/IG9wdHMub3JnSWQsXG4gICAgLy8gVW5pcXVlIHRva2VuIGlkIG9uIGV2ZXJ5IG1pbnQuIENvbWJpbmVkIHdpdGggdGhlIHNob3J0ICgzMDBzIGRlZmF1bHQpIFRUTFxuICAgIC8vIHRoaXMgZ2l2ZXMgZWFjaCBzZXJ2aWNlIHRva2VuIGEgZGlzdGluY3QgaWRlbnRpdHkg4oCUIHRoZSBjb3JyZWxhdGlvbiBoYW5kbGVcbiAgICAvLyBmb3IgdHJhY2luZyB3aGljaCBtaW50IHBlcmZvcm1lZCBhIGNyb3NzLXNlcnZpY2UgYWN0aW9uLCBhbmQgdGhlIGJ1aWxkaW5nXG4gICAgLy8gYmxvY2sgZm9yIHJlcGxheSBkZXRlY3Rpb24gKGEgdmVyaWZpZXIgY2FuIHRyYWNrIHNlZW4ganRpcykuIEl0IGRvZXMgTk9UXG4gICAgLy8gYnkgaXRzZWxmIHByZXZlbnQgcmVwbGF5IHdpdGhpbiB0aGUgVFRMIHdpbmRvdy5cbiAgICBqdGk6IHJhbmRvbVVVSUQoKSxcbiAgICAvLyBMZWFzdC1wcml2aWxlZ2UgY2FwYWJpbGl0eSBjbGFpbSAob3B0aW9uYWwpIOKAlCBsZXRzIGEgbWVtYmVyLXJvbGUgdG9rZW5cbiAgICAvLyBzYXRpc2Z5IGEgc3BlY2lmaWMgcGVybWlzc2lvbiBnYXRlIHdpdGhvdXQgY2FycnlpbmcgaXNBZG1pbi5cbiAgICAuLi4ob3B0cy5wZXJtaXNzaW9ucyAmJiBvcHRzLnBlcm1pc3Npb25zLmxlbmd0aCA+IDAgPyB7IHBlcm1pc3Npb25zOiBvcHRzLnBlcm1pc3Npb25zIH0gOiB7fSksXG4gIH07XG4gIC8vIGBzdWJgLCBgaWF0YC9gZXhwYCBhbmQgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZSB0aGF0IHJlcXVpcmVBdXRoXG4gIC8vIHZlcmlmaWVzIGFyZSBzdGFtcGVkIGJ5IHRoZSBzaWduZXIsIHNvIHRoZXJlIGlzIGV4YWN0bHkgb25lIHBsYWNlIHRoYXRcbiAgLy8gZGVjaWRlcyB3aGF0IGEgc2VydmljZSB0b2tlbiBzYXlzLlxuICByZXR1cm4gc2lnblNlcnZpY2VKd3QocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgIHNlcnZpY2VOYW1lOiBvcHRzLnNlcnZpY2VOYW1lLFxuICAgIGV4cGlyZXNJblNlY29uZHM6IG9wdHMudHRsU2Vjb25kcyA/PyBERUZBVUxUX1NFUlZJQ0VfVE9LRU5fVFRMX1NFQ09ORFMsXG4gICAgLi4uaXNzdWVyQXVkaWVuY2VPcHRpb25zKCksXG4gIH0pO1xufVxuXG4vKiogQ29udmVuaWVuY2U6IHJldHVybnMgYSBgQmVhcmVyIDx0b2tlbj5gIGhlYWRlciB2YWx1ZSBmb3IgZmV0Y2gvYXhpb3MgY2FsbHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VydmljZUF1dGhIZWFkZXIob3B0czogU2VydmljZVRva2VuT3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBgQmVhcmVyICR7c2lnblNlcnZpY2VUb2tlbihvcHRzKX1gO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYSBzZXJ2aWNlIHByaW5jaXBhbCAoYHByaW5jaXBhbFR5cGU6ICdzZXJ2aWNlJ2AsIG1pbnRlZCBieSBgc2lnblNlcnZpY2VUb2tlbmApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VydmljZVByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZSc7XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIGByZXEudXNlcmAgaXMgYW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCAoYHByaW5jaXBhbFR5cGU6XG4gKiAnc2VydmljZV9hY2NvdW50J2ApIOKAlCBhIG5vbi1odW1hbiBwcmluY2lwYWwgb3duZWQgYnkgb25lIG9yZywgYXV0aGVudGljYXRpbmdcbiAqIHdpdGggYSBgcGJfc2Ff4oCmYCBrZXkgZXhjaGFuZ2VkIGF0IHBsYXRmb3JtLlxuICpcbiAqIEEgc2VydmljZSBhY2NvdW50IGlzIE5PVCBhbiBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbDogaXQgaG9sZHMgb3JnIFJvbGVzIGFuZFxuICogaXMgc3ViamVjdCB0byBldmVyeSBwZXJtaXNzaW9uIGdhdGUgYSBtZW1iZXIgaXMuIFdoYXQgaXQgY2FuIG5ldmVyIGRvIGlzXG4gKiBzYXRpc2Z5IGEgSFVNQU4tcHJlc2VuY2UgcmVxdWlyZW1lbnQg4oCUIHN0ZXAtdXAgKGFuZCBhbnkgbGF0ZXIgYXNzdXJhbmNlIGdhdGUpXG4gKiByZWZ1c2VzIGl0IG91dHJpZ2h0LCBiZWNhdXNlIHRoZXJlIGlzIG5vIHBlcnNvbiBiZWhpbmQgaXQgdG8gcmUtdmVyaWZ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbChyZXE6IFJlcXVlc3QpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlcS51c2VyPy5wcmluY2lwYWxUeXBlID09PSAnc2VydmljZV9hY2NvdW50Jztcbn1cblxuLyoqIFRydWUgd2hlbiBgcmVxLnVzZXJgIGlzIHRoZSBuYW1lZCBpbnRlcm5hbCBzZXJ2aWNlIChlLmcuIGAnYmlsbGluZydgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlcnZpY2VQcmluY2lwYWxOYW1lZChyZXE6IFJlcXVlc3QsIHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZpY2VOYW1lT2YocmVxLnVzZXIpID09PSBzZXJ2aWNlTmFtZTtcbn1cblxuLyoqXG4gKiBQUkUtYXV0aCBjaGVjazogY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoZSByZXF1ZXN0IGNhcnJpZXMgYSB2YWxpZCwgc2lnbmVkXG4gKiBTRVJWSUNFIHRva2VuIChgcHJpbmNpcGFsVHlwZTogJ3NlcnZpY2UnYCkuIFVubGlrZSB7QGxpbmsgaXNTZXJ2aWNlUHJpbmNpcGFsfVxuICogKHdoaWNoIHJlYWRzIHRoZSBhbHJlYWR5LXBvcHVsYXRlZCBgcmVxLnVzZXJgKSwgdGhpcyB2ZXJpZmllcyB0aGUgYmVhcmVyIHRva2VuXG4gKiBpdHNlbGYsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbCBCRUZPUkUgYHJlcXVpcmVBdXRoYCBydW5zIOKAlCBlLmcuIHRoZSBnbG9iYWwgcmF0ZVxuICogbGltaXRlcidzIGBza2lwYCwgd2hpY2ggbXVzdCBub3QgdHJ1c3QgdGhlIHNwb29mYWJsZSBgeC1pbnRlcm5hbC1zZXJ2aWNlYFxuICogaGVhZGVyLiBNaXJyb3JzIGByZXF1aXJlQXV0aGAncyBTRVJWSUNFIGNoYWluIGV4YWN0bHkgKHRoZSBzaWduZXIncyBvd24ga2V5LFxuICogcmVzb2x2ZWQgYnkgYGtpZGAsIHdpdGggdGhlIGBzdWJgL3NpZ25lciBhZ3JlZW1lbnQgY2hlY2sgYW5kIHRoZSBvcHRpb25hbFxuICogaXNzdWVyL2F1ZGllbmNlKSBhbmQgcmV0dXJucyBgZmFsc2VgIG9uIGFueSBtaXNzaW5nL2ludmFsaWQvbm9uLXNlcnZpY2UgdG9rZW5cbiAqIOKAlCBpbmNsdWRpbmcgYW55IHBsYXRmb3JtLXNpZ25lZCBVU0VSIHRva2VuLCB3aG9zZSBga2lkYCBpcyBub3QgaW4gdGhlIHNlcnZpY2VcbiAqIGJ1bmRsZSBhdCBhbGwuIFN0YXlzIFNZTkNIUk9OT1VTLCB3aGljaCBpcyB3aHkgdGhlIHBlci1zZXJ2aWNlIHB1YmxpYyBrZXlzIGFyZVxuICogZGlzdHJpYnV0ZWQgYXMgYSBtb3VudGVkIGJ1bmRsZSByYXRoZXIgdGhhbiBmZXRjaGVkIG92ZXIgSFRUUC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwocmVxOiBSZXF1ZXN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnRzID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoJyAnKTtcbiAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggIT09IDIgfHwgcGFydHNbMF0gIT09ICdCZWFyZXInKSByZXR1cm4gZmFsc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgaGVhZGVyID0gZGVjb2RlSnd0SGVhZGVyKHBhcnRzWzFdKTtcbiAgICBpZiAoIWhlYWRlcj8ua2lkIHx8ICFpc1NlcnZpY2VLaWQoaGVhZGVyLmtpZCkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBkZWNvZGVkID0gdmVyaWZ5U2VydmljZUp3dDxKd3RQYXlsb2FkPihwYXJ0c1sxXSwgeyBraWQ6IGhlYWRlci5raWQsIC4uLmlzc3VlckF1ZGllbmNlT3B0aW9ucygpIH0pO1xuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnIHx8IGRlY29kZWQucHJpbmNpcGFsVHlwZSAhPT0gJ3NlcnZpY2UnIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gQSBkZW55bGlzdGVkIChraWxsZWQpIHNlcnZpY2UgbXVzdCBOT1QgYmUgdHJlYXRlZCBhcyBhIHRydXN0ZWQgcHJpbmNpcGFsIOKAlFxuICAgIC8vIG90aGVyd2lzZSBpdCBrZWVwcyB0aGUgcmF0ZS1saW1pdGVyIGV4ZW1wdGlvbiBldmVuIHRob3VnaCByZXF1aXJlQXV0aCByZWplY3RzXG4gICAgLy8gaXQgb24gcmVhbCByb3V0ZXMuIEZvbGQgdGhlIGtpbGwtc3dpdGNoIGludG8gdGhlIHByZS1hdXRoIGNoZWNrIHRvby5cbiAgICByZXR1cm4gIWlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -31,11 +31,14 @@ export type RouteGate = {
31
31
  methods?: readonly string[];
32
32
  }
33
33
  /** The whole SESSION must be MFA-grade (`requireAuth({ minAssurance })`), and
34
- * optionally no older than `maxAge` seconds. */
34
+ * optionally no older than `maxAge` seconds. `exempt` names a carve-out the
35
+ * gate applies to a narrow class of request (see `AssuranceOptions.exempt`),
36
+ * so a route whose level is conditional says so on the table. */
35
37
  | {
36
38
  kind: 'assurance';
37
39
  minAssurance: 1 | 2;
38
40
  maxAge?: number;
41
+ exempt?: string;
39
42
  }
40
43
  /** The session must be MFA-grade WHEN the org's `adminActionsRequireMfa`
41
44
  * policy is on (`requireOrgAdminAssurance`). `machines` says what a machine
@@ -99,6 +102,13 @@ export interface RouteTableEntry {
99
102
  minAssurance: 0 | 1 | 2;
100
103
  /** Tightest `maxAge` (seconds) any assurance gate in the chain demands. */
101
104
  maxAge?: number;
105
+ /**
106
+ * The named carve-outs the chain's assurance gates allow (sorted). Absent when
107
+ * there are none, so a table of routes without one is unchanged. A reviewer
108
+ * reading `minAssurance: 2` next to `assuranceExempt: ["bootstrap-setup"]`
109
+ * knows the level is required of everyone EXCEPT that named case.
110
+ */
111
+ assuranceExempt?: string[];
102
112
  /**
103
113
  * Present when the route requires an MFA-grade session WHEN the org's
104
114
  * `adminActionsRequireMfa` policy is on (`requireOrgAdminAssurance`), with
@@ -145,6 +145,9 @@ function toEntry(method, path, gates) {
145
145
  entry.minAssurance = g.minAssurance;
146
146
  if (g.maxAge !== undefined)
147
147
  entry.maxAge = entry.maxAge === undefined ? g.maxAge : Math.min(entry.maxAge, g.maxAge);
148
+ if (g.exempt !== undefined) {
149
+ entry.assuranceExempt = [...new Set([...(entry.assuranceExempt ?? []), g.exempt])].sort();
150
+ }
148
151
  break;
149
152
  case 'orgAdminAssurance':
150
153
  // Strictest wins: one `refuse` in the chain refuses machines.
@@ -233,4 +236,4 @@ export function summarizeRouteTable(table) {
233
236
  internal: table.filter((e) => e.internalCallers.length > 0).length,
234
237
  };
235
238
  }
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9yb3V0ZS10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBa0M5QixzRUFBc0U7QUFDdEUsaUVBQWlFO0FBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFJekU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFtQixFQUFLLEVBQUUsR0FBRyxLQUFrQjtJQUN6RSxNQUFNLENBQUMsR0FBRyxFQUFnQixDQUFDO0lBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkksT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBVztJQUN2QyxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxPQUFRLEVBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7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cEUsQ0FBQztBQUVELDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBaUM7SUFDbkUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFrQixFQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUM7SUFDL0csTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVELE9BQU87UUFDTCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDcEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDOUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDNUQsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU07S0FDbkUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBJbnRyb3NwZWN0YWJsZSByb3V0ZSB0YWJsZS5cbiAqXG4gKiBBdXRob3JpemF0aW9uIGlzIHNwbGl0IGJldHdlZW4gcm91dGVyIG1vdW50cyAoYGFwcC51c2UoJy94JywgZ2F0ZSwgcm91dGVyKWApXG4gKiBhbmQgaW5kaXZpZHVhbCByb3V0ZXMsIHNvIGdyZXBwaW5nIHNvdXJjZSBjYW4ndCBwcm92ZSB0aGF0IGV2ZXJ5IHJvdXRlIGlzXG4gKiBnYXRlZC4gSW5zdGVhZCwgZXZlcnkgZ2F0ZSBtaWRkbGV3YXJlIGluIHRoaXMgcGFja2FnZSBjYXJyaWVzIE1FVEFEQVRBICh3aGF0IGl0XG4gKiByZXF1aXJlcyksIGFuZCB7QGxpbmsgYnVpbGRSb3V0ZVRhYmxlfSB3YWxrcyBhbiBhc3NlbWJsZWQgRXhwcmVzcyBhcHAgYW5kXG4gKiByZXNvbHZlcywgcGVyIG1ldGhvZCArIHBhdGgsIHRoZSBmdWxsIGNoYWluIG9mIGdhdGVzIEV4cHJlc3Mgd291bGQgcnVuIGJlZm9yZVxuICogdGhlIGhhbmRsZXI6IHBlcm1pc3Npb25zLCBzeXN0ZW0tYWRtaW4sIHNlcnZpY2UgcHJpbmNpcGFsLCBzdGVwLXVwLCBmZWF0dXJlLFxuICogdG9rZW4gc2NvcGUsIGFuZCB0aGUgYXVkaXQgYWN0aW9ucyB0aGUgcm91dGUgZGVjbGFyZXMgdmlhIHtAbGluayBhdWRpdGVkfS5cbiAqXG4gKiBFeHByZXNzIDUgKHJvdXRlckAyKSBkb2VzIG5vdCBrZWVwIGEgbW91bnQncyBwYXRoIHN0cmluZyBvbiBpdHMgbGF5ZXIsIHNvIHRoaXNcbiAqIG1vZHVsZSByZWNvcmRzIGl0OiBvbiBpbXBvcnQgaXQgd3JhcHMgYFJvdXRlci5wcm90b3R5cGUudXNlYCB0byBzdGFtcCBlYWNoIG5ld1xuICogbGF5ZXIgd2l0aCB0aGUgcGF0aCBpdCB3YXMgbW91bnRlZCBhdC4gYXBpLWNvcmUgaXMgaW1wb3J0ZWQgYmVmb3JlIGFueSByb3V0ZVxuICogbW9kdWxlIHJlZ2lzdGVycyBhIHJvdXRlLCBzbyBldmVyeSBsYXllciBhbiBhcHAgYnVpbGRzIGlzIHN0YW1wZWQuIFRoZSB3cmFwXG4gKiBvbmx5IGFkZHMgYSBzeW1ib2wgcHJvcGVydHk7IHJvdXRpbmcgYmVoYXZpb3VyIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcblxuLyoqXG4gKiBXaGF0IGEgTUFDSElORSBjcmVkZW50aWFsIChQQVQsIHNlcnZpY2UgYWNjb3VudCkgbWVldHMgb24gYSByb3V0ZSBnYXRlZCBieVxuICogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgd2hpbGUgdGhlIG9yZydzIGFkbWluLU1GQSBwb2xpY3kgaXMgb246XG4gKiAgIC0gYGFsbG93YCAg4oCUIHRoZSByb3V0ZSBpcyBsZWdpdGltYXRlbHkgbWFjaGluZS1jYWxsYWJsZSAoYXV0b21hdGlvbiB0aGF0XG4gKiAgICAgICAgICAgICAgICBtYW5hZ2VzIG1lbWJlcnMsIHJvbGVzLCBiaWxsaW5n4oCmKTsgdGhlIHBvbGljeSBpcyBhYm91dCBob3dcbiAqICAgICAgICAgICAgICAgIHN0cm9uZ2x5IGEgUEVSU09OJ3Mgc2Vzc2lvbiB3YXMgb3BlbmVkLCBzbyBpdCBkb2VzIG5vdCBhcHBseTtcbiAqICAgLSBgcmVmdXNlYCDigJQgb25seSBhIHBlcnNvbiBtYXkgZG8gdGhpcyB3aGlsZSB0aGUgcG9saWN5IGlzIG9uICg0MDNcbiAqICAgICAgICAgICAgICAgIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCksIGUuZy4gbWludGluZyBhbm90aGVyIGNyZWRlbnRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgPSAnYWxsb3cnIHwgJ3JlZnVzZSc7XG5cbi8qKiBPbmUgcmVxdWlyZW1lbnQgYSBnYXRlIG1pZGRsZXdhcmUgZW5mb3JjZXMuICovXG5leHBvcnQgdHlwZSBSb3V0ZUdhdGUgPVxuICB8IHsga2luZDogJ2F1dGgnIH1cbiAgfCB7IGtpbmQ6ICdwZXJtaXNzaW9uJzsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlPzogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiAnc3lzdGVtQWRtaW4nIH1cbiAgfCB7IGtpbmQ6ICdzZXJ2aWNlUHJpbmNpcGFsJyB9XG4gIC8qKiBBbiBJTlRFUk5BTCByb3V0ZTogdXNlciB0b2tlbnMgcmVmdXNlZCBvdXRyaWdodCwgb25seSB0aGVzZSBzZXJ2aWNlcyBhZG1pdHRlZC4gKi9cbiAgfCB7IGtpbmQ6ICdpbnRlcm5hbFNlcnZpY2UnOyBjYWxsZXJzOiByZWFkb25seSBzdHJpbmdbXSB9XG4gIHwgeyBraW5kOiAnc3RlcFVwJzsgbWV0aG9kcz86IHJlYWRvbmx5IHN0cmluZ1tdIH1cbiAgLyoqIFRoZSB3aG9sZSBTRVNTSU9OIG11c3QgYmUgTUZBLWdyYWRlIChgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UgfSlgKSwgYW5kXG4gICAqICBvcHRpb25hbGx5IG5vIG9sZGVyIHRoYW4gYG1heEFnZWAgc2Vjb25kcy4gKi9cbiAgfCB7IGtpbmQ6ICdhc3N1cmFuY2UnOyBtaW5Bc3N1cmFuY2U6IDEgfCAyOyBtYXhBZ2U/OiBudW1iZXIgfVxuICAvKiogVGhlIHNlc3Npb24gbXVzdCBiZSBNRkEtZ3JhZGUgV0hFTiB0aGUgb3JnJ3MgYGFkbWluQWN0aW9uc1JlcXVpcmVNZmFgXG4gICAqICBwb2xpY3kgaXMgb24gKGByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2VgKS4gYG1hY2hpbmVzYCBzYXlzIHdoYXQgYSBtYWNoaW5lXG4gICAqICBjcmVkZW50aWFsIG1lZXRzIG9uIHRoZSByb3V0ZSB3aGlsZSB0aGUgcG9saWN5IGlzIG9uLiAqL1xuICB8IHsga2luZDogJ29yZ0FkbWluQXNzdXJhbmNlJzsgbWFjaGluZXM6IE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgfVxuICB8IHsga2luZDogJ2ZlYXR1cmUnOyBmZWF0dXJlOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ3Njb3BlJzsgc2NvcGU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnYXVkaXQnOyBhY3Rpb25zOiByZWFkb25seSBzdHJpbmdbXSB9O1xuXG4vLyBTeW1ib2wuZm9yLCBub3QgU3ltYm9sKCk6IGEgdGVzdCB0aGF0IGxvYWRzIGFwaS1jb3JlIHR3aWNlIChFU00gKyBhXG4vLyByZXF1aXJlQWN0dWFsIGNvcHkpIG11c3Qgc3RpbGwgc2VlIHRhZ3Mgc2V0IGJ5IHRoZSBvdGhlciBjb3B5LlxuY29uc3QgR0FURVMgPSBTeW1ib2wuZm9yKCdwaXBlbGluZS1idWlsZGVyLnJvdXRlLWdhdGVzJyk7XG5jb25zdCBMQVlFUl9QQVRIID0gU3ltYm9sLmZvcigncGlwZWxpbmUtYnVpbGRlci5sYXllci1wYXRoJyk7XG5jb25zdCBSRUNPUkRFUl9JTlNUQUxMRUQgPSBTeW1ib2wuZm9yKCdwaXBlbGluZS1idWlsZGVyLnJvdXRlLXJlY29yZGVyJyk7XG5cbnR5cGUgVGFnZ2VkID0geyBbR0FURVNdPzogUm91dGVHYXRlW10gfTtcblxuLyoqXG4gKiBBdHRhY2ggZ2F0ZSBtZXRhZGF0YSB0byBhIG1pZGRsZXdhcmUgZnVuY3Rpb24gKGFwcGVuZHMgdG8gYW55IGV4aXN0aW5nIHRhZ3MpXG4gKiBhbmQgcmV0dXJuIHRoZSBzYW1lIGZ1bmN0aW9uLiBVc2UgaXQgZm9yIGEgc2VydmljZS1sb2NhbCBnYXRlIHNvIHRoZSByb3V0ZVxuICogdGFibGUga25vd3Mgd2hhdCBpdCBlbmZvcmNlcyDigJQgZS5nLiBhIGhhbmRsZXItbGV2ZWwgYHJlcXVpcmVDb21wbGlhbmNlV3JpdGVgXG4gKiB0YWdnZWQgYHsga2luZDogJ3Blcm1pc3Npb24nLCBtb2RlOiAnYW55JywgcGVybWlzc2lvbnM6IFsnY29tcGxpYW5jZTp3cml0ZSddIH1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnUm91dGVHYXRlPFQgZXh0ZW5kcyBvYmplY3Q+KGZuOiBULCAuLi5nYXRlczogUm91dGVHYXRlW10pOiBUIHtcbiAgY29uc3QgdCA9IGZuIGFzIFQgJiBUYWdnZWQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBHQVRFUywgeyB2YWx1ZTogWy4uLih0W0dBVEVTXSA/PyBbXSksIC4uLmdhdGVzXSwgY29uZmlndXJhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIHJldHVybiBmbjtcbn1cblxuLyoqIFRoZSBnYXRlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGEgbWlkZGxld2FyZSBmdW5jdGlvbiAoZW1wdHkgd2hlbiB1bnRhZ2dlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGVHYXRlcyhmbjogdW5rbm93bik6IHJlYWRvbmx5IFJvdXRlR2F0ZVtdIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFtdO1xuICByZXR1cm4gKGZuIGFzIFRhZ2dlZClbR0FURVNdID8/IFtdO1xufVxuXG4vKipcbiAqIERlY2xhcmUgdGhlIGF1ZGl0IGFjdGlvbihzKSBhIHJvdXRlIGVtaXRzLiBBIG5vLW9wIG1pZGRsZXdhcmUgd2hvc2Ugb25seSBqb2JcbiAqIGlzIHRvIHB1dCB0aGUgYWN0aW9uIG9uIHRoZSByb3V0ZSB0YWJsZSwgc28gdGhlIGNvdmVyYWdlIHRlc3QgY2FuIHJlcXVpcmUgYW5cbiAqIGF1ZGl0IGRlY2xhcmF0aW9uIG9uIGV2ZXJ5IHdyaXRlIHJvdXRlLiBQbGFjZSBpdCBpbiB0aGUgcm91dGUncyBjaGFpbjpcbiAqIGByb3V0ZXIucG9zdCgnLycsIGF1ZGl0ZWQoJ3BpcGVsaW5lLmNyZWF0ZScpLCBoYW5kbGVyKWAuIFRoZSBoYW5kbGVyIHN0aWxsXG4gKiBlbWl0cyB0aGUgZXZlbnQgaXRzZWxmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXVkaXRlZCguLi5hY3Rpb25zOiBzdHJpbmdbXSk6IChyZXE6IHVua25vd24sIHJlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgPT4gdm9pZCB7XG4gIHJldHVybiB0YWdSb3V0ZUdhdGUoZnVuY3Rpb24gYXVkaXRlZFJvdXRlKF9yZXE6IHVua25vd24sIF9yZXM6IHVua25vd24sIG5leHQ6ICgpID0+IHZvaWQpIHsgbmV4dCgpOyB9LCB7IGtpbmQ6ICdhdWRpdCcsIGFjdGlvbnMgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW91bnQtcGF0aCByZWNvcmRpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbnRlcmZhY2UgTGF5ZXIge1xuICBoYW5kbGU6IHVua25vd247XG4gIHJvdXRlPzogeyBwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXTsgbWV0aG9kczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47IHN0YWNrOiBBcnJheTx7IG1ldGhvZD86IHN0cmluZzsgaGFuZGxlOiB1bmtub3duIH0+IH07XG4gIG1hdGNoZXJzOiBBcnJheTwocGF0aDogc3RyaW5nKSA9PiB1bmtub3duPjtcbiAgLyoqIHJvdXRlckAyJ3MgXCJtb3VudGVkIGF0ICcvJyB3aXRoIGVuZDpmYWxzZVwiIGZhc3QgcGF0aCDigJQgbWF0Y2hlcyBBTlkgcGF0aC4gKi9cbiAgc2xhc2g/OiBib29sZWFuO1xuICBbTEFZRVJfUEFUSF0/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3V0ZXJMaWtlIHsgc3RhY2s6IExheWVyW10gfVxuXG5mdW5jdGlvbiBpbnN0YWxsUm91dGVSZWNvcmRlcigpOiB2b2lkIHtcbiAgY29uc3QgcHJvdG8gPSAoZXhwcmVzcy5Sb3V0ZXIgYXMgdW5rbm93biBhcyB7IHByb3RvdHlwZTogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gfSkucHJvdG90eXBlO1xuICBpZiAocHJvdG9bUkVDT1JERVJfSU5TVEFMTEVEXSkgcmV0dXJuO1xuICBjb25zdCBvcmlnaW5hbFVzZSA9IHByb3RvLnVzZSBhcyAodGhpczogUm91dGVyTGlrZSwgLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICBwcm90by51c2UgPSBmdW5jdGlvbiByZWNvcmRpbmdVc2UodGhpczogUm91dGVyTGlrZSwgLi4uYXJnczogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5zdGFjay5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxVc2UuYXBwbHkodGhpcywgYXJncyk7XG4gICAgLy8gU2FtZSBwYXRoIGRpc2FtYmlndWF0aW9uIGFzIHJvdXRlckAyJ3MgYHVzZWA6IGEgbGVhZGluZyBub24tZnVuY3Rpb25cbiAgICAvLyAocG9zc2libHkgbmVzdGVkIGluIGFycmF5cykgaXMgdGhlIHBhdGg7IG90aGVyd2lzZSB0aGUgbW91bnQgaXMgJy8nLlxuICAgIGxldCBmaXJzdDogdW5rbm93biA9IGFyZ3NbMF07XG4gICAgd2hpbGUgKEFycmF5LmlzQXJyYXkoZmlyc3QpICYmIGZpcnN0Lmxlbmd0aCA+IDApIGZpcnN0ID0gZmlyc3RbMF07XG4gICAgY29uc3QgcGF0aCA9IHR5cGVvZiBmaXJzdCA9PT0gJ2Z1bmN0aW9uJyA/ICcvJyA6IFN0cmluZyhhcmdzWzBdKTtcbiAgICBmb3IgKGxldCBpID0gYmVmb3JlOyBpIDwgdGhpcy5zdGFjay5sZW5ndGg7IGkrKykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuc3RhY2tbaV0sIExBWUVSX1BBVEgsIHsgdmFsdWU6IHBhdGgsIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgUkVDT1JERVJfSU5TVEFMTEVELCB7IHZhbHVlOiB0cnVlLCBlbnVtZXJhYmxlOiBmYWxzZSB9KTtcbn1cblxuaW5zdGFsbFJvdXRlUmVjb3JkZXIoKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBUYWJsZSBjb25zdHJ1Y3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogUmVzb2x2ZWQgcmVxdWlyZW1lbnRzIGZvciBvbmUgbWV0aG9kICsgcGF0aC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVUYWJsZUVudHJ5IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIEF1dGhlbnRpY2F0aW9uIHJ1bnMgYmVmb3JlIHRoZSBoYW5kbGVyIChyZXF1aXJlQXV0aCkuICovXG4gIGF1dGg6IGJvb2xlYW47XG4gIC8qKiBFYWNoIHBlcm1pc3Npb24gZ2F0ZSBpbiB0aGUgY2hhaW4gKGFsbCBtdXN0IHBhc3M7IGVhY2ggaXMgYW55LW9mIG9yIGFsbC1vZikuICovXG4gIHBlcm1pc3Npb25zOiBBcnJheTx7IG1vZGU6ICdhbnknIHwgJ2FsbCc7IHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW107IGFsbG93U2VydmljZTogYm9vbGVhbiB9PjtcbiAgc3lzdGVtQWRtaW46IGJvb2xlYW47XG4gIHNlcnZpY2VQcmluY2lwYWw6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgc2VydmljZXMgYWxsb3dlZCB0byBjYWxsIHRoaXMgcm91dGUgd2hlbiBpdCBpcyBJTlRFUk5BTCAoYHJlcXVpcmVJbnRlcm5hbFNlcnZpY2VgKS5cbiAgICogQW4gZW1wdHkgYXJyYXkgbWVhbnMgdGhlIHJvdXRlIGlzIG5vdCBpbnRlcm5hbCDigJQgYSB1c2VyIHRva2VuIG1heSByZWFjaCBpdCxcbiAgICogc3ViamVjdCB0byB0aGUgb3RoZXIgZ2F0ZXMuIFNvcnRlZCwgc28gdGhlIGdlbmVyYXRlZCB0YWJsZSBpcyBzdGFibGUuXG4gICAqL1xuICBpbnRlcm5hbENhbGxlcnM6IHN0cmluZ1tdO1xuICBzdGVwVXA6IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRoZSBzdGVwLXVwIGdhdGUgbmFtZXMgdGhlIGZhY3RvcnMgdGhhdCBtYXkgZWFybiBpdCAoYFsnd2ViYXV0aG4nLFxuICAgKiAgJ3RvdHAnXWAgb24gdGhlIG1vc3QgZGFuZ2Vyb3VzIHJvdXRlcyksIHRoZSBhbGxvd2VkIG1ldGhvZHMuIEVtcHR5IG1lYW5zXG4gICAqICBhbnkgZmFjdG9yIHNhdGlzZmllcyBpdC4gU29ydGVkLCBzbyB0aGUgZ2VuZXJhdGVkIHRhYmxlIGlzIHN0YWJsZS4gKi9cbiAgc3RlcFVwTWV0aG9kczogc3RyaW5nW107XG4gIC8qKiBIaWdoZXN0IGBtaW5Bc3N1cmFuY2VgIGFueSBnYXRlIGluIHRoZSBjaGFpbiBkZW1hbmRzOyAwIHdoZW4gbm9uZSBkb2VzLiAqL1xuICBtaW5Bc3N1cmFuY2U6IDAgfCAxIHwgMjtcbiAgLyoqIFRpZ2h0ZXN0IGBtYXhBZ2VgIChzZWNvbmRzKSBhbnkgYXNzdXJhbmNlIGdhdGUgaW4gdGhlIGNoYWluIGRlbWFuZHMuICovXG4gIG1heEFnZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFByZXNlbnQgd2hlbiB0aGUgcm91dGUgcmVxdWlyZXMgYW4gTUZBLWdyYWRlIHNlc3Npb24gV0hFTiB0aGUgb3JnJ3NcbiAgICogYGFkbWluQWN0aW9uc1JlcXVpcmVNZmFgIHBvbGljeSBpcyBvbiAoYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWApLCB3aXRoXG4gICAqIHdoYXQgYSBtYWNoaW5lIGNyZWRlbnRpYWwgbWVldHMgdGhlcmUuIEFic2VudCAobm90IGBmYWxzZWApIG90aGVyd2lzZSwgc29cbiAgICogdGhlIHRhYmxlIG9mIGEgc2VydmljZSB0aGF0IHVzZXMgbm8gc3VjaCBnYXRlIGlzIHVuY2hhbmdlZC5cbiAgICovXG4gIG9yZ0FkbWluQXNzdXJhbmNlPzogeyBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcyB9O1xuICBmZWF0dXJlczogc3RyaW5nW107XG4gIHNjb3Blczogc3RyaW5nW107XG4gIGF1ZGl0OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIENhbmRpZGF0ZSB7IGxheWVyOiBMYXllcjsgcHJlZml4OiBzdHJpbmcgfVxuXG5mdW5jdGlvbiBqb2luUGF0aChwcmVmaXg6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgam9pbmVkID0gYCR7cHJlZml4LnJlcGxhY2UoL1xcLyskLywgJycpfS8ke3BhdGgucmVwbGFjZSgvXlxcLysvLCAnJyl9YDtcbiAgcmV0dXJuIGpvaW5lZC5sZW5ndGggPiAxID8gam9pbmVkLnJlcGxhY2UoL1xcLyskLywgJycpIDogJy8nO1xufVxuXG5mdW5jdGlvbiBpc1JvdXRlcihoYW5kbGU6IHVua25vd24pOiBoYW5kbGUgaXMgUm91dGVyTGlrZSB7XG4gIHJldHVybiB0eXBlb2YgaGFuZGxlID09PSAnZnVuY3Rpb24nICYmIEFycmF5LmlzQXJyYXkoKGhhbmRsZSBhcyBQYXJ0aWFsPFJvdXRlckxpa2U+KS5zdGFjayk7XG59XG5cbi8qKlxuICogV2hldGhlciBhIG1pZGRsZXdhcmUgbGF5ZXIgKG1vdW50ZWQgdW5kZXIgYHByZWZpeGApIHJ1bnMgZm9yIGBmdWxsUGF0aGAuXG4gKiBNaXJyb3JzIGBMYXllci5wcm90b3R5cGUubWF0Y2hgLCBpbmNsdWRpbmcgaXRzIGZhc3QgcGF0aDogYSBsYXllciBhZGRlZCB3aXRoXG4gKiBubyBwYXRoIChgcm91dGVyLnVzZShnYXRlKWApIG1hdGNoZXMgRVZFUlkgcGF0aCB1bmRlciBpdHMgcm91dGVyIOKAlCB3aGljaCBpc1xuICogZXhhY3RseSBob3cgdGhlIHNoYXJlZCBgcmVxdWlyZVBlcm1pc3Npb25gIGdhdGVzIGJldHdlZW4gdHdvIGByb3V0ZXIudXNlKC4uLilgXG4gKiBtb3VudHMgcmVhY2ggdGhlIHJvdXRlcnMgcmVnaXN0ZXJlZCBhZnRlciB0aGVtLlxuICovXG5mdW5jdGlvbiBhcHBsaWVzKGM6IENhbmRpZGF0ZSwgZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlID0gYy5wcmVmaXggPT09ICcvJyA/ICcnIDogYy5wcmVmaXg7XG4gIGlmIChiYXNlICYmIGZ1bGxQYXRoICE9PSBiYXNlICYmICFmdWxsUGF0aC5zdGFydHNXaXRoKGAke2Jhc2V9L2ApKSByZXR1cm4gZmFsc2U7XG4gIGlmIChjLmxheWVyLnNsYXNoKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgcmVsID0gZnVsbFBhdGguc2xpY2UoYmFzZS5sZW5ndGgpIHx8ICcvJztcbiAgcmV0dXJuIGMubGF5ZXIubWF0Y2hlcnMuc29tZSgobSkgPT4gbShyZWwpICE9PSBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RHYXRlcyhmbnM6IHVua25vd25bXSk6IFJvdXRlR2F0ZVtdIHtcbiAgcmV0dXJuIGZucy5mbGF0TWFwKChmbikgPT4gZ2V0Um91dGVHYXRlcyhmbikpO1xufVxuXG5mdW5jdGlvbiB0b0VudHJ5KG1ldGhvZDogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIGdhdGVzOiBSb3V0ZUdhdGVbXSk6IFJvdXRlVGFibGVFbnRyeSB7XG4gIGNvbnN0IGVudHJ5OiBSb3V0ZVRhYmxlRW50cnkgPSB7XG4gICAgbWV0aG9kLFxuICAgIHBhdGgsXG4gICAgYXV0aDogZmFsc2UsXG4gICAgcGVybWlzc2lvbnM6IFtdLFxuICAgIHN5c3RlbUFkbWluOiBmYWxzZSxcbiAgICBzZXJ2aWNlUHJpbmNpcGFsOiBmYWxzZSxcbiAgICBpbnRlcm5hbENhbGxlcnM6IFtdLFxuICAgIHN0ZXBVcDogZmFsc2UsXG4gICAgc3RlcFVwTWV0aG9kczogW10sXG4gICAgbWluQXNzdXJhbmNlOiAwLFxuICAgIGZlYXR1cmVzOiBbXSxcbiAgICBzY29wZXM6IFtdLFxuICAgIGF1ZGl0OiBbXSxcbiAgfTtcbiAgZm9yIChjb25zdCBnIG9mIGdhdGVzKSB7XG4gICAgc3dpdGNoIChnLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2F1dGgnOiBlbnRyeS5hdXRoID0gdHJ1ZTsgYnJlYWs7XG4gICAgICBjYXNlICdwZXJtaXNzaW9uJzogZW50cnkucGVybWlzc2lvbnMucHVzaCh7IG1vZGU6IGcubW9kZSwgcGVybWlzc2lvbnM6IFsuLi5nLnBlcm1pc3Npb25zXSwgYWxsb3dTZXJ2aWNlOiBnLmFsbG93U2VydmljZSA9PT0gdHJ1ZSB9KTsgYnJlYWs7XG4gICAgICBjYXNlICdzeXN0ZW1BZG1pbic6IGVudHJ5LnN5c3RlbUFkbWluID0gdHJ1ZTsgYnJlYWs7XG4gICAgICBjYXNlICdzZXJ2aWNlUHJpbmNpcGFsJzogZW50cnkuc2VydmljZVByaW5jaXBhbCA9IHRydWU7IGJyZWFrO1xuICAgICAgY2FzZSAnaW50ZXJuYWxTZXJ2aWNlJzogZm9yIChjb25zdCBjIG9mIGcuY2FsbGVycykgaWYgKCFlbnRyeS5pbnRlcm5hbENhbGxlcnMuaW5jbHVkZXMoYykpIGVudHJ5LmludGVybmFsQ2FsbGVycy5wdXNoKGMpOyBicmVhaztcbiAgICAgIGNhc2UgJ3N0ZXBVcCc6XG4gICAgICAgIGVudHJ5LnN0ZXBVcCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBnLm1ldGhvZHMgPz8gW10pIGlmICghZW50cnkuc3RlcFVwTWV0aG9kcy5pbmNsdWRlcyhtKSkgZW50cnkuc3RlcFVwTWV0aG9kcy5wdXNoKG0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Fzc3VyYW5jZSc6XG4gICAgICAgIC8vIFNldmVyYWwgZ2F0ZXMgbWF5IGFwcGx5OyB0aGUgU1RSSUNURVNUIHdpbnMsIHNpbmNlIGV2ZXJ5IG9uZSBvZiB0aGVtIHJ1bnMuXG4gICAgICAgIGlmIChnLm1pbkFzc3VyYW5jZSA+IGVudHJ5Lm1pbkFzc3VyYW5jZSkgZW50cnkubWluQXNzdXJhbmNlID0gZy5taW5Bc3N1cmFuY2U7XG4gICAgICAgIGlmIChnLm1heEFnZSAhPT0gdW5kZWZpbmVkKSBlbnRyeS5tYXhBZ2UgPSBlbnRyeS5tYXhBZ2UgPT09IHVuZGVmaW5lZCA/IGcubWF4QWdlIDogTWF0aC5taW4oZW50cnkubWF4QWdlLCBnLm1heEFnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3JnQWRtaW5Bc3N1cmFuY2UnOlxuICAgICAgICAvLyBTdHJpY3Rlc3Qgd2luczogb25lIGByZWZ1c2VgIGluIHRoZSBjaGFpbiByZWZ1c2VzIG1hY2hpbmVzLlxuICAgICAgICBlbnRyeS5vcmdBZG1pbkFzc3VyYW5jZSA9IHtcbiAgICAgICAgICBtYWNoaW5lczogZW50cnkub3JnQWRtaW5Bc3N1cmFuY2U/Lm1hY2hpbmVzID09PSAncmVmdXNlJyB8fCBnLm1hY2hpbmVzID09PSAncmVmdXNlJyA/ICdyZWZ1c2UnIDogJ2FsbG93JyxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmZWF0dXJlJzogaWYgKCFlbnRyeS5mZWF0dXJlcy5pbmNsdWRlcyhnLmZlYXR1cmUpKSBlbnRyeS5mZWF0dXJlcy5wdXNoKGcuZmVhdHVyZSk7IGJyZWFrO1xuICAgICAgY2FzZSAnc2NvcGUnOiBpZiAoIWVudHJ5LnNjb3Blcy5pbmNsdWRlcyhnLnNjb3BlKSkgZW50cnkuc2NvcGVzLnB1c2goZy5zY29wZSk7IGJyZWFrO1xuICAgICAgY2FzZSAnYXVkaXQnOiBmb3IgKGNvbnN0IGEgb2YgZy5hY3Rpb25zKSBpZiAoIWVudHJ5LmF1ZGl0LmluY2x1ZGVzKGEpKSBlbnRyeS5hdWRpdC5wdXNoKGEpOyBicmVhaztcbiAgICB9XG4gIH1cbiAgZW50cnkuaW50ZXJuYWxDYWxsZXJzLnNvcnQoKTtcbiAgZW50cnkuc3RlcFVwTWV0aG9kcy5zb3J0KCk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuZnVuY3Rpb24gd2FsayhzdGFjazogTGF5ZXJbXSwgcHJlZml4OiBzdHJpbmcsIGluaGVyaXRlZDogQ2FuZGlkYXRlW10sIG91dDogUm91dGVUYWJsZUVudHJ5W10sIHNlZW46IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsOiBDYW5kaWRhdGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0YWNrKSB7XG4gICAgaWYgKGxheWVyLnJvdXRlKSB7XG4gICAgICBjb25zdCBwYXRocyA9IEFycmF5LmlzQXJyYXkobGF5ZXIucm91dGUucGF0aCkgPyBsYXllci5yb3V0ZS5wYXRoIDogW2xheWVyLnJvdXRlLnBhdGhdO1xuICAgICAgY29uc3QgbWV0aG9kcyA9IE9iamVjdC5rZXlzKGxheWVyLnJvdXRlLm1ldGhvZHMpLm1hcCgobSkgPT4gKG0gPT09ICdfYWxsJyA/ICcqJyA6IG0udG9VcHBlckNhc2UoKSkpO1xuICAgICAgZm9yIChjb25zdCByb3V0ZVBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgY29uc3QgZnVsbCA9IGpvaW5QYXRoKHByZWZpeCwgU3RyaW5nKHJvdXRlUGF0aCkpO1xuICAgICAgICBjb25zdCBjaGFpbiA9IFsuLi5pbmhlcml0ZWQsIC4uLmxvY2FsXS5maWx0ZXIoKGMpID0+IGFwcGxpZXMoYywgZnVsbCkpLm1hcCgoYykgPT4gYy5sYXllci5oYW5kbGUpO1xuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYCR7bWV0aG9kfSAke2Z1bGx9YDtcbiAgICAgICAgICAvLyBGaXJzdCByZWdpc3RyYXRpb24gd2lucywgYXMgaW4gRXhwcmVzczogYSBsYXRlciBkdXBsaWNhdGUgaXMgdW5yZWFjaGFibGUuXG4gICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgICAgY29uc3Qgcm91dGVGbnMgPSBsYXllci5yb3V0ZS5zdGFja1xuICAgICAgICAgICAgLmZpbHRlcigobCkgPT4gbC5tZXRob2QgPT09IHVuZGVmaW5lZCB8fCBsLm1ldGhvZC50b1VwcGVyQ2FzZSgpID09PSBtZXRob2QgfHwgbWV0aG9kID09PSAnKicpXG4gICAgICAgICAgICAubWFwKChsKSA9PiBsLmhhbmRsZSk7XG4gICAgICAgICAgb3V0LnB1c2godG9FbnRyeShtZXRob2QsIGZ1bGwsIGNvbGxlY3RHYXRlcyhbLi4uY2hhaW4sIC4uLnJvdXRlRm5zXSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNSb3V0ZXIobGF5ZXIuaGFuZGxlKSkge1xuICAgICAgY29uc3QgbW91bnRQYXRoID0gam9pblBhdGgocHJlZml4LCBsYXllcltMQVlFUl9QQVRIXSA/PyAnLycpO1xuICAgICAgLy8gTWlkZGxld2FyZSB0aGF0IHJ1bnMgYmVmb3JlIHRoaXMgcm91dGVyIChhbmNlc3RvcnMgKyBlYXJsaWVyIHNpYmxpbmdzKVxuICAgICAgLy8gaXMgaW5oZXJpdGVkOyBhcHBsaWNhYmlsaXR5IGlzIHJlLWNoZWNrZWQgYWdhaW5zdCBlYWNoIGZ1bGwgcm91dGUgcGF0aC5cbiAgICAgIHdhbGsobGF5ZXIuaGFuZGxlLnN0YWNrLCBtb3VudFBhdGgsIFsuLi5pbmhlcml0ZWQsIC4uLmxvY2FsXSwgb3V0LCBzZWVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWwucHVzaCh7IGxheWVyLCBwcmVmaXggfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHJvdXRlIHRhYmxlIG9mIGFuIGFzc2VtYmxlZCBFeHByZXNzIGFwcCAob3Igcm91dGVyKTogb25lIGVudHJ5IHBlclxuICogcmVhY2hhYmxlIG1ldGhvZCArIHBhdGggd2l0aCBldmVyeSBnYXRlIHRoYXQgcnVucyBiZWZvcmUgaXRzIGhhbmRsZXIuXG4gKiBIRUFEIGlzIGZvbGRlZCBpbnRvIEdFVCwgYXMgRXhwcmVzcyBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSb3V0ZVRhYmxlKGFwcDogdW5rbm93bik6IFJvdXRlVGFibGVFbnRyeVtdIHtcbiAgY29uc3Qgcm9vdCA9IChhcHAgYXMgeyByb3V0ZXI/OiBSb3V0ZXJMaWtlIH0pLnJvdXRlciA/PyAoYXBwIGFzIFJvdXRlckxpa2UpO1xuICBjb25zdCBvdXQ6IFJvdXRlVGFibGVFbnRyeVtdID0gW107XG4gIGlmICghcm9vdCB8fCAhQXJyYXkuaXNBcnJheShyb290LnN0YWNrKSkgcmV0dXJuIG91dDtcbiAgd2Fsayhyb290LnN0YWNrLCAnLycsIFtdLCBvdXQsIG5ldyBTZXQoKSk7XG4gIHJldHVybiBvdXQuc29ydCgoYSwgYikgPT4gKGEucGF0aCA9PT0gYi5wYXRoID8gYS5tZXRob2QubG9jYWxlQ29tcGFyZShiLm1ldGhvZCkgOiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgbWV0aG9kIG11dGF0ZXMgc3RhdGUgKGV2ZXJ5dGhpbmcgZXhjZXB0IEdFVC9IRUFEL09QVElPTlMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGVNZXRob2QobWV0aG9kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXS5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSk7XG59XG5cbi8qKiBTdW1tYXJ5IGNvdW50cyBmb3IgYSBzdGFydHVwIGxvZyBsaW5lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVJvdXRlVGFibGUodGFibGU6IHJlYWRvbmx5IFJvdXRlVGFibGVFbnRyeVtdKTogeyByb3V0ZXM6IG51bWJlcjsgd3JpdGVzOiBudW1iZXI7IHVuZ2F0ZWQ6IG51bWJlcjsgdW5hdWRpdGVkOiBudW1iZXI7IGludGVybmFsOiBudW1iZXIgfSB7XG4gIGNvbnN0IGdhdGVkID0gKGU6IFJvdXRlVGFibGVFbnRyeSk6IGJvb2xlYW4gPT4gZS5wZXJtaXNzaW9ucy5sZW5ndGggPiAwIHx8IGUuc3lzdGVtQWRtaW4gfHwgZS5zZXJ2aWNlUHJpbmNpcGFsO1xuICBjb25zdCB3cml0ZXMgPSB0YWJsZS5maWx0ZXIoKGUpID0+IGlzV3JpdGVNZXRob2QoZS5tZXRob2QpKTtcbiAgcmV0dXJuIHtcbiAgICByb3V0ZXM6IHRhYmxlLmxlbmd0aCxcbiAgICB3cml0ZXM6IHdyaXRlcy5sZW5ndGgsXG4gICAgdW5nYXRlZDogdGFibGUuZmlsdGVyKChlKSA9PiAhZ2F0ZWQoZSkpLmxlbmd0aCxcbiAgICB1bmF1ZGl0ZWQ6IHdyaXRlcy5maWx0ZXIoKGUpID0+IGUuYXVkaXQubGVuZ3RoID09PSAwKS5sZW5ndGgsXG4gICAgaW50ZXJuYWw6IHRhYmxlLmZpbHRlcigoZSkgPT4gZS5pbnRlcm5hbENhbGxlcnMubGVuZ3RoID4gMCkubGVuZ3RoLFxuICB9O1xufVxuIl19
239
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS9yb3V0ZS10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUgsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBb0M5QixzRUFBc0U7QUFDdEUsaUVBQWlFO0FBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztBQUN6RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFJekU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFtQixFQUFLLEVBQUUsR0FBRyxLQUFrQjtJQUN6RSxNQUFNLENBQUMsR0FBRyxFQUFnQixDQUFDO0lBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkksT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxhQUFhLENBQUMsRUFBVztJQUN2QyxJQUFJLE9BQU8sRUFBRSxLQUFLLFVBQVU7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN4QyxPQUFRLEVBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQUVEOzs7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Q0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBJbnRyb3NwZWN0YWJsZSByb3V0ZSB0YWJsZS5cbiAqXG4gKiBBdXRob3JpemF0aW9uIGlzIHNwbGl0IGJldHdlZW4gcm91dGVyIG1vdW50cyAoYGFwcC51c2UoJy94JywgZ2F0ZSwgcm91dGVyKWApXG4gKiBhbmQgaW5kaXZpZHVhbCByb3V0ZXMsIHNvIGdyZXBwaW5nIHNvdXJjZSBjYW4ndCBwcm92ZSB0aGF0IGV2ZXJ5IHJvdXRlIGlzXG4gKiBnYXRlZC4gSW5zdGVhZCwgZXZlcnkgZ2F0ZSBtaWRkbGV3YXJlIGluIHRoaXMgcGFja2FnZSBjYXJyaWVzIE1FVEFEQVRBICh3aGF0IGl0XG4gKiByZXF1aXJlcyksIGFuZCB7QGxpbmsgYnVpbGRSb3V0ZVRhYmxlfSB3YWxrcyBhbiBhc3NlbWJsZWQgRXhwcmVzcyBhcHAgYW5kXG4gKiByZXNvbHZlcywgcGVyIG1ldGhvZCArIHBhdGgsIHRoZSBmdWxsIGNoYWluIG9mIGdhdGVzIEV4cHJlc3Mgd291bGQgcnVuIGJlZm9yZVxuICogdGhlIGhhbmRsZXI6IHBlcm1pc3Npb25zLCBzeXN0ZW0tYWRtaW4sIHNlcnZpY2UgcHJpbmNpcGFsLCBzdGVwLXVwLCBmZWF0dXJlLFxuICogdG9rZW4gc2NvcGUsIGFuZCB0aGUgYXVkaXQgYWN0aW9ucyB0aGUgcm91dGUgZGVjbGFyZXMgdmlhIHtAbGluayBhdWRpdGVkfS5cbiAqXG4gKiBFeHByZXNzIDUgKHJvdXRlckAyKSBkb2VzIG5vdCBrZWVwIGEgbW91bnQncyBwYXRoIHN0cmluZyBvbiBpdHMgbGF5ZXIsIHNvIHRoaXNcbiAqIG1vZHVsZSByZWNvcmRzIGl0OiBvbiBpbXBvcnQgaXQgd3JhcHMgYFJvdXRlci5wcm90b3R5cGUudXNlYCB0byBzdGFtcCBlYWNoIG5ld1xuICogbGF5ZXIgd2l0aCB0aGUgcGF0aCBpdCB3YXMgbW91bnRlZCBhdC4gYXBpLWNvcmUgaXMgaW1wb3J0ZWQgYmVmb3JlIGFueSByb3V0ZVxuICogbW9kdWxlIHJlZ2lzdGVycyBhIHJvdXRlLCBzbyBldmVyeSBsYXllciBhbiBhcHAgYnVpbGRzIGlzIHN0YW1wZWQuIFRoZSB3cmFwXG4gKiBvbmx5IGFkZHMgYSBzeW1ib2wgcHJvcGVydHk7IHJvdXRpbmcgYmVoYXZpb3VyIGlzIHVuY2hhbmdlZC5cbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJy4uL3R5cGVzL3Blcm1pc3Npb25zLmpzJztcblxuLyoqXG4gKiBXaGF0IGEgTUFDSElORSBjcmVkZW50aWFsIChQQVQsIHNlcnZpY2UgYWNjb3VudCkgbWVldHMgb24gYSByb3V0ZSBnYXRlZCBieVxuICogYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWAgd2hpbGUgdGhlIG9yZydzIGFkbWluLU1GQSBwb2xpY3kgaXMgb246XG4gKiAgIC0gYGFsbG93YCAg4oCUIHRoZSByb3V0ZSBpcyBsZWdpdGltYXRlbHkgbWFjaGluZS1jYWxsYWJsZSAoYXV0b21hdGlvbiB0aGF0XG4gKiAgICAgICAgICAgICAgICBtYW5hZ2VzIG1lbWJlcnMsIHJvbGVzLCBiaWxsaW5n4oCmKTsgdGhlIHBvbGljeSBpcyBhYm91dCBob3dcbiAqICAgICAgICAgICAgICAgIHN0cm9uZ2x5IGEgUEVSU09OJ3Mgc2Vzc2lvbiB3YXMgb3BlbmVkLCBzbyBpdCBkb2VzIG5vdCBhcHBseTtcbiAqICAgLSBgcmVmdXNlYCDigJQgb25seSBhIHBlcnNvbiBtYXkgZG8gdGhpcyB3aGlsZSB0aGUgcG9saWN5IGlzIG9uICg0MDNcbiAqICAgICAgICAgICAgICAgIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCksIGUuZy4gbWludGluZyBhbm90aGVyIGNyZWRlbnRpYWwuXG4gKi9cbmV4cG9ydCB0eXBlIE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgPSAnYWxsb3cnIHwgJ3JlZnVzZSc7XG5cbi8qKiBPbmUgcmVxdWlyZW1lbnQgYSBnYXRlIG1pZGRsZXdhcmUgZW5mb3JjZXMuICovXG5leHBvcnQgdHlwZSBSb3V0ZUdhdGUgPVxuICB8IHsga2luZDogJ2F1dGgnIH1cbiAgfCB7IGtpbmQ6ICdwZXJtaXNzaW9uJzsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlPzogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiAnc3lzdGVtQWRtaW4nIH1cbiAgfCB7IGtpbmQ6ICdzZXJ2aWNlUHJpbmNpcGFsJyB9XG4gIC8qKiBBbiBJTlRFUk5BTCByb3V0ZTogdXNlciB0b2tlbnMgcmVmdXNlZCBvdXRyaWdodCwgb25seSB0aGVzZSBzZXJ2aWNlcyBhZG1pdHRlZC4gKi9cbiAgfCB7IGtpbmQ6ICdpbnRlcm5hbFNlcnZpY2UnOyBjYWxsZXJzOiByZWFkb25seSBzdHJpbmdbXSB9XG4gIHwgeyBraW5kOiAnc3RlcFVwJzsgbWV0aG9kcz86IHJlYWRvbmx5IHN0cmluZ1tdIH1cbiAgLyoqIFRoZSB3aG9sZSBTRVNTSU9OIG11c3QgYmUgTUZBLWdyYWRlIChgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UgfSlgKSwgYW5kXG4gICAqICBvcHRpb25hbGx5IG5vIG9sZGVyIHRoYW4gYG1heEFnZWAgc2Vjb25kcy4gYGV4ZW1wdGAgbmFtZXMgYSBjYXJ2ZS1vdXQgdGhlXG4gICAqICBnYXRlIGFwcGxpZXMgdG8gYSBuYXJyb3cgY2xhc3Mgb2YgcmVxdWVzdCAoc2VlIGBBc3N1cmFuY2VPcHRpb25zLmV4ZW1wdGApLFxuICAgKiAgc28gYSByb3V0ZSB3aG9zZSBsZXZlbCBpcyBjb25kaXRpb25hbCBzYXlzIHNvIG9uIHRoZSB0YWJsZS4gKi9cbiAgfCB7IGtpbmQ6ICdhc3N1cmFuY2UnOyBtaW5Bc3N1cmFuY2U6IDEgfCAyOyBtYXhBZ2U/OiBudW1iZXI7IGV4ZW1wdD86IHN0cmluZyB9XG4gIC8qKiBUaGUgc2Vzc2lvbiBtdXN0IGJlIE1GQS1ncmFkZSBXSEVOIHRoZSBvcmcncyBgYWRtaW5BY3Rpb25zUmVxdWlyZU1mYWBcbiAgICogIHBvbGljeSBpcyBvbiAoYHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZWApLiBgbWFjaGluZXNgIHNheXMgd2hhdCBhIG1hY2hpbmVcbiAgICogIGNyZWRlbnRpYWwgbWVldHMgb24gdGhlIHJvdXRlIHdoaWxlIHRoZSBwb2xpY3kgaXMgb24uICovXG4gIHwgeyBraW5kOiAnb3JnQWRtaW5Bc3N1cmFuY2UnOyBtYWNoaW5lczogT3JnQWRtaW5Bc3N1cmFuY2VNYWNoaW5lcyB9XG4gIHwgeyBraW5kOiAnZmVhdHVyZSc7IGZlYXR1cmU6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnc2NvcGUnOyBzY29wZTogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdhdWRpdCc7IGFjdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbi8vIFN5bWJvbC5mb3IsIG5vdCBTeW1ib2woKTogYSB0ZXN0IHRoYXQgbG9hZHMgYXBpLWNvcmUgdHdpY2UgKEVTTSArIGFcbi8vIHJlcXVpcmVBY3R1YWwgY29weSkgbXVzdCBzdGlsbCBzZWUgdGFncyBzZXQgYnkgdGhlIG90aGVyIGNvcHkuXG5jb25zdCBHQVRFUyA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtZ2F0ZXMnKTtcbmNvbnN0IExBWUVSX1BBVEggPSBTeW1ib2wuZm9yKCdwaXBlbGluZS1idWlsZGVyLmxheWVyLXBhdGgnKTtcbmNvbnN0IFJFQ09SREVSX0lOU1RBTExFRCA9IFN5bWJvbC5mb3IoJ3BpcGVsaW5lLWJ1aWxkZXIucm91dGUtcmVjb3JkZXInKTtcblxudHlwZSBUYWdnZWQgPSB7IFtHQVRFU10/OiBSb3V0ZUdhdGVbXSB9O1xuXG4vKipcbiAqIEF0dGFjaCBnYXRlIG1ldGFkYXRhIHRvIGEgbWlkZGxld2FyZSBmdW5jdGlvbiAoYXBwZW5kcyB0byBhbnkgZXhpc3RpbmcgdGFncylcbiAqIGFuZCByZXR1cm4gdGhlIHNhbWUgZnVuY3Rpb24uIFVzZSBpdCBmb3IgYSBzZXJ2aWNlLWxvY2FsIGdhdGUgc28gdGhlIHJvdXRlXG4gKiB0YWJsZSBrbm93cyB3aGF0IGl0IGVuZm9yY2VzIOKAlCBlLmcuIGEgaGFuZGxlci1sZXZlbCBgcmVxdWlyZUNvbXBsaWFuY2VXcml0ZWBcbiAqIHRhZ2dlZCBgeyBraW5kOiAncGVybWlzc2lvbicsIG1vZGU6ICdhbnknLCBwZXJtaXNzaW9uczogWydjb21wbGlhbmNlOndyaXRlJ10gfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdSb3V0ZUdhdGU8VCBleHRlbmRzIG9iamVjdD4oZm46IFQsIC4uLmdhdGVzOiBSb3V0ZUdhdGVbXSk6IFQge1xuICBjb25zdCB0ID0gZm4gYXMgVCAmIFRhZ2dlZDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIEdBVEVTLCB7IHZhbHVlOiBbLi4uKHRbR0FURVNdID8/IFtdKSwgLi4uZ2F0ZXNdLCBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIGZuO1xufVxuXG4vKiogVGhlIGdhdGUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gYSBtaWRkbGV3YXJlIGZ1bmN0aW9uIChlbXB0eSB3aGVuIHVudGFnZ2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZUdhdGVzKGZuOiB1bmtub3duKTogcmVhZG9ubHkgUm91dGVHYXRlW10ge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gW107XG4gIHJldHVybiAoZm4gYXMgVGFnZ2VkKVtHQVRFU10gPz8gW107XG59XG5cbi8qKlxuICogRGVjbGFyZSB0aGUgYXVkaXQgYWN0aW9uKHMpIGEgcm91dGUgZW1pdHMuIEEgbm8tb3AgbWlkZGxld2FyZSB3aG9zZSBvbmx5IGpvYlxuICogaXMgdG8gcHV0IHRoZSBhY3Rpb24gb24gdGhlIHJvdXRlIHRhYmxlLCBzbyB0aGUgY292ZXJhZ2UgdGVzdCBjYW4gcmVxdWlyZSBhblxuICogYXVkaXQgZGVjbGFyYXRpb24gb24gZXZlcnkgd3JpdGUgcm91dGUuIFBsYWNlIGl0IGluIHRoZSByb3V0ZSdzIGNoYWluOlxuICogYHJvdXRlci5wb3N0KCcvJywgYXVkaXRlZCgncGlwZWxpbmUuY3JlYXRlJyksIGhhbmRsZXIpYC4gVGhlIGhhbmRsZXIgc3RpbGxcbiAqIGVtaXRzIHRoZSBldmVudCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdWRpdGVkKC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogKHJlcTogdW5rbm93biwgcmVzOiB1bmtub3duLCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB2b2lkIHtcbiAgcmV0dXJuIHRhZ1JvdXRlR2F0ZShmdW5jdGlvbiBhdWRpdGVkUm91dGUoX3JlcTogdW5rbm93biwgX3JlczogdW5rbm93biwgbmV4dDogKCkgPT4gdm9pZCkgeyBuZXh0KCk7IH0sIHsga2luZDogJ2F1ZGl0JywgYWN0aW9ucyB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb3VudC1wYXRoIHJlY29yZGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmludGVyZmFjZSBMYXllciB7XG4gIGhhbmRsZTogdW5rbm93bjtcbiAgcm91dGU/OiB7IHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdOyBtZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjsgc3RhY2s6IEFycmF5PHsgbWV0aG9kPzogc3RyaW5nOyBoYW5kbGU6IHVua25vd24gfT4gfTtcbiAgbWF0Y2hlcnM6IEFycmF5PChwYXRoOiBzdHJpbmcpID0+IHVua25vd24+O1xuICAvKiogcm91dGVyQDIncyBcIm1vdW50ZWQgYXQgJy8nIHdpdGggZW5kOmZhbHNlXCIgZmFzdCBwYXRoIOKAlCBtYXRjaGVzIEFOWSBwYXRoLiAqL1xuICBzbGFzaD86IGJvb2xlYW47XG4gIFtMQVlFUl9QQVRIXT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJvdXRlckxpa2UgeyBzdGFjazogTGF5ZXJbXSB9XG5cbmZ1bmN0aW9uIGluc3RhbGxSb3V0ZVJlY29yZGVyKCk6IHZvaWQge1xuICBjb25zdCBwcm90byA9IChleHByZXNzLlJvdXRlciBhcyB1bmtub3duIGFzIHsgcHJvdG90eXBlOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiB9KS5wcm90b3R5cGU7XG4gIGlmIChwcm90b1tSRUNPUkRFUl9JTlNUQUxMRURdKSByZXR1cm47XG4gIGNvbnN0IG9yaWdpbmFsVXNlID0gcHJvdG8udXNlIGFzICh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIHByb3RvLnVzZSA9IGZ1bmN0aW9uIHJlY29yZGluZ1VzZSh0aGlzOiBSb3V0ZXJMaWtlLCAuLi5hcmdzOiB1bmtub3duW10pOiB1bmtub3duIHtcbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLnN0YWNrLmxlbmd0aDtcbiAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbFVzZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAvLyBTYW1lIHBhdGggZGlzYW1iaWd1YXRpb24gYXMgcm91dGVyQDIncyBgdXNlYDogYSBsZWFkaW5nIG5vbi1mdW5jdGlvblxuICAgIC8vIChwb3NzaWJseSBuZXN0ZWQgaW4gYXJyYXlzKSBpcyB0aGUgcGF0aDsgb3RoZXJ3aXNlIHRoZSBtb3VudCBpcyAnLycuXG4gICAgbGV0IGZpcnN0OiB1bmtub3duID0gYXJnc1swXTtcbiAgICB3aGlsZSAoQXJyYXkuaXNBcnJheShmaXJzdCkgJiYgZmlyc3QubGVuZ3RoID4gMCkgZmlyc3QgPSBmaXJzdFswXTtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIGZpcnN0ID09PSAnZnVuY3Rpb24nID8gJy8nIDogU3RyaW5nKGFyZ3NbMF0pO1xuICAgIGZvciAobGV0IGkgPSBiZWZvcmU7IGkgPCB0aGlzLnN0YWNrLmxlbmd0aDsgaSsrKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5zdGFja1tpXSwgTEFZRVJfUEFUSCwgeyB2YWx1ZTogcGF0aCwgZW51bWVyYWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBSRUNPUkRFUl9JTlNUQUxMRUQsIHsgdmFsdWU6IHRydWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xufVxuXG5pbnN0YWxsUm91dGVSZWNvcmRlcigpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRhYmxlIGNvbnN0cnVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBSZXNvbHZlZCByZXF1aXJlbWVudHMgZm9yIG9uZSBtZXRob2QgKyBwYXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVRhYmxlRW50cnkge1xuICBtZXRob2Q6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICAvKiogQXV0aGVudGljYXRpb24gcnVucyBiZWZvcmUgdGhlIGhhbmRsZXIgKHJlcXVpcmVBdXRoKS4gKi9cbiAgYXV0aDogYm9vbGVhbjtcbiAgLyoqIEVhY2ggcGVybWlzc2lvbiBnYXRlIGluIHRoZSBjaGFpbiAoYWxsIG11c3QgcGFzczsgZWFjaCBpcyBhbnktb2Ygb3IgYWxsLW9mKS4gKi9cbiAgcGVybWlzc2lvbnM6IEFycmF5PHsgbW9kZTogJ2FueScgfCAnYWxsJzsgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXTsgYWxsb3dTZXJ2aWNlOiBib29sZWFuIH0+O1xuICBzeXN0ZW1BZG1pbjogYm9vbGVhbjtcbiAgc2VydmljZVByaW5jaXBhbDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlcyBhbGxvd2VkIHRvIGNhbGwgdGhpcyByb3V0ZSB3aGVuIGl0IGlzIElOVEVSTkFMIChgcmVxdWlyZUludGVybmFsU2VydmljZWApLlxuICAgKiBBbiBlbXB0eSBhcnJheSBtZWFucyB0aGUgcm91dGUgaXMgbm90IGludGVybmFsIOKAlCBhIHVzZXIgdG9rZW4gbWF5IHJlYWNoIGl0LFxuICAgKiBzdWJqZWN0IHRvIHRoZSBvdGhlciBnYXRlcy4gU29ydGVkLCBzbyB0aGUgZ2VuZXJhdGVkIHRhYmxlIGlzIHN0YWJsZS5cbiAgICovXG4gIGludGVybmFsQ2FsbGVyczogc3RyaW5nW107XG4gIHN0ZXBVcDogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdGhlIHN0ZXAtdXAgZ2F0ZSBuYW1lcyB0aGUgZmFjdG9ycyB0aGF0IG1heSBlYXJuIGl0IChgWyd3ZWJhdXRobicsXG4gICAqICAndG90cCddYCBvbiB0aGUgbW9zdCBkYW5nZXJvdXMgcm91dGVzKSwgdGhlIGFsbG93ZWQgbWV0aG9kcy4gRW1wdHkgbWVhbnNcbiAgICogIGFueSBmYWN0b3Igc2F0aXNmaWVzIGl0LiBTb3J0ZWQsIHNvIHRoZSBnZW5lcmF0ZWQgdGFibGUgaXMgc3RhYmxlLiAqL1xuICBzdGVwVXBNZXRob2RzOiBzdHJpbmdbXTtcbiAgLyoqIEhpZ2hlc3QgYG1pbkFzc3VyYW5jZWAgYW55IGdhdGUgaW4gdGhlIGNoYWluIGRlbWFuZHM7IDAgd2hlbiBub25lIGRvZXMuICovXG4gIG1pbkFzc3VyYW5jZTogMCB8IDEgfCAyO1xuICAvKiogVGlnaHRlc3QgYG1heEFnZWAgKHNlY29uZHMpIGFueSBhc3N1cmFuY2UgZ2F0ZSBpbiB0aGUgY2hhaW4gZGVtYW5kcy4gKi9cbiAgbWF4QWdlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5hbWVkIGNhcnZlLW91dHMgdGhlIGNoYWluJ3MgYXNzdXJhbmNlIGdhdGVzIGFsbG93IChzb3J0ZWQpLiBBYnNlbnQgd2hlblxuICAgKiB0aGVyZSBhcmUgbm9uZSwgc28gYSB0YWJsZSBvZiByb3V0ZXMgd2l0aG91dCBvbmUgaXMgdW5jaGFuZ2VkLiBBIHJldmlld2VyXG4gICAqIHJlYWRpbmcgYG1pbkFzc3VyYW5jZTogMmAgbmV4dCB0byBgYXNzdXJhbmNlRXhlbXB0OiBbXCJib290c3RyYXAtc2V0dXBcIl1gXG4gICAqIGtub3dzIHRoZSBsZXZlbCBpcyByZXF1aXJlZCBvZiBldmVyeW9uZSBFWENFUFQgdGhhdCBuYW1lZCBjYXNlLlxuICAgKi9cbiAgYXNzdXJhbmNlRXhlbXB0Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBQcmVzZW50IHdoZW4gdGhlIHJvdXRlIHJlcXVpcmVzIGFuIE1GQS1ncmFkZSBzZXNzaW9uIFdIRU4gdGhlIG9yZydzXG4gICAqIGBhZG1pbkFjdGlvbnNSZXF1aXJlTWZhYCBwb2xpY3kgaXMgb24gKGByZXF1aXJlT3JnQWRtaW5Bc3N1cmFuY2VgKSwgd2l0aFxuICAgKiB3aGF0IGEgbWFjaGluZSBjcmVkZW50aWFsIG1lZXRzIHRoZXJlLiBBYnNlbnQgKG5vdCBgZmFsc2VgKSBvdGhlcndpc2UsIHNvXG4gICAqIHRoZSB0YWJsZSBvZiBhIHNlcnZpY2UgdGhhdCB1c2VzIG5vIHN1Y2ggZ2F0ZSBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBvcmdBZG1pbkFzc3VyYW5jZT86IHsgbWFjaGluZXM6IE9yZ0FkbWluQXNzdXJhbmNlTWFjaGluZXMgfTtcbiAgZmVhdHVyZXM6IHN0cmluZ1tdO1xuICBzY29wZXM6IHN0cmluZ1tdO1xuICBhdWRpdDogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBDYW5kaWRhdGUgeyBsYXllcjogTGF5ZXI7IHByZWZpeDogc3RyaW5nIH1cblxuZnVuY3Rpb24gam9pblBhdGgocHJlZml4OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGpvaW5lZCA9IGAke3ByZWZpeC5yZXBsYWNlKC9cXC8rJC8sICcnKX0vJHtwYXRoLnJlcGxhY2UoL15cXC8rLywgJycpfWA7XG4gIHJldHVybiBqb2luZWQubGVuZ3RoID4gMSA/IGpvaW5lZC5yZXBsYWNlKC9cXC8rJC8sICcnKSA6ICcvJztcbn1cblxuZnVuY3Rpb24gaXNSb3V0ZXIoaGFuZGxlOiB1bmtub3duKTogaGFuZGxlIGlzIFJvdXRlckxpa2Uge1xuICByZXR1cm4gdHlwZW9mIGhhbmRsZSA9PT0gJ2Z1bmN0aW9uJyAmJiBBcnJheS5pc0FycmF5KChoYW5kbGUgYXMgUGFydGlhbDxSb3V0ZXJMaWtlPikuc3RhY2spO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBtaWRkbGV3YXJlIGxheWVyIChtb3VudGVkIHVuZGVyIGBwcmVmaXhgKSBydW5zIGZvciBgZnVsbFBhdGhgLlxuICogTWlycm9ycyBgTGF5ZXIucHJvdG90eXBlLm1hdGNoYCwgaW5jbHVkaW5nIGl0cyBmYXN0IHBhdGg6IGEgbGF5ZXIgYWRkZWQgd2l0aFxuICogbm8gcGF0aCAoYHJvdXRlci51c2UoZ2F0ZSlgKSBtYXRjaGVzIEVWRVJZIHBhdGggdW5kZXIgaXRzIHJvdXRlciDigJQgd2hpY2ggaXNcbiAqIGV4YWN0bHkgaG93IHRoZSBzaGFyZWQgYHJlcXVpcmVQZXJtaXNzaW9uYCBnYXRlcyBiZXR3ZWVuIHR3byBgcm91dGVyLnVzZSguLi4pYFxuICogbW91bnRzIHJlYWNoIHRoZSByb3V0ZXJzIHJlZ2lzdGVyZWQgYWZ0ZXIgdGhlbS5cbiAqL1xuZnVuY3Rpb24gYXBwbGllcyhjOiBDYW5kaWRhdGUsIGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IGMucHJlZml4ID09PSAnLycgPyAnJyA6IGMucHJlZml4O1xuICBpZiAoYmFzZSAmJiBmdWxsUGF0aCAhPT0gYmFzZSAmJiAhZnVsbFBhdGguc3RhcnRzV2l0aChgJHtiYXNlfS9gKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYy5sYXllci5zbGFzaCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHJlbCA9IGZ1bGxQYXRoLnNsaWNlKGJhc2UubGVuZ3RoKSB8fCAnLyc7XG4gIHJldHVybiBjLmxheWVyLm1hdGNoZXJzLnNvbWUoKG0pID0+IG0ocmVsKSAhPT0gZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0R2F0ZXMoZm5zOiB1bmtub3duW10pOiBSb3V0ZUdhdGVbXSB7XG4gIHJldHVybiBmbnMuZmxhdE1hcCgoZm4pID0+IGdldFJvdXRlR2F0ZXMoZm4pKTtcbn1cblxuZnVuY3Rpb24gdG9FbnRyeShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nLCBnYXRlczogUm91dGVHYXRlW10pOiBSb3V0ZVRhYmxlRW50cnkge1xuICBjb25zdCBlbnRyeTogUm91dGVUYWJsZUVudHJ5ID0ge1xuICAgIG1ldGhvZCxcbiAgICBwYXRoLFxuICAgIGF1dGg6IGZhbHNlLFxuICAgIHBlcm1pc3Npb25zOiBbXSxcbiAgICBzeXN0ZW1BZG1pbjogZmFsc2UsXG4gICAgc2VydmljZVByaW5jaXBhbDogZmFsc2UsXG4gICAgaW50ZXJuYWxDYWxsZXJzOiBbXSxcbiAgICBzdGVwVXA6IGZhbHNlLFxuICAgIHN0ZXBVcE1ldGhvZHM6IFtdLFxuICAgIG1pbkFzc3VyYW5jZTogMCxcbiAgICBmZWF0dXJlczogW10sXG4gICAgc2NvcGVzOiBbXSxcbiAgICBhdWRpdDogW10sXG4gIH07XG4gIGZvciAoY29uc3QgZyBvZiBnYXRlcykge1xuICAgIHN3aXRjaCAoZy5raW5kKSB7XG4gICAgICBjYXNlICdhdXRoJzogZW50cnkuYXV0aCA9IHRydWU7IGJyZWFrO1xuICAgICAgY2FzZSAncGVybWlzc2lvbic6IGVudHJ5LnBlcm1pc3Npb25zLnB1c2goeyBtb2RlOiBnLm1vZGUsIHBlcm1pc3Npb25zOiBbLi4uZy5wZXJtaXNzaW9uc10sIGFsbG93U2VydmljZTogZy5hbGxvd1NlcnZpY2UgPT09IHRydWUgfSk7IGJyZWFrO1xuICAgICAgY2FzZSAnc3lzdGVtQWRtaW4nOiBlbnRyeS5zeXN0ZW1BZG1pbiA9IHRydWU7IGJyZWFrO1xuICAgICAgY2FzZSAnc2VydmljZVByaW5jaXBhbCc6IGVudHJ5LnNlcnZpY2VQcmluY2lwYWwgPSB0cnVlOyBicmVhaztcbiAgICAgIGNhc2UgJ2ludGVybmFsU2VydmljZSc6IGZvciAoY29uc3QgYyBvZiBnLmNhbGxlcnMpIGlmICghZW50cnkuaW50ZXJuYWxDYWxsZXJzLmluY2x1ZGVzKGMpKSBlbnRyeS5pbnRlcm5hbENhbGxlcnMucHVzaChjKTsgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwVXAnOlxuICAgICAgICBlbnRyeS5zdGVwVXAgPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgZy5tZXRob2RzID8/IFtdKSBpZiAoIWVudHJ5LnN0ZXBVcE1ldGhvZHMuaW5jbHVkZXMobSkpIGVudHJ5LnN0ZXBVcE1ldGhvZHMucHVzaChtKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhc3N1cmFuY2UnOlxuICAgICAgICAvLyBTZXZlcmFsIGdhdGVzIG1heSBhcHBseTsgdGhlIFNUUklDVEVTVCB3aW5zLCBzaW5jZSBldmVyeSBvbmUgb2YgdGhlbSBydW5zLlxuICAgICAgICBpZiAoZy5taW5Bc3N1cmFuY2UgPiBlbnRyeS5taW5Bc3N1cmFuY2UpIGVudHJ5Lm1pbkFzc3VyYW5jZSA9IGcubWluQXNzdXJhbmNlO1xuICAgICAgICBpZiAoZy5tYXhBZ2UgIT09IHVuZGVmaW5lZCkgZW50cnkubWF4QWdlID0gZW50cnkubWF4QWdlID09PSB1bmRlZmluZWQgPyBnLm1heEFnZSA6IE1hdGgubWluKGVudHJ5Lm1heEFnZSwgZy5tYXhBZ2UpO1xuICAgICAgICBpZiAoZy5leGVtcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVudHJ5LmFzc3VyYW5jZUV4ZW1wdCA9IFsuLi5uZXcgU2V0KFsuLi4oZW50cnkuYXNzdXJhbmNlRXhlbXB0ID8/IFtdKSwgZy5leGVtcHRdKV0uc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3JnQWRtaW5Bc3N1cmFuY2UnOlxuICAgICAgICAvLyBTdHJpY3Rlc3Qgd2luczogb25lIGByZWZ1c2VgIGluIHRoZSBjaGFpbiByZWZ1c2VzIG1hY2hpbmVzLlxuICAgICAgICBlbnRyeS5vcmdBZG1pbkFzc3VyYW5jZSA9IHtcbiAgICAgICAgICBtYWNoaW5lczogZW50cnkub3JnQWRtaW5Bc3N1cmFuY2U/Lm1hY2hpbmVzID09PSAncmVmdXNlJyB8fCBnLm1hY2hpbmVzID09PSAncmVmdXNlJyA/ICdyZWZ1c2UnIDogJ2FsbG93JyxcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmZWF0dXJlJzogaWYgKCFlbnRyeS5mZWF0dXJlcy5pbmNsdWRlcyhnLmZlYXR1cmUpKSBlbnRyeS5mZWF0dXJlcy5wdXNoKGcuZmVhdHVyZSk7IGJyZWFrO1xuICAgICAgY2FzZSAnc2NvcGUnOiBpZiAoIWVudHJ5LnNjb3Blcy5pbmNsdWRlcyhnLnNjb3BlKSkgZW50cnkuc2NvcGVzLnB1c2goZy5zY29wZSk7IGJyZWFrO1xuICAgICAgY2FzZSAnYXVkaXQnOiBmb3IgKGNvbnN0IGEgb2YgZy5hY3Rpb25zKSBpZiAoIWVudHJ5LmF1ZGl0LmluY2x1ZGVzKGEpKSBlbnRyeS5hdWRpdC5wdXNoKGEpOyBicmVhaztcbiAgICB9XG4gIH1cbiAgZW50cnkuaW50ZXJuYWxDYWxsZXJzLnNvcnQoKTtcbiAgZW50cnkuc3RlcFVwTWV0aG9kcy5zb3J0KCk7XG4gIHJldHVybiBlbnRyeTtcbn1cblxuZnVuY3Rpb24gd2FsayhzdGFjazogTGF5ZXJbXSwgcHJlZml4OiBzdHJpbmcsIGluaGVyaXRlZDogQ2FuZGlkYXRlW10sIG91dDogUm91dGVUYWJsZUVudHJ5W10sIHNlZW46IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gIGNvbnN0IGxvY2FsOiBDYW5kaWRhdGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxheWVyIG9mIHN0YWNrKSB7XG4gICAgaWYgKGxheWVyLnJvdXRlKSB7XG4gICAgICBjb25zdCBwYXRocyA9IEFycmF5LmlzQXJyYXkobGF5ZXIucm91dGUucGF0aCkgPyBsYXllci5yb3V0ZS5wYXRoIDogW2xheWVyLnJvdXRlLnBhdGhdO1xuICAgICAgY29uc3QgbWV0aG9kcyA9IE9iamVjdC5rZXlzKGxheWVyLnJvdXRlLm1ldGhvZHMpLm1hcCgobSkgPT4gKG0gPT09ICdfYWxsJyA/ICcqJyA6IG0udG9VcHBlckNhc2UoKSkpO1xuICAgICAgZm9yIChjb25zdCByb3V0ZVBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgY29uc3QgZnVsbCA9IGpvaW5QYXRoKHByZWZpeCwgU3RyaW5nKHJvdXRlUGF0aCkpO1xuICAgICAgICBjb25zdCBjaGFpbiA9IFsuLi5pbmhlcml0ZWQsIC4uLmxvY2FsXS5maWx0ZXIoKGMpID0+IGFwcGxpZXMoYywgZnVsbCkpLm1hcCgoYykgPT4gYy5sYXllci5oYW5kbGUpO1xuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gYCR7bWV0aG9kfSAke2Z1bGx9YDtcbiAgICAgICAgICAvLyBGaXJzdCByZWdpc3RyYXRpb24gd2lucywgYXMgaW4gRXhwcmVzczogYSBsYXRlciBkdXBsaWNhdGUgaXMgdW5yZWFjaGFibGUuXG4gICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgICAgY29uc3Qgcm91dGVGbnMgPSBsYXllci5yb3V0ZS5zdGFja1xuICAgICAgICAgICAgLmZpbHRlcigobCkgPT4gbC5tZXRob2QgPT09IHVuZGVmaW5lZCB8fCBsLm1ldGhvZC50b1VwcGVyQ2FzZSgpID09PSBtZXRob2QgfHwgbWV0aG9kID09PSAnKicpXG4gICAgICAgICAgICAubWFwKChsKSA9PiBsLmhhbmRsZSk7XG4gICAgICAgICAgb3V0LnB1c2godG9FbnRyeShtZXRob2QsIGZ1bGwsIGNvbGxlY3RHYXRlcyhbLi4uY2hhaW4sIC4uLnJvdXRlRm5zXSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNSb3V0ZXIobGF5ZXIuaGFuZGxlKSkge1xuICAgICAgY29uc3QgbW91bnRQYXRoID0gam9pblBhdGgocHJlZml4LCBsYXllcltMQVlFUl9QQVRIXSA/PyAnLycpO1xuICAgICAgLy8gTWlkZGxld2FyZSB0aGF0IHJ1bnMgYmVmb3JlIHRoaXMgcm91dGVyIChhbmNlc3RvcnMgKyBlYXJsaWVyIHNpYmxpbmdzKVxuICAgICAgLy8gaXMgaW5oZXJpdGVkOyBhcHBsaWNhYmlsaXR5IGlzIHJlLWNoZWNrZWQgYWdhaW5zdCBlYWNoIGZ1bGwgcm91dGUgcGF0aC5cbiAgICAgIHdhbGsobGF5ZXIuaGFuZGxlLnN0YWNrLCBtb3VudFBhdGgsIFsuLi5pbmhlcml0ZWQsIC4uLmxvY2FsXSwgb3V0LCBzZWVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWwucHVzaCh7IGxheWVyLCBwcmVmaXggfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIHJvdXRlIHRhYmxlIG9mIGFuIGFzc2VtYmxlZCBFeHByZXNzIGFwcCAob3Igcm91dGVyKTogb25lIGVudHJ5IHBlclxuICogcmVhY2hhYmxlIG1ldGhvZCArIHBhdGggd2l0aCBldmVyeSBnYXRlIHRoYXQgcnVucyBiZWZvcmUgaXRzIGhhbmRsZXIuXG4gKiBIRUFEIGlzIGZvbGRlZCBpbnRvIEdFVCwgYXMgRXhwcmVzcyBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSb3V0ZVRhYmxlKGFwcDogdW5rbm93bik6IFJvdXRlVGFibGVFbnRyeVtdIHtcbiAgY29uc3Qgcm9vdCA9IChhcHAgYXMgeyByb3V0ZXI/OiBSb3V0ZXJMaWtlIH0pLnJvdXRlciA/PyAoYXBwIGFzIFJvdXRlckxpa2UpO1xuICBjb25zdCBvdXQ6IFJvdXRlVGFibGVFbnRyeVtdID0gW107XG4gIGlmICghcm9vdCB8fCAhQXJyYXkuaXNBcnJheShyb290LnN0YWNrKSkgcmV0dXJuIG91dDtcbiAgd2Fsayhyb290LnN0YWNrLCAnLycsIFtdLCBvdXQsIG5ldyBTZXQoKSk7XG4gIHJldHVybiBvdXQuc29ydCgoYSwgYikgPT4gKGEucGF0aCA9PT0gYi5wYXRoID8gYS5tZXRob2QubG9jYWxlQ29tcGFyZShiLm1ldGhvZCkgOiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKSk7XG59XG5cbi8qKiBXaGV0aGVyIGEgbWV0aG9kIG11dGF0ZXMgc3RhdGUgKGV2ZXJ5dGhpbmcgZXhjZXB0IEdFVC9IRUFEL09QVElPTlMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV3JpdGVNZXRob2QobWV0aG9kOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICFbJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnXS5pbmNsdWRlcyhtZXRob2QudG9VcHBlckNhc2UoKSk7XG59XG5cbi8qKiBTdW1tYXJ5IGNvdW50cyBmb3IgYSBzdGFydHVwIGxvZyBsaW5lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1bW1hcml6ZVJvdXRlVGFibGUodGFibGU6IHJlYWRvbmx5IFJvdXRlVGFibGVFbnRyeVtdKTogeyByb3V0ZXM6IG51bWJlcjsgd3JpdGVzOiBudW1iZXI7IHVuZ2F0ZWQ6IG51bWJlcjsgdW5hdWRpdGVkOiBudW1iZXI7IGludGVybmFsOiBudW1iZXIgfSB7XG4gIGNvbnN0IGdhdGVkID0gKGU6IFJvdXRlVGFibGVFbnRyeSk6IGJvb2xlYW4gPT4gZS5wZXJtaXNzaW9ucy5sZW5ndGggPiAwIHx8IGUuc3lzdGVtQWRtaW4gfHwgZS5zZXJ2aWNlUHJpbmNpcGFsO1xuICBjb25zdCB3cml0ZXMgPSB0YWJsZS5maWx0ZXIoKGUpID0+IGlzV3JpdGVNZXRob2QoZS5tZXRob2QpKTtcbiAgcmV0dXJuIHtcbiAgICByb3V0ZXM6IHRhYmxlLmxlbmd0aCxcbiAgICB3cml0ZXM6IHdyaXRlcy5sZW5ndGgsXG4gICAgdW5nYXRlZDogdGFibGUuZmlsdGVyKChlKSA9PiAhZ2F0ZWQoZSkpLmxlbmd0aCxcbiAgICB1bmF1ZGl0ZWQ6IHdyaXRlcy5maWx0ZXIoKGUpID0+IGUuYXVkaXQubGVuZ3RoID09PSAwKS5sZW5ndGgsXG4gICAgaW50ZXJuYWw6IHRhYmxlLmZpbHRlcigoZSkgPT4gZS5pbnRlcm5hbENhbGxlcnMubGVuZ3RoID4gMCkubGVuZ3RoLFxuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -97,7 +97,7 @@
97
97
  ]
98
98
  }
99
99
  },
100
- "version": "4.1.9",
100
+ "version": "4.1.10",
101
101
  "bugs": {
102
102
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
103
103
  },