@pipeline-builder/pipeline-data 4.3.7 → 4.3.9

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.
@@ -37,6 +37,7 @@ import { randomUUID } from 'node:crypto';
37
37
  import { asScanFlag, createLogger, errorMessage, scanFindingKey } from '@pipeline-builder/api-core';
38
38
  import { and, eq, inArray, isNull, lte, sql } from 'drizzle-orm';
39
39
  import { schema } from '../../database/drizzle-schema.js';
40
+ import { anyText } from '../../database/pg-result.js';
40
41
  import { withTenantTx } from '../../database/tenancy.js';
41
42
  const logger = createLogger('plugin-exposure');
42
43
  /** `1.2.3` → `[1, 2, 3]`; anything unparseable → null. */
@@ -399,7 +400,7 @@ export async function pipelinesOnVersion(ref) {
399
400
  ? sql ``
400
401
  : ref.pluginPublisher === null ? sql ` AND ${sql.raw(col)} IS NULL` : sql ` AND ${sql.raw(col)} = ${ref.pluginPublisher}`);
401
402
  const digestSql = (col) => (ref.imageDigest ? sql ` AND ${sql.raw(col)} = ${ref.imageDigest}` : sql ``);
402
- const orgSql = (col) => (ref.orgIds ? sql ` AND ${sql.raw(col)} = ANY(${[...ref.orgIds]})` : sql ``);
403
+ const orgSql = (col) => (ref.orgIds ? sql ` AND ${sql.raw(col)} = ${anyText([...ref.orgIds])}` : sql ``);
403
404
  if (ref.orgIds && ref.orgIds.length === 0)
404
405
  return [];
405
406
  const result = await withTenantTx((tx) => tx.execute(sql `
@@ -694,4 +695,4 @@ export async function lapsedAcceptances(orgId, now = new Date()) {
694
695
  .where(and(eq(schema.pluginVulnExposure.orgId, orgId), eq(schema.pluginVulnExposure.triageState, 'accepted'), isNull(schema.pluginVulnExposure.fixedAt), lte(schema.pluginVulnExposure.acceptedUntil, now))));
695
696
  return rows;
696
697
  }
697
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWV4cG9zdXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9wbHVnaW4tZXhwb3N1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQStDLE1BQU0sNEJBQTRCLENBQUM7QUFDakosT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFZLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUF5Qi9DLDBEQUEwRDtBQUMxRCxTQUFTLE1BQU0sQ0FBQyxDQUE0QjtJQUMxQyxNQUFNLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMvRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUFtQyxFQUFFLE1BQWlDO0lBQy9GLE1BQU0s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QUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUN6QyxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FDbEQsQ0FBQyxDQUFDLENBQUM7SUFDTixPQUFPLElBQThILENBQUM7QUFDeEksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFdoYXQgcGx1Z2luIHZlcnNpb25zIGFuIG9yZydzIHBpcGVsaW5lcyBhcmUgYWN0dWFsbHkgb24sIGFuZCB3aGljaCBvZiB0aG9zZSBhcmVcbiAqIGtub3duLXZ1bG5lcmFibGUuXG4gKlxuICogVHdvIHRhYmxlcywgd3JpdHRlbiBoZXJlLCByZWFkIGJ5IHRoZSBvdXRkYXRlZC1wbHVnaW4gYW5kIHZ1bG5lcmFiaWxpdHkgcmVwb3J0XG4gKiBzZWN0aW9uczpcbiAqXG4gKiAgLSBgcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb25gIOKAlCB0aGUgREVDTEFSRUQgc2lkZS4gUmVjb21wdXRlZCBvbiBwaXBlbGluZVxuICogICAgd3JpdGUgYW5kIG9uIHBsdWdpbiBwdWJsaXNoLCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSBpcyByZXNvbHZpbmcgZXZlcnkgc3RlcFxuICogICAgb2YgZXZlcnkgcGlwZWxpbmUgYWdhaW5zdCB0aGUgY2F0YWxvZyBvbiBldmVyeSByZWFkLCBhbmQgdGhhdCBpcyBub3QgYSBxdWVyeVxuICogICAgYW55b25lIGNhbiBhZmZvcmQgdG8gcHV0IGluIGEgcmVwb3J0LlxuICogIC0gYHBsdWdpbl92dWxuX2V4cG9zdXJlYCDigJQgdGhlIFZVTE5FUkFCTEUgc2lkZSwgcGVyIFBJUEVMSU5FLiBBIHZlcnNpb24tbGV2ZWxcbiAqICAgIHRhYmxlIHdvdWxkIGZvcmNlIGV2ZXJ5IHJlYWRlciB0byByZS1kZXJpdmUgXCJ3aGljaCBvZiBvdXIgcGlwZWxpbmVzIGlzXG4gKiAgICBleHBvc2VkXCIsIHdoaWNoIGlzIHRoZSBvbmx5IGZvcm0gb2YgdGhlIHF1ZXN0aW9uIGFueWJvZHkgYXNrcy5cbiAqXG4gKiBERUNMQVJFRCBJUyBOT1QgREVQTE9ZRUQsIGFuZCB0aGUgcmVwb3J0IHNheXMgd2hpY2ggaXQgaXMgc2hvd2luZy4gQSBwaXBlbGluZSdzXG4gKiBjb25maWcgZGVjbGFyZXMgYF4yLjAuMGA7IHdoYXQgcmFuIGF0IGl0cyBsYXN0IGRlcGxveSBpcyB3aGF0ZXZlciB0aGUgc3RlcFxuICogbWFuaWZlc3QgcmVjb3JkZWQsIHBpbm5lZCB0byBhIGRpZ2VzdC4gVGhvc2UgZGlzYWdyZWUgd2hlbmV2ZXIgYSBwaXBlbGluZSBoYXMgbm90XG4gKiByZS1zeW50aGVkIHNpbmNlIGEgcHVibGlzaCDigJQgd2hpY2ggaXMgbW9zdCBvZiB0aGUgdGltZSwgYW5kIGV4YWN0bHkgdGhlIGdhcCBhXG4gKiB2dWxuZXJhYmlsaXR5IHJlcG9ydCBpcyBmb3IuIENvbmZsYXRpbmcgdGhlbSB3b3VsZCBsZXQgYSByZXBvcnQgc2F5IFwiZml4ZWRcIlxuICogYWJvdXQgYSBwaXBlbGluZSBzdGlsbCBydW5uaW5nIHRoZSBvbGQgaW1hZ2UuXG4gKlxuICogV0hPIFdSSVRFUyBXSEFUOlxuICogIC0gdGhlIHBpcGVsaW5lIHNlcnZpY2UsIG9uIGEgcGlwZWxpbmUgd3JpdGU6IGByZXBsYWNlUGlwZWxpbmVSZXNvbHV0aW9uYCArXG4gKiAgICBgcmVjb25jaWxlUGlwZWxpbmVFeHBvc3VyZXMoc291cmNlICdkZWNsYXJlZCcpYDtcbiAqICAtIHRoZSBwaXBlbGluZSBzZXJ2aWNlLCBvbiBhIGRlcGxveSByZWdpc3RyYXRpb24gY2FycnlpbmcgYSBzdGVwIG1hbmlmZXN0OlxuICogICAgYHJlY29uY2lsZVBpcGVsaW5lRXhwb3N1cmVzKHNvdXJjZSAnZGVwbG95ZWQnKWA7XG4gKiAgLSB0aGUgcGx1Z2luIHNlcnZpY2UsIHdoZW4gYSB2ZXJzaW9uIGJlY29tZXMgdGhlIGxhdGVzdCAoYW4gb3JnIHBsdWdpbidzIG5ld1xuICogICAgZGVmYXVsdDsgYSBsaXN0aW5nJ3MgcHVibGlzaCwgeWFuayBvciB1bnlhbmspOiBgcmVmcmVzaExhdGVzdEZvclBsdWdpbmA7XG4gKiAgLSB0aGUgbmlnaHRseSByZXNjYW4sIHBlciByZXNjYW5uZWQgdmVyc2lvbjogYHN5bmNWZXJzaW9uRXhwb3N1cmVzYCwgd2hpY2hcbiAqICAgIGZhbnMgdGhlIHZlcnNpb24ncyBmaW5kaW5ncyBvdXQgdG8gZXZlcnkgcGlwZWxpbmUgZGVjbGFyaW5nIG9yIHJ1bm5pbmcgaXRcbiAqICAgIChvciBjbG9zZXMgdGhlbSB3aGVuIHRoZSB2ZXJzaW9uIGNhbWUgYmFjayBjbGVhbikuXG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGFzU2NhbkZsYWcsIGNyZWF0ZUxvZ2dlciwgZXJyb3JNZXNzYWdlLCBzY2FuRmluZGluZ0tleSwgdHlwZSBQbHVnaW5TY2FuRmluZGluZywgdHlwZSBWdWxuQWNjZXB0YW5jZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGluQXJyYXksIGlzTnVsbCwgbHRlLCBzcWwsIHR5cGUgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgc2NoZW1hIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuaW1wb3J0IHR5cGUgeyBFeHBvc3VyZVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3NjaGVtYS9yZXBvcnRpbmctYW5hbHl0aWNzLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3BsdWdpbi1leHBvc3VyZScpO1xuXG4vKiogSG93IGZhciBiZWhpbmQgYSByZXNvbHZlZCB2ZXJzaW9uIGlzIGZyb20gdGhlIG5ld2VzdCBvbmUgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbkdhcCA9ICdtYWpvcicgfCAnbWlub3InIHwgJ3BhdGNoJyB8ICdub25lJztcblxuLyoqIE9uZSByZXNvbHZlZCBzdGVwLCBhcyB0aGUgd3JpdGVyIHRha2VzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFN0ZXAge1xuICBvcmdJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBwbHVnaW5QdWJsaXNoZXI/OiBzdHJpbmcgfCBudWxsO1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgcmVjb3JkOiBhIGBwbHVnaW5zYCByb3cgaWQgb3IgYSBsaXN0aW5nIHZlcnNpb24gaWQuICovXG4gIHJlc29sdmVkUGx1Z2luSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGltYWdlIGRpZ2VzdCB0aGUgcmVzb2x2ZWQgdmVyc2lvbiBpcyBwaW5uZWQgdG8gKG51bGwgPSBpbWFnZS1sZXNzKS4gKi9cbiAgcmVzb2x2ZWREaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICBsYXRlc3RWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgd2l0aGluUG9saWN5PzogYm9vbGVhbjtcbiAgLyoqIFRoZSByb290IG9yZyBvZiBhIHRlYW0ncyBwaXBlbGluZSAoc2VlIHRoZSBjb2x1bW4pLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogYDEuMi4zYCDihpIgYFsxLCAyLCAzXWA7IGFueXRoaW5nIHVucGFyc2VhYmxlIOKGkiBudWxsLiAqL1xuZnVuY3Rpb24gc2VtdmVyKHY6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgY29uc3QgbSA9IC9edj8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModiA/PyAnJyk7XG4gIHJldHVybiBtID8gW051bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pLCBOdW1iZXIobVszXSldIDogbnVsbDtcbn1cblxuLyoqXG4gKiBIb3cgZmFyIGByZXNvbHZlZGAgaXMgYmVoaW5kIGBsYXRlc3RgLlxuICpcbiAqIGBudWxsYCB3aGVuIGVpdGhlciBzaWRlIGlzIHVucGFyc2VhYmxlLCBOT1QgYCdub25lJ2AuIFwiV2UgY291bGQgbm90IHRlbGxcIiBhbmRcbiAqIFwiaXQgaXMgdXAgdG8gZGF0ZVwiIGFyZSBvcHBvc2l0ZSBhbnN3ZXJzLCBhbmQgcmVwb3J0aW5nIHRoZSBzZWNvbmQgZm9yIHRoZSBmaXJzdFxuICogaXMgaG93IGEgcGlwZWxpbmUgb24gYW4gYW5jaWVudCBwcmUtcmVsZWFzZSB2ZXJzaW9uIGdldHMgYSBjbGVhbiBiaWxsIG9mIGhlYWx0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25HYXAocmVzb2x2ZWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxhdGVzdDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFZlcnNpb25HYXAgfCBudWxsIHtcbiAgY29uc3QgYSA9IHNlbXZlcihyZXNvbHZlZCk7XG4gIGNvbnN0IGIgPSBzZW12ZXIobGF0ZXN0KTtcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gbnVsbDtcbiAgaWYgKGJbMF0gPiBhWzBdKSByZXR1cm4gJ21ham9yJztcbiAgaWYgKGJbMF0gPCBhWzBdKSByZXR1cm4gJ25vbmUnOyAvLyByZXNvbHZlZCBpcyBhaGVhZCBvZiBcImxhdGVzdFwiIOKAlCBub3QgYmVoaW5kXG4gIGlmIChiWzFdID4gYVsxXSkgcmV0dXJuICdtaW5vcic7XG4gIGlmIChiWzFdIDwgYVsxXSkgcmV0dXJuICdub25lJztcbiAgaWYgKGJbMl0gPiBhWzJdKSByZXR1cm4gJ3BhdGNoJztcbiAgcmV0dXJuICdub25lJztcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgcGlwZWxpbmUncyByZXNvbHV0aW9uIHJvd3MuXG4gKlxuICogREVMRVRFLXRoZW4tSU5TRVJUIGZvciB0aGUgcGlwZWxpbmUsIGluIG9uZSB0cmFuc2FjdGlvbiwgYmVjYXVzZSBhIHN0ZXAgY2FuIGJlXG4gKiBSRU1PVkVEIGZyb20gYSBjb25maWc6IGFuIHVwc2VydC1vbmx5IHdyaXRlciB3b3VsZCBsZWF2ZSB0aGUgZGVsZXRlZCBzdGVwJ3Mgcm93XG4gKiBiZWhpbmQgZm9yZXZlciwgYW5kIHRoZSBvdXRkYXRlZC1wbHVnaW4gc2VjdGlvbiB3b3VsZCBrZWVwIHJlcG9ydGluZyBhIHN0ZXAgdGhlXG4gKiBwaXBlbGluZSBubyBsb25nZXIgaGFzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVBpcGVsaW5lUmVzb2x1dGlvbihcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBzdGVwczogcmVhZG9ubHkgUmVzb2x2ZWRTdGVwW10sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB2YWx1ZXMgPSBzdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgb3JnSWQ6IHMub3JnSWQsXG4gICAgcGlwZWxpbmVJZDogcy5waXBlbGluZUlkLFxuICAgIHN0YWdlTmFtZTogcy5zdGFnZU5hbWUsXG4gICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgcGx1Z2luUHVibGlzaGVyOiBzLnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgIHBsdWdpbk5hbWU6IHMucGx1Z2luTmFtZSxcbiAgICBkZWNsYXJlZFZlcnNpb246IHMuZGVjbGFyZWRWZXJzaW9uID8/IG51bGwsXG4gICAgcmVzb2x2ZWRWZXJzaW9uOiBzLnJlc29sdmVkVmVyc2lvbiA/PyBudWxsLFxuICAgIHJlc29sdmVkUGx1Z2luSWQ6IHMucmVzb2x2ZWRQbHVnaW5JZCA/PyBudWxsLFxuICAgIHJlc29sdmVkRGlnZXN0OiBzLnJlc29sdmVkRGlnZXN0ID8/IG51bGwsXG4gICAgbGF0ZXN0VmVyc2lvbjogcy5sYXRlc3RWZXJzaW9uID8/IG51bGwsXG4gICAgdmVyc2lvbkdhcDogdmVyc2lvbkdhcChzLnJlc29sdmVkVmVyc2lvbiwgcy5sYXRlc3RWZXJzaW9uKSxcbiAgICB3aXRoaW5Qb2xpY3k6IHMud2l0aGluUG9saWN5ID8/IHRydWUsXG4gICAgcm9vdE9yZ0lkOiBzLnJvb3RPcmdJZCA/PyBudWxsLFxuICAgIGNvbXB1dGVkQXQ6IG5ldyBEYXRlKCksXG4gIH0pKTtcblxuICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uKVxuICAgICAgLndoZXJlKGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGlwZWxpbmVJZCwgcGlwZWxpbmVJZCkpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBjb25zdCBsYW5kZWQgPSBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbikudmFsdWVzKHZhbHVlcylcbiAgICAgIC5yZXR1cm5pbmcoeyBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnBpcGVsaW5lSWQgfSk7XG4gICAgcmV0dXJuIChsYW5kZWQgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggdGhlIGBsYXRlc3RgL2dhcCBjb2x1bW5zIGZvciBvbmUgcGx1Z2luIGFjcm9zcyBldmVyeSBwaXBlbGluZSB0aGF0IHVzZXNcbiAqIGl0LCB3aXRob3V0IHJlLXJlc29sdmluZyBhbnl0aGluZyBlbHNlLlxuICpcbiAqIENhbGxlZCBvbiBwdWJsaXNoLiBBIHB1Ymxpc2ggY2hhbmdlcyB3aGF0IFwibGF0ZXN0XCIgbWVhbnMgZm9yIGV2ZXJ5IHBpcGVsaW5lIGluXG4gKiB0aGUgaW5zdGFuY2UgdGhhdCBkZWNsYXJlcyB0aGUgcGx1Z2luLCBhbmQgcmUtcmVzb2x2aW5nIGVhY2ggb2YgdGhvc2UgcGlwZWxpbmVzXG4gKiBmcm9tIHNjcmF0Y2ggd291bGQgbWFrZSBwdWJsaXNoaW5nIGNvc3QgTyhwaXBlbGluZXMpIHdvcmsg4oCUIHNvIG9ubHkgdGhlIHR3b1xuICogY29sdW1ucyBhIHB1Ymxpc2ggY2FuIGNoYW5nZSBhcmUgdG91Y2hlZC5cbiAqXG4gKiBgb3duZXJgIHNheXMgd2hvc2UgcGx1Z2luIGl0IGlzOiBhIGxpc3RpbmcgKGBwdWJsaXNoZXJgIGhhbmRsZSDigJQgZXZlcnkgb3JnJ3NcbiAqIHBpcGVsaW5lcyB0aGF0IGRlY2xhcmUgaXQsIHNvIHRoZSBjYWxsZXIgbXVzdCBiZSBlbGV2YXRlZCksIG9yIGFuIG9yZydzIG93blxuICogcGx1Z2luIChgb3JnSWRgIOKAlCB0aGF0IG9yZydzIHBpcGVsaW5lcyBvbmx5OiBhbiBvcmcgcGx1Z2luJ3MgbmFtZSBpcyB1bmlxdWVcbiAqIG9ubHkgd2l0aGluIGl0cyBvcmcsIHNvIGFub3RoZXIgb3JnJ3Mgc2FtZS1uYW1lZCBwbHVnaW4gaXMgYSBkaWZmZXJlbnQgb25lKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hMYXRlc3RGb3JQbHVnaW4oXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgb3duZXI6IHsgcHVibGlzaGVyOiBzdHJpbmcgfSB8IHsgb3JnSWQ6IHN0cmluZyB9LFxuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmcsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24pXG4gICAgLnNldCh7XG4gICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgLy8gUmVjb21wdXRlZCBpbiBTUUwgZnJvbSB0aGUgcm93J3Mgb3duIHJlc29sdmVkIHZlcnNpb24sIHNvIG9uZSBzdGF0ZW1lbnRcbiAgICAgIC8vIGNvdmVycyBldmVyeSBwaXBlbGluZSByYXRoZXIgdGhhbiBhIHJvdW5kIHRyaXAgZWFjaC5cbiAgICAgIC8vIGA6OnRleHRgIG9uIGV2ZXJ5IGJpbmQgb2YgdGhlIHZlcnNpb246IFBvc3RncmVzIG90aGVyd2lzZSBkZWR1Y2VzXG4gICAgICAvLyBpbmNvbnNpc3RlbnQgdHlwZXMgZm9yIHRoZSBzYW1lIHBhcmFtZXRlciAodmFyY2hhciBmb3IgdGhlIGFzc2lnbm1lbnQsXG4gICAgICAvLyB0ZXh0IGZvciBgc3BsaXRfcGFydGApIGFuZCByZWZ1c2VzIHRvIHBsYW4gdGhlIHN0YXRlbWVudC5cbiAgICAgIHZlcnNpb25HYXA6IHNxbGBDQVNFXG4gICAgICAgIFdIRU4gJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0gSVMgTlVMTCBUSEVOIE5VTExcbiAgICAgICAgV0hFTiBzcGxpdF9wYXJ0KCR7bGF0ZXN0VmVyc2lvbn06OnRleHQsICcuJywgMSk6OmludCA+IHNwbGl0X3BhcnQoJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0sICcuJywgMSk6OmludCBUSEVOICdtYWpvcidcbiAgICAgICAgV0hFTiBzcGxpdF9wYXJ0KCR7bGF0ZXN0VmVyc2lvbn06OnRleHQsICcuJywgMSk6OmludCA8IHNwbGl0X3BhcnQoJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0sICcuJywgMSk6OmludCBUSEVOICdub25lJ1xuICAgICAgICBXSEVOIHNwbGl0X3BhcnQoJHtsYXRlc3RWZXJzaW9ufTo6dGV4dCwgJy4nLCAyKTo6aW50ID4gc3BsaXRfcGFydCgke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSwgJy4nLCAyKTo6aW50IFRIRU4gJ21pbm9yJ1xuICAgICAgICBXSEVOIHNwbGl0X3BhcnQoJHtsYXRlc3RWZXJzaW9ufTo6dGV4dCwgJy4nLCAyKTo6aW50IDwgc3BsaXRfcGFydCgke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSwgJy4nLCAyKTo6aW50IFRIRU4gJ25vbmUnXG4gICAgICAgIFdIRU4gc3BsaXRfcGFydCgke2xhdGVzdFZlcnNpb259Ojp0ZXh0LCAnLicsIDMpOjppbnQgPiBzcGxpdF9wYXJ0KCR7c2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbi5yZXNvbHZlZFZlcnNpb259LCAnLicsIDMpOjppbnQgVEhFTiAncGF0Y2gnXG4gICAgICAgIEVMU0UgJ25vbmUnIEVORGAsXG4gICAgICBjb21wdXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgIH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGx1Z2luTmFtZSwgcGx1Z2luTmFtZSksXG4gICAgICAuLi4oJ3B1Ymxpc2hlcicgaW4gb3duZXJcbiAgICAgICAgPyBbZXEoc2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbi5wbHVnaW5QdWJsaXNoZXIsIG93bmVyLnB1Ymxpc2hlcildXG4gICAgICAgIDogW2lzTnVsbChzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnBsdWdpblB1Ymxpc2hlciksIGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ub3JnSWQsIG93bmVyLm9yZ0lkKV0pLFxuICAgICAgLy8gT25seSByb3dzIHdob3NlIHJlc29sdmVkIHZlcnNpb24gcGFyc2VzIGFzIHNlbXZlcjsgYW55dGhpbmcgZWxzZSBoYXMgbm9cbiAgICAgIC8vIGdhcCB0byBjb21wdXRlIGFuZCB0aGUgQ0FTRSB3b3VsZCB0aHJvdyBvbiB0aGUgY2FzdC5cbiAgICAgIHNxbGAke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSB+ICdeWzAtOV0rXFxcXC5bMC05XStcXFxcLlswLTldKydgLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGlwZWxpbmVJZCB9KSk7XG4gIHJldHVybiAocm93cyBhcyB1bmtub3duW10pLmxlbmd0aDtcbn1cblxuLyoqIE9uZSBmbGFnZ2VkIHZlcnNpb24sIGFzIHRoZSByZXNjYW4gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3N1cmVJbnB1dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGx1Z2luUHVibGlzaGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlOiBFeHBvc3VyZVNvdXJjZTtcbiAgY3JpdGljYWxDb3VudDogbnVtYmVyO1xuICBoaWdoQ291bnQ6IG51bWJlcjtcbiAgdG9wRmluZGluZ3M/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBFdmVyeSBDcml0aWNhbC9IaWdoIGZpbmRpbmcga2V5IG9mIHRoZSB2ZXJzaW9uIChzZWUgdGhlIGNvbHVtbikuICovXG4gIGZpbmRpbmdLZXlzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBleHBvc3VyZSByb3cgaXMgTElWRTogbm90IGZpeGVkLCBub3QgZGlzbWlzc2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUsXG4gKiBhbmQgbm90IHVuZGVyIGFuIGFjY2VwdGFuY2UgdGhhdCBpcyBzdGlsbCBpbiBmb3JjZS5cbiAqXG4gKiBUaGUgT05FIHByZWRpY2F0ZSBldmVyeSByZWFkZXIgdXNlcyAodGhlIHJlcG9ydCBzZWN0aW9uLCBuZWVkcy1hdHRlbnRpb24sIHRoZVxuICogb3JnJ3Mgb3BlbiBsaXN0KS4gVHdvIHJlYWRlcnMgdGhhdCBkaXNhZ3JlZSBhYm91dCB3aGF0IFwiZXhwb3NlZFwiIG1lYW5zIHByb2R1Y2VcbiAqIGEgcmVwb3J0IHdob3NlIHZ1bG5lcmFiaWxpdHkgcGFuZWwgYW5kIG5lZWRzLWF0dGVudGlvbiBsaXN0IGNvbnRyYWRpY3QgZWFjaFxuICogb3RoZXIg4oCUIHdoaWNoIGlzIGhvdyB0aGlzIHByZWRpY2F0ZSBjYW1lIHRvIGV4aXN0LiBBbiBhY2NlcHRhbmNlIExBUFNFUyBhdCBpdHNcbiAqIGRlYWRsaW5lIGFuZCB0aGUgcm93IGlzIGxpdmUgYWdhaW47IG9uZSB3aXRoIG5vIGRlYWRsaW5lICh3aGljaFxuICogYHRyaWFnZUV4cG9zdXJlYCByZWZ1c2VzIHRvIHdyaXRlKSBpcyB0cmVhdGVkIGFzIGluIGZvcmNlLCBhcyBldmVyeSByZWFkZXJcbiAqIGFscmVhZHkgZGlkLlxuICpcbiAqIGBhbGlhc2AgaXMgdGhlIHRhYmxlIG5hbWUgb3IgYWxpYXMgdGhlIGNhbGxlcidzIHF1ZXJ5IHVzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlRXhwb3N1cmVQcmVkaWNhdGUobm93OiBEYXRlLCBhbGlhcyA9ICdwbHVnaW5fdnVsbl9leHBvc3VyZScpOiBTUUwge1xuICBjb25zdCBjb2wgPSAoYzogc3RyaW5nKSA9PiBzcWwucmF3KGAke2FsaWFzfS4ke2N9YCk7XG4gIHJldHVybiBzcWxgKCR7Y29sKCdmaXhlZF9hdCcpfSBJUyBOVUxMXG4gICAgQU5EICgke2NvbCgndHJpYWdlX3N0YXRlJyl9ID0gJ29wZW4nXG4gICAgICAgICBPUiAoJHtjb2woJ3RyaWFnZV9zdGF0ZScpfSA9ICdhY2NlcHRlZCdcbiAgICAgICAgICAgICBBTkQgJHtjb2woJ2FjY2VwdGVkX3VudGlsJyl9IElTIE5PVCBOVUxMIEFORCAke2NvbCgnYWNjZXB0ZWRfdW50aWwnKX0gPD0gJHtub3d9KSkpYDtcbn1cblxuLyoqIFdoYXQgYSB2ZXJzaW9uJ3Mgc2NhbiBzdGF0ZSBjb250cmlidXRlcyB0byBhbiBleHBvc3VyZSAoc2VlIHtAbGluayBleHBvc3VyZUZyb21TY2FufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYW5TdGF0ZSB7XG4gIC8qKiBUaGUgZGlnZXN0IHRoZSBzdGVwIHJ1bnMuIEEgc2NhbiBzdW1tYXJ5IGRlc2NyaWJpbmcgYW5vdGhlciBpbWFnZSBpcyBpZ25vcmVkLiAqL1xuICBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7XG4gIHNjYW5TdW1tYXJ5PzogdW5rbm93bjtcbiAgc2NhbkZsYWc/OiB1bmtub3duO1xuICBzY2FuRmxhZ2dlZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBUaGUgY291bnRzIGFuIGV4cG9zdXJlIHJvdyBjYXJyaWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvc3VyZUNvdW50cyB7XG4gIGNyaXRpY2FsQ291bnQ6IG51bWJlcjtcbiAgaGlnaENvdW50OiBudW1iZXI7XG4gIHRvcEZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogS2V5cyBvZiBFVkVSWSBDcml0aWNhbC9IaWdoIGZpbmRpbmcgaXRlbWl6ZWQgKGZpeGFibGUgb3Igbm90KSwgc29ydGVkLiAqL1xuICBmaW5kaW5nS2V5czogc3RyaW5nW107XG59XG5cbmNvbnN0IGtleXNPZiA9IChmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSk6IHN0cmluZ1tdID0+IFsuLi5uZXcgU2V0KGZpbmRpbmdzLm1hcChzY2FuRmluZGluZ0tleSkpXS5zb3J0KCk7XG5cbi8qKiBBdCBtb3N0IHRoaXMgbWFueSBmaW5kaW5ncyBhcmUgc3RvcmVkIG9uIGFuIGV4cG9zdXJlIHJvdy4gKi9cbmNvbnN0IEVYUE9TVVJFX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKipcbiAqIFRoZSBleHBvc3VyZSBhIHZlcnNpb24ncyBzY2FuIHN0YXRlIGFtb3VudHMgdG8sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZS5cbiAqXG4gKiBSZWFkcyB0aGUgcmVzY2FuJ3MgYHNjYW5fc3VtbWFyeWAgKGZpeGFibGUgQ3JpdGljYWwgQU5EIEhpZ2gsIHdoZXRoZXIgb3Igbm90IHRoZVxuICogZ2F0ZSB0cmlwcGVkKSBhbmQgZmFsbHMgYmFjayB0byBgc2Nhbl9mbGFnYCBmb3IgYSB2ZXJzaW9uIGZsYWdnZWQgYmVmb3JlIGFueVxuICogc3VtbWFyeSB3YXMgd3JpdHRlbi4gQSBzdW1tYXJ5IHdob3NlIGRpZ2VzdCBpcyBub3QgdGhlIHN0ZXAncyBpcyBJR05PUkVEOiBhXG4gKiB2ZXJzaW9uIHJlYnVpbHQgb24gYSBwYXRjaGVkIGJhc2UgaXMgYSBkaWZmZXJlbnQgYXJ0aWZhY3QsIGFuZCBpdHMgZmluZGluZ3Mgc2F5XG4gKiBub3RoaW5nIGFib3V0IHRoZSBpbWFnZSB0aGUgcGlwZWxpbmUgcnVucy4gT25seSBGSVhBQkxFIGZpbmRpbmdzIGNvdW50IOKAlCBhblxuICogZXhwb3N1cmUgaXMgc29tZXRoaW5nIGEgcmVidWlsZCBvciBhbiB1cGdyYWRlIGNhbiBjbGVhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9zdXJlRnJvbVNjYW4oc3RhdGU6IFNjYW5TdGF0ZSk6IEV4cG9zdXJlQ291bnRzIHwgbnVsbCB7XG4gIGNvbnN0IHN1bW1hcnkgPSBzdGF0ZS5zY2FuU3VtbWFyeSAmJiB0eXBlb2Ygc3RhdGUuc2NhblN1bW1hcnkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHN0YXRlLnNjYW5TdW1tYXJ5KVxuICAgID8gc3RhdGUuc2NhblN1bW1hcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHN1bW1hcnlEaWdlc3QgPSB0eXBlb2Ygc3VtbWFyeT8uaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnID8gc3VtbWFyeS5pbWFnZURpZ2VzdCA6IG51bGw7XG4gIGlmIChzdW1tYXJ5ICYmIHR5cGVvZiBzdW1tYXJ5LmNyaXRpY2FsRml4YWJsZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHN1bW1hcnkuaGlnaEZpeGFibGUgPT09ICdudW1iZXInXG4gICAgJiYgKHN1bW1hcnlEaWdlc3QgPT09IG51bGwgfHwgIXN0YXRlLmltYWdlRGlnZXN0IHx8IHN1bW1hcnlEaWdlc3QgPT09IHN0YXRlLmltYWdlRGlnZXN0KSkge1xuICAgIGlmIChzdW1tYXJ5LmNyaXRpY2FsRml4YWJsZSA8PSAwICYmIHN1bW1hcnkuaGlnaEZpeGFibGUgPD0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYWxsID0gKEFycmF5LmlzQXJyYXkoc3VtbWFyeS5maW5kaW5ncykgPyBzdW1tYXJ5LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10gOiBbXSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgdHlwZW9mIGYuaWQgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBmaW5kaW5ncyA9IGFsbC5maWx0ZXIoKGYpID0+IEFycmF5LmlzQXJyYXkoZi5maXhlZEluKSAmJiBmLmZpeGVkSW4ubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIHsgY3JpdGljYWxDb3VudDogc3VtbWFyeS5jcml0aWNhbEZpeGFibGUsIGhpZ2hDb3VudDogc3VtbWFyeS5oaWdoRml4YWJsZSwgdG9wRmluZGluZ3M6IGZpbmRpbmdzLnNsaWNlKDAsIEVYUE9TVVJFX1RPUF9GSU5ESU5HUyksIGZpbmRpbmdLZXlzOiBrZXlzT2YoYWxsKSB9O1xuICB9XG4gIGNvbnN0IGZsYWcgPSBzdGF0ZS5zY2FuRmxhZ2dlZEF0ID8gYXNTY2FuRmxhZyhzdGF0ZS5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoIWZsYWcgfHwgKGZsYWcuZ2F0ZWQgPD0gMCAmJiBmbGFnLmhpZ2ggPD0gMCkpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBjcml0aWNhbENvdW50OiBmbGFnLmdhdGVkLCBoaWdoQ291bnQ6IGZsYWcuaGlnaCwgdG9wRmluZGluZ3M6IGZsYWcuZmluZGluZ3Muc2xpY2UoMCwgRVhQT1NVUkVfVE9QX0ZJTkRJTkdTKSwgZmluZGluZ0tleXM6IGtleXNPZihmbGFnLmZpbmRpbmdzKSB9O1xufVxuXG4vKipcbiAqIE9wZW4gb3IgcmVmcmVzaCBleHBvc3VyZXMuXG4gKlxuICogVXBzZXJ0cyBvbiAocGlwZWxpbmUsIHBsdWdpbiwgdmVyc2lvbiwgZGlnZXN0LCBzb3VyY2UpIHNvIGEgbmlnaHRseSByZXNjYW4gUkVGUkVTSEVTIHRoZVxuICogY291bnRzIHJhdGhlciB0aGFuIG9wZW5pbmcgYSBuZXcgcm93IGV2ZXJ5IG5pZ2h0IOKAlCBvdGhlcndpc2UgdGhlIHJlcG9ydCB3b3VsZFxuICogc2hvdyBvbmUgZXhwb3N1cmUgcGVyIG5pZ2h0IG9mIHRoZSBzYW1lIHByb2JsZW0sIHdoaWNoIHJlYWRzIGFzIGFuIGVzY2FsYXRpbmdcbiAqIHNpdHVhdGlvbiB3aGVuIG5vdGhpbmcgY2hhbmdlZC5cbiAqXG4gKiBBIHJlZnJlc2ggZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlc2V0IGB0cmlhZ2Vfc3RhdGVgOiBhbiBvcmcgdGhhdCBhY2NlcHRlZCBhXG4gKiBmaW5kaW5nIHdpdGggYSByZWFzb24gYW5kIGEgZGVhZGxpbmUgaGFzIG1hZGUgYSBkZWNpc2lvbiwgYW5kIHJlLXJhaXNpbmcgaXQgZXZlcnlcbiAqIG5pZ2h0IGlzIGhvdyBhIHRlYW0gbGVhcm5zIHRvIGlnbm9yZSB0aGUgcmVwb3J0LiBJdCBET0VTIGNsZWFyIGEgc3RhbGVcbiAqIGFjY2VwdGFuY2UsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBkZWFkbGluZSB3YXMgZm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBzZXJ0RXhwb3N1cmVzKGlucHV0czogcmVhZG9ubHkgRXhwb3N1cmVJbnB1dFtdLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICBjb25zdCB2YWx1ZXMgPSBpbnB1dHMubWFwKChlKSA9PiAoe1xuICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgb3JnSWQ6IGUub3JnSWQsXG4gICAgcGlwZWxpbmVJZDogZS5waXBlbGluZUlkLFxuICAgIHBsdWdpblB1Ymxpc2hlcjogZS5wbHVnaW5QdWJsaXNoZXIgPz8gbnVsbCxcbiAgICBwbHVnaW5OYW1lOiBlLnBsdWdpbk5hbWUsXG4gICAgcGx1Z2luVmVyc2lvbjogZS5wbHVnaW5WZXJzaW9uLFxuICAgIGltYWdlRGlnZXN0OiBlLmltYWdlRGlnZXN0ID8/IG51bGwsXG4gICAgc291cmNlOiBlLnNvdXJjZSxcbiAgICBjcml0aWNhbENvdW50OiBlLmNyaXRpY2FsQ291bnQsXG4gICAgaGlnaENvdW50OiBlLmhpZ2hDb3VudCxcbiAgICB0b3BGaW5kaW5nczogZS50b3BGaW5kaW5ncyA/PyBbXSxcbiAgICBmaW5kaW5nS2V5czogZS5maW5kaW5nS2V5cyA/PyBbXSxcbiAgICBmbGFnZ2VkQXQ6IG5vdyxcbiAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgfSkpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbGFuZGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUpLnZhbHVlcyh2YWx1ZXMpXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbXG4gICAgICAgICAgc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5waXBlbGluZUlkLFxuICAgICAgICAgIHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luTmFtZSxcbiAgICAgICAgICBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBsdWdpblZlcnNpb24sXG4gICAgICAgICAgc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pbWFnZURpZ2VzdCxcbiAgICAgICAgICBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnNvdXJjZSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgY3JpdGljYWxDb3VudDogc3FsYGV4Y2x1ZGVkLmNyaXRpY2FsX2NvdW50YCxcbiAgICAgICAgICBoaWdoQ291bnQ6IHNxbGBleGNsdWRlZC5oaWdoX2NvdW50YCxcbiAgICAgICAgICB0b3BGaW5kaW5nczogc3FsYGV4Y2x1ZGVkLnRvcF9maW5kaW5nc2AsXG4gICAgICAgICAgZmluZGluZ0tleXM6IHNxbGBleGNsdWRlZC5maW5kaW5nX2tleXNgLFxuICAgICAgICAgIC8vIFN0aWxsIGV4cG9zZWQsIHNvIHRoZSBmaXggbWFya2VyIGlzIGNsZWFyZWQ6IGEgcm93IHRoYXQgd2FzIGNsb3NlZCBieSBhXG4gICAgICAgICAgLy8gZGVwbG95IGFuZCBpcyBmbGFnZ2VkIGFnYWluIGlzIGEgcmVncmVzc2lvbiwgYW5kIGxlYXZpbmcgYGZpeGVkX2F0YCBzZXRcbiAgICAgICAgICAvLyB3b3VsZCBoaWRlIGl0LlxuICAgICAgICAgIGZpeGVkQXQ6IG51bGwsXG4gICAgICAgICAgLy8gQW4gYWNjZXB0YW5jZSBwYXN0IGl0cyBkZWFkbGluZSBzdG9wcyBiZWluZyBhbiBhY2NlcHRhbmNlLiBUaGF0IGlzIHRoZVxuICAgICAgICAgIC8vIGVudGlyZSBwb2ludCBvZiB0aW1lLWJveGluZyBpdCwgYW5kIGl0IGlzIGVuZm9yY2VkIEhFUkUgcmF0aGVyIHRoYW4gYXRcbiAgICAgICAgICAvLyByZWFkIHRpbWUgc28gdGhlIHN0b3JlZCBzdGF0ZSBpcyB0aGUgdHJ1dGguXG4gICAgICAgICAgLy8gQW4gYWNjZXB0YW5jZSBjb3ZlcnMgdGhlIGZpbmRpbmdzIGl0IHdhcyBtYWRlIG92ZXIsIG5ldmVyIG9uZXMgZm91bmRcbiAgICAgICAgICAvLyBzaW5jZTogYSByZWZyZXNoIGNhcnJ5aW5nIGEgZmluZGluZyBrZXkgdGhlIGFjY2VwdGFuY2UgZGlkIG5vdCBmcmVlemVcbiAgICAgICAgICAvLyByZW9wZW5zIHRoZSByb3csIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluIGFib3V0IHdoYXQgaXMgdGhlcmUgbm93LlxuICAgICAgICAgIHRyaWFnZVN0YXRlOiBzcWxgQ0FTRVxuICAgICAgICAgICAgV0hFTiAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGV9ID0gJ2FjY2VwdGVkJ1xuICAgICAgICAgICAgIEFORCAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuYWNjZXB0ZWRVbnRpbH0gSVMgTk9UIE5VTExcbiAgICAgICAgICAgICBBTkQgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkVW50aWx9IDw9ICR7bm93fVxuICAgICAgICAgICAgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdhY2NlcHRlZCdcbiAgICAgICAgICAgICBBTkQgTk9UIChleGNsdWRlZC5maW5kaW5nX2tleXMgPEAgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkRmluZGluZ0tleXN9KVxuICAgICAgICAgICAgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdmaXhlZCcgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIC0tIEEgUkVNT1ZFRCBzdGVwIC8gcGlwZWxpbmUgYmFjayBvbiB0aGUgc2FtZSB2ZXJzaW9uOiBpdHMgYWNjZXB0YW5jZVxuICAgICAgICAgICAgLS0gcmV0dXJucyBpZiBzdGlsbCBpbiBmb3JjZSBhbmQgaXQgY292ZXJzIHdoYXQgdGhlIHZlcnNpb24gY2FycmllcyBub3cuXG4gICAgICAgICAgICBXSEVOICR7c2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS50cmlhZ2VTdGF0ZX0gPSAncmVtb3ZlZCdcbiAgICAgICAgICAgICBBTkQgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkVW50aWx9IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgQU5EICR7c2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5hY2NlcHRlZFVudGlsfSA+ICR7bm93fVxuICAgICAgICAgICAgIEFORCBleGNsdWRlZC5maW5kaW5nX2tleXMgPEAgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkRmluZGluZ0tleXN9XG4gICAgICAgICAgICBUSEVOICdhY2NlcHRlZCdcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdyZW1vdmVkJyBUSEVOICdvcGVuJ1xuICAgICAgICAgICAgRUxTRSAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGV9IEVORGAsXG4gICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmlkIH0pKTtcbiAgICByZXR1cm4gKGxhbmRlZCBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1BsdWdpbiBleHBvc3VyZSB1cHNlcnQgZmFpbGVkJywgeyBjb3VudDogdmFsdWVzLmxlbmd0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8qKiBPbmUgdmVyc2lvbiBhIHBpcGVsaW5lIHN0aWxsIGRlY2xhcmVzIC8gcnVucyBXSVRIIG9wZW4gZmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVWZXJzaW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuY29uc3QgbGl2ZUtleSA9ICh2OiBMaXZlVmVyc2lvbik6IHN0cmluZyA9PiBgJHt2LnBsdWdpbk5hbWV9QCR7di5wbHVnaW5WZXJzaW9ufUAke3YuaW1hZ2VEaWdlc3QgPz8gJyd9YDtcblxuLyoqXG4gKiBDbG9zZSB0aGUgZXhwb3N1cmVzIG9mIG9uZSBTT1VSQ0UgYSBwaXBlbGluZSBoYXMgbW92ZWQgb2ZmIOKAlCBgZml4ZWRgIHdoZW4gdGhlXG4gKiBwaXBlbGluZSBzdGlsbCB1c2VzIHRoZSBwbHVnaW4gYXQgYW5vdGhlciB2ZXJzaW9uLCBgcmVtb3ZlZGAgd2hlbiBubyBsaXZlIHN0ZXBcbiAqIHVzZXMgdGhlIHBsdWdpbiBhdCBhbGwgKHRoZSB0cmlhZ2UgZmllbGRzIHN0YXksIHNvIGEgcmUtYWRkZWQgc3RlcCBnZXRzIGFuXG4gKiB1bmV4cGlyZWQgYWNjZXB0YW5jZSBiYWNrIOKAlCBzZWUge0BsaW5rIHVwc2VydEV4cG9zdXJlc30pLlxuICpcbiAqIENhbGxlZCB3aGVuIGEgZGVwbG95IHJlY29yZHMgYSBuZXcgc3RlcCBtYW5pZmVzdCAoYGRlcGxveWVkYCkgb3IgYSBwaXBlbGluZVxuICogd3JpdGUgcmUtcmVzb2x2ZXMgaXRzIGNvbmZpZyAoYGRlY2xhcmVkYCk6IGFueXRoaW5nIG9wZW4gZm9yIHRoYXQgcGlwZWxpbmUgYW5kXG4gKiBzb3VyY2Ugd2hvc2UgKHZlcnNpb24sIGRpZ2VzdCkgaXMgTk9UIGluIGBsaXZlVmVyc2lvbnNgIGlzIGZpeGVkLiBDbG9zaW5nIGJ5XG4gKiBhYnNlbmNlIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGEgcmVzY2FuIHRvIG5vdGljZSBpcyB3aGF0IG1ha2VzIFwid2UgZml4ZWQgaXRcIlxuICogc2hvdyB1cCBpbiB0aGUgcmVwb3J0IG9uIHRoZSBuZXh0IGRlcGxveSBpbnN0ZWFkIG9mIHRoZSBuZXh0IG5pZ2h0LlxuICpcbiAqIFBlciBzb3VyY2UsIGJlY2F1c2UgdGhlIHR3byBzaWRlcyBtb3ZlIGluZGVwZW5kZW50bHk6IGEgY29uZmlnIHVwZGF0ZWQgdG8gdGhlXG4gKiBmaXhlZCB2ZXJzaW9uIGNsb3NlcyB0aGUgREVDTEFSRUQgZXhwb3N1cmUgd2hpbGUgdGhlIG9sZCBpbWFnZSBrZWVwcyBydW5uaW5nLFxuICogYW5kIGl0cyBERVBMT1lFRCBleHBvc3VyZSBtdXN0IHN0YXkgb3BlbiB1bnRpbCB0aGUgZGVwbG95IGxhbmRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VGaXhlZEV4cG9zdXJlcyhcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBzb3VyY2U6IEV4cG9zdXJlU291cmNlLFxuICBsaXZlVmVyc2lvbnM6IHJlYWRvbmx5IExpdmVWZXJzaW9uW10sXG4gIG5vdyA9IG5ldyBEYXRlKCksXG4gIG9wdHM6IHsgbGl2ZVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBsaXZlID0gbmV3IFNldChsaXZlVmVyc2lvbnMubWFwKGxpdmVLZXkpKTtcbiAgY29uc3QgbGl2ZVBsdWdpbnMgPSBuZXcgU2V0KFsuLi5saXZlVmVyc2lvbnMsIC4uLihvcHRzLmxpdmVQbHVnaW5zID8/IFtdKV0ubWFwKCh2KSA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IHYucGx1Z2luTmFtZSkpKTtcbiAgY29uc3Qgb3BlbiA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7XG4gICAgaWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuaWQsXG4gICAgcGx1Z2luTmFtZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5OYW1lLFxuICAgIHBsdWdpblZlcnNpb246IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luVmVyc2lvbixcbiAgICBpbWFnZURpZ2VzdDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pbWFnZURpZ2VzdCxcbiAgfSkuZnJvbShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgZXEoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5zb3VyY2UsIHNvdXJjZSksXG4gICAgICBpc051bGwoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5maXhlZEF0KSxcbiAgICApKSk7XG4gIGNvbnN0IHN0YWxlUm93cyA9IChvcGVuIGFzIEFycmF5PExpdmVWZXJzaW9uICYgeyBpZDogc3RyaW5nIH0+KS5maWx0ZXIoKHIpID0+ICFsaXZlLmhhcyhsaXZlS2V5KHIpKSk7XG4gIGlmIChzdGFsZVJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgY29uc3QgZml4ZWQgPSBzdGFsZVJvd3MuZmlsdGVyKChyKSA9PiBsaXZlUGx1Z2lucy5oYXMoci5wbHVnaW5OYW1lKSkubWFwKChyKSA9PiByLmlkKTtcbiAgY29uc3QgcmVtb3ZlZCA9IHN0YWxlUm93cy5maWx0ZXIoKHIpID0+ICFsaXZlUGx1Z2lucy5oYXMoci5wbHVnaW5OYW1lKSkubWFwKChyKSA9PiByLmlkKTtcbiAgbGV0IGNsb3NlZCA9IDA7XG4gIGZvciAoY29uc3QgW2lkcywgc3RhdGVdIG9mIFtbZml4ZWQsICdmaXhlZCddLCBbcmVtb3ZlZCwgJ3JlbW92ZWQnXV0gYXMgY29uc3QpIHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgICAgLnNldCh7IGZpeGVkQXQ6IG5vdywgdHJpYWdlU3RhdGU6IHN0YXRlLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pZCwgWy4uLmlkc10pKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmlkIH0pKTtcbiAgICBjbG9zZWQgKz0gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGNsb3NlZDtcbn1cblxuLyoqXG4gKiBDbG9zZSBldmVyeSBvcGVuIGV4cG9zdXJlIG9mIGEgcGlwZWxpbmUgKG9yIG9mIG9uZSBzb3VyY2UpIGFzIGByZW1vdmVkYCDigJQgdGhlXG4gKiBwaXBlbGluZSB3YXMgZGVsZXRlZCwgb3IgZGVyZWdpc3RlcmVkIChpdHMgZGVwbG95IGlzIGdvbmUpLiBUaGUgdHJpYWdlIGZpZWxkc1xuICogc3RheTogYSByZXN0b3JlIHJlLXJlY29yZHMgdGhlIHBpcGVsaW5lJ3MgcmVzb2x1dGlvbiwgYW5kXG4gKiB7QGxpbmsgdXBzZXJ0RXhwb3N1cmVzfSByZW9wZW5zIHRoZSByb3dzIChyZXN0b3JpbmcgYW4gYWNjZXB0YW5jZSBzdGlsbCBpblxuICogZm9yY2UpLiBSZXR1cm5zIHRoZSByb3dzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlUGlwZWxpbmVFeHBvc3VyZXMoXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgc3RhdGU6ICdyZW1vdmVkJyxcbiAgb3B0czogeyBzb3VyY2U/OiBFeHBvc3VyZVNvdXJjZSB9ID0ge30sXG4gIG5vdyA9IG5ldyBEYXRlKCksXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUpXG4gICAgLnNldCh7IGZpeGVkQXQ6IG5vdywgdHJpYWdlU3RhdGU6IHN0YXRlLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuZml4ZWRBdCksXG4gICAgICAuLi4ob3B0cy5zb3VyY2UgPyBbZXEoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5zb3VyY2UsIG9wdHMuc291cmNlKV0gOiBbXSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuaWQgfSkpO1xuICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG59XG5cbi8qKiBPbmUgc3RlcCBvZiBhIHBpcGVsaW5lIGFzIHtAbGluayByZWNvbmNpbGVQaXBlbGluZUV4cG9zdXJlc30gdGFrZXMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9zdXJlU3RlcCB7XG4gIHBsdWdpblB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgdmVyc2lvbidzIHNjYW4gc3RhdGUsIGFzIHN0b3JlZCBvbiBpdHMgcm93LiAqL1xuICBzY2FuOiBTY2FuU3RhdGU7XG59XG5cbi8qKlxuICogQnJpbmcgb25lIHBpcGVsaW5lJ3MgZXhwb3N1cmVzIG9mIG9uZSBzb3VyY2UgaW4gbGluZSB3aXRoIHRoZSBzdGVwcyBpdCBub3dcbiAqIGRlY2xhcmVzIChgZGVjbGFyZWRgKSBvciBydW5zIChgZGVwbG95ZWRgKTogb3BlbiAvIHJlZnJlc2ggYSByb3cgZm9yIGV2ZXJ5IHN0ZXBcbiAqIHdob3NlIHZlcnNpb24gaGFzIG9wZW4gZml4YWJsZSBmaW5kaW5ncywgY2xvc2UgdGhlIHJlc3QgYnkgYWJzZW5jZS5cbiAqXG4gKiBOZXZlciB0aHJvd3Mg4oCUIGV4cG9zdXJlIHRyYWNraW5nIGlzIHJlcG9ydGluZywgYW5kIGEgcGlwZWxpbmUgd3JpdGUgb3IgYSBkZXBsb3lcbiAqIHJlZ2lzdHJhdGlvbiBtdXN0IG5vdCBmYWlsIGJlY2F1c2UgdGhlIHJlcG9ydCB0YWJsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29uY2lsZVBpcGVsaW5lRXhwb3N1cmVzKFxuICBpbnB1dDogeyBvcmdJZDogc3RyaW5nOyBwaXBlbGluZUlkOiBzdHJpbmc7IHNvdXJjZTogRXhwb3N1cmVTb3VyY2U7IHN0ZXBzOiByZWFkb25seSBFeHBvc3VyZVN0ZXBbXSB9LFxuICBub3cgPSBuZXcgRGF0ZSgpLFxuKTogUHJvbWlzZTx7IG9wZW5lZDogbnVtYmVyOyBjbG9zZWQ6IG51bWJlciB9PiB7XG4gIGNvbnN0IGV4cG9zZWQ6IEV4cG9zdXJlSW5wdXRbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBpbnB1dC5zdGVwcykge1xuICAgIGNvbnN0IGNvdW50cyA9IGV4cG9zdXJlRnJvbVNjYW4oeyAuLi5zdGVwLnNjYW4sIGltYWdlRGlnZXN0OiBzdGVwLmltYWdlRGlnZXN0ID8/IHN0ZXAuc2Nhbi5pbWFnZURpZ2VzdCA/PyBudWxsIH0pO1xuICAgIGlmICghY291bnRzKSBjb250aW51ZTtcbiAgICBjb25zdCBrZXkgPSBsaXZlS2V5KHsgcGx1Z2luTmFtZTogc3RlcC5wbHVnaW5OYW1lLCBwbHVnaW5WZXJzaW9uOiBzdGVwLnBsdWdpblZlcnNpb24sIGltYWdlRGlnZXN0OiBzdGVwLmltYWdlRGlnZXN0IH0pO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTsgLy8gdHdvIHN0ZXBzIG9uIG9uZSB2ZXJzaW9uIGFyZSBvbmUgZXhwb3N1cmVcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIGV4cG9zZWQucHVzaCh7XG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBwaXBlbGluZUlkOiBpbnB1dC5waXBlbGluZUlkLFxuICAgICAgcGx1Z2luUHVibGlzaGVyOiBzdGVwLnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgICAgcGx1Z2luTmFtZTogc3RlcC5wbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogc3RlcC5wbHVnaW5WZXJzaW9uLFxuICAgICAgaW1hZ2VEaWdlc3Q6IHN0ZXAuaW1hZ2VEaWdlc3QgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogaW5wdXQuc291cmNlLFxuICAgICAgLi4uY291bnRzLFxuICAgICAgdG9wRmluZGluZ3M6IGNvdW50cy50b3BGaW5kaW5ncyBhcyB1bmtub3duIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICB9KTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IHVwc2VydEV4cG9zdXJlcyhleHBvc2VkLCBub3cpO1xuICAgIC8vIEV2ZXJ5IHBsdWdpbiBhIHN0ZXAgc3RpbGwgdXNlcyAoY2xlYW4gdmVyc2lvbnMgdG9vKTogYSByb3cgZm9yIG9uZSBvZlxuICAgIC8vIHRoZW0gY2xvc2VzIGBmaXhlZGA7IGEgcm93IGZvciBhIHBsdWdpbiBubyBzdGVwIHVzZXMgYW55IG1vcmUsIGByZW1vdmVkYC5cbiAgICBjb25zdCBjbG9zZWQgPSBhd2FpdCBjbG9zZUZpeGVkRXhwb3N1cmVzKGlucHV0LnBpcGVsaW5lSWQsIGlucHV0LnNvdXJjZSwgZXhwb3NlZCwgbm93LCB7IGxpdmVQbHVnaW5zOiBpbnB1dC5zdGVwcy5tYXAoKHMpID0+IHMucGx1Z2luTmFtZSkgfSk7XG4gICAgcmV0dXJuIHsgb3BlbmVkLCBjbG9zZWQgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV4cG9zdXJlIHJlY29uY2lsZSBmYWlsZWQnLCB7IHBpcGVsaW5lSWQ6IGlucHV0LnBpcGVsaW5lSWQsIHNvdXJjZTogaW5wdXQuc291cmNlLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHsgb3BlbmVkOiAwLCBjbG9zZWQ6IDAgfTtcbiAgfVxufVxuXG4vKiogQSBwbHVnaW4gdmVyc2lvbiAob3B0aW9uYWxseSBvbmUgaW1hZ2Ugb2YgaXQpIHdob3NlIHBpcGVsaW5lcyBhcmUgd2FudGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5WZXJzaW9uUmVmIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBMaXN0aW5nIHB1Ymxpc2hlciBoYW5kbGU7IG51bGwgPSBhbiBvcmcncyBvd24gcGx1Z2luIHJvdzsgb21pdHRlZCA9IGVpdGhlci4gKi9cbiAgcGx1Z2luUHVibGlzaGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIE5hcnJvdyB0byBwaXBlbGluZXMgb24gdGhpcyBpbWFnZS4gT21pdHRlZCA9IGFueSBpbWFnZSBvZiB0aGUgdmVyc2lvbi4gKi9cbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTmFycm93IHRvIHRoZXNlIG9yZ3MuIE9taXR0ZWQgPSBldmVyeSBvcmcgdGhlIGNhbGxlcidzIHNjb3BlIGNhbiByZWFkLiAqL1xuICBvcmdJZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEEgcGlwZWxpbmUgdGhhdCBkZWNsYXJlcyBvciBydW5zIGEgZ2l2ZW4gcGx1Z2luIHZlcnNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lT25WZXJzaW9uIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBgZGVwbG95ZWRgID0gaXRzIGxhc3QgZGVwbG95J3Mgc3RlcCBtYW5pZmVzdDsgYGRlY2xhcmVkYCA9IGl0cyBjb25maWcgcmVzb2x2ZXMgdG8gaXQuICovXG4gIHNvdXJjZTogRXhwb3N1cmVTb3VyY2U7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgaW1hZ2VEaWdlc3Q6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgc3RlcHMgb24gaXQ6IGBzeW50aGAgb3IgYDxzdGFnZT4vPHN0ZXA+YCAoZGVjbGFyZWQpIC8gYDxzdGFnZT4vPGFjdGlvbj5gIChkZXBsb3llZCkuICovXG4gIHN0ZXBzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFdmVyeSBMSVZFIHBpcGVsaW5lIGRlY2xhcmluZyAoYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCkgb3IgcnVubmluZ1xuICogKGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApIGEgcGx1Z2luIHZlcnNpb24sIG9uZSBlbnRyeSBwZXIgKHBpcGVsaW5lLCBzb3VyY2UpXG4gKiB3aXRoIHRoZSBzdGVwcyBvbiBpdC4gQSBzb2Z0LWRlbGV0ZWQgcGlwZWxpbmUgaXMgTk9UIGFmZmVjdGVkOiBjb3VudGluZyBpdFxuICogd291bGQgcHV0IGEgcGlwZWxpbmUgbm9ib2R5IGNhbiBvcGVuIGludG8gYSBub3RpY2Ugb3IgYSByZXBvcnQuIFJlYWRzIHVuZGVyXG4gKiB0aGUgQ0FMTEVSJ3MgdGVuYW50IHNjb3BlOiBhbiBvcmctc2NvcGVkIGNhbGxlciBzZWVzIGl0cyBvd24gcGlwZWxpbmVzLCB0aGVcbiAqIHJlc2NhbiAoZWxldmF0ZWQpIHNlZXMgZXZlcnkgb3JnJ3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaXBlbGluZXNPblZlcnNpb24ocmVmOiBQbHVnaW5WZXJzaW9uUmVmKTogUHJvbWlzZTxQaXBlbGluZU9uVmVyc2lvbltdPiB7XG4gIGNvbnN0IHB1Ymxpc2hlclNxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5wbHVnaW5QdWJsaXNoZXIgPT09IHVuZGVmaW5lZFxuICAgID8gc3FsYGBcbiAgICA6IHJlZi5wbHVnaW5QdWJsaXNoZXIgPT09IG51bGwgPyBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gSVMgTlVMTGAgOiBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gPSAke3JlZi5wbHVnaW5QdWJsaXNoZXJ9YCk7XG4gIGNvbnN0IGRpZ2VzdFNxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5pbWFnZURpZ2VzdCA/IHNxbGAgQU5EICR7c3FsLnJhdyhjb2wpfSA9ICR7cmVmLmltYWdlRGlnZXN0fWAgOiBzcWxgYCk7XG4gIGNvbnN0IG9yZ1NxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5vcmdJZHMgPyBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gPSBBTlkoJHtbLi4ucmVmLm9yZ0lkc119KWAgOiBzcWxgYCk7XG4gIGlmIChyZWYub3JnSWRzICYmIHJlZi5vcmdJZHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LmV4ZWN1dGUoc3FsYFxuICAgIFNFTEVDVCB4Lm9yZ19pZCwgeC5waXBlbGluZV9pZCwgeC5zb3VyY2UsIE1JTih4LnBsdWdpbl9wdWJsaXNoZXIpIEFTIHBsdWdpbl9wdWJsaXNoZXIsIE1JTih4LmltYWdlX2RpZ2VzdCkgQVMgaW1hZ2VfZGlnZXN0LFxuICAgICAgICAgICBwLnBpcGVsaW5lX25hbWUsIGFycmF5X2FnZyhESVNUSU5DVCB4LnN0ZXAgT1JERVIgQlkgeC5zdGVwKSBBUyBzdGVwc1xuICAgIEZST00gKFxuICAgICAgU0VMRUNUIG0ub3JnX2lkLCBtLnBpcGVsaW5lX2lkOjp0ZXh0IEFTIHBpcGVsaW5lX2lkLCAnZGVwbG95ZWQnIEFTIHNvdXJjZSwgbS5wbHVnaW5fcHVibGlzaGVyLCBtLmltYWdlX2RpZ2VzdCxcbiAgICAgICAgICAgICBtLnN0YWdlX25hbWUgfHwgJy8nIHx8IG0uYWN0aW9uX25hbWUgQVMgc3RlcFxuICAgICAgRlJPTSBwaXBlbGluZV9zdGVwX21hbmlmZXN0cyBtXG4gICAgICBXSEVSRSBtLnBsdWdpbl9uYW1lID0gJHtyZWYucGx1Z2luTmFtZX0gQU5EIG0ucGx1Z2luX3ZlcnNpb24gPSAke3JlZi5wbHVnaW5WZXJzaW9ufVxuICAgICAgICAke3B1Ymxpc2hlclNxbCgnbS5wbHVnaW5fcHVibGlzaGVyJyl9JHtkaWdlc3RTcWwoJ20uaW1hZ2VfZGlnZXN0Jyl9JHtvcmdTcWwoJ20ub3JnX2lkJyl9XG4gICAgICBVTklPTiBBTExcbiAgICAgIFNFTEVDVCByLm9yZ19pZCwgci5waXBlbGluZV9pZCwgJ2RlY2xhcmVkJyBBUyBzb3VyY2UsIHIucGx1Z2luX3B1Ymxpc2hlciwgci5yZXNvbHZlZF9kaWdlc3QgQVMgaW1hZ2VfZGlnZXN0LFxuICAgICAgICAgICAgIENBU0UgV0hFTiByLnN0YWdlX25hbWUgPSAnc3ludGgnIEFORCByLnN0ZXBfbmFtZSA9ICdzeW50aCcgVEhFTiAnc3ludGgnIEVMU0Ugci5zdGFnZV9uYW1lIHx8ICcvJyB8fCByLnN0ZXBfbmFtZSBFTkQgQVMgc3RlcFxuICAgICAgRlJPTSBwaXBlbGluZV9wbHVnaW5fcmVzb2x1dGlvbiByXG4gICAgICBXSEVSRSByLnBsdWdpbl9uYW1lID0gJHtyZWYucGx1Z2luTmFtZX0gQU5EIHIucmVzb2x2ZWRfdmVyc2lvbiA9ICR7cmVmLnBsdWdpblZlcnNpb259XG4gICAgICAgICR7cHVibGlzaGVyU3FsKCdyLnBsdWdpbl9wdWJsaXNoZXInKX0ke2RpZ2VzdFNxbCgnci5yZXNvbHZlZF9kaWdlc3QnKX0ke29yZ1NxbCgnci5vcmdfaWQnKX1cbiAgICApIHhcbiAgICBKT0lOIHBpcGVsaW5lcyBwIE9OIHAuaWQ6OnRleHQgPSB4LnBpcGVsaW5lX2lkIEFORCBwLmRlbGV0ZWRfYXQgSVMgTlVMTFxuICAgIEdST1VQIEJZIHgub3JnX2lkLCB4LnBpcGVsaW5lX2lkLCB4LnNvdXJjZSwgcC5waXBlbGluZV9uYW1lXG4gICAgT1JERVIgQlkgeC5waXBlbGluZV9pZCwgeC5zb3VyY2VcbiAgYCkpO1xuICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogKChyZXN1bHQgYXMgeyByb3dzPzogdW5rbm93bltdIH0pPy5yb3dzID8/IFtdKTtcbiAgcmV0dXJuIChyb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikubWFwKChyKSA9PiAoe1xuICAgIG9yZ0lkOiBTdHJpbmcoci5vcmdfaWQpLFxuICAgIHBpcGVsaW5lSWQ6IFN0cmluZyhyLnBpcGVsaW5lX2lkKSxcbiAgICBwaXBlbGluZU5hbWU6IChyLnBpcGVsaW5lX25hbWUgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzb3VyY2U6IHIuc291cmNlIGFzIEV4cG9zdXJlU291cmNlLFxuICAgIHBsdWdpblB1Ymxpc2hlcjogKHIucGx1Z2luX3B1Ymxpc2hlciBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIGltYWdlRGlnZXN0OiAoci5pbWFnZV9kaWdlc3QgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzdGVwczogQXJyYXkuaXNBcnJheShyLnN0ZXBzKSA/IChyLnN0ZXBzIGFzIHN0cmluZ1tdKSA6IFtdLFxuICB9KSk7XG59XG5cbi8qKlxuICogVGhlIHJlc2NhbidzIGVudHJ5IHBvaW50OiBvbmUgcmVzY2FubmVkIHZlcnNpb24ncyBmaW5kaW5ncywgZmFubmVkIG91dCB0byBldmVyeVxuICogcGlwZWxpbmUgdGhhdCBkZWNsYXJlcyBvciBydW5zIGl0LlxuICpcbiAqIEEgdmVyc2lvbiB3aXRoIG9wZW4gZml4YWJsZSBmaW5kaW5ncyBvcGVucyAvIHJlZnJlc2hlcyBvbmUgZXhwb3N1cmUgcGVyXG4gKiAocGlwZWxpbmUsIHNvdXJjZSk7IGEgdmVyc2lvbiB0aGF0IGNhbWUgYmFjayBDTEVBTiBjbG9zZXMgZXZlcnkgb3BlbiBleHBvc3VyZVxuICogb24gaXQgKGBmaXhlZGApLCBzbyBhIHJlYnVpbGQtaW4tcGxhY2Ugb3IgYW4gYWR2aXNvcnkgd2l0aGRyYXduIHVwc3RyZWFtIHNob3dzXG4gKiBhcyBmaXhlZCBvbiB0aGUgbmV4dCBuaWdodCByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgZWFjaCBwaXBlbGluZSByZWRlcGxveXMuXG4gKlxuICogTXVzdCBydW4gd2l0aCBhIHNjb3BlIHRoYXQgY2FuIHJlYWQgYW5kIHdyaXRlIGV2ZXJ5IG9yZydzIHJvd3MgKHRoZSByZXNjYW4nc1xuICogZWxldmF0ZWQgY29udGV4dCkuIE5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNWZXJzaW9uRXhwb3N1cmVzKFxuICByZWY6IFBsdWdpblZlcnNpb25SZWYsXG4gIHNjYW46IFNjYW5TdGF0ZSxcbiAgbm93ID0gbmV3IERhdGUoKSxcbik6IFByb21pc2U8eyBvcGVuZWQ6IG51bWJlcjsgY2xvc2VkOiBudW1iZXIgfT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGNvdW50cyA9IGV4cG9zdXJlRnJvbVNjYW4oeyAuLi5zY2FuLCBpbWFnZURpZ2VzdDogcmVmLmltYWdlRGlnZXN0ID8/IHNjYW4uaW1hZ2VEaWdlc3QgPz8gbnVsbCB9KTtcbiAgICBpZiAoIWNvdW50cykgcmV0dXJuIHsgb3BlbmVkOiAwLCBjbG9zZWQ6IGF3YWl0IGNsb3NlVmVyc2lvbkV4cG9zdXJlcyhyZWYsIG5vdykgfTtcbiAgICBjb25zdCBwaXBlbGluZXMgPSBhd2FpdCBwaXBlbGluZXNPblZlcnNpb24ocmVmKTtcbiAgICBjb25zdCBvcGVuZWQgPSBhd2FpdCB1cHNlcnRFeHBvc3VyZXMocGlwZWxpbmVzLm1hcCgocCkgPT4gKHtcbiAgICAgIG9yZ0lkOiBwLm9yZ0lkLFxuICAgICAgcGlwZWxpbmVJZDogcC5waXBlbGluZUlkLFxuICAgICAgcGx1Z2luUHVibGlzaGVyOiBwLnBsdWdpblB1Ymxpc2hlcixcbiAgICAgIHBsdWdpbk5hbWU6IHJlZi5wbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogcmVmLnBsdWdpblZlcnNpb24sXG4gICAgICBpbWFnZURpZ2VzdDogcmVmLmltYWdlRGlnZXN0ID8/IHAuaW1hZ2VEaWdlc3QsXG4gICAgICBzb3VyY2U6IHAuc291cmNlLFxuICAgICAgY3JpdGljYWxDb3VudDogY291bnRzLmNyaXRpY2FsQ291bnQsXG4gICAgICBoaWdoQ291bnQ6IGNvdW50cy5oaWdoQ291bnQsXG4gICAgICB0b3BGaW5kaW5nczogY291bnRzLnRvcEZpbmRpbmdzIGFzIHVua25vd24gYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgZmluZGluZ0tleXM6IGNvdW50cy5maW5kaW5nS2V5cyxcbiAgICB9KSksIG5vdyk7XG4gICAgcmV0dXJuIHsgb3BlbmVkLCBjbG9zZWQ6IDAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1ZlcnNpb24gZXhwb3N1cmUgc3luYyBmYWlsZWQnLCB7IHBsdWdpbjogcmVmLnBsdWdpbk5hbWUsIHZlcnNpb246IHJlZi5wbHVnaW5WZXJzaW9uLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHsgb3BlbmVkOiAwLCBjbG9zZWQ6IDAgfTtcbiAgfVxufVxuXG4vKiogQ2xvc2UgZXZlcnkgb3BlbiBleHBvc3VyZSBvbiBhIHZlcnNpb24gKG9wdGlvbmFsbHkgb25lIGltYWdlIG9mIGl0KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9zZVZlcnNpb25FeHBvc3VyZXMocmVmOiBQbHVnaW5WZXJzaW9uUmVmLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgRSA9IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmU7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoRSlcbiAgICAuc2V0KHsgZml4ZWRBdDogbm93LCB0cmlhZ2VTdGF0ZTogJ2ZpeGVkJywgdXBkYXRlZEF0OiBub3cgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoRS5wbHVnaW5OYW1lLCByZWYucGx1Z2luTmFtZSksXG4gICAgICBlcShFLnBsdWdpblZlcnNpb24sIHJlZi5wbHVnaW5WZXJzaW9uKSxcbiAgICAgIGlzTnVsbChFLmZpeGVkQXQpLFxuICAgICAgLi4uKHJlZi5pbWFnZURpZ2VzdCA/IFtlcShFLmltYWdlRGlnZXN0LCByZWYuaW1hZ2VEaWdlc3QpXSA6IFtdKSxcbiAgICAgIC4uLihyZWYucGx1Z2luUHVibGlzaGVyID09PSB1bmRlZmluZWQgPyBbXSA6IFtyZWYucGx1Z2luUHVibGlzaGVyID09PSBudWxsID8gaXNOdWxsKEUucGx1Z2luUHVibGlzaGVyKSA6IGVxKEUucGx1Z2luUHVibGlzaGVyLCByZWYucGx1Z2luUHVibGlzaGVyKV0pLFxuICAgICAgLi4uKHJlZi5vcmdJZHMgPyBbaW5BcnJheShFLm9yZ0lkLCBbLi4ucmVmLm9yZ0lkc10pXSA6IFtdKSxcbiAgICApKVxuICAgIC5yZXR1cm5pbmcoeyBpZDogRS5pZCB9KSk7XG4gIHJldHVybiAocm93cyBhcyB1bmtub3duW10pLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBUaGUgb3JnJ3MgbGl2ZSBleHBvc3VyZXMsIGZvciB0aGUgcmVwb3J0IHNlY3Rpb24uXG4gKlxuICogYGFjY2VwdGVkYCByb3dzIHdob3NlIGRlYWRsaW5lIGhhcyBwYXNzZWQgY29tZSBiYWNrIGFzIE9QRU4gZXZlbiBpZiBubyByZXNjYW5cbiAqIGhhcyByZWZyZXNoZWQgdGhlbSB5ZXQ6IGEgcmVhZCBtdXN0IG5vdCBwcmVzZW50IGFuIGV4cGlyZWQgYWNjZXB0YW5jZSBhcyBhXG4gKiBjdXJyZW50IG9uZSwgYW5kIHRoZSByZXBvcnQgaXMgcmVhZCBmYXIgbW9yZSBvZnRlbiB0aGFuIHRoZSByZXNjYW4gcnVucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5FeHBvc3VyZXMob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8e1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBwbHVnaW5QdWJsaXNoZXI6IHN0cmluZyB8IG51bGw7XG4gIHNvdXJjZTogRXhwb3N1cmVTb3VyY2U7XG4gIGNyaXRpY2FsQ291bnQ6IG51bWJlcjtcbiAgaGlnaENvdW50OiBudW1iZXI7XG4gIHRvcEZpbmRpbmdzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIHRyaWFnZVN0YXRlOiBzdHJpbmc7XG4gIGZsYWdnZWRBdDogRGF0ZTtcbn0+PiB7XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgIHBpcGVsaW5lSWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGlwZWxpbmVJZCxcbiAgICBwbHVnaW5OYW1lOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBsdWdpbk5hbWUsXG4gICAgcGx1Z2luVmVyc2lvbjogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5WZXJzaW9uLFxuICAgIHBsdWdpblB1Ymxpc2hlcjogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5QdWJsaXNoZXIsXG4gICAgc291cmNlOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnNvdXJjZSxcbiAgICBjcml0aWNhbENvdW50OiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmNyaXRpY2FsQ291bnQsXG4gICAgaGlnaENvdW50OiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmhpZ2hDb3VudCxcbiAgICB0b3BGaW5kaW5nczogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS50b3BGaW5kaW5ncyxcbiAgICB0cmlhZ2VTdGF0ZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS50cmlhZ2VTdGF0ZSxcbiAgICBhY2NlcHRlZFVudGlsOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkVW50aWwsXG4gICAgZmxhZ2dlZEF0OiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmZsYWdnZWRBdCxcbiAgfSkuZnJvbShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLm9yZ0lkLCBvcmdJZCksXG4gICAgICBsaXZlRXhwb3N1cmVQcmVkaWNhdGUobm93KSxcbiAgICApKVxuICAgIC5vcmRlckJ5KHNxbGAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuY3JpdGljYWxDb3VudH0gREVTQywgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmhpZ2hDb3VudH0gREVTQ2ApKTtcblxuICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5tYXAoKHIpID0+ICh7XG4gICAgcGlwZWxpbmVJZDogci5waXBlbGluZUlkIGFzIHN0cmluZyxcbiAgICBwbHVnaW5OYW1lOiByLnBsdWdpbk5hbWUgYXMgc3RyaW5nLFxuICAgIHBsdWdpblZlcnNpb246IHIucGx1Z2luVmVyc2lvbiBhcyBzdHJpbmcsXG4gICAgcGx1Z2luUHVibGlzaGVyOiAoci5wbHVnaW5QdWJsaXNoZXIgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzb3VyY2U6IHIuc291cmNlIGFzIEV4cG9zdXJlU291cmNlLFxuICAgIGNyaXRpY2FsQ291bnQ6IHIuY3JpdGljYWxDb3VudCBhcyBudW1iZXIsXG4gICAgaGlnaENvdW50OiByLmhpZ2hDb3VudCBhcyBudW1iZXIsXG4gICAgdG9wRmluZGluZ3M6IChyLnRvcEZpbmRpbmdzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPz8gW10sXG4gICAgLy8gT25seSBhY2NlcHRhbmNlcyBOT1QgaW4gZm9yY2UgcGFzcyB0aGUgbGl2ZSBwcmVkaWNhdGUsIHNvIGFuIGBhY2NlcHRlZGBcbiAgICAvLyByb3cgaGVyZSBpcyBhbiBleHBpcmVkIG9uZSwgYW5kIHJlYWRzIGFzIHdoYXQgaXQgaXM6IG9wZW4uXG4gICAgdHJpYWdlU3RhdGU6IHIudHJpYWdlU3RhdGUgPT09ICdhY2NlcHRlZCcgPyAnb3BlbicgOiAoci50cmlhZ2VTdGF0ZSBhcyBzdHJpbmcpLFxuICAgIGZsYWdnZWRBdDogci5mbGFnZ2VkQXQgYXMgRGF0ZSxcbiAgfSkpO1xufVxuXG4vKiogT25lIGV4cG9zdXJlIHJvdyBhcyB0aGUgcGVyLXBpcGVsaW5lIHNlY3VyaXR5IHZpZXdzIHJlYWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lRXhwb3N1cmUge1xuICBpZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICBzb3VyY2U6IEV4cG9zdXJlU291cmNlO1xuICBjcml0aWNhbENvdW50OiBudW1iZXI7XG4gIGhpZ2hDb3VudDogbnVtYmVyO1xuICB0b3BGaW5kaW5nczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICBmaW5kaW5nS2V5czogc3RyaW5nW107XG4gIC8qKiBBcyBzdG9yZWQ7IGFuIGBhY2NlcHRlZGAgcm93IHBhc3QgaXRzIGRlYWRsaW5lIHJlYWRzIGBvcGVuYCAoc2VlIHtAbGluayBsaXZlRXhwb3N1cmVQcmVkaWNhdGV9KS4gKi9cbiAgdHJpYWdlU3RhdGU6IHN0cmluZztcbiAgLyoqIEFuIGFjY2VwdGFuY2Ugc3RpbGwgaW4gZm9yY2UgcmlnaHQgbm93LiAqL1xuICBhY2NlcHRhbmNlQWN0aXZlOiBib29sZWFuO1xuICBhY2NlcHRlZFVudGlsOiBEYXRlIHwgbnVsbDtcbiAgYWNjZXB0ZWRGaW5kaW5nS2V5czogc3RyaW5nW107XG4gIGFjY2VwdGVkS2V2OiBib29sZWFuO1xuICB0cmlhZ2VSZWFzb246IHN0cmluZyB8IG51bGw7XG4gIHRyaWFnZWRCeTogc3RyaW5nIHwgbnVsbDtcbiAgdHJpYWdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgZmxhZ2dlZEF0OiBEYXRlO1xuICBmaXhlZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuY29uc3QgRSA9ICgpID0+IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmU7XG5cbmZ1bmN0aW9uIHRvUGlwZWxpbmVFeHBvc3VyZShyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbm93OiBEYXRlKTogUGlwZWxpbmVFeHBvc3VyZSB7XG4gIGNvbnN0IHVudGlsID0gKHIuYWNjZXB0ZWRVbnRpbCBhcyBEYXRlIHwgbnVsbCkgPz8gbnVsbDtcbiAgY29uc3QgYWN0aXZlID0gci50cmlhZ2VTdGF0ZSA9PT0gJ2FjY2VwdGVkJyAmJiByLmZpeGVkQXQgPT0gbnVsbCAmJiB1bnRpbCAhPT0gbnVsbCAmJiB1bnRpbC5nZXRUaW1lKCkgPiBub3cuZ2V0VGltZSgpO1xuICByZXR1cm4ge1xuICAgIGlkOiByLmlkIGFzIHN0cmluZyxcbiAgICBvcmdJZDogci5vcmdJZCBhcyBzdHJpbmcsXG4gICAgcGlwZWxpbmVJZDogci5waXBlbGluZUlkIGFzIHN0cmluZyxcbiAgICBwbHVnaW5QdWJsaXNoZXI6IChyLnBsdWdpblB1Ymxpc2hlciBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIHBsdWdpbk5hbWU6IHIucGx1Z2luTmFtZSBhcyBzdHJpbmcsXG4gICAgcGx1Z2luVmVyc2lvbjogci5wbHVnaW5WZXJzaW9uIGFzIHN0cmluZyxcbiAgICBpbWFnZURpZ2VzdDogKHIuaW1hZ2VEaWdlc3QgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBzb3VyY2U6IHIuc291cmNlIGFzIEV4cG9zdXJlU291cmNlLFxuICAgIGNyaXRpY2FsQ291bnQ6IHIuY3JpdGljYWxDb3VudCBhcyBudW1iZXIsXG4gICAgaGlnaENvdW50OiByLmhpZ2hDb3VudCBhcyBudW1iZXIsXG4gICAgdG9wRmluZGluZ3M6IChyLnRvcEZpbmRpbmdzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPz8gW10sXG4gICAgZmluZGluZ0tleXM6IChyLmZpbmRpbmdLZXlzIGFzIHN0cmluZ1tdKSA/PyBbXSxcbiAgICB0cmlhZ2VTdGF0ZTogci50cmlhZ2VTdGF0ZSA9PT0gJ2FjY2VwdGVkJyAmJiAhYWN0aXZlICYmIHIuZml4ZWRBdCA9PSBudWxsID8gJ29wZW4nIDogKHIudHJpYWdlU3RhdGUgYXMgc3RyaW5nKSxcbiAgICBhY2NlcHRhbmNlQWN0aXZlOiBhY3RpdmUsXG4gICAgYWNjZXB0ZWRVbnRpbDogdW50aWwsXG4gICAgYWNjZXB0ZWRGaW5kaW5nS2V5czogKHIuYWNjZXB0ZWRGaW5kaW5nS2V5cyBhcyBzdHJpbmdbXSkgPz8gW10sXG4gICAgYWNjZXB0ZWRLZXY6IHIuYWNjZXB0ZWRLZXYgPT09IHRydWUsXG4gICAgdHJpYWdlUmVhc29uOiAoci50cmlhZ2VSZWFzb24gYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICB0cmlhZ2VkQnk6IChyLnRyaWFnZWRCeSBhcyBzdHJpbmcgfCBudWxsKSA/PyBudWxsLFxuICAgIHRyaWFnZWRBdDogKHIudHJpYWdlZEF0IGFzIERhdGUgfCBudWxsKSA/PyBudWxsLFxuICAgIGZsYWdnZWRBdDogci5mbGFnZ2VkQXQgYXMgRGF0ZSxcbiAgICBmaXhlZEF0OiAoci5maXhlZEF0IGFzIERhdGUgfCBudWxsKSA/PyBudWxsLFxuICB9O1xufVxuXG4vKipcbiAqIE9uZSBwaXBlbGluZSdzIGV4cG9zdXJlczogdGhlIHVuZml4ZWQgb25lcyAob3BlbiwgYWNjZXB0ZWQsIGZhbHNlIHBvc2l0aXZlKSxcbiAqIHBsdXMgdGhlIGZpeGVkIG9uZXMgd2hlbiBhc2tlZCDigJQgbW9zdCBzZXZlcmUgZmlyc3QuIFJlYWRzIHVuZGVyIHRoZSBDQUxMRVInc1xuICogc2NvcGUsIG5hcnJvd2VkIHRvIGBvcmdJZGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaXBlbGluZUV4cG9zdXJlcyhcbiAgb3JnSWQ6IHN0cmluZyxcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBvcHRzOiB7IGluY2x1ZGVGaXhlZD86IGJvb2xlYW47IG5vdz86IERhdGUgfSA9IHt9LFxuKTogUHJvbWlzZTxQaXBlbGluZUV4cG9zdXJlW10+IHtcbiAgY29uc3Qgbm93ID0gb3B0cy5ub3cgPz8gbmV3IERhdGUoKTtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oRSgpKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShFKCkub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKEUoKS5waXBlbGluZUlkLCBwaXBlbGluZUlkKSxcbiAgICAgIC4uLihvcHRzLmluY2x1ZGVGaXhlZCA/IFtdIDogW2lzTnVsbChFKCkuZml4ZWRBdCldKSxcbiAgICApKVxuICAgIC5vcmRlckJ5KHNxbGAke0UoKS5jcml0aWNhbENvdW50fSBERVNDLCAke0UoKS5oaWdoQ291bnR9IERFU0MsICR7RSgpLnBsdWdpbk5hbWV9YCkpO1xuICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5tYXAoKHIpID0+IHRvUGlwZWxpbmVFeHBvc3VyZShyLCBub3cpKTtcbn1cblxuLyoqIE9uZSBleHBvc3VyZSByb3cgb2YgYG9yZ0lkYCwgb3IgbnVsbC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvc3VyZUJ5SWQob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UGlwZWxpbmVFeHBvc3VyZSB8IG51bGw+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCgpLmZyb20oRSgpKS53aGVyZShhbmQoZXEoRSgpLmlkLCBpZCksIGVxKEUoKS5vcmdJZCwgb3JnSWQpKSkpO1xuICBjb25zdCByb3cgPSAocm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pWzBdO1xuICByZXR1cm4gcm93ID8gdG9QaXBlbGluZUV4cG9zdXJlKHJvdywgbm93KSA6IG51bGw7XG59XG5cbi8qKiBBIHRyaWFnZSBkZWNpc2lvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWdlRGVjaXNpb24ge1xuICBzdGF0ZTogJ29wZW4nIHwgJ2FjY2VwdGVkJyB8ICdmYWxzZV9wb3NpdGl2ZSc7XG4gIHJlYXNvbj86IHN0cmluZztcbiAgYWNjZXB0ZWRVbnRpbD86IERhdGU7XG4gIC8qKiBBY2NlcHQgS0VWLWxpc3RlZCBmaW5kaW5ncyB0b28uIE5ldmVyIGltcGxpZWQ6IGFuIGFjY2VwdGFuY2Ugd2l0aG91dCBpdCBkb2VzIG5vdCBjb3ZlciB0aGVtLiAqL1xuICBrZXY/OiBib29sZWFuO1xuICBhY3Rvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlY29yZCBhIHRyaWFnZSBkZWNpc2lvbiBvbiBvbmUgZXhwb3N1cmUg4oCUIGFuZCBvbiBpdHMgU0lCTElOR1M6IHRoZSBzYW1lXG4gKiBwaXBlbGluZSdzIG90aGVyIG9wZW4gcm93IGZvciB0aGUgc2FtZSB2ZXJzaW9uIGFuZCBpbWFnZSAodGhlIGRlY2xhcmVkIGFuZFxuICogdGhlIGRlcGxveWVkIHNpZGUpLiBBIHJpc2sgZGVjaXNpb24gaXMgYWJvdXQgd2hhdCB0aGUgcGlwZWxpbmUgcnVucywgYW5kXG4gKiBsZWF2aW5nIG9uZSBzaWRlIG9wZW4gd291bGQgaGF2ZSB0aGUgcmVwb3J0IGFuZCB0aGUgbG9va3VwIGRpc2FncmVlLlxuICpcbiAqIGBhY2NlcHRlZGAgUkVRVUlSRVMgYSBkZWFkbGluZSBhbmQgYSByZWFzb24uIEEgcGVybWFuZW50LCB1bmV4cGxhaW5lZCBtdXRlIGlzXG4gKiBob3cgYSBmaW5kaW5nIHN0b3BzIGJlaW5nIGFueWJvZHkncyBwcm9ibGVtLCBhbmQgdGhlcmUgaXMgbm8gZ29vZCByZWFzb24gdG9cbiAqIHN1cHBvcnQgaXQg4oCUIHRoZSBjYWxsZXIgZ2V0cyBhbiBlcnJvciByYXRoZXIgdGhhbiBhIHNpbGVudGx5IHVuYm91bmRlZFxuICogYWNjZXB0YW5jZS4gVGhlIGFjY2VwdGVkIGZpbmRpbmcga2V5cyBhcmUgRlJPWkVOIGF0IHRoZSBkZWNpc2lvbjogYW5cbiAqIGFjY2VwdGFuY2UgY292ZXJzIHdoYXQgd2FzIHRoZXJlIHdoZW4gaXQgd2FzIG1hZGUsIG5ldmVyIGEgZmluZGluZyBzaW5jZS5cbiAqXG4gKiBSZXR1cm5zIHRoZSB1cGRhdGVkIHJvd3MgKGVtcHR5IHdoZW4gYGlkYCBpcyBub3QgYG9yZ0lkYCdzIHVuZml4ZWQgZXhwb3N1cmUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJpYWdlRXhwb3N1cmUob3JnSWQ6IHN0cmluZywgaWQ6IHN0cmluZywgZGVjaXNpb246IFRyaWFnZURlY2lzaW9uKTogUHJvbWlzZTxQaXBlbGluZUV4cG9zdXJlW10+IHtcbiAgaWYgKGRlY2lzaW9uLnN0YXRlID09PSAnYWNjZXB0ZWQnICYmICghZGVjaXNpb24uYWNjZXB0ZWRVbnRpbCB8fCAhZGVjaXNpb24ucmVhc29uPy50cmltKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY2NlcHRpbmcgYSB2dWxuZXJhYmlsaXR5IGV4cG9zdXJlIG5lZWRzIGEgcmVhc29uIGFuZCBhbiBleHBpcnkgZGF0ZScpO1xuICB9XG4gIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHRhcmdldCA9IGF3YWl0IGV4cG9zdXJlQnlJZChvcmdJZCwgaWQsIG5vdyk7XG4gIGlmICghdGFyZ2V0IHx8IHRhcmdldC5maXhlZEF0KSByZXR1cm4gW107XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoRSgpKVxuICAgIC5zZXQoe1xuICAgICAgdHJpYWdlU3RhdGU6IGRlY2lzaW9uLnN0YXRlLFxuICAgICAgYWNjZXB0ZWRVbnRpbDogZGVjaXNpb24uc3RhdGUgPT09ICdhY2NlcHRlZCcgPyAoZGVjaXNpb24uYWNjZXB0ZWRVbnRpbCA/PyBudWxsKSA6IG51bGwsXG4gICAgICBhY2NlcHRlZEZpbmRpbmdLZXlzOiBkZWNpc2lvbi5zdGF0ZSA9PT0gJ2FjY2VwdGVkJyA/IHNxbGAke0UoKS5maW5kaW5nS2V5c31gIDogW10sXG4gICAgICBhY2NlcHRlZEtldjogZGVjaXNpb24uc3RhdGUgPT09ICdhY2NlcHRlZCcgJiYgZGVjaXNpb24ua2V2ID09PSB0cnVlLFxuICAgICAgdHJpYWdlUmVhc29uOiBkZWNpc2lvbi5yZWFzb24/LnRyaW0oKSB8fCBudWxsLFxuICAgICAgdHJpYWdlZEJ5OiBkZWNpc2lvbi5hY3RvcixcbiAgICAgIHRyaWFnZWRBdDogbm93LFxuICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgfSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoRSgpLm9yZ0lkLCBvcmdJZCksXG4gICAgICBlcShFKCkucGlwZWxpbmVJZCwgdGFyZ2V0LnBpcGVsaW5lSWQpLFxuICAgICAgZXEoRSgpLnBsdWdpbk5hbWUsIHRhcmdldC5wbHVnaW5OYW1lKSxcbiAgICAgIGVxKEUoKS5wbHVnaW5WZXJzaW9uLCB0YXJnZXQucGx1Z2luVmVyc2lvbiksXG4gICAgICB0YXJnZXQuaW1hZ2VEaWdlc3QgPT09IG51bGwgPyBpc051bGwoRSgpLmltYWdlRGlnZXN0KSA6IGVxKEUoKS5pbWFnZURpZ2VzdCwgdGFyZ2V0LmltYWdlRGlnZXN0KSxcbiAgICAgIGlzTnVsbChFKCkuZml4ZWRBdCksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKCkpO1xuICByZXR1cm4gKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5tYXAoKHIpID0+IHRvUGlwZWxpbmVFeHBvc3VyZShyLCBub3cpKTtcbn1cblxuLyoqIGBuYW1lQHZlcnNpb25AZGlnZXN0YCDigJQgdGhlIGtleSB7QGxpbmsgYWN0aXZlQWNjZXB0YW5jZXN9IGFuc3dlcnMgdW5kZXIuICovXG5leHBvcnQgY29uc3QgYWNjZXB0YW5jZUtleSA9IChwbHVnaW5OYW1lOiBzdHJpbmcsIHBsdWdpblZlcnNpb246IHN0cmluZywgaW1hZ2VEaWdlc3Q/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nID0+XG4gIGAke3BsdWdpbk5hbWV9QCR7cGx1Z2luVmVyc2lvbn1AJHtpbWFnZURpZ2VzdCA/PyAnJ31gO1xuXG4vKiogQSBwaXBlbGluZSdzIGFjY2VwdGFuY2VzIGluIGZvcmNlLCBrZXllZCBieSB7QGxpbmsgYWNjZXB0YW5jZUtleX0sIHBsdXMgdGhlIGFjY2VwdGVkIHZlcnNpb25zIHBlciBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQWNjZXB0YW5jZXMge1xuICBieUtleTogTWFwPHN0cmluZywgVnVsbkFjY2VwdGFuY2UgJiB7IGV4cG9zdXJlSWRzOiBzdHJpbmdbXSB9PjtcbiAgLyoqIGBwbHVnaW5OYW1lYCDihpIgdmVyc2lvbnMgd2l0aCBhbiBhY2NlcHRhbmNlICh0aGUgcmVzb2x2ZXIncyBgYWNjZXB0ZWRWZXJzaW9uc2AgaGludCkuICovXG4gIHZlcnNpb25zQnlQbHVnaW46IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBUaGUgYWNjZXB0YW5jZXMgSU4gRk9SQ0UgZm9yIG9uZSBwaXBlbGluZSAoYGFjY2VwdGVkYCwgdW5maXhlZCwgZGVhZGxpbmUgaW4gdGhlXG4gKiBmdXR1cmUpLCBtZXJnZWQgcGVyIHZlcnNpb24gYW5kIGltYWdlOiB0aGUgdW5pb24gb2YgdGhlIGZpbmRpbmcga2V5cyB0aGUgcm93c1xuICogZnJvemUsIEtFViBvbmx5IHdoZW4gZXZlcnkgbWVyZ2VkIHJvdyBhY2NlcHRlZCBpdC4gUmVhZHMgdW5kZXIgdGhlIGNhbGxlcidzXG4gKiBzY29wZSBuYXJyb3dlZCB0byBgb3JnSWRgOyBhIGZhaWxlZCByZWFkIGlzIFwibm8gYWNjZXB0YW5jZVwiIOKAlCB0aGUgc3RyaWN0ZXIgYW5zd2VyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWN0aXZlQWNjZXB0YW5jZXMob3JnSWQ6IHN0cmluZywgcGlwZWxpbmVJZDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxQaXBlbGluZUFjY2VwdGFuY2VzPiB7XG4gIGNvbnN0IG91dDogUGlwZWxpbmVBY2NlcHRhbmNlcyA9IHsgYnlLZXk6IG5ldyBNYXAoKSwgdmVyc2lvbnNCeVBsdWdpbjogbmV3IE1hcCgpIH07XG4gIHRyeSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7XG4gICAgICBpZDogRSgpLmlkLFxuICAgICAgcGx1Z2luTmFtZTogRSgpLnBsdWdpbk5hbWUsXG4gICAgICBwbHVnaW5WZXJzaW9uOiBFKCkucGx1Z2luVmVyc2lvbixcbiAgICAgIGltYWdlRGlnZXN0OiBFKCkuaW1hZ2VEaWdlc3QsXG4gICAgICBhY2NlcHRlZFVudGlsOiBFKCkuYWNjZXB0ZWRVbnRpbCxcbiAgICAgIGFjY2VwdGVkRmluZGluZ0tleXM6IEUoKS5hY2NlcHRlZEZpbmRpbmdLZXlzLFxuICAgICAgYWNjZXB0ZWRLZXY6IEUoKS5hY2NlcHRlZEtldixcbiAgICB9KS5mcm9tKEUoKSlcbiAgICAgIC53aGVyZShhbmQoXG4gICAgICAgIGVxKEUoKS5vcmdJZCwgb3JnSWQpLFxuICAgICAgICBlcShFKCkucGlwZWxpbmVJZCwgcGlwZWxpbmVJZCksXG4gICAgICAgIGVxKEUoKS50cmlhZ2VTdGF0ZSwgJ2FjY2VwdGVkJyksXG4gICAgICAgIGlzTnVsbChFKCkuZml4ZWRBdCksXG4gICAgICAgIHNxbGAke0UoKS5hY2NlcHRlZFVudGlsfSA+ICR7bm93fWAsXG4gICAgICApKSkgYXMgQXJyYXk8eyBpZDogc3RyaW5nOyBwbHVnaW5OYW1lOiBzdHJpbmc7IHBsdWdpblZlcnNpb246IHN0cmluZzsgaW1hZ2VEaWdlc3Q6IHN0cmluZyB8IG51bGw7IGFjY2VwdGVkVW50aWw6IERhdGU7IGFjY2VwdGVkRmluZGluZ0tleXM6IHN0cmluZ1tdOyBhY2NlcHRlZEtldjogYm9vbGVhbiB9PjtcbiAgICBmb3IgKGNvbnN0IHIgb2Ygcm93cykge1xuICAgICAgY29uc3Qga2V5ID0gYWNjZXB0YW5jZUtleShyLnBsdWdpbk5hbWUsIHIucGx1Z2luVmVyc2lvbiwgci5pbWFnZURpZ2VzdCk7XG4gICAgICBjb25zdCBwcmV2ID0gb3V0LmJ5S2V5LmdldChrZXkpO1xuICAgICAgb3V0LmJ5S2V5LnNldChrZXksIHByZXZcbiAgICAgICAgPyB7XG4gICAgICAgICAgZmluZGluZ0tleXM6IFsuLi5uZXcgU2V0KFsuLi5wcmV2LmZpbmRpbmdLZXlzLCAuLi4oci5hY2NlcHRlZEZpbmRpbmdLZXlzID8/IFtdKV0pXSxcbiAgICAgICAgICBrZXY6IHByZXYua2V2ICYmIHIuYWNjZXB0ZWRLZXYsXG4gICAgICAgICAgYWNjZXB0ZWRVbnRpbDogcHJldi5hY2NlcHRlZFVudGlsICYmIG5ldyBEYXRlKHByZXYuYWNjZXB0ZWRVbnRpbCkgPCByLmFjY2VwdGVkVW50aWwgPyBwcmV2LmFjY2VwdGVkVW50aWwgOiByLmFjY2VwdGVkVW50aWwsXG4gICAgICAgICAgZXhwb3N1cmVJZHM6IFsuLi5wcmV2LmV4cG9zdXJlSWRzLCByLmlkXSxcbiAgICAgICAgfVxuICAgICAgICA6IHsgZmluZGluZ0tleXM6IHIuYWNjZXB0ZWRGaW5kaW5nS2V5cyA/PyBbXSwga2V2OiByLmFjY2VwdGVkS2V2LCBhY2NlcHRlZFVudGlsOiByLmFjY2VwdGVkVW50aWwsIGV4cG9zdXJlSWRzOiBbci5pZF0gfSk7XG4gICAgICBjb25zdCB2ZXJzaW9ucyA9IG91dC52ZXJzaW9uc0J5UGx1Z2luLmdldChyLnBsdWdpbk5hbWUpID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgdmVyc2lvbnMuYWRkKHIucGx1Z2luVmVyc2lvbik7XG4gICAgICBvdXQudmVyc2lvbnNCeVBsdWdpbi5zZXQoci5wbHVnaW5OYW1lLCB2ZXJzaW9ucyk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybignUGlwZWxpbmUgYWNjZXB0YW5jZXMgdW5yZWFkYWJsZTsgdHJlYXRpbmcgYXMgbm9uZScsIHsgcGlwZWxpbmVJZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBBbiBhY2NlcHRhbmNlIHRoYXQgbGFwc2VkLCBhcyB7QGxpbmsgcmVvcGVuTGFwc2VkQWNjZXB0YW5jZXN9IHJldHVybnMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIExhcHNlZEFjY2VwdGFuY2Uge1xuICBpZDogc3RyaW5nO1xuICBvcmdJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsO1xuICB0cmlhZ2VkQnk6IHN0cmluZyB8IG51bGw7XG4gIHRyaWFnZVJlYXNvbjogc3RyaW5nIHwgbnVsbDtcbiAgYWNjZXB0ZWRVbnRpbDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogUmVvcGVuIGV2ZXJ5IGFjY2VwdGFuY2Ugd2hvc2UgZGVhZGxpbmUgaGFzIHBhc3NlZCwgYW5kIHJldHVybiB0aGVtIHNvIHRoZVxuICogcGlwZWxpbmUgb3duZXJzIGNhbiBiZSB0b2xkIChOMzMpLiBSZWFkZXJzIGFscmVhZHkgdHJlYXQgc3VjaCBhIHJvdyBhcyBvcGVuO1xuICogd3JpdGluZyBpdCBtYWtlcyB0aGUgc3RvcmVkIHN0YXRlIHRoZSB0cnV0aCBhbmQgZ2l2ZXMgdGhlIG5vdGljZSBleGFjdGx5IG9uZVxuICogbW9tZW50IHRvIGZpcmUuIE11c3QgcnVuIHdpdGggYSBzY29wZSB0aGF0IGNhbiB3cml0ZSBldmVyeSBvcmcncyByb3dzICh0aGVcbiAqIG5pZ2h0bHkgcmVzY2FuJ3MgZWxldmF0ZWQgY29udGV4dCkuIE5ldmVyIHRocm93cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlb3BlbkxhcHNlZEFjY2VwdGFuY2VzKG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPExhcHNlZEFjY2VwdGFuY2VbXT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC51cGRhdGUoRSgpKVxuICAgICAgLnNldCh7IHRyaWFnZVN0YXRlOiAnb3BlbicsIHVwZGF0ZWRBdDogbm93IH0pXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShFKCkudHJpYWdlU3RhdGUsICdhY2NlcHRlZCcpLFxuICAgICAgICBpc051bGwoRSgpLmZpeGVkQXQpLFxuICAgICAgICBsdGUoRSgpLmFjY2VwdGVkVW50aWwsIG5vdyksXG4gICAgICApKVxuICAgICAgLnJldHVybmluZyh7XG4gICAgICAgIGlkOiBFKCkuaWQsXG4gICAgICAgIG9yZ0lkOiBFKCkub3JnSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IEUoKS5waXBlbGluZUlkLFxuICAgICAgICBwbHVnaW5QdWJsaXNoZXI6IEUoKS5wbHVnaW5QdWJsaXNoZXIsXG4gICAgICAgIHBsdWdpbk5hbWU6IEUoKS5wbHVnaW5OYW1lLFxuICAgICAgICBwbHVnaW5WZXJzaW9uOiBFKCkucGx1Z2luVmVyc2lvbixcbiAgICAgICAgaW1hZ2VEaWdlc3Q6IEUoKS5pbWFnZURpZ2VzdCxcbiAgICAgICAgdHJpYWdlZEJ5OiBFKCkudHJpYWdlZEJ5LFxuICAgICAgICB0cmlhZ2VSZWFzb246IEUoKS50cmlhZ2VSZWFzb24sXG4gICAgICAgIGFjY2VwdGVkVW50aWw6IEUoKS5hY2NlcHRlZFVudGlsLFxuICAgICAgfSkpO1xuICAgIHJldHVybiByb3dzIGFzIExhcHNlZEFjY2VwdGFuY2VbXTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ0xhcHNlZCBhY2NlcHRhbmNlcyBub3QgcmVvcGVuZWQnLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqXG4gKiBFeHBvc3VyZXMgd2hvc2UgYWNjZXB0YW5jZSBoYXMgbGFwc2VkLCBmb3IgdGhlIG9yZydzIHNlY3VyaXR5IG5vdGlmaWNhdGlvbnMuXG4gKlxuICogU3VyZmFjZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgcmVvcGVuZWQ6IHNvbWVib2R5IGRlY2lkZWQgdG8gYWNjZXB0IHRoaXMgdW50aWwgYVxuICogZGF0ZSwgdGhhdCBkYXRlIGhhcyBwYXNzZWQsIGFuZCB0aGUgcGVyc29uIHdobyBkZWNpZGVkIGlzIHRoZSBvbmUgd2hvIHNob3VsZFxuICogaGVhciBhYm91dCBpdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxhcHNlZEFjY2VwdGFuY2VzKG9yZ0lkOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPEFycmF5PHtcbiAgaWQ6IHN0cmluZztcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIHRyaWFnZWRCeTogc3RyaW5nIHwgbnVsbDtcbiAgYWNjZXB0ZWRVbnRpbDogRGF0ZSB8IG51bGw7XG59Pj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICBpZDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pZCxcbiAgICBwbHVnaW5OYW1lOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBsdWdpbk5hbWUsXG4gICAgcGx1Z2luVmVyc2lvbjogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5WZXJzaW9uLFxuICAgIHRyaWFnZWRCeTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS50cmlhZ2VkQnksXG4gICAgYWNjZXB0ZWRVbnRpbDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5hY2NlcHRlZFVudGlsLFxuICB9KS5mcm9tKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUpXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUub3JnSWQsIG9yZ0lkKSxcbiAgICAgIGVxKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGUsICdhY2NlcHRlZCcpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuZml4ZWRBdCksXG4gICAgICBsdGUoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5hY2NlcHRlZFVudGlsLCBub3cpLFxuICAgICkpKTtcbiAgcmV0dXJuIHJvd3MgYXMgQXJyYXk8eyBpZDogc3RyaW5nOyBwbHVnaW5OYW1lOiBzdHJpbmc7IHBsdWdpblZlcnNpb246IHN0cmluZzsgdHJpYWdlZEJ5OiBzdHJpbmcgfCBudWxsOyBhY2NlcHRlZFVudGlsOiBEYXRlIHwgbnVsbCB9Pjtcbn1cbiJdfQ==
698
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWV4cG9zdXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBpL3JlcG9ydGluZy9wbHVnaW4tZXhwb3N1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQStDLE1BQU0sNEJBQTRCLENBQUM7QUFDakosT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFZLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBeUIvQywwREFBMEQ7QUFDMUQsU0FBUyxNQUFNLENBQUMsQ0FBNEI7SUFDMUMsTUFBTSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDL0QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0s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QUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsRUFDckQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsRUFDekMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ04sT0FBTyxJQUE4SCxDQUFDO0FBQ3hJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBXaGF0IHBsdWdpbiB2ZXJzaW9ucyBhbiBvcmcncyBwaXBlbGluZXMgYXJlIGFjdHVhbGx5IG9uLCBhbmQgd2hpY2ggb2YgdGhvc2UgYXJlXG4gKiBrbm93bi12dWxuZXJhYmxlLlxuICpcbiAqIFR3byB0YWJsZXMsIHdyaXR0ZW4gaGVyZSwgcmVhZCBieSB0aGUgb3V0ZGF0ZWQtcGx1Z2luIGFuZCB2dWxuZXJhYmlsaXR5IHJlcG9ydFxuICogc2VjdGlvbnM6XG4gKlxuICogIC0gYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCDigJQgdGhlIERFQ0xBUkVEIHNpZGUuIFJlY29tcHV0ZWQgb24gcGlwZWxpbmVcbiAqICAgIHdyaXRlIGFuZCBvbiBwbHVnaW4gcHVibGlzaCwgYmVjYXVzZSB0aGUgYWx0ZXJuYXRpdmUgaXMgcmVzb2x2aW5nIGV2ZXJ5IHN0ZXBcbiAqICAgIG9mIGV2ZXJ5IHBpcGVsaW5lIGFnYWluc3QgdGhlIGNhdGFsb2cgb24gZXZlcnkgcmVhZCwgYW5kIHRoYXQgaXMgbm90IGEgcXVlcnlcbiAqICAgIGFueW9uZSBjYW4gYWZmb3JkIHRvIHB1dCBpbiBhIHJlcG9ydC5cbiAqICAtIGBwbHVnaW5fdnVsbl9leHBvc3VyZWAg4oCUIHRoZSBWVUxORVJBQkxFIHNpZGUsIHBlciBQSVBFTElORS4gQSB2ZXJzaW9uLWxldmVsXG4gKiAgICB0YWJsZSB3b3VsZCBmb3JjZSBldmVyeSByZWFkZXIgdG8gcmUtZGVyaXZlIFwid2hpY2ggb2Ygb3VyIHBpcGVsaW5lcyBpc1xuICogICAgZXhwb3NlZFwiLCB3aGljaCBpcyB0aGUgb25seSBmb3JtIG9mIHRoZSBxdWVzdGlvbiBhbnlib2R5IGFza3MuXG4gKlxuICogREVDTEFSRUQgSVMgTk9UIERFUExPWUVELCBhbmQgdGhlIHJlcG9ydCBzYXlzIHdoaWNoIGl0IGlzIHNob3dpbmcuIEEgcGlwZWxpbmUnc1xuICogY29uZmlnIGRlY2xhcmVzIGBeMi4wLjBgOyB3aGF0IHJhbiBhdCBpdHMgbGFzdCBkZXBsb3kgaXMgd2hhdGV2ZXIgdGhlIHN0ZXBcbiAqIG1hbmlmZXN0IHJlY29yZGVkLCBwaW5uZWQgdG8gYSBkaWdlc3QuIFRob3NlIGRpc2FncmVlIHdoZW5ldmVyIGEgcGlwZWxpbmUgaGFzIG5vdFxuICogcmUtc3ludGhlZCBzaW5jZSBhIHB1Ymxpc2gg4oCUIHdoaWNoIGlzIG1vc3Qgb2YgdGhlIHRpbWUsIGFuZCBleGFjdGx5IHRoZSBnYXAgYVxuICogdnVsbmVyYWJpbGl0eSByZXBvcnQgaXMgZm9yLiBDb25mbGF0aW5nIHRoZW0gd291bGQgbGV0IGEgcmVwb3J0IHNheSBcImZpeGVkXCJcbiAqIGFib3V0IGEgcGlwZWxpbmUgc3RpbGwgcnVubmluZyB0aGUgb2xkIGltYWdlLlxuICpcbiAqIFdITyBXUklURVMgV0hBVDpcbiAqICAtIHRoZSBwaXBlbGluZSBzZXJ2aWNlLCBvbiBhIHBpcGVsaW5lIHdyaXRlOiBgcmVwbGFjZVBpcGVsaW5lUmVzb2x1dGlvbmAgK1xuICogICAgYHJlY29uY2lsZVBpcGVsaW5lRXhwb3N1cmVzKHNvdXJjZSAnZGVjbGFyZWQnKWA7XG4gKiAgLSB0aGUgcGlwZWxpbmUgc2VydmljZSwgb24gYSBkZXBsb3kgcmVnaXN0cmF0aW9uIGNhcnJ5aW5nIGEgc3RlcCBtYW5pZmVzdDpcbiAqICAgIGByZWNvbmNpbGVQaXBlbGluZUV4cG9zdXJlcyhzb3VyY2UgJ2RlcGxveWVkJylgO1xuICogIC0gdGhlIHBsdWdpbiBzZXJ2aWNlLCB3aGVuIGEgdmVyc2lvbiBiZWNvbWVzIHRoZSBsYXRlc3QgKGFuIG9yZyBwbHVnaW4ncyBuZXdcbiAqICAgIGRlZmF1bHQ7IGEgbGlzdGluZydzIHB1Ymxpc2gsIHlhbmsgb3IgdW55YW5rKTogYHJlZnJlc2hMYXRlc3RGb3JQbHVnaW5gO1xuICogIC0gdGhlIG5pZ2h0bHkgcmVzY2FuLCBwZXIgcmVzY2FubmVkIHZlcnNpb246IGBzeW5jVmVyc2lvbkV4cG9zdXJlc2AsIHdoaWNoXG4gKiAgICBmYW5zIHRoZSB2ZXJzaW9uJ3MgZmluZGluZ3Mgb3V0IHRvIGV2ZXJ5IHBpcGVsaW5lIGRlY2xhcmluZyBvciBydW5uaW5nIGl0XG4gKiAgICAob3IgY2xvc2VzIHRoZW0gd2hlbiB0aGUgdmVyc2lvbiBjYW1lIGJhY2sgY2xlYW4pLlxuICovXG5cbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBhc1NjYW5GbGFnLCBjcmVhdGVMb2dnZXIsIGVycm9yTWVzc2FnZSwgc2NhbkZpbmRpbmdLZXksIHR5cGUgUGx1Z2luU2NhbkZpbmRpbmcsIHR5cGUgVnVsbkFjY2VwdGFuY2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBhbmQsIGVxLCBpbkFycmF5LCBpc051bGwsIGx0ZSwgc3FsLCB0eXBlIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7IHNjaGVtYSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL2RyaXp6bGUtc2NoZW1hLmpzJztcbmltcG9ydCB7IGFueVRleHQgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9wZy1yZXN1bHQuanMnO1xuaW1wb3J0IHR5cGUgeyBFeHBvc3VyZVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3NjaGVtYS9yZXBvcnRpbmctYW5hbHl0aWNzLmpzJztcbmltcG9ydCB7IHdpdGhUZW5hbnRUeCB9IGZyb20gJy4uLy4uL2RhdGFiYXNlL3RlbmFuY3kuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3BsdWdpbi1leHBvc3VyZScpO1xuXG4vKiogSG93IGZhciBiZWhpbmQgYSByZXNvbHZlZCB2ZXJzaW9uIGlzIGZyb20gdGhlIG5ld2VzdCBvbmUgYXZhaWxhYmxlLiAqL1xuZXhwb3J0IHR5cGUgVmVyc2lvbkdhcCA9ICdtYWpvcicgfCAnbWlub3InIHwgJ3BhdGNoJyB8ICdub25lJztcblxuLyoqIE9uZSByZXNvbHZlZCBzdGVwLCBhcyB0aGUgd3JpdGVyIHRha2VzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFN0ZXAge1xuICBvcmdJZDogc3RyaW5nO1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xuICBzdGVwTmFtZTogc3RyaW5nO1xuICBwbHVnaW5QdWJsaXNoZXI/OiBzdHJpbmcgfCBudWxsO1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIGRlY2xhcmVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIHJlc29sdmVkVmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgcmVjb3JkOiBhIGBwbHVnaW5zYCByb3cgaWQgb3IgYSBsaXN0aW5nIHZlcnNpb24gaWQuICovXG4gIHJlc29sdmVkUGx1Z2luSWQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGltYWdlIGRpZ2VzdCB0aGUgcmVzb2x2ZWQgdmVyc2lvbiBpcyBwaW5uZWQgdG8gKG51bGwgPSBpbWFnZS1sZXNzKS4gKi9cbiAgcmVzb2x2ZWREaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICBsYXRlc3RWZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgd2l0aGluUG9saWN5PzogYm9vbGVhbjtcbiAgLyoqIFRoZSByb290IG9yZyBvZiBhIHRlYW0ncyBwaXBlbGluZSAoc2VlIHRoZSBjb2x1bW4pLiAqL1xuICByb290T3JnSWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKiogYDEuMi4zYCDihpIgYFsxLCAyLCAzXWA7IGFueXRoaW5nIHVucGFyc2VhYmxlIOKGkiBudWxsLiAqL1xuZnVuY3Rpb24gc2VtdmVyKHY6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsIHtcbiAgY29uc3QgbSA9IC9edj8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModiA/PyAnJyk7XG4gIHJldHVybiBtID8gW051bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pLCBOdW1iZXIobVszXSldIDogbnVsbDtcbn1cblxuLyoqXG4gKiBIb3cgZmFyIGByZXNvbHZlZGAgaXMgYmVoaW5kIGBsYXRlc3RgLlxuICpcbiAqIGBudWxsYCB3aGVuIGVpdGhlciBzaWRlIGlzIHVucGFyc2VhYmxlLCBOT1QgYCdub25lJ2AuIFwiV2UgY291bGQgbm90IHRlbGxcIiBhbmRcbiAqIFwiaXQgaXMgdXAgdG8gZGF0ZVwiIGFyZSBvcHBvc2l0ZSBhbnN3ZXJzLCBhbmQgcmVwb3J0aW5nIHRoZSBzZWNvbmQgZm9yIHRoZSBmaXJzdFxuICogaXMgaG93IGEgcGlwZWxpbmUgb24gYW4gYW5jaWVudCBwcmUtcmVsZWFzZSB2ZXJzaW9uIGdldHMgYSBjbGVhbiBiaWxsIG9mIGhlYWx0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcnNpb25HYXAocmVzb2x2ZWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxhdGVzdDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFZlcnNpb25HYXAgfCBudWxsIHtcbiAgY29uc3QgYSA9IHNlbXZlcihyZXNvbHZlZCk7XG4gIGNvbnN0IGIgPSBzZW12ZXIobGF0ZXN0KTtcbiAgaWYgKCFhIHx8ICFiKSByZXR1cm4gbnVsbDtcbiAgaWYgKGJbMF0gPiBhWzBdKSByZXR1cm4gJ21ham9yJztcbiAgaWYgKGJbMF0gPCBhWzBdKSByZXR1cm4gJ25vbmUnOyAvLyByZXNvbHZlZCBpcyBhaGVhZCBvZiBcImxhdGVzdFwiIOKAlCBub3QgYmVoaW5kXG4gIGlmIChiWzFdID4gYVsxXSkgcmV0dXJuICdtaW5vcic7XG4gIGlmIChiWzFdIDwgYVsxXSkgcmV0dXJuICdub25lJztcbiAgaWYgKGJbMl0gPiBhWzJdKSByZXR1cm4gJ3BhdGNoJztcbiAgcmV0dXJuICdub25lJztcbn1cblxuLyoqXG4gKiBSZXBsYWNlIGEgcGlwZWxpbmUncyByZXNvbHV0aW9uIHJvd3MuXG4gKlxuICogREVMRVRFLXRoZW4tSU5TRVJUIGZvciB0aGUgcGlwZWxpbmUsIGluIG9uZSB0cmFuc2FjdGlvbiwgYmVjYXVzZSBhIHN0ZXAgY2FuIGJlXG4gKiBSRU1PVkVEIGZyb20gYSBjb25maWc6IGFuIHVwc2VydC1vbmx5IHdyaXRlciB3b3VsZCBsZWF2ZSB0aGUgZGVsZXRlZCBzdGVwJ3Mgcm93XG4gKiBiZWhpbmQgZm9yZXZlciwgYW5kIHRoZSBvdXRkYXRlZC1wbHVnaW4gc2VjdGlvbiB3b3VsZCBrZWVwIHJlcG9ydGluZyBhIHN0ZXAgdGhlXG4gKiBwaXBlbGluZSBubyBsb25nZXIgaGFzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwbGFjZVBpcGVsaW5lUmVzb2x1dGlvbihcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBzdGVwczogcmVhZG9ubHkgUmVzb2x2ZWRTdGVwW10sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCB2YWx1ZXMgPSBzdGVwcy5tYXAoKHMpID0+ICh7XG4gICAgb3JnSWQ6IHMub3JnSWQsXG4gICAgcGlwZWxpbmVJZDogcy5waXBlbGluZUlkLFxuICAgIHN0YWdlTmFtZTogcy5zdGFnZU5hbWUsXG4gICAgc3RlcE5hbWU6IHMuc3RlcE5hbWUsXG4gICAgcGx1Z2luUHVibGlzaGVyOiBzLnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgIHBsdWdpbk5hbWU6IHMucGx1Z2luTmFtZSxcbiAgICBkZWNsYXJlZFZlcnNpb246IHMuZGVjbGFyZWRWZXJzaW9uID8/IG51bGwsXG4gICAgcmVzb2x2ZWRWZXJzaW9uOiBzLnJlc29sdmVkVmVyc2lvbiA/PyBudWxsLFxuICAgIHJlc29sdmVkUGx1Z2luSWQ6IHMucmVzb2x2ZWRQbHVnaW5JZCA/PyBudWxsLFxuICAgIHJlc29sdmVkRGlnZXN0OiBzLnJlc29sdmVkRGlnZXN0ID8/IG51bGwsXG4gICAgbGF0ZXN0VmVyc2lvbjogcy5sYXRlc3RWZXJzaW9uID8/IG51bGwsXG4gICAgdmVyc2lvbkdhcDogdmVyc2lvbkdhcChzLnJlc29sdmVkVmVyc2lvbiwgcy5sYXRlc3RWZXJzaW9uKSxcbiAgICB3aXRoaW5Qb2xpY3k6IHMud2l0aGluUG9saWN5ID8/IHRydWUsXG4gICAgcm9vdE9yZ0lkOiBzLnJvb3RPcmdJZCA/PyBudWxsLFxuICAgIGNvbXB1dGVkQXQ6IG5ldyBEYXRlKCksXG4gIH0pKTtcblxuICByZXR1cm4gd2l0aFRlbmFudFR4KGFzeW5jICh0eCkgPT4ge1xuICAgIGF3YWl0IHR4LmRlbGV0ZShzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uKVxuICAgICAgLndoZXJlKGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGlwZWxpbmVJZCwgcGlwZWxpbmVJZCkpO1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBjb25zdCBsYW5kZWQgPSBhd2FpdCB0eC5pbnNlcnQoc2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbikudmFsdWVzKHZhbHVlcylcbiAgICAgIC5yZXR1cm5pbmcoeyBwaXBlbGluZUlkOiBzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnBpcGVsaW5lSWQgfSk7XG4gICAgcmV0dXJuIChsYW5kZWQgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnJlc2ggdGhlIGBsYXRlc3RgL2dhcCBjb2x1bW5zIGZvciBvbmUgcGx1Z2luIGFjcm9zcyBldmVyeSBwaXBlbGluZSB0aGF0IHVzZXNcbiAqIGl0LCB3aXRob3V0IHJlLXJlc29sdmluZyBhbnl0aGluZyBlbHNlLlxuICpcbiAqIENhbGxlZCBvbiBwdWJsaXNoLiBBIHB1Ymxpc2ggY2hhbmdlcyB3aGF0IFwibGF0ZXN0XCIgbWVhbnMgZm9yIGV2ZXJ5IHBpcGVsaW5lIGluXG4gKiB0aGUgaW5zdGFuY2UgdGhhdCBkZWNsYXJlcyB0aGUgcGx1Z2luLCBhbmQgcmUtcmVzb2x2aW5nIGVhY2ggb2YgdGhvc2UgcGlwZWxpbmVzXG4gKiBmcm9tIHNjcmF0Y2ggd291bGQgbWFrZSBwdWJsaXNoaW5nIGNvc3QgTyhwaXBlbGluZXMpIHdvcmsg4oCUIHNvIG9ubHkgdGhlIHR3b1xuICogY29sdW1ucyBhIHB1Ymxpc2ggY2FuIGNoYW5nZSBhcmUgdG91Y2hlZC5cbiAqXG4gKiBgb3duZXJgIHNheXMgd2hvc2UgcGx1Z2luIGl0IGlzOiBhIGxpc3RpbmcgKGBwdWJsaXNoZXJgIGhhbmRsZSDigJQgZXZlcnkgb3JnJ3NcbiAqIHBpcGVsaW5lcyB0aGF0IGRlY2xhcmUgaXQsIHNvIHRoZSBjYWxsZXIgbXVzdCBiZSBlbGV2YXRlZCksIG9yIGFuIG9yZydzIG93blxuICogcGx1Z2luIChgb3JnSWRgIOKAlCB0aGF0IG9yZydzIHBpcGVsaW5lcyBvbmx5OiBhbiBvcmcgcGx1Z2luJ3MgbmFtZSBpcyB1bmlxdWVcbiAqIG9ubHkgd2l0aGluIGl0cyBvcmcsIHNvIGFub3RoZXIgb3JnJ3Mgc2FtZS1uYW1lZCBwbHVnaW4gaXMgYSBkaWZmZXJlbnQgb25lKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hMYXRlc3RGb3JQbHVnaW4oXG4gIHBsdWdpbk5hbWU6IHN0cmluZyxcbiAgb3duZXI6IHsgcHVibGlzaGVyOiBzdHJpbmcgfSB8IHsgb3JnSWQ6IHN0cmluZyB9LFxuICBsYXRlc3RWZXJzaW9uOiBzdHJpbmcsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24pXG4gICAgLnNldCh7XG4gICAgICBsYXRlc3RWZXJzaW9uLFxuICAgICAgLy8gUmVjb21wdXRlZCBpbiBTUUwgZnJvbSB0aGUgcm93J3Mgb3duIHJlc29sdmVkIHZlcnNpb24sIHNvIG9uZSBzdGF0ZW1lbnRcbiAgICAgIC8vIGNvdmVycyBldmVyeSBwaXBlbGluZSByYXRoZXIgdGhhbiBhIHJvdW5kIHRyaXAgZWFjaC5cbiAgICAgIC8vIGA6OnRleHRgIG9uIGV2ZXJ5IGJpbmQgb2YgdGhlIHZlcnNpb246IFBvc3RncmVzIG90aGVyd2lzZSBkZWR1Y2VzXG4gICAgICAvLyBpbmNvbnNpc3RlbnQgdHlwZXMgZm9yIHRoZSBzYW1lIHBhcmFtZXRlciAodmFyY2hhciBmb3IgdGhlIGFzc2lnbm1lbnQsXG4gICAgICAvLyB0ZXh0IGZvciBgc3BsaXRfcGFydGApIGFuZCByZWZ1c2VzIHRvIHBsYW4gdGhlIHN0YXRlbWVudC5cbiAgICAgIHZlcnNpb25HYXA6IHNxbGBDQVNFXG4gICAgICAgIFdIRU4gJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0gSVMgTlVMTCBUSEVOIE5VTExcbiAgICAgICAgV0hFTiBzcGxpdF9wYXJ0KCR7bGF0ZXN0VmVyc2lvbn06OnRleHQsICcuJywgMSk6OmludCA+IHNwbGl0X3BhcnQoJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0sICcuJywgMSk6OmludCBUSEVOICdtYWpvcidcbiAgICAgICAgV0hFTiBzcGxpdF9wYXJ0KCR7bGF0ZXN0VmVyc2lvbn06OnRleHQsICcuJywgMSk6OmludCA8IHNwbGl0X3BhcnQoJHtzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnJlc29sdmVkVmVyc2lvbn0sICcuJywgMSk6OmludCBUSEVOICdub25lJ1xuICAgICAgICBXSEVOIHNwbGl0X3BhcnQoJHtsYXRlc3RWZXJzaW9ufTo6dGV4dCwgJy4nLCAyKTo6aW50ID4gc3BsaXRfcGFydCgke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSwgJy4nLCAyKTo6aW50IFRIRU4gJ21pbm9yJ1xuICAgICAgICBXSEVOIHNwbGl0X3BhcnQoJHtsYXRlc3RWZXJzaW9ufTo6dGV4dCwgJy4nLCAyKTo6aW50IDwgc3BsaXRfcGFydCgke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSwgJy4nLCAyKTo6aW50IFRIRU4gJ25vbmUnXG4gICAgICAgIFdIRU4gc3BsaXRfcGFydCgke2xhdGVzdFZlcnNpb259Ojp0ZXh0LCAnLicsIDMpOjppbnQgPiBzcGxpdF9wYXJ0KCR7c2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbi5yZXNvbHZlZFZlcnNpb259LCAnLicsIDMpOjppbnQgVEhFTiAncGF0Y2gnXG4gICAgICAgIEVMU0UgJ25vbmUnIEVORGAsXG4gICAgICBjb21wdXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgIH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGx1Z2luTmFtZSwgcGx1Z2luTmFtZSksXG4gICAgICAuLi4oJ3B1Ymxpc2hlcicgaW4gb3duZXJcbiAgICAgICAgPyBbZXEoc2NoZW1hLnBpcGVsaW5lUGx1Z2luUmVzb2x1dGlvbi5wbHVnaW5QdWJsaXNoZXIsIG93bmVyLnB1Ymxpc2hlcildXG4gICAgICAgIDogW2lzTnVsbChzY2hlbWEucGlwZWxpbmVQbHVnaW5SZXNvbHV0aW9uLnBsdWdpblB1Ymxpc2hlciksIGVxKHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ub3JnSWQsIG93bmVyLm9yZ0lkKV0pLFxuICAgICAgLy8gT25seSByb3dzIHdob3NlIHJlc29sdmVkIHZlcnNpb24gcGFyc2VzIGFzIHNlbXZlcjsgYW55dGhpbmcgZWxzZSBoYXMgbm9cbiAgICAgIC8vIGdhcCB0byBjb21wdXRlIGFuZCB0aGUgQ0FTRSB3b3VsZCB0aHJvdyBvbiB0aGUgY2FzdC5cbiAgICAgIHNxbGAke3NjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucmVzb2x2ZWRWZXJzaW9ufSB+ICdeWzAtOV0rXFxcXC5bMC05XStcXFxcLlswLTldKydgLFxuICAgICkpXG4gICAgLnJldHVybmluZyh7IHBpcGVsaW5lSWQ6IHNjaGVtYS5waXBlbGluZVBsdWdpblJlc29sdXRpb24ucGlwZWxpbmVJZCB9KSk7XG4gIHJldHVybiAocm93cyBhcyB1bmtub3duW10pLmxlbmd0aDtcbn1cblxuLyoqIE9uZSBmbGFnZ2VkIHZlcnNpb24sIGFzIHRoZSByZXNjYW4gcmVwb3J0cyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3N1cmVJbnB1dCB7XG4gIG9yZ0lkOiBzdHJpbmc7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgcGx1Z2luUHVibGlzaGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlOiBFeHBvc3VyZVNvdXJjZTtcbiAgY3JpdGljYWxDb3VudDogbnVtYmVyO1xuICBoaWdoQ291bnQ6IG51bWJlcjtcbiAgdG9wRmluZGluZ3M/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBFdmVyeSBDcml0aWNhbC9IaWdoIGZpbmRpbmcga2V5IG9mIHRoZSB2ZXJzaW9uIChzZWUgdGhlIGNvbHVtbikuICovXG4gIGZpbmRpbmdLZXlzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hldGhlciBhbiBleHBvc3VyZSByb3cgaXMgTElWRTogbm90IGZpeGVkLCBub3QgZGlzbWlzc2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUsXG4gKiBhbmQgbm90IHVuZGVyIGFuIGFjY2VwdGFuY2UgdGhhdCBpcyBzdGlsbCBpbiBmb3JjZS5cbiAqXG4gKiBUaGUgT05FIHByZWRpY2F0ZSBldmVyeSByZWFkZXIgdXNlcyAodGhlIHJlcG9ydCBzZWN0aW9uLCBuZWVkcy1hdHRlbnRpb24sIHRoZVxuICogb3JnJ3Mgb3BlbiBsaXN0KS4gVHdvIHJlYWRlcnMgdGhhdCBkaXNhZ3JlZSBhYm91dCB3aGF0IFwiZXhwb3NlZFwiIG1lYW5zIHByb2R1Y2VcbiAqIGEgcmVwb3J0IHdob3NlIHZ1bG5lcmFiaWxpdHkgcGFuZWwgYW5kIG5lZWRzLWF0dGVudGlvbiBsaXN0IGNvbnRyYWRpY3QgZWFjaFxuICogb3RoZXIg4oCUIHdoaWNoIGlzIGhvdyB0aGlzIHByZWRpY2F0ZSBjYW1lIHRvIGV4aXN0LiBBbiBhY2NlcHRhbmNlIExBUFNFUyBhdCBpdHNcbiAqIGRlYWRsaW5lIGFuZCB0aGUgcm93IGlzIGxpdmUgYWdhaW47IG9uZSB3aXRoIG5vIGRlYWRsaW5lICh3aGljaFxuICogYHRyaWFnZUV4cG9zdXJlYCByZWZ1c2VzIHRvIHdyaXRlKSBpcyB0cmVhdGVkIGFzIGluIGZvcmNlLCBhcyBldmVyeSByZWFkZXJcbiAqIGFscmVhZHkgZGlkLlxuICpcbiAqIGBhbGlhc2AgaXMgdGhlIHRhYmxlIG5hbWUgb3IgYWxpYXMgdGhlIGNhbGxlcidzIHF1ZXJ5IHVzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXZlRXhwb3N1cmVQcmVkaWNhdGUobm93OiBEYXRlLCBhbGlhcyA9ICdwbHVnaW5fdnVsbl9leHBvc3VyZScpOiBTUUwge1xuICBjb25zdCBjb2wgPSAoYzogc3RyaW5nKSA9PiBzcWwucmF3KGAke2FsaWFzfS4ke2N9YCk7XG4gIHJldHVybiBzcWxgKCR7Y29sKCdmaXhlZF9hdCcpfSBJUyBOVUxMXG4gICAgQU5EICgke2NvbCgndHJpYWdlX3N0YXRlJyl9ID0gJ29wZW4nXG4gICAgICAgICBPUiAoJHtjb2woJ3RyaWFnZV9zdGF0ZScpfSA9ICdhY2NlcHRlZCdcbiAgICAgICAgICAgICBBTkQgJHtjb2woJ2FjY2VwdGVkX3VudGlsJyl9IElTIE5PVCBOVUxMIEFORCAke2NvbCgnYWNjZXB0ZWRfdW50aWwnKX0gPD0gJHtub3d9KSkpYDtcbn1cblxuLyoqIFdoYXQgYSB2ZXJzaW9uJ3Mgc2NhbiBzdGF0ZSBjb250cmlidXRlcyB0byBhbiBleHBvc3VyZSAoc2VlIHtAbGluayBleHBvc3VyZUZyb21TY2FufSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYW5TdGF0ZSB7XG4gIC8qKiBUaGUgZGlnZXN0IHRoZSBzdGVwIHJ1bnMuIEEgc2NhbiBzdW1tYXJ5IGRlc2NyaWJpbmcgYW5vdGhlciBpbWFnZSBpcyBpZ25vcmVkLiAqL1xuICBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7XG4gIHNjYW5TdW1tYXJ5PzogdW5rbm93bjtcbiAgc2NhbkZsYWc/OiB1bmtub3duO1xuICBzY2FuRmxhZ2dlZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKiBUaGUgY291bnRzIGFuIGV4cG9zdXJlIHJvdyBjYXJyaWVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvc3VyZUNvdW50cyB7XG4gIGNyaXRpY2FsQ291bnQ6IG51bWJlcjtcbiAgaGlnaENvdW50OiBudW1iZXI7XG4gIHRvcEZpbmRpbmdzOiBQbHVnaW5TY2FuRmluZGluZ1tdO1xuICAvKiogS2V5cyBvZiBFVkVSWSBDcml0aWNhbC9IaWdoIGZpbmRpbmcgaXRlbWl6ZWQgKGZpeGFibGUgb3Igbm90KSwgc29ydGVkLiAqL1xuICBmaW5kaW5nS2V5czogc3RyaW5nW107XG59XG5cbmNvbnN0IGtleXNPZiA9IChmaW5kaW5nczogcmVhZG9ubHkgUGx1Z2luU2NhbkZpbmRpbmdbXSk6IHN0cmluZ1tdID0+IFsuLi5uZXcgU2V0KGZpbmRpbmdzLm1hcChzY2FuRmluZGluZ0tleSkpXS5zb3J0KCk7XG5cbi8qKiBBdCBtb3N0IHRoaXMgbWFueSBmaW5kaW5ncyBhcmUgc3RvcmVkIG9uIGFuIGV4cG9zdXJlIHJvdy4gKi9cbmNvbnN0IEVYUE9TVVJFX1RPUF9GSU5ESU5HUyA9IDEwO1xuXG4vKipcbiAqIFRoZSBleHBvc3VyZSBhIHZlcnNpb24ncyBzY2FuIHN0YXRlIGFtb3VudHMgdG8sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm9uZS5cbiAqXG4gKiBSZWFkcyB0aGUgcmVzY2FuJ3MgYHNjYW5fc3VtbWFyeWAgKGZpeGFibGUgQ3JpdGljYWwgQU5EIEhpZ2gsIHdoZXRoZXIgb3Igbm90IHRoZVxuICogZ2F0ZSB0cmlwcGVkKSBhbmQgZmFsbHMgYmFjayB0byBgc2Nhbl9mbGFnYCBmb3IgYSB2ZXJzaW9uIGZsYWdnZWQgYmVmb3JlIGFueVxuICogc3VtbWFyeSB3YXMgd3JpdHRlbi4gQSBzdW1tYXJ5IHdob3NlIGRpZ2VzdCBpcyBub3QgdGhlIHN0ZXAncyBpcyBJR05PUkVEOiBhXG4gKiB2ZXJzaW9uIHJlYnVpbHQgb24gYSBwYXRjaGVkIGJhc2UgaXMgYSBkaWZmZXJlbnQgYXJ0aWZhY3QsIGFuZCBpdHMgZmluZGluZ3Mgc2F5XG4gKiBub3RoaW5nIGFib3V0IHRoZSBpbWFnZSB0aGUgcGlwZWxpbmUgcnVucy4gT25seSBGSVhBQkxFIGZpbmRpbmdzIGNvdW50IOKAlCBhblxuICogZXhwb3N1cmUgaXMgc29tZXRoaW5nIGEgcmVidWlsZCBvciBhbiB1cGdyYWRlIGNhbiBjbGVhci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9zdXJlRnJvbVNjYW4oc3RhdGU6IFNjYW5TdGF0ZSk6IEV4cG9zdXJlQ291bnRzIHwgbnVsbCB7XG4gIGNvbnN0IHN1bW1hcnkgPSBzdGF0ZS5zY2FuU3VtbWFyeSAmJiB0eXBlb2Ygc3RhdGUuc2NhblN1bW1hcnkgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHN0YXRlLnNjYW5TdW1tYXJ5KVxuICAgID8gc3RhdGUuc2NhblN1bW1hcnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA6IG51bGw7XG4gIGNvbnN0IHN1bW1hcnlEaWdlc3QgPSB0eXBlb2Ygc3VtbWFyeT8uaW1hZ2VEaWdlc3QgPT09ICdzdHJpbmcnID8gc3VtbWFyeS5pbWFnZURpZ2VzdCA6IG51bGw7XG4gIGlmIChzdW1tYXJ5ICYmIHR5cGVvZiBzdW1tYXJ5LmNyaXRpY2FsRml4YWJsZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHN1bW1hcnkuaGlnaEZpeGFibGUgPT09ICdudW1iZXInXG4gICAgJiYgKHN1bW1hcnlEaWdlc3QgPT09IG51bGwgfHwgIXN0YXRlLmltYWdlRGlnZXN0IHx8IHN1bW1hcnlEaWdlc3QgPT09IHN0YXRlLmltYWdlRGlnZXN0KSkge1xuICAgIGlmIChzdW1tYXJ5LmNyaXRpY2FsRml4YWJsZSA8PSAwICYmIHN1bW1hcnkuaGlnaEZpeGFibGUgPD0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgYWxsID0gKEFycmF5LmlzQXJyYXkoc3VtbWFyeS5maW5kaW5ncykgPyBzdW1tYXJ5LmZpbmRpbmdzIGFzIFBsdWdpblNjYW5GaW5kaW5nW10gOiBbXSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgJiYgdHlwZW9mIGYuaWQgPT09ICdzdHJpbmcnKTtcbiAgICBjb25zdCBmaW5kaW5ncyA9IGFsbC5maWx0ZXIoKGYpID0+IEFycmF5LmlzQXJyYXkoZi5maXhlZEluKSAmJiBmLmZpeGVkSW4ubGVuZ3RoID4gMCk7XG4gICAgcmV0dXJuIHsgY3JpdGljYWxDb3VudDogc3VtbWFyeS5jcml0aWNhbEZpeGFibGUsIGhpZ2hDb3VudDogc3VtbWFyeS5oaWdoRml4YWJsZSwgdG9wRmluZGluZ3M6IGZpbmRpbmdzLnNsaWNlKDAsIEVYUE9TVVJFX1RPUF9GSU5ESU5HUyksIGZpbmRpbmdLZXlzOiBrZXlzT2YoYWxsKSB9O1xuICB9XG4gIGNvbnN0IGZsYWcgPSBzdGF0ZS5zY2FuRmxhZ2dlZEF0ID8gYXNTY2FuRmxhZyhzdGF0ZS5zY2FuRmxhZykgOiBudWxsO1xuICBpZiAoIWZsYWcgfHwgKGZsYWcuZ2F0ZWQgPD0gMCAmJiBmbGFnLmhpZ2ggPD0gMCkpIHJldHVybiBudWxsO1xuICByZXR1cm4geyBjcml0aWNhbENvdW50OiBmbGFnLmdhdGVkLCBoaWdoQ291bnQ6IGZsYWcuaGlnaCwgdG9wRmluZGluZ3M6IGZsYWcuZmluZGluZ3Muc2xpY2UoMCwgRVhQT1NVUkVfVE9QX0ZJTkRJTkdTKSwgZmluZGluZ0tleXM6IGtleXNPZihmbGFnLmZpbmRpbmdzKSB9O1xufVxuXG4vKipcbiAqIE9wZW4gb3IgcmVmcmVzaCBleHBvc3VyZXMuXG4gKlxuICogVXBzZXJ0cyBvbiAocGlwZWxpbmUsIHBsdWdpbiwgdmVyc2lvbiwgZGlnZXN0LCBzb3VyY2UpIHNvIGEgbmlnaHRseSByZXNjYW4gUkVGUkVTSEVTIHRoZVxuICogY291bnRzIHJhdGhlciB0aGFuIG9wZW5pbmcgYSBuZXcgcm93IGV2ZXJ5IG5pZ2h0IOKAlCBvdGhlcndpc2UgdGhlIHJlcG9ydCB3b3VsZFxuICogc2hvdyBvbmUgZXhwb3N1cmUgcGVyIG5pZ2h0IG9mIHRoZSBzYW1lIHByb2JsZW0sIHdoaWNoIHJlYWRzIGFzIGFuIGVzY2FsYXRpbmdcbiAqIHNpdHVhdGlvbiB3aGVuIG5vdGhpbmcgY2hhbmdlZC5cbiAqXG4gKiBBIHJlZnJlc2ggZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIHJlc2V0IGB0cmlhZ2Vfc3RhdGVgOiBhbiBvcmcgdGhhdCBhY2NlcHRlZCBhXG4gKiBmaW5kaW5nIHdpdGggYSByZWFzb24gYW5kIGEgZGVhZGxpbmUgaGFzIG1hZGUgYSBkZWNpc2lvbiwgYW5kIHJlLXJhaXNpbmcgaXQgZXZlcnlcbiAqIG5pZ2h0IGlzIGhvdyBhIHRlYW0gbGVhcm5zIHRvIGlnbm9yZSB0aGUgcmVwb3J0LiBJdCBET0VTIGNsZWFyIGEgc3RhbGVcbiAqIGFjY2VwdGFuY2UsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBkZWFkbGluZSB3YXMgZm9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBzZXJ0RXhwb3N1cmVzKGlucHV0czogcmVhZG9ubHkgRXhwb3N1cmVJbnB1dFtdLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgaWYgKGlucHV0cy5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICBjb25zdCB2YWx1ZXMgPSBpbnB1dHMubWFwKChlKSA9PiAoe1xuICAgIGlkOiByYW5kb21VVUlEKCksXG4gICAgb3JnSWQ6IGUub3JnSWQsXG4gICAgcGlwZWxpbmVJZDogZS5waXBlbGluZUlkLFxuICAgIHBsdWdpblB1Ymxpc2hlcjogZS5wbHVnaW5QdWJsaXNoZXIgPz8gbnVsbCxcbiAgICBwbHVnaW5OYW1lOiBlLnBsdWdpbk5hbWUsXG4gICAgcGx1Z2luVmVyc2lvbjogZS5wbHVnaW5WZXJzaW9uLFxuICAgIGltYWdlRGlnZXN0OiBlLmltYWdlRGlnZXN0ID8/IG51bGwsXG4gICAgc291cmNlOiBlLnNvdXJjZSxcbiAgICBjcml0aWNhbENvdW50OiBlLmNyaXRpY2FsQ291bnQsXG4gICAgaGlnaENvdW50OiBlLmhpZ2hDb3VudCxcbiAgICB0b3BGaW5kaW5nczogZS50b3BGaW5kaW5ncyA/PyBbXSxcbiAgICBmaW5kaW5nS2V5czogZS5maW5kaW5nS2V5cyA/PyBbXSxcbiAgICBmbGFnZ2VkQXQ6IG5vdyxcbiAgICB1cGRhdGVkQXQ6IG5vdyxcbiAgfSkpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbGFuZGVkID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguaW5zZXJ0KHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUpLnZhbHVlcyh2YWx1ZXMpXG4gICAgICAub25Db25mbGljdERvVXBkYXRlKHtcbiAgICAgICAgdGFyZ2V0OiBbXG4gICAgICAgICAgc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5waXBlbGluZUlkLFxuICAgICAgICAgIHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luTmFtZSxcbiAgICAgICAgICBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBsdWdpblZlcnNpb24sXG4gICAgICAgICAgc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pbWFnZURpZ2VzdCxcbiAgICAgICAgICBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnNvdXJjZSxcbiAgICAgICAgXSxcbiAgICAgICAgc2V0OiB7XG4gICAgICAgICAgY3JpdGljYWxDb3VudDogc3FsYGV4Y2x1ZGVkLmNyaXRpY2FsX2NvdW50YCxcbiAgICAgICAgICBoaWdoQ291bnQ6IHNxbGBleGNsdWRlZC5oaWdoX2NvdW50YCxcbiAgICAgICAgICB0b3BGaW5kaW5nczogc3FsYGV4Y2x1ZGVkLnRvcF9maW5kaW5nc2AsXG4gICAgICAgICAgZmluZGluZ0tleXM6IHNxbGBleGNsdWRlZC5maW5kaW5nX2tleXNgLFxuICAgICAgICAgIC8vIFN0aWxsIGV4cG9zZWQsIHNvIHRoZSBmaXggbWFya2VyIGlzIGNsZWFyZWQ6IGEgcm93IHRoYXQgd2FzIGNsb3NlZCBieSBhXG4gICAgICAgICAgLy8gZGVwbG95IGFuZCBpcyBmbGFnZ2VkIGFnYWluIGlzIGEgcmVncmVzc2lvbiwgYW5kIGxlYXZpbmcgYGZpeGVkX2F0YCBzZXRcbiAgICAgICAgICAvLyB3b3VsZCBoaWRlIGl0LlxuICAgICAgICAgIGZpeGVkQXQ6IG51bGwsXG4gICAgICAgICAgLy8gQW4gYWNjZXB0YW5jZSBwYXN0IGl0cyBkZWFkbGluZSBzdG9wcyBiZWluZyBhbiBhY2NlcHRhbmNlLiBUaGF0IGlzIHRoZVxuICAgICAgICAgIC8vIGVudGlyZSBwb2ludCBvZiB0aW1lLWJveGluZyBpdCwgYW5kIGl0IGlzIGVuZm9yY2VkIEhFUkUgcmF0aGVyIHRoYW4gYXRcbiAgICAgICAgICAvLyByZWFkIHRpbWUgc28gdGhlIHN0b3JlZCBzdGF0ZSBpcyB0aGUgdHJ1dGguXG4gICAgICAgICAgLy8gQW4gYWNjZXB0YW5jZSBjb3ZlcnMgdGhlIGZpbmRpbmdzIGl0IHdhcyBtYWRlIG92ZXIsIG5ldmVyIG9uZXMgZm91bmRcbiAgICAgICAgICAvLyBzaW5jZTogYSByZWZyZXNoIGNhcnJ5aW5nIGEgZmluZGluZyBrZXkgdGhlIGFjY2VwdGFuY2UgZGlkIG5vdCBmcmVlemVcbiAgICAgICAgICAvLyByZW9wZW5zIHRoZSByb3csIHNvIHRoZSBkZWNpc2lvbiBpcyBtYWRlIGFnYWluIGFib3V0IHdoYXQgaXMgdGhlcmUgbm93LlxuICAgICAgICAgIHRyaWFnZVN0YXRlOiBzcWxgQ0FTRVxuICAgICAgICAgICAgV0hFTiAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGV9ID0gJ2FjY2VwdGVkJ1xuICAgICAgICAgICAgIEFORCAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuYWNjZXB0ZWRVbnRpbH0gSVMgTk9UIE5VTExcbiAgICAgICAgICAgICBBTkQgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkVW50aWx9IDw9ICR7bm93fVxuICAgICAgICAgICAgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdhY2NlcHRlZCdcbiAgICAgICAgICAgICBBTkQgTk9UIChleGNsdWRlZC5maW5kaW5nX2tleXMgPEAgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkRmluZGluZ0tleXN9KVxuICAgICAgICAgICAgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdmaXhlZCcgVEhFTiAnb3BlbidcbiAgICAgICAgICAgIC0tIEEgUkVNT1ZFRCBzdGVwIC8gcGlwZWxpbmUgYmFjayBvbiB0aGUgc2FtZSB2ZXJzaW9uOiBpdHMgYWNjZXB0YW5jZVxuICAgICAgICAgICAgLS0gcmV0dXJucyBpZiBzdGlsbCBpbiBmb3JjZSBhbmQgaXQgY292ZXJzIHdoYXQgdGhlIHZlcnNpb24gY2FycmllcyBub3cuXG4gICAgICAgICAgICBXSEVOICR7c2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS50cmlhZ2VTdGF0ZX0gPSAncmVtb3ZlZCdcbiAgICAgICAgICAgICBBTkQgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkVW50aWx9IElTIE5PVCBOVUxMXG4gICAgICAgICAgICAgQU5EICR7c2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5hY2NlcHRlZFVudGlsfSA+ICR7bm93fVxuICAgICAgICAgICAgIEFORCBleGNsdWRlZC5maW5kaW5nX2tleXMgPEAgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmFjY2VwdGVkRmluZGluZ0tleXN9XG4gICAgICAgICAgICBUSEVOICdhY2NlcHRlZCdcbiAgICAgICAgICAgIFdIRU4gJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlfSA9ICdyZW1vdmVkJyBUSEVOICdvcGVuJ1xuICAgICAgICAgICAgRUxTRSAke3NjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGV9IEVORGAsXG4gICAgICAgICAgdXBkYXRlZEF0OiBub3csXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmlkIH0pKTtcbiAgICByZXR1cm4gKGxhbmRlZCBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1BsdWdpbiBleHBvc3VyZSB1cHNlcnQgZmFpbGVkJywgeyBjb3VudDogdmFsdWVzLmxlbmd0aCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8qKiBPbmUgdmVyc2lvbiBhIHBpcGVsaW5lIHN0aWxsIGRlY2xhcmVzIC8gcnVucyBXSVRIIG9wZW4gZmluZGluZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIExpdmVWZXJzaW9uIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbDtcbn1cblxuY29uc3QgbGl2ZUtleSA9ICh2OiBMaXZlVmVyc2lvbik6IHN0cmluZyA9PiBgJHt2LnBsdWdpbk5hbWV9QCR7di5wbHVnaW5WZXJzaW9ufUAke3YuaW1hZ2VEaWdlc3QgPz8gJyd9YDtcblxuLyoqXG4gKiBDbG9zZSB0aGUgZXhwb3N1cmVzIG9mIG9uZSBTT1VSQ0UgYSBwaXBlbGluZSBoYXMgbW92ZWQgb2ZmIOKAlCBgZml4ZWRgIHdoZW4gdGhlXG4gKiBwaXBlbGluZSBzdGlsbCB1c2VzIHRoZSBwbHVnaW4gYXQgYW5vdGhlciB2ZXJzaW9uLCBgcmVtb3ZlZGAgd2hlbiBubyBsaXZlIHN0ZXBcbiAqIHVzZXMgdGhlIHBsdWdpbiBhdCBhbGwgKHRoZSB0cmlhZ2UgZmllbGRzIHN0YXksIHNvIGEgcmUtYWRkZWQgc3RlcCBnZXRzIGFuXG4gKiB1bmV4cGlyZWQgYWNjZXB0YW5jZSBiYWNrIOKAlCBzZWUge0BsaW5rIHVwc2VydEV4cG9zdXJlc30pLlxuICpcbiAqIENhbGxlZCB3aGVuIGEgZGVwbG95IHJlY29yZHMgYSBuZXcgc3RlcCBtYW5pZmVzdCAoYGRlcGxveWVkYCkgb3IgYSBwaXBlbGluZVxuICogd3JpdGUgcmUtcmVzb2x2ZXMgaXRzIGNvbmZpZyAoYGRlY2xhcmVkYCk6IGFueXRoaW5nIG9wZW4gZm9yIHRoYXQgcGlwZWxpbmUgYW5kXG4gKiBzb3VyY2Ugd2hvc2UgKHZlcnNpb24sIGRpZ2VzdCkgaXMgTk9UIGluIGBsaXZlVmVyc2lvbnNgIGlzIGZpeGVkLiBDbG9zaW5nIGJ5XG4gKiBhYnNlbmNlIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGEgcmVzY2FuIHRvIG5vdGljZSBpcyB3aGF0IG1ha2VzIFwid2UgZml4ZWQgaXRcIlxuICogc2hvdyB1cCBpbiB0aGUgcmVwb3J0IG9uIHRoZSBuZXh0IGRlcGxveSBpbnN0ZWFkIG9mIHRoZSBuZXh0IG5pZ2h0LlxuICpcbiAqIFBlciBzb3VyY2UsIGJlY2F1c2UgdGhlIHR3byBzaWRlcyBtb3ZlIGluZGVwZW5kZW50bHk6IGEgY29uZmlnIHVwZGF0ZWQgdG8gdGhlXG4gKiBmaXhlZCB2ZXJzaW9uIGNsb3NlcyB0aGUgREVDTEFSRUQgZXhwb3N1cmUgd2hpbGUgdGhlIG9sZCBpbWFnZSBrZWVwcyBydW5uaW5nLFxuICogYW5kIGl0cyBERVBMT1lFRCBleHBvc3VyZSBtdXN0IHN0YXkgb3BlbiB1bnRpbCB0aGUgZGVwbG95IGxhbmRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VGaXhlZEV4cG9zdXJlcyhcbiAgcGlwZWxpbmVJZDogc3RyaW5nLFxuICBzb3VyY2U6IEV4cG9zdXJlU291cmNlLFxuICBsaXZlVmVyc2lvbnM6IHJlYWRvbmx5IExpdmVWZXJzaW9uW10sXG4gIG5vdyA9IG5ldyBEYXRlKCksXG4gIG9wdHM6IHsgbGl2ZVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB9ID0ge30sXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBsaXZlID0gbmV3IFNldChsaXZlVmVyc2lvbnMubWFwKGxpdmVLZXkpKTtcbiAgY29uc3QgbGl2ZVBsdWdpbnMgPSBuZXcgU2V0KFsuLi5saXZlVmVyc2lvbnMsIC4uLihvcHRzLmxpdmVQbHVnaW5zID8/IFtdKV0ubWFwKCh2KSA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IHYucGx1Z2luTmFtZSkpKTtcbiAgY29uc3Qgb3BlbiA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7XG4gICAgaWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuaWQsXG4gICAgcGx1Z2luTmFtZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5OYW1lLFxuICAgIHBsdWdpblZlcnNpb246IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luVmVyc2lvbixcbiAgICBpbWFnZURpZ2VzdDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pbWFnZURpZ2VzdCxcbiAgfSkuZnJvbShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgZXEoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5zb3VyY2UsIHNvdXJjZSksXG4gICAgICBpc051bGwoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5maXhlZEF0KSxcbiAgICApKSk7XG4gIGNvbnN0IHN0YWxlUm93cyA9IChvcGVuIGFzIEFycmF5PExpdmVWZXJzaW9uICYgeyBpZDogc3RyaW5nIH0+KS5maWx0ZXIoKHIpID0+ICFsaXZlLmhhcyhsaXZlS2V5KHIpKSk7XG4gIGlmIChzdGFsZVJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgY29uc3QgZml4ZWQgPSBzdGFsZVJvd3MuZmlsdGVyKChyKSA9PiBsaXZlUGx1Z2lucy5oYXMoci5wbHVnaW5OYW1lKSkubWFwKChyKSA9PiByLmlkKTtcbiAgY29uc3QgcmVtb3ZlZCA9IHN0YWxlUm93cy5maWx0ZXIoKHIpID0+ICFsaXZlUGx1Z2lucy5oYXMoci5wbHVnaW5OYW1lKSkubWFwKChyKSA9PiByLmlkKTtcbiAgbGV0IGNsb3NlZCA9IDA7XG4gIGZvciAoY29uc3QgW2lkcywgc3RhdGVdIG9mIFtbZml4ZWQsICdmaXhlZCddLCBbcmVtb3ZlZCwgJ3JlbW92ZWQnXV0gYXMgY29uc3QpIHtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnVwZGF0ZShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgICAgLnNldCh7IGZpeGVkQXQ6IG5vdywgdHJpYWdlU3RhdGU6IHN0YXRlLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgLndoZXJlKGluQXJyYXkoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5pZCwgWy4uLmlkc10pKVxuICAgICAgLnJldHVybmluZyh7IGlkOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmlkIH0pKTtcbiAgICBjbG9zZWQgKz0gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGNsb3NlZDtcbn1cblxuLyoqXG4gKiBDbG9zZSBldmVyeSBvcGVuIGV4cG9zdXJlIG9mIGEgcGlwZWxpbmUgKG9yIG9mIG9uZSBzb3VyY2UpIGFzIGByZW1vdmVkYCDigJQgdGhlXG4gKiBwaXBlbGluZSB3YXMgZGVsZXRlZCwgb3IgZGVyZWdpc3RlcmVkIChpdHMgZGVwbG95IGlzIGdvbmUpLiBUaGUgdHJpYWdlIGZpZWxkc1xuICogc3RheTogYSByZXN0b3JlIHJlLXJlY29yZHMgdGhlIHBpcGVsaW5lJ3MgcmVzb2x1dGlvbiwgYW5kXG4gKiB7QGxpbmsgdXBzZXJ0RXhwb3N1cmVzfSByZW9wZW5zIHRoZSByb3dzIChyZXN0b3JpbmcgYW4gYWNjZXB0YW5jZSBzdGlsbCBpblxuICogZm9yY2UpLiBSZXR1cm5zIHRoZSByb3dzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlUGlwZWxpbmVFeHBvc3VyZXMoXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgc3RhdGU6ICdyZW1vdmVkJyxcbiAgb3B0czogeyBzb3VyY2U/OiBFeHBvc3VyZVNvdXJjZSB9ID0ge30sXG4gIG5vdyA9IG5ldyBEYXRlKCksXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUpXG4gICAgLnNldCh7IGZpeGVkQXQ6IG5vdywgdHJpYWdlU3RhdGU6IHN0YXRlLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgaXNOdWxsKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuZml4ZWRBdCksXG4gICAgICAuLi4ob3B0cy5zb3VyY2UgPyBbZXEoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5zb3VyY2UsIG9wdHMuc291cmNlKV0gOiBbXSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuaWQgfSkpO1xuICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG59XG5cbi8qKiBPbmUgc3RlcCBvZiBhIHBpcGVsaW5lIGFzIHtAbGluayByZWNvbmNpbGVQaXBlbGluZUV4cG9zdXJlc30gdGFrZXMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9zdXJlU3RlcCB7XG4gIHBsdWdpblB1Ymxpc2hlcj86IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBpbWFnZURpZ2VzdD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgdmVyc2lvbidzIHNjYW4gc3RhdGUsIGFzIHN0b3JlZCBvbiBpdHMgcm93LiAqL1xuICBzY2FuOiBTY2FuU3RhdGU7XG59XG5cbi8qKlxuICogQnJpbmcgb25lIHBpcGVsaW5lJ3MgZXhwb3N1cmVzIG9mIG9uZSBzb3VyY2UgaW4gbGluZSB3aXRoIHRoZSBzdGVwcyBpdCBub3dcbiAqIGRlY2xhcmVzIChgZGVjbGFyZWRgKSBvciBydW5zIChgZGVwbG95ZWRgKTogb3BlbiAvIHJlZnJlc2ggYSByb3cgZm9yIGV2ZXJ5IHN0ZXBcbiAqIHdob3NlIHZlcnNpb24gaGFzIG9wZW4gZml4YWJsZSBmaW5kaW5ncywgY2xvc2UgdGhlIHJlc3QgYnkgYWJzZW5jZS5cbiAqXG4gKiBOZXZlciB0aHJvd3Mg4oCUIGV4cG9zdXJlIHRyYWNraW5nIGlzIHJlcG9ydGluZywgYW5kIGEgcGlwZWxpbmUgd3JpdGUgb3IgYSBkZXBsb3lcbiAqIHJlZ2lzdHJhdGlvbiBtdXN0IG5vdCBmYWlsIGJlY2F1c2UgdGhlIHJlcG9ydCB0YWJsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY29uY2lsZVBpcGVsaW5lRXhwb3N1cmVzKFxuICBpbnB1dDogeyBvcmdJZDogc3RyaW5nOyBwaXBlbGluZUlkOiBzdHJpbmc7IHNvdXJjZTogRXhwb3N1cmVTb3VyY2U7IHN0ZXBzOiByZWFkb25seSBFeHBvc3VyZVN0ZXBbXSB9LFxuICBub3cgPSBuZXcgRGF0ZSgpLFxuKTogUHJvbWlzZTx7IG9wZW5lZDogbnVtYmVyOyBjbG9zZWQ6IG51bWJlciB9PiB7XG4gIGNvbnN0IGV4cG9zZWQ6IEV4cG9zdXJlSW5wdXRbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgc3RlcCBvZiBpbnB1dC5zdGVwcykge1xuICAgIGNvbnN0IGNvdW50cyA9IGV4cG9zdXJlRnJvbVNjYW4oeyAuLi5zdGVwLnNjYW4sIGltYWdlRGlnZXN0OiBzdGVwLmltYWdlRGlnZXN0ID8/IHN0ZXAuc2Nhbi5pbWFnZURpZ2VzdCA/PyBudWxsIH0pO1xuICAgIGlmICghY291bnRzKSBjb250aW51ZTtcbiAgICBjb25zdCBrZXkgPSBsaXZlS2V5KHsgcGx1Z2luTmFtZTogc3RlcC5wbHVnaW5OYW1lLCBwbHVnaW5WZXJzaW9uOiBzdGVwLnBsdWdpblZlcnNpb24sIGltYWdlRGlnZXN0OiBzdGVwLmltYWdlRGlnZXN0IH0pO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZTsgLy8gdHdvIHN0ZXBzIG9uIG9uZSB2ZXJzaW9uIGFyZSBvbmUgZXhwb3N1cmVcbiAgICBzZWVuLmFkZChrZXkpO1xuICAgIGV4cG9zZWQucHVzaCh7XG4gICAgICBvcmdJZDogaW5wdXQub3JnSWQsXG4gICAgICBwaXBlbGluZUlkOiBpbnB1dC5waXBlbGluZUlkLFxuICAgICAgcGx1Z2luUHVibGlzaGVyOiBzdGVwLnBsdWdpblB1Ymxpc2hlciA/PyBudWxsLFxuICAgICAgcGx1Z2luTmFtZTogc3RlcC5wbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogc3RlcC5wbHVnaW5WZXJzaW9uLFxuICAgICAgaW1hZ2VEaWdlc3Q6IHN0ZXAuaW1hZ2VEaWdlc3QgPz8gbnVsbCxcbiAgICAgIHNvdXJjZTogaW5wdXQuc291cmNlLFxuICAgICAgLi4uY291bnRzLFxuICAgICAgdG9wRmluZGluZ3M6IGNvdW50cy50b3BGaW5kaW5ncyBhcyB1bmtub3duIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICB9KTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IG9wZW5lZCA9IGF3YWl0IHVwc2VydEV4cG9zdXJlcyhleHBvc2VkLCBub3cpO1xuICAgIC8vIEV2ZXJ5IHBsdWdpbiBhIHN0ZXAgc3RpbGwgdXNlcyAoY2xlYW4gdmVyc2lvbnMgdG9vKTogYSByb3cgZm9yIG9uZSBvZlxuICAgIC8vIHRoZW0gY2xvc2VzIGBmaXhlZGA7IGEgcm93IGZvciBhIHBsdWdpbiBubyBzdGVwIHVzZXMgYW55IG1vcmUsIGByZW1vdmVkYC5cbiAgICBjb25zdCBjbG9zZWQgPSBhd2FpdCBjbG9zZUZpeGVkRXhwb3N1cmVzKGlucHV0LnBpcGVsaW5lSWQsIGlucHV0LnNvdXJjZSwgZXhwb3NlZCwgbm93LCB7IGxpdmVQbHVnaW5zOiBpbnB1dC5zdGVwcy5tYXAoKHMpID0+IHMucGx1Z2luTmFtZSkgfSk7XG4gICAgcmV0dXJuIHsgb3BlbmVkLCBjbG9zZWQgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGV4cG9zdXJlIHJlY29uY2lsZSBmYWlsZWQnLCB7IHBpcGVsaW5lSWQ6IGlucHV0LnBpcGVsaW5lSWQsIHNvdXJjZTogaW5wdXQuc291cmNlLCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIHsgb3BlbmVkOiAwLCBjbG9zZWQ6IDAgfTtcbiAgfVxufVxuXG4vKiogQSBwbHVnaW4gdmVyc2lvbiAob3B0aW9uYWxseSBvbmUgaW1hZ2Ugb2YgaXQpIHdob3NlIHBpcGVsaW5lcyBhcmUgd2FudGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5WZXJzaW9uUmVmIHtcbiAgcGx1Z2luTmFtZTogc3RyaW5nO1xuICBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBMaXN0aW5nIHB1Ymxpc2hlciBoYW5kbGU7IG51bGwgPSBhbiBvcmcncyBvd24gcGx1Z2luIHJvdzsgb21pdHRlZCA9IGVpdGhlci4gKi9cbiAgcGx1Z2luUHVibGlzaGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIE5hcnJvdyB0byBwaXBlbGluZXMgb24gdGhpcyBpbWFnZS4gT21pdHRlZCA9IGFueSBpbWFnZSBvZiB0aGUgdmVyc2lvbi4gKi9cbiAgaW1hZ2VEaWdlc3Q/OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTmFycm93IHRvIHRoZXNlIG9yZ3MuIE9taXR0ZWQgPSBldmVyeSBvcmcgdGhlIGNhbGxlcidzIHNjb3BlIGNhbiByZWFkLiAqL1xuICBvcmdJZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqIEEgcGlwZWxpbmUgdGhhdCBkZWNsYXJlcyBvciBydW5zIGEgZ2l2ZW4gcGx1Z2luIHZlcnNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lT25WZXJzaW9uIHtcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwaXBlbGluZU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBgZGVwbG95ZWRgID0gaXRzIGxhc3QgZGVwbG95J3Mgc3RlcCBtYW5pZmVzdDsgYGRlY2xhcmVkYCA9IGl0cyBjb25maWcgcmVzb2x2ZXMgdG8gaXQuICovXG4gIHNvdXJjZTogRXhwb3N1cmVTb3VyY2U7XG4gIHBsdWdpblB1Ymxpc2hlcjogc3RyaW5nIHwgbnVsbDtcbiAgaW1hZ2VEaWdlc3Q6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgc3RlcHMgb24gaXQ6IGBzeW50aGAgb3IgYDxzdGFnZT4vPHN0ZXA+YCAoZGVjbGFyZWQpIC8gYDxzdGFnZT4vPGFjdGlvbj5gIChkZXBsb3llZCkuICovXG4gIHN0ZXBzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBFdmVyeSBMSVZFIHBpcGVsaW5lIGRlY2xhcmluZyAoYHBpcGVsaW5lX3BsdWdpbl9yZXNvbHV0aW9uYCkgb3IgcnVubmluZ1xuICogKGBwaXBlbGluZV9zdGVwX21hbmlmZXN0c2ApIGEgcGx1Z2luIHZlcnNpb24sIG9uZSBlbnRyeSBwZXIgKHBpcGVsaW5lLCBzb3VyY2UpXG4gKiB3aXRoIHRoZSBzdGVwcyBvbiBpdC4gQSBzb2Z0LWRlbGV0ZWQgcGlwZWxpbmUgaXMgTk9UIGFmZmVjdGVkOiBjb3VudGluZyBpdFxuICogd291bGQgcHV0IGEgcGlwZWxpbmUgbm9ib2R5IGNhbiBvcGVuIGludG8gYSBub3RpY2Ugb3IgYSByZXBvcnQuIFJlYWRzIHVuZGVyXG4gKiB0aGUgQ0FMTEVSJ3MgdGVuYW50IHNjb3BlOiBhbiBvcmctc2NvcGVkIGNhbGxlciBzZWVzIGl0cyBvd24gcGlwZWxpbmVzLCB0aGVcbiAqIHJlc2NhbiAoZWxldmF0ZWQpIHNlZXMgZXZlcnkgb3JnJ3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwaXBlbGluZXNPblZlcnNpb24ocmVmOiBQbHVnaW5WZXJzaW9uUmVmKTogUHJvbWlzZTxQaXBlbGluZU9uVmVyc2lvbltdPiB7XG4gIGNvbnN0IHB1Ymxpc2hlclNxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5wbHVnaW5QdWJsaXNoZXIgPT09IHVuZGVmaW5lZFxuICAgID8gc3FsYGBcbiAgICA6IHJlZi5wbHVnaW5QdWJsaXNoZXIgPT09IG51bGwgPyBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gSVMgTlVMTGAgOiBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gPSAke3JlZi5wbHVnaW5QdWJsaXNoZXJ9YCk7XG4gIGNvbnN0IGRpZ2VzdFNxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5pbWFnZURpZ2VzdCA/IHNxbGAgQU5EICR7c3FsLnJhdyhjb2wpfSA9ICR7cmVmLmltYWdlRGlnZXN0fWAgOiBzcWxgYCk7XG4gIGNvbnN0IG9yZ1NxbCA9IChjb2w6IHN0cmluZykgPT4gKHJlZi5vcmdJZHMgPyBzcWxgIEFORCAke3NxbC5yYXcoY29sKX0gPSAke2FueVRleHQoWy4uLnJlZi5vcmdJZHNdKX1gIDogc3FsYGApO1xuICBpZiAocmVmLm9yZ0lkcyAmJiByZWYub3JnSWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5leGVjdXRlKHNxbGBcbiAgICBTRUxFQ1QgeC5vcmdfaWQsIHgucGlwZWxpbmVfaWQsIHguc291cmNlLCBNSU4oeC5wbHVnaW5fcHVibGlzaGVyKSBBUyBwbHVnaW5fcHVibGlzaGVyLCBNSU4oeC5pbWFnZV9kaWdlc3QpIEFTIGltYWdlX2RpZ2VzdCxcbiAgICAgICAgICAgcC5waXBlbGluZV9uYW1lLCBhcnJheV9hZ2coRElTVElOQ1QgeC5zdGVwIE9SREVSIEJZIHguc3RlcCkgQVMgc3RlcHNcbiAgICBGUk9NIChcbiAgICAgIFNFTEVDVCBtLm9yZ19pZCwgbS5waXBlbGluZV9pZDo6dGV4dCBBUyBwaXBlbGluZV9pZCwgJ2RlcGxveWVkJyBBUyBzb3VyY2UsIG0ucGx1Z2luX3B1Ymxpc2hlciwgbS5pbWFnZV9kaWdlc3QsXG4gICAgICAgICAgICAgbS5zdGFnZV9uYW1lIHx8ICcvJyB8fCBtLmFjdGlvbl9uYW1lIEFTIHN0ZXBcbiAgICAgIEZST00gcGlwZWxpbmVfc3RlcF9tYW5pZmVzdHMgbVxuICAgICAgV0hFUkUgbS5wbHVnaW5fbmFtZSA9ICR7cmVmLnBsdWdpbk5hbWV9IEFORCBtLnBsdWdpbl92ZXJzaW9uID0gJHtyZWYucGx1Z2luVmVyc2lvbn1cbiAgICAgICAgJHtwdWJsaXNoZXJTcWwoJ20ucGx1Z2luX3B1Ymxpc2hlcicpfSR7ZGlnZXN0U3FsKCdtLmltYWdlX2RpZ2VzdCcpfSR7b3JnU3FsKCdtLm9yZ19pZCcpfVxuICAgICAgVU5JT04gQUxMXG4gICAgICBTRUxFQ1Qgci5vcmdfaWQsIHIucGlwZWxpbmVfaWQsICdkZWNsYXJlZCcgQVMgc291cmNlLCByLnBsdWdpbl9wdWJsaXNoZXIsIHIucmVzb2x2ZWRfZGlnZXN0IEFTIGltYWdlX2RpZ2VzdCxcbiAgICAgICAgICAgICBDQVNFIFdIRU4gci5zdGFnZV9uYW1lID0gJ3N5bnRoJyBBTkQgci5zdGVwX25hbWUgPSAnc3ludGgnIFRIRU4gJ3N5bnRoJyBFTFNFIHIuc3RhZ2VfbmFtZSB8fCAnLycgfHwgci5zdGVwX25hbWUgRU5EIEFTIHN0ZXBcbiAgICAgIEZST00gcGlwZWxpbmVfcGx1Z2luX3Jlc29sdXRpb24gclxuICAgICAgV0hFUkUgci5wbHVnaW5fbmFtZSA9ICR7cmVmLnBsdWdpbk5hbWV9IEFORCByLnJlc29sdmVkX3ZlcnNpb24gPSAke3JlZi5wbHVnaW5WZXJzaW9ufVxuICAgICAgICAke3B1Ymxpc2hlclNxbCgnci5wbHVnaW5fcHVibGlzaGVyJyl9JHtkaWdlc3RTcWwoJ3IucmVzb2x2ZWRfZGlnZXN0Jyl9JHtvcmdTcWwoJ3Iub3JnX2lkJyl9XG4gICAgKSB4XG4gICAgSk9JTiBwaXBlbGluZXMgcCBPTiBwLmlkOjp0ZXh0ID0geC5waXBlbGluZV9pZCBBTkQgcC5kZWxldGVkX2F0IElTIE5VTExcbiAgICBHUk9VUCBCWSB4Lm9yZ19pZCwgeC5waXBlbGluZV9pZCwgeC5zb3VyY2UsIHAucGlwZWxpbmVfbmFtZVxuICAgIE9SREVSIEJZIHgucGlwZWxpbmVfaWQsIHguc291cmNlXG4gIGApKTtcbiAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6ICgocmVzdWx0IGFzIHsgcm93cz86IHVua25vd25bXSB9KT8ucm93cyA/PyBbXSk7XG4gIHJldHVybiAocm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLm1hcCgocikgPT4gKHtcbiAgICBvcmdJZDogU3RyaW5nKHIub3JnX2lkKSxcbiAgICBwaXBlbGluZUlkOiBTdHJpbmcoci5waXBlbGluZV9pZCksXG4gICAgcGlwZWxpbmVOYW1lOiAoci5waXBlbGluZV9uYW1lIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgc291cmNlOiByLnNvdXJjZSBhcyBFeHBvc3VyZVNvdXJjZSxcbiAgICBwbHVnaW5QdWJsaXNoZXI6IChyLnBsdWdpbl9wdWJsaXNoZXIgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBpbWFnZURpZ2VzdDogKHIuaW1hZ2VfZGlnZXN0IGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgc3RlcHM6IEFycmF5LmlzQXJyYXkoci5zdGVwcykgPyAoci5zdGVwcyBhcyBzdHJpbmdbXSkgOiBbXSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIFRoZSByZXNjYW4ncyBlbnRyeSBwb2ludDogb25lIHJlc2Nhbm5lZCB2ZXJzaW9uJ3MgZmluZGluZ3MsIGZhbm5lZCBvdXQgdG8gZXZlcnlcbiAqIHBpcGVsaW5lIHRoYXQgZGVjbGFyZXMgb3IgcnVucyBpdC5cbiAqXG4gKiBBIHZlcnNpb24gd2l0aCBvcGVuIGZpeGFibGUgZmluZGluZ3Mgb3BlbnMgLyByZWZyZXNoZXMgb25lIGV4cG9zdXJlIHBlclxuICogKHBpcGVsaW5lLCBzb3VyY2UpOyBhIHZlcnNpb24gdGhhdCBjYW1lIGJhY2sgQ0xFQU4gY2xvc2VzIGV2ZXJ5IG9wZW4gZXhwb3N1cmVcbiAqIG9uIGl0IChgZml4ZWRgKSwgc28gYSByZWJ1aWxkLWluLXBsYWNlIG9yIGFuIGFkdmlzb3J5IHdpdGhkcmF3biB1cHN0cmVhbSBzaG93c1xuICogYXMgZml4ZWQgb24gdGhlIG5leHQgbmlnaHQgcmF0aGVyIHRoYW4gbGluZ2VyaW5nIHVudGlsIGVhY2ggcGlwZWxpbmUgcmVkZXBsb3lzLlxuICpcbiAqIE11c3QgcnVuIHdpdGggYSBzY29wZSB0aGF0IGNhbiByZWFkIGFuZCB3cml0ZSBldmVyeSBvcmcncyByb3dzICh0aGUgcmVzY2FuJ3NcbiAqIGVsZXZhdGVkIGNvbnRleHQpLiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jVmVyc2lvbkV4cG9zdXJlcyhcbiAgcmVmOiBQbHVnaW5WZXJzaW9uUmVmLFxuICBzY2FuOiBTY2FuU3RhdGUsXG4gIG5vdyA9IG5ldyBEYXRlKCksXG4pOiBQcm9taXNlPHsgb3BlbmVkOiBudW1iZXI7IGNsb3NlZDogbnVtYmVyIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb3VudHMgPSBleHBvc3VyZUZyb21TY2FuKHsgLi4uc2NhbiwgaW1hZ2VEaWdlc3Q6IHJlZi5pbWFnZURpZ2VzdCA/PyBzY2FuLmltYWdlRGlnZXN0ID8/IG51bGwgfSk7XG4gICAgaWYgKCFjb3VudHMpIHJldHVybiB7IG9wZW5lZDogMCwgY2xvc2VkOiBhd2FpdCBjbG9zZVZlcnNpb25FeHBvc3VyZXMocmVmLCBub3cpIH07XG4gICAgY29uc3QgcGlwZWxpbmVzID0gYXdhaXQgcGlwZWxpbmVzT25WZXJzaW9uKHJlZik7XG4gICAgY29uc3Qgb3BlbmVkID0gYXdhaXQgdXBzZXJ0RXhwb3N1cmVzKHBpcGVsaW5lcy5tYXAoKHApID0+ICh7XG4gICAgICBvcmdJZDogcC5vcmdJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHAucGlwZWxpbmVJZCxcbiAgICAgIHBsdWdpblB1Ymxpc2hlcjogcC5wbHVnaW5QdWJsaXNoZXIsXG4gICAgICBwbHVnaW5OYW1lOiByZWYucGx1Z2luTmFtZSxcbiAgICAgIHBsdWdpblZlcnNpb246IHJlZi5wbHVnaW5WZXJzaW9uLFxuICAgICAgaW1hZ2VEaWdlc3Q6IHJlZi5pbWFnZURpZ2VzdCA/PyBwLmltYWdlRGlnZXN0LFxuICAgICAgc291cmNlOiBwLnNvdXJjZSxcbiAgICAgIGNyaXRpY2FsQ291bnQ6IGNvdW50cy5jcml0aWNhbENvdW50LFxuICAgICAgaGlnaENvdW50OiBjb3VudHMuaGlnaENvdW50LFxuICAgICAgdG9wRmluZGluZ3M6IGNvdW50cy50b3BGaW5kaW5ncyBhcyB1bmtub3duIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PixcbiAgICAgIGZpbmRpbmdLZXlzOiBjb3VudHMuZmluZGluZ0tleXMsXG4gICAgfSkpLCBub3cpO1xuICAgIHJldHVybiB7IG9wZW5lZCwgY2xvc2VkOiAwIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdWZXJzaW9uIGV4cG9zdXJlIHN5bmMgZmFpbGVkJywgeyBwbHVnaW46IHJlZi5wbHVnaW5OYW1lLCB2ZXJzaW9uOiByZWYucGx1Z2luVmVyc2lvbiwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgIHJldHVybiB7IG9wZW5lZDogMCwgY2xvc2VkOiAwIH07XG4gIH1cbn1cblxuLyoqIENsb3NlIGV2ZXJ5IG9wZW4gZXhwb3N1cmUgb24gYSB2ZXJzaW9uIChvcHRpb25hbGx5IG9uZSBpbWFnZSBvZiBpdCkuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2VWZXJzaW9uRXhwb3N1cmVzKHJlZjogUGx1Z2luVmVyc2lvblJlZiwgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IEUgPSBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKEUpXG4gICAgLnNldCh7IGZpeGVkQXQ6IG5vdywgdHJpYWdlU3RhdGU6ICdmaXhlZCcsIHVwZGF0ZWRBdDogbm93IH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKEUucGx1Z2luTmFtZSwgcmVmLnBsdWdpbk5hbWUpLFxuICAgICAgZXEoRS5wbHVnaW5WZXJzaW9uLCByZWYucGx1Z2luVmVyc2lvbiksXG4gICAgICBpc051bGwoRS5maXhlZEF0KSxcbiAgICAgIC4uLihyZWYuaW1hZ2VEaWdlc3QgPyBbZXEoRS5pbWFnZURpZ2VzdCwgcmVmLmltYWdlRGlnZXN0KV0gOiBbXSksXG4gICAgICAuLi4ocmVmLnBsdWdpblB1Ymxpc2hlciA9PT0gdW5kZWZpbmVkID8gW10gOiBbcmVmLnBsdWdpblB1Ymxpc2hlciA9PT0gbnVsbCA/IGlzTnVsbChFLnBsdWdpblB1Ymxpc2hlcikgOiBlcShFLnBsdWdpblB1Ymxpc2hlciwgcmVmLnBsdWdpblB1Ymxpc2hlcildKSxcbiAgICAgIC4uLihyZWYub3JnSWRzID8gW2luQXJyYXkoRS5vcmdJZCwgWy4uLnJlZi5vcmdJZHNdKV0gOiBbXSksXG4gICAgKSlcbiAgICAucmV0dXJuaW5nKHsgaWQ6IEUuaWQgfSkpO1xuICByZXR1cm4gKHJvd3MgYXMgdW5rbm93bltdKS5sZW5ndGg7XG59XG5cbi8qKlxuICogVGhlIG9yZydzIGxpdmUgZXhwb3N1cmVzLCBmb3IgdGhlIHJlcG9ydCBzZWN0aW9uLlxuICpcbiAqIGBhY2NlcHRlZGAgcm93cyB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2VkIGNvbWUgYmFjayBhcyBPUEVOIGV2ZW4gaWYgbm8gcmVzY2FuXG4gKiBoYXMgcmVmcmVzaGVkIHRoZW0geWV0OiBhIHJlYWQgbXVzdCBub3QgcHJlc2VudCBhbiBleHBpcmVkIGFjY2VwdGFuY2UgYXMgYVxuICogY3VycmVudCBvbmUsIGFuZCB0aGUgcmVwb3J0IGlzIHJlYWQgZmFyIG1vcmUgb2Z0ZW4gdGhhbiB0aGUgcmVzY2FuIHJ1bnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuRXhwb3N1cmVzKG9yZ0lkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHBsdWdpblZlcnNpb246IHN0cmluZztcbiAgcGx1Z2luUHVibGlzaGVyOiBzdHJpbmcgfCBudWxsO1xuICBzb3VyY2U6IEV4cG9zdXJlU291cmNlO1xuICBjcml0aWNhbENvdW50OiBudW1iZXI7XG4gIGhpZ2hDb3VudDogbnVtYmVyO1xuICB0b3BGaW5kaW5nczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICB0cmlhZ2VTdGF0ZTogc3RyaW5nO1xuICBmbGFnZ2VkQXQ6IERhdGU7XG59Pj4ge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHguc2VsZWN0KHtcbiAgICBwaXBlbGluZUlkOiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnBpcGVsaW5lSWQsXG4gICAgcGx1Z2luTmFtZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5OYW1lLFxuICAgIHBsdWdpblZlcnNpb246IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luVmVyc2lvbixcbiAgICBwbHVnaW5QdWJsaXNoZXI6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luUHVibGlzaGVyLFxuICAgIHNvdXJjZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5zb3VyY2UsXG4gICAgY3JpdGljYWxDb3VudDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5jcml0aWNhbENvdW50LFxuICAgIGhpZ2hDb3VudDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5oaWdoQ291bnQsXG4gICAgdG9wRmluZGluZ3M6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudG9wRmluZGluZ3MsXG4gICAgdHJpYWdlU3RhdGU6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlU3RhdGUsXG4gICAgYWNjZXB0ZWRVbnRpbDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5hY2NlcHRlZFVudGlsLFxuICAgIGZsYWdnZWRBdDogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5mbGFnZ2VkQXQsXG4gIH0pLmZyb20oc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5vcmdJZCwgb3JnSWQpLFxuICAgICAgbGl2ZUV4cG9zdXJlUHJlZGljYXRlKG5vdyksXG4gICAgKSlcbiAgICAub3JkZXJCeShzcWxgJHtzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmNyaXRpY2FsQ291bnR9IERFU0MsICR7c2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5oaWdoQ291bnR9IERFU0NgKSk7XG5cbiAgcmV0dXJuIChyb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikubWFwKChyKSA9PiAoe1xuICAgIHBpcGVsaW5lSWQ6IHIucGlwZWxpbmVJZCBhcyBzdHJpbmcsXG4gICAgcGx1Z2luTmFtZTogci5wbHVnaW5OYW1lIGFzIHN0cmluZyxcbiAgICBwbHVnaW5WZXJzaW9uOiByLnBsdWdpblZlcnNpb24gYXMgc3RyaW5nLFxuICAgIHBsdWdpblB1Ymxpc2hlcjogKHIucGx1Z2luUHVibGlzaGVyIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgc291cmNlOiByLnNvdXJjZSBhcyBFeHBvc3VyZVNvdXJjZSxcbiAgICBjcml0aWNhbENvdW50OiByLmNyaXRpY2FsQ291bnQgYXMgbnVtYmVyLFxuICAgIGhpZ2hDb3VudDogci5oaWdoQ291bnQgYXMgbnVtYmVyLFxuICAgIHRvcEZpbmRpbmdzOiAoci50b3BGaW5kaW5ncyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID8/IFtdLFxuICAgIC8vIE9ubHkgYWNjZXB0YW5jZXMgTk9UIGluIGZvcmNlIHBhc3MgdGhlIGxpdmUgcHJlZGljYXRlLCBzbyBhbiBgYWNjZXB0ZWRgXG4gICAgLy8gcm93IGhlcmUgaXMgYW4gZXhwaXJlZCBvbmUsIGFuZCByZWFkcyBhcyB3aGF0IGl0IGlzOiBvcGVuLlxuICAgIHRyaWFnZVN0YXRlOiByLnRyaWFnZVN0YXRlID09PSAnYWNjZXB0ZWQnID8gJ29wZW4nIDogKHIudHJpYWdlU3RhdGUgYXMgc3RyaW5nKSxcbiAgICBmbGFnZ2VkQXQ6IHIuZmxhZ2dlZEF0IGFzIERhdGUsXG4gIH0pKTtcbn1cblxuLyoqIE9uZSBleHBvc3VyZSByb3cgYXMgdGhlIHBlci1waXBlbGluZSBzZWN1cml0eSB2aWV3cyByZWFkIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUV4cG9zdXJlIHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwbHVnaW5QdWJsaXNoZXI6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlOiBFeHBvc3VyZVNvdXJjZTtcbiAgY3JpdGljYWxDb3VudDogbnVtYmVyO1xuICBoaWdoQ291bnQ6IG51bWJlcjtcbiAgdG9wRmluZGluZ3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgZmluZGluZ0tleXM6IHN0cmluZ1tdO1xuICAvKiogQXMgc3RvcmVkOyBhbiBgYWNjZXB0ZWRgIHJvdyBwYXN0IGl0cyBkZWFkbGluZSByZWFkcyBgb3BlbmAgKHNlZSB7QGxpbmsgbGl2ZUV4cG9zdXJlUHJlZGljYXRlfSkuICovXG4gIHRyaWFnZVN0YXRlOiBzdHJpbmc7XG4gIC8qKiBBbiBhY2NlcHRhbmNlIHN0aWxsIGluIGZvcmNlIHJpZ2h0IG5vdy4gKi9cbiAgYWNjZXB0YW5jZUFjdGl2ZTogYm9vbGVhbjtcbiAgYWNjZXB0ZWRVbnRpbDogRGF0ZSB8IG51bGw7XG4gIGFjY2VwdGVkRmluZGluZ0tleXM6IHN0cmluZ1tdO1xuICBhY2NlcHRlZEtldjogYm9vbGVhbjtcbiAgdHJpYWdlUmVhc29uOiBzdHJpbmcgfCBudWxsO1xuICB0cmlhZ2VkQnk6IHN0cmluZyB8IG51bGw7XG4gIHRyaWFnZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdnZWRBdDogRGF0ZTtcbiAgZml4ZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbmNvbnN0IEUgPSAoKSA9PiBzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlO1xuXG5mdW5jdGlvbiB0b1BpcGVsaW5lRXhwb3N1cmUocjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG5vdzogRGF0ZSk6IFBpcGVsaW5lRXhwb3N1cmUge1xuICBjb25zdCB1bnRpbCA9IChyLmFjY2VwdGVkVW50aWwgYXMgRGF0ZSB8IG51bGwpID8/IG51bGw7XG4gIGNvbnN0IGFjdGl2ZSA9IHIudHJpYWdlU3RhdGUgPT09ICdhY2NlcHRlZCcgJiYgci5maXhlZEF0ID09IG51bGwgJiYgdW50aWwgIT09IG51bGwgJiYgdW50aWwuZ2V0VGltZSgpID4gbm93LmdldFRpbWUoKTtcbiAgcmV0dXJuIHtcbiAgICBpZDogci5pZCBhcyBzdHJpbmcsXG4gICAgb3JnSWQ6IHIub3JnSWQgYXMgc3RyaW5nLFxuICAgIHBpcGVsaW5lSWQ6IHIucGlwZWxpbmVJZCBhcyBzdHJpbmcsXG4gICAgcGx1Z2luUHVibGlzaGVyOiAoci5wbHVnaW5QdWJsaXNoZXIgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBwbHVnaW5OYW1lOiByLnBsdWdpbk5hbWUgYXMgc3RyaW5nLFxuICAgIHBsdWdpblZlcnNpb246IHIucGx1Z2luVmVyc2lvbiBhcyBzdHJpbmcsXG4gICAgaW1hZ2VEaWdlc3Q6IChyLmltYWdlRGlnZXN0IGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgc291cmNlOiByLnNvdXJjZSBhcyBFeHBvc3VyZVNvdXJjZSxcbiAgICBjcml0aWNhbENvdW50OiByLmNyaXRpY2FsQ291bnQgYXMgbnVtYmVyLFxuICAgIGhpZ2hDb3VudDogci5oaWdoQ291bnQgYXMgbnVtYmVyLFxuICAgIHRvcEZpbmRpbmdzOiAoci50b3BGaW5kaW5ncyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID8/IFtdLFxuICAgIGZpbmRpbmdLZXlzOiAoci5maW5kaW5nS2V5cyBhcyBzdHJpbmdbXSkgPz8gW10sXG4gICAgdHJpYWdlU3RhdGU6IHIudHJpYWdlU3RhdGUgPT09ICdhY2NlcHRlZCcgJiYgIWFjdGl2ZSAmJiByLmZpeGVkQXQgPT0gbnVsbCA/ICdvcGVuJyA6IChyLnRyaWFnZVN0YXRlIGFzIHN0cmluZyksXG4gICAgYWNjZXB0YW5jZUFjdGl2ZTogYWN0aXZlLFxuICAgIGFjY2VwdGVkVW50aWw6IHVudGlsLFxuICAgIGFjY2VwdGVkRmluZGluZ0tleXM6IChyLmFjY2VwdGVkRmluZGluZ0tleXMgYXMgc3RyaW5nW10pID8/IFtdLFxuICAgIGFjY2VwdGVkS2V2OiByLmFjY2VwdGVkS2V2ID09PSB0cnVlLFxuICAgIHRyaWFnZVJlYXNvbjogKHIudHJpYWdlUmVhc29uIGFzIHN0cmluZyB8IG51bGwpID8/IG51bGwsXG4gICAgdHJpYWdlZEJ5OiAoci50cmlhZ2VkQnkgYXMgc3RyaW5nIHwgbnVsbCkgPz8gbnVsbCxcbiAgICB0cmlhZ2VkQXQ6IChyLnRyaWFnZWRBdCBhcyBEYXRlIHwgbnVsbCkgPz8gbnVsbCxcbiAgICBmbGFnZ2VkQXQ6IHIuZmxhZ2dlZEF0IGFzIERhdGUsXG4gICAgZml4ZWRBdDogKHIuZml4ZWRBdCBhcyBEYXRlIHwgbnVsbCkgPz8gbnVsbCxcbiAgfTtcbn1cblxuLyoqXG4gKiBPbmUgcGlwZWxpbmUncyBleHBvc3VyZXM6IHRoZSB1bmZpeGVkIG9uZXMgKG9wZW4sIGFjY2VwdGVkLCBmYWxzZSBwb3NpdGl2ZSksXG4gKiBwbHVzIHRoZSBmaXhlZCBvbmVzIHdoZW4gYXNrZWQg4oCUIG1vc3Qgc2V2ZXJlIGZpcnN0LiBSZWFkcyB1bmRlciB0aGUgQ0FMTEVSJ3NcbiAqIHNjb3BlLCBuYXJyb3dlZCB0byBgb3JnSWRgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVFeHBvc3VyZXMoXG4gIG9yZ0lkOiBzdHJpbmcsXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgb3B0czogeyBpbmNsdWRlRml4ZWQ/OiBib29sZWFuOyBub3c/OiBEYXRlIH0gPSB7fSxcbik6IFByb21pc2U8UGlwZWxpbmVFeHBvc3VyZVtdPiB7XG4gIGNvbnN0IG5vdyA9IG9wdHMubm93ID8/IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKEUoKSlcbiAgICAud2hlcmUoYW5kKFxuICAgICAgZXEoRSgpLm9yZ0lkLCBvcmdJZCksXG4gICAgICBlcShFKCkucGlwZWxpbmVJZCwgcGlwZWxpbmVJZCksXG4gICAgICAuLi4ob3B0cy5pbmNsdWRlRml4ZWQgPyBbXSA6IFtpc051bGwoRSgpLmZpeGVkQXQpXSksXG4gICAgKSlcbiAgICAub3JkZXJCeShzcWxgJHtFKCkuY3JpdGljYWxDb3VudH0gREVTQywgJHtFKCkuaGlnaENvdW50fSBERVNDLCAke0UoKS5wbHVnaW5OYW1lfWApKTtcbiAgcmV0dXJuIChyb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikubWFwKChyKSA9PiB0b1BpcGVsaW5lRXhwb3N1cmUociwgbm93KSk7XG59XG5cbi8qKiBPbmUgZXhwb3N1cmUgcm93IG9mIGBvcmdJZGAsIG9yIG51bGwuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwb3N1cmVCeUlkKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIG5vdyA9IG5ldyBEYXRlKCkpOiBQcm9taXNlPFBpcGVsaW5lRXhwb3N1cmUgfCBudWxsPiB7XG4gIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3QoKS5mcm9tKEUoKSkud2hlcmUoYW5kKGVxKEUoKS5pZCwgaWQpLCBlcShFKCkub3JnSWQsIG9yZ0lkKSkpKTtcbiAgY29uc3Qgcm93ID0gKHJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVswXTtcbiAgcmV0dXJuIHJvdyA/IHRvUGlwZWxpbmVFeHBvc3VyZShyb3csIG5vdykgOiBudWxsO1xufVxuXG4vKiogQSB0cmlhZ2UgZGVjaXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFnZURlY2lzaW9uIHtcbiAgc3RhdGU6ICdvcGVuJyB8ICdhY2NlcHRlZCcgfCAnZmFsc2VfcG9zaXRpdmUnO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIGFjY2VwdGVkVW50aWw/OiBEYXRlO1xuICAvKiogQWNjZXB0IEtFVi1saXN0ZWQgZmluZGluZ3MgdG9vLiBOZXZlciBpbXBsaWVkOiBhbiBhY2NlcHRhbmNlIHdpdGhvdXQgaXQgZG9lcyBub3QgY292ZXIgdGhlbS4gKi9cbiAga2V2PzogYm9vbGVhbjtcbiAgYWN0b3I6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWNvcmQgYSB0cmlhZ2UgZGVjaXNpb24gb24gb25lIGV4cG9zdXJlIOKAlCBhbmQgb24gaXRzIFNJQkxJTkdTOiB0aGUgc2FtZVxuICogcGlwZWxpbmUncyBvdGhlciBvcGVuIHJvdyBmb3IgdGhlIHNhbWUgdmVyc2lvbiBhbmQgaW1hZ2UgKHRoZSBkZWNsYXJlZCBhbmRcbiAqIHRoZSBkZXBsb3llZCBzaWRlKS4gQSByaXNrIGRlY2lzaW9uIGlzIGFib3V0IHdoYXQgdGhlIHBpcGVsaW5lIHJ1bnMsIGFuZFxuICogbGVhdmluZyBvbmUgc2lkZSBvcGVuIHdvdWxkIGhhdmUgdGhlIHJlcG9ydCBhbmQgdGhlIGxvb2t1cCBkaXNhZ3JlZS5cbiAqXG4gKiBgYWNjZXB0ZWRgIFJFUVVJUkVTIGEgZGVhZGxpbmUgYW5kIGEgcmVhc29uLiBBIHBlcm1hbmVudCwgdW5leHBsYWluZWQgbXV0ZSBpc1xuICogaG93IGEgZmluZGluZyBzdG9wcyBiZWluZyBhbnlib2R5J3MgcHJvYmxlbSwgYW5kIHRoZXJlIGlzIG5vIGdvb2QgcmVhc29uIHRvXG4gKiBzdXBwb3J0IGl0IOKAlCB0aGUgY2FsbGVyIGdldHMgYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSBzaWxlbnRseSB1bmJvdW5kZWRcbiAqIGFjY2VwdGFuY2UuIFRoZSBhY2NlcHRlZCBmaW5kaW5nIGtleXMgYXJlIEZST1pFTiBhdCB0aGUgZGVjaXNpb246IGFuXG4gKiBhY2NlcHRhbmNlIGNvdmVycyB3aGF0IHdhcyB0aGVyZSB3aGVuIGl0IHdhcyBtYWRlLCBuZXZlciBhIGZpbmRpbmcgc2luY2UuXG4gKlxuICogUmV0dXJucyB0aGUgdXBkYXRlZCByb3dzIChlbXB0eSB3aGVuIGBpZGAgaXMgbm90IGBvcmdJZGAncyB1bmZpeGVkIGV4cG9zdXJlKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyaWFnZUV4cG9zdXJlKG9yZ0lkOiBzdHJpbmcsIGlkOiBzdHJpbmcsIGRlY2lzaW9uOiBUcmlhZ2VEZWNpc2lvbik6IFByb21pc2U8UGlwZWxpbmVFeHBvc3VyZVtdPiB7XG4gIGlmIChkZWNpc2lvbi5zdGF0ZSA9PT0gJ2FjY2VwdGVkJyAmJiAoIWRlY2lzaW9uLmFjY2VwdGVkVW50aWwgfHwgIWRlY2lzaW9uLnJlYXNvbj8udHJpbSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWNjZXB0aW5nIGEgdnVsbmVyYWJpbGl0eSBleHBvc3VyZSBuZWVkcyBhIHJlYXNvbiBhbmQgYW4gZXhwaXJ5IGRhdGUnKTtcbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB0YXJnZXQgPSBhd2FpdCBleHBvc3VyZUJ5SWQob3JnSWQsIGlkLCBub3cpO1xuICBpZiAoIXRhcmdldCB8fCB0YXJnZXQuZml4ZWRBdCkgcmV0dXJuIFtdO1xuICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKEUoKSlcbiAgICAuc2V0KHtcbiAgICAgIHRyaWFnZVN0YXRlOiBkZWNpc2lvbi5zdGF0ZSxcbiAgICAgIGFjY2VwdGVkVW50aWw6IGRlY2lzaW9uLnN0YXRlID09PSAnYWNjZXB0ZWQnID8gKGRlY2lzaW9uLmFjY2VwdGVkVW50aWwgPz8gbnVsbCkgOiBudWxsLFxuICAgICAgYWNjZXB0ZWRGaW5kaW5nS2V5czogZGVjaXNpb24uc3RhdGUgPT09ICdhY2NlcHRlZCcgPyBzcWxgJHtFKCkuZmluZGluZ0tleXN9YCA6IFtdLFxuICAgICAgYWNjZXB0ZWRLZXY6IGRlY2lzaW9uLnN0YXRlID09PSAnYWNjZXB0ZWQnICYmIGRlY2lzaW9uLmtldiA9PT0gdHJ1ZSxcbiAgICAgIHRyaWFnZVJlYXNvbjogZGVjaXNpb24ucmVhc29uPy50cmltKCkgfHwgbnVsbCxcbiAgICAgIHRyaWFnZWRCeTogZGVjaXNpb24uYWN0b3IsXG4gICAgICB0cmlhZ2VkQXQ6IG5vdyxcbiAgICAgIHVwZGF0ZWRBdDogbm93LFxuICAgIH0pXG4gICAgLndoZXJlKGFuZChcbiAgICAgIGVxKEUoKS5vcmdJZCwgb3JnSWQpLFxuICAgICAgZXEoRSgpLnBpcGVsaW5lSWQsIHRhcmdldC5waXBlbGluZUlkKSxcbiAgICAgIGVxKEUoKS5wbHVnaW5OYW1lLCB0YXJnZXQucGx1Z2luTmFtZSksXG4gICAgICBlcShFKCkucGx1Z2luVmVyc2lvbiwgdGFyZ2V0LnBsdWdpblZlcnNpb24pLFxuICAgICAgdGFyZ2V0LmltYWdlRGlnZXN0ID09PSBudWxsID8gaXNOdWxsKEUoKS5pbWFnZURpZ2VzdCkgOiBlcShFKCkuaW1hZ2VEaWdlc3QsIHRhcmdldC5pbWFnZURpZ2VzdCksXG4gICAgICBpc051bGwoRSgpLmZpeGVkQXQpLFxuICAgICkpXG4gICAgLnJldHVybmluZygpKTtcbiAgcmV0dXJuIChyb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikubWFwKChyKSA9PiB0b1BpcGVsaW5lRXhwb3N1cmUociwgbm93KSk7XG59XG5cbi8qKiBgbmFtZUB2ZXJzaW9uQGRpZ2VzdGAg4oCUIHRoZSBrZXkge0BsaW5rIGFjdGl2ZUFjY2VwdGFuY2VzfSBhbnN3ZXJzIHVuZGVyLiAqL1xuZXhwb3J0IGNvbnN0IGFjY2VwdGFuY2VLZXkgPSAocGx1Z2luTmFtZTogc3RyaW5nLCBwbHVnaW5WZXJzaW9uOiBzdHJpbmcsIGltYWdlRGlnZXN0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyA9PlxuICBgJHtwbHVnaW5OYW1lfUAke3BsdWdpblZlcnNpb259QCR7aW1hZ2VEaWdlc3QgPz8gJyd9YDtcblxuLyoqIEEgcGlwZWxpbmUncyBhY2NlcHRhbmNlcyBpbiBmb3JjZSwga2V5ZWQgYnkge0BsaW5rIGFjY2VwdGFuY2VLZXl9LCBwbHVzIHRoZSBhY2NlcHRlZCB2ZXJzaW9ucyBwZXIgcGx1Z2luLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFjY2VwdGFuY2VzIHtcbiAgYnlLZXk6IE1hcDxzdHJpbmcsIFZ1bG5BY2NlcHRhbmNlICYgeyBleHBvc3VyZUlkczogc3RyaW5nW10gfT47XG4gIC8qKiBgcGx1Z2luTmFtZWAg4oaSIHZlcnNpb25zIHdpdGggYW4gYWNjZXB0YW5jZSAodGhlIHJlc29sdmVyJ3MgYGFjY2VwdGVkVmVyc2lvbnNgIGhpbnQpLiAqL1xuICB2ZXJzaW9uc0J5UGx1Z2luOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj47XG59XG5cbi8qKlxuICogVGhlIGFjY2VwdGFuY2VzIElOIEZPUkNFIGZvciBvbmUgcGlwZWxpbmUgKGBhY2NlcHRlZGAsIHVuZml4ZWQsIGRlYWRsaW5lIGluIHRoZVxuICogZnV0dXJlKSwgbWVyZ2VkIHBlciB2ZXJzaW9uIGFuZCBpbWFnZTogdGhlIHVuaW9uIG9mIHRoZSBmaW5kaW5nIGtleXMgdGhlIHJvd3NcbiAqIGZyb3plLCBLRVYgb25seSB3aGVuIGV2ZXJ5IG1lcmdlZCByb3cgYWNjZXB0ZWQgaXQuIFJlYWRzIHVuZGVyIHRoZSBjYWxsZXInc1xuICogc2NvcGUgbmFycm93ZWQgdG8gYG9yZ0lkYDsgYSBmYWlsZWQgcmVhZCBpcyBcIm5vIGFjY2VwdGFuY2VcIiDigJQgdGhlIHN0cmljdGVyIGFuc3dlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFjdGl2ZUFjY2VwdGFuY2VzKG9yZ0lkOiBzdHJpbmcsIHBpcGVsaW5lSWQ6IHN0cmluZywgbm93ID0gbmV3IERhdGUoKSk6IFByb21pc2U8UGlwZWxpbmVBY2NlcHRhbmNlcz4ge1xuICBjb25zdCBvdXQ6IFBpcGVsaW5lQWNjZXB0YW5jZXMgPSB7IGJ5S2V5OiBuZXcgTWFwKCksIHZlcnNpb25zQnlQbHVnaW46IG5ldyBNYXAoKSB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB3aXRoVGVuYW50VHgoKHR4KSA9PiB0eC5zZWxlY3Qoe1xuICAgICAgaWQ6IEUoKS5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IEUoKS5wbHVnaW5OYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogRSgpLnBsdWdpblZlcnNpb24sXG4gICAgICBpbWFnZURpZ2VzdDogRSgpLmltYWdlRGlnZXN0LFxuICAgICAgYWNjZXB0ZWRVbnRpbDogRSgpLmFjY2VwdGVkVW50aWwsXG4gICAgICBhY2NlcHRlZEZpbmRpbmdLZXlzOiBFKCkuYWNjZXB0ZWRGaW5kaW5nS2V5cyxcbiAgICAgIGFjY2VwdGVkS2V2OiBFKCkuYWNjZXB0ZWRLZXYsXG4gICAgfSkuZnJvbShFKCkpXG4gICAgICAud2hlcmUoYW5kKFxuICAgICAgICBlcShFKCkub3JnSWQsIG9yZ0lkKSxcbiAgICAgICAgZXEoRSgpLnBpcGVsaW5lSWQsIHBpcGVsaW5lSWQpLFxuICAgICAgICBlcShFKCkudHJpYWdlU3RhdGUsICdhY2NlcHRlZCcpLFxuICAgICAgICBpc051bGwoRSgpLmZpeGVkQXQpLFxuICAgICAgICBzcWxgJHtFKCkuYWNjZXB0ZWRVbnRpbH0gPiAke25vd31gLFxuICAgICAgKSkpIGFzIEFycmF5PHsgaWQ6IHN0cmluZzsgcGx1Z2luTmFtZTogc3RyaW5nOyBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7IGltYWdlRGlnZXN0OiBzdHJpbmcgfCBudWxsOyBhY2NlcHRlZFVudGlsOiBEYXRlOyBhY2NlcHRlZEZpbmRpbmdLZXlzOiBzdHJpbmdbXTsgYWNjZXB0ZWRLZXY6IGJvb2xlYW4gfT47XG4gICAgZm9yIChjb25zdCByIG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IGtleSA9IGFjY2VwdGFuY2VLZXkoci5wbHVnaW5OYW1lLCByLnBsdWdpblZlcnNpb24sIHIuaW1hZ2VEaWdlc3QpO1xuICAgICAgY29uc3QgcHJldiA9IG91dC5ieUtleS5nZXQoa2V5KTtcbiAgICAgIG91dC5ieUtleS5zZXQoa2V5LCBwcmV2XG4gICAgICAgID8ge1xuICAgICAgICAgIGZpbmRpbmdLZXlzOiBbLi4ubmV3IFNldChbLi4ucHJldi5maW5kaW5nS2V5cywgLi4uKHIuYWNjZXB0ZWRGaW5kaW5nS2V5cyA/PyBbXSldKV0sXG4gICAgICAgICAga2V2OiBwcmV2LmtldiAmJiByLmFjY2VwdGVkS2V2LFxuICAgICAgICAgIGFjY2VwdGVkVW50aWw6IHByZXYuYWNjZXB0ZWRVbnRpbCAmJiBuZXcgRGF0ZShwcmV2LmFjY2VwdGVkVW50aWwpIDwgci5hY2NlcHRlZFVudGlsID8gcHJldi5hY2NlcHRlZFVudGlsIDogci5hY2NlcHRlZFVudGlsLFxuICAgICAgICAgIGV4cG9zdXJlSWRzOiBbLi4ucHJldi5leHBvc3VyZUlkcywgci5pZF0sXG4gICAgICAgIH1cbiAgICAgICAgOiB7IGZpbmRpbmdLZXlzOiByLmFjY2VwdGVkRmluZGluZ0tleXMgPz8gW10sIGtldjogci5hY2NlcHRlZEtldiwgYWNjZXB0ZWRVbnRpbDogci5hY2NlcHRlZFVudGlsLCBleHBvc3VyZUlkczogW3IuaWRdIH0pO1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBvdXQudmVyc2lvbnNCeVBsdWdpbi5nZXQoci5wbHVnaW5OYW1lKSA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIHZlcnNpb25zLmFkZChyLnBsdWdpblZlcnNpb24pO1xuICAgICAgb3V0LnZlcnNpb25zQnlQbHVnaW4uc2V0KHIucGx1Z2luTmFtZSwgdmVyc2lvbnMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1BpcGVsaW5lIGFjY2VwdGFuY2VzIHVucmVhZGFibGU7IHRyZWF0aW5nIGFzIG5vbmUnLCB7IHBpcGVsaW5lSWQsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQW4gYWNjZXB0YW5jZSB0aGF0IGxhcHNlZCwgYXMge0BsaW5rIHJlb3BlbkxhcHNlZEFjY2VwdGFuY2VzfSByZXR1cm5zIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXBzZWRBY2NlcHRhbmNlIHtcbiAgaWQ6IHN0cmluZztcbiAgb3JnSWQ6IHN0cmluZztcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBwbHVnaW5QdWJsaXNoZXI6IHN0cmluZyB8IG51bGw7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICBpbWFnZURpZ2VzdDogc3RyaW5nIHwgbnVsbDtcbiAgdHJpYWdlZEJ5OiBzdHJpbmcgfCBudWxsO1xuICB0cmlhZ2VSZWFzb246IHN0cmluZyB8IG51bGw7XG4gIGFjY2VwdGVkVW50aWw6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlb3BlbiBldmVyeSBhY2NlcHRhbmNlIHdob3NlIGRlYWRsaW5lIGhhcyBwYXNzZWQsIGFuZCByZXR1cm4gdGhlbSBzbyB0aGVcbiAqIHBpcGVsaW5lIG93bmVycyBjYW4gYmUgdG9sZCAoTjMzKS4gUmVhZGVycyBhbHJlYWR5IHRyZWF0IHN1Y2ggYSByb3cgYXMgb3BlbjtcbiAqIHdyaXRpbmcgaXQgbWFrZXMgdGhlIHN0b3JlZCBzdGF0ZSB0aGUgdHJ1dGggYW5kIGdpdmVzIHRoZSBub3RpY2UgZXhhY3RseSBvbmVcbiAqIG1vbWVudCB0byBmaXJlLiBNdXN0IHJ1biB3aXRoIGEgc2NvcGUgdGhhdCBjYW4gd3JpdGUgZXZlcnkgb3JnJ3Mgcm93cyAodGhlXG4gKiBuaWdodGx5IHJlc2NhbidzIGVsZXZhdGVkIGNvbnRleHQpLiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW9wZW5MYXBzZWRBY2NlcHRhbmNlcyhub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxMYXBzZWRBY2NlcHRhbmNlW10+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgd2l0aFRlbmFudFR4KCh0eCkgPT4gdHgudXBkYXRlKEUoKSlcbiAgICAgIC5zZXQoeyB0cmlhZ2VTdGF0ZTogJ29wZW4nLCB1cGRhdGVkQXQ6IG5vdyB9KVxuICAgICAgLndoZXJlKGFuZChcbiAgICAgICAgZXEoRSgpLnRyaWFnZVN0YXRlLCAnYWNjZXB0ZWQnKSxcbiAgICAgICAgaXNOdWxsKEUoKS5maXhlZEF0KSxcbiAgICAgICAgbHRlKEUoKS5hY2NlcHRlZFVudGlsLCBub3cpLFxuICAgICAgKSlcbiAgICAgIC5yZXR1cm5pbmcoe1xuICAgICAgICBpZDogRSgpLmlkLFxuICAgICAgICBvcmdJZDogRSgpLm9yZ0lkLFxuICAgICAgICBwaXBlbGluZUlkOiBFKCkucGlwZWxpbmVJZCxcbiAgICAgICAgcGx1Z2luUHVibGlzaGVyOiBFKCkucGx1Z2luUHVibGlzaGVyLFxuICAgICAgICBwbHVnaW5OYW1lOiBFKCkucGx1Z2luTmFtZSxcbiAgICAgICAgcGx1Z2luVmVyc2lvbjogRSgpLnBsdWdpblZlcnNpb24sXG4gICAgICAgIGltYWdlRGlnZXN0OiBFKCkuaW1hZ2VEaWdlc3QsXG4gICAgICAgIHRyaWFnZWRCeTogRSgpLnRyaWFnZWRCeSxcbiAgICAgICAgdHJpYWdlUmVhc29uOiBFKCkudHJpYWdlUmVhc29uLFxuICAgICAgICBhY2NlcHRlZFVudGlsOiBFKCkuYWNjZXB0ZWRVbnRpbCxcbiAgICAgIH0pKTtcbiAgICByZXR1cm4gcm93cyBhcyBMYXBzZWRBY2NlcHRhbmNlW107XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKCdMYXBzZWQgYWNjZXB0YW5jZXMgbm90IHJlb3BlbmVkJywgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKlxuICogRXhwb3N1cmVzIHdob3NlIGFjY2VwdGFuY2UgaGFzIGxhcHNlZCwgZm9yIHRoZSBvcmcncyBzZWN1cml0eSBub3RpZmljYXRpb25zLlxuICpcbiAqIFN1cmZhY2VkIHJhdGhlciB0aGFuIHNpbGVudGx5IHJlb3BlbmVkOiBzb21lYm9keSBkZWNpZGVkIHRvIGFjY2VwdCB0aGlzIHVudGlsIGFcbiAqIGRhdGUsIHRoYXQgZGF0ZSBoYXMgcGFzc2VkLCBhbmQgdGhlIHBlcnNvbiB3aG8gZGVjaWRlZCBpcyB0aGUgb25lIHdobyBzaG91bGRcbiAqIGhlYXIgYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsYXBzZWRBY2NlcHRhbmNlcyhvcmdJZDogc3RyaW5nLCBub3cgPSBuZXcgRGF0ZSgpKTogUHJvbWlzZTxBcnJheTx7XG4gIGlkOiBzdHJpbmc7XG4gIHBsdWdpbk5hbWU6IHN0cmluZztcbiAgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xuICB0cmlhZ2VkQnk6IHN0cmluZyB8IG51bGw7XG4gIGFjY2VwdGVkVW50aWw6IERhdGUgfCBudWxsO1xufT4+IHtcbiAgY29uc3Qgcm93cyA9IGF3YWl0IHdpdGhUZW5hbnRUeCgodHgpID0+IHR4LnNlbGVjdCh7XG4gICAgaWQ6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuaWQsXG4gICAgcGx1Z2luTmFtZTogc2NoZW1hLnBsdWdpblZ1bG5FeHBvc3VyZS5wbHVnaW5OYW1lLFxuICAgIHBsdWdpblZlcnNpb246IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUucGx1Z2luVmVyc2lvbixcbiAgICB0cmlhZ2VkQnk6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUudHJpYWdlZEJ5LFxuICAgIGFjY2VwdGVkVW50aWw6IHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuYWNjZXB0ZWRVbnRpbCxcbiAgfSkuZnJvbShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlKVxuICAgIC53aGVyZShhbmQoXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLm9yZ0lkLCBvcmdJZCksXG4gICAgICBlcShzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLnRyaWFnZVN0YXRlLCAnYWNjZXB0ZWQnKSxcbiAgICAgIGlzTnVsbChzY2hlbWEucGx1Z2luVnVsbkV4cG9zdXJlLmZpeGVkQXQpLFxuICAgICAgbHRlKHNjaGVtYS5wbHVnaW5WdWxuRXhwb3N1cmUuYWNjZXB0ZWRVbnRpbCwgbm93KSxcbiAgICApKSk7XG4gIHJldHVybiByb3dzIGFzIEFycmF5PHsgaWQ6IHN0cmluZzsgcGx1Z2luTmFtZTogc3RyaW5nOyBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7IHRyaWFnZWRCeTogc3RyaW5nIHwgbnVsbDsgYWNjZXB0ZWRVbnRpbDogRGF0ZSB8IG51bGwgfT47XG59XG4iXX0=
@@ -5,4 +5,4 @@ export * from './tenancy.js';
5
5
  export * from './public-reader.js';
6
6
  export * from './read-connection.js';
7
7
  export * from './read-lag.js';
8
- export { isUniqueViolation, resultRows, executeRows, type SqlExecutor, } from './pg-result.js';
8
+ export { isUniqueViolation, resultRows, executeRows, anyText, type SqlExecutor, } from './pg-result.js';
@@ -11,5 +11,5 @@ export * from './public-reader.js';
11
11
  // same shape: a second, smaller pool with a narrower remit than the primary.
12
12
  export * from './read-connection.js';
13
13
  export * from './read-lag.js';
14
- export { isUniqueViolation, resultRows, executeRows, } from './pg-result.js';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxNQUFNLEVBTU4sTUFBTSxFQUlOLG9CQUFvQixFQUlwQixRQUFRLEVBQ1IsZ0JBQWdCLEVBRWhCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBS1osZ0JBQWdCLEVBTWhCLE9BQU8sRUFJUCxpQkFBaUIsRUFRakIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMseUJBQXlCLEVBU3pCLFNBQVMsRUFDVCxjQUFjO0FBQ2Qsc0JBQXNCO0FBQ3RCLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLGVBQWUsRUFlZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBTWxCLG1CQUFtQixFQUNuQixZQUFZLEVBSVosZUFBZSxFQUlmLDZCQUE2QixFQUU3Qix3QkFBd0IsRUFReEIsd0JBQXdCLEVBT3hCLFNBQVMsRUFDVCxhQUFhLEVBRWIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLDBCQUEwQixHQStCM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixlQUFlLEVBQ2YsY0FBYyxFQUVkLFVBQVUsRUFDVixFQUFFLEdBQ0gsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsR0FFWixNQUFNLGdCQUFnQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHNjaGVtYSxcbiAgdHlwZSBQbHVnaW5TZWNyZXQsXG4gIHR5cGUgSW1hZ2VTb3VyY2UsXG4gIHR5cGUgUGx1Z2luTGlmZWN5Y2xlLFxuICB0eXBlIFBsdWdpbkNvbnRyYWN0VmFsdWVUeXBlLFxuICB0eXBlIFBsdWdpbkljb24sXG4gIHBsdWdpbixcbiAgdHlwZSBQbHVnaW4sXG4gIHR5cGUgUGx1Z2luSW5zZXJ0LFxuICB0eXBlIFBsdWdpblVwZGF0ZSxcbiAgcGx1Z2luS2VwdFNldHVwSW1hZ2UsXG4gIHR5cGUgUGx1Z2luS2VwdFNldHVwSW1hZ2UsXG4gIHR5cGUgUGx1Z2luS2VwdFNldHVwSW1hZ2VJbnNlcnQsXG4gIHR5cGUgS2VwdFNldHVwSW1hZ2VCdWlsZCxcbiAgcGlwZWxpbmUsXG4gIHBpcGVsaW5lUmVnaXN0cnksXG4gIHR5cGUgRXZlbnRTb3VyY2UsXG4gIHBpcGVsaW5lRXZlbnQsXG4gIGRlcGxveW1lbnRPdXRjb21lLFxuICBpbmdlc3RIZWFsdGgsXG4gIGluY2lkZW50LFxuICBkb3JhU2V0dGluZ3MsXG4gIHR5cGUgUGlwZWxpbmUsXG4gIHR5cGUgUGlwZWxpbmVJbnNlcnQsXG4gIHR5cGUgSW5jaWRlbnQsXG4gIHR5cGUgUGlwZWxpbmVVcGRhdGUsXG4gIHBpcGVsaW5lVGVtcGxhdGUsXG4gIHR5cGUgUGlwZWxpbmVUZW1wbGF0ZSxcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlSW5zZXJ0LFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGVVcGRhdGUsXG4gIHR5cGUgTWVzc2FnZVR5cGUsXG4gIHR5cGUgTWVzc2FnZVByaW9yaXR5LFxuICBtZXNzYWdlLFxuICB0eXBlIE1lc3NhZ2UsXG4gIHR5cGUgTWVzc2FnZUluc2VydCxcbiAgdHlwZSBNZXNzYWdlVXBkYXRlLFxuICBtZXNzYWdlQXR0YWNobWVudCxcbiAgdHlwZSBNZXNzYWdlQXR0YWNobWVudCxcbiAgdHlwZSBSdWxlU2V2ZXJpdHksXG4gIHR5cGUgUnVsZVRhcmdldCxcbiAgdHlwZSBSdWxlT3BlcmF0b3IsXG4gIHR5cGUgUnVsZUNvbmRpdGlvbk1vZGUsXG4gIHR5cGUgUnVsZVNjb3BlLFxuICB0eXBlIFJ1bGVDb25kaXRpb24sXG4gIGNvbXBsaWFuY2VQb2xpY3ksXG4gIGNvbXBsaWFuY2VSdWxlLFxuICBjb21wbGlhbmNlUnVsZUhpc3RvcnksXG4gIGNvbXBsaWFuY2VBdWRpdExvZyxcbiAgY29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24sXG4gIGNvbXBsaWFuY2VTY2FuLFxuICBjb21wbGlhbmNlU2NhblNjaGVkdWxlLFxuICBjb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyxcbiAgdHlwZSBDb21wbGlhbmNlUG9saWN5LFxuICB0eXBlIENvbXBsaWFuY2VQb2xpY3lJbnNlcnQsXG4gIHR5cGUgQ29tcGxpYW5jZVJ1bGUsXG4gIHR5cGUgQ29tcGxpYW5jZVJ1bGVJbnNlcnQsXG4gIHR5cGUgQ29tcGxpYW5jZUV4ZW1wdGlvbixcbiAgdHlwZSBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbixcbiAgdHlwZSBDb21wbGlhbmNlU2NhbixcbiAgdHlwZSBDb21wbGlhbmNlTm90aWZpY2F0aW9uUHJlZmVyZW5jZSxcbiAgZGFzaGJvYXJkLFxuICBkYXNoYm9hcmRQYW5lbCxcbiAgLy8gU3Rha2Vob2xkZXIgcmVwb3J0c1xuICByZXBvcnREZWZpbml0aW9uLFxuICByZXBvcnRSdW4sXG4gIHJlcG9ydFNoYXJlTGluayxcbiAgcmVwb3J0UmVjaXBpZW50LFxuICB0eXBlIFJlcG9ydERlZmluaXRpb24sXG4gIHR5cGUgUmVwb3J0RGVmaW5pdGlvbkluc2VydCxcbiAgdHlwZSBSZXBvcnRSdW4sXG4gIHR5cGUgUmVwb3J0UnVuSW5zZXJ0LFxuICB0eXBlIFJlcG9ydFNoYXJlTGluayxcbiAgdHlwZSBSZXBvcnRTaGFyZUxpbmtJbnNlcnQsXG4gIHR5cGUgUmVwb3J0UmVjaXBpZW50LFxuICB0eXBlIFJlcG9ydFJlY2lwaWVudEluc2VydCxcbiAgdHlwZSBSZXBvcnRDYWRlbmNlLFxuICB0eXBlIFJlcG9ydFRlbXBsYXRlLFxuICB0eXBlIFJlcG9ydFJ1blN0YXR1cyxcbiAgdHlwZSBSZXBvcnRQYXVzZVJlYXNvbixcbiAgdHlwZSBSZXBvcnRTY29wZSxcbiAgdHlwZSBSZXBvcnRTY29wZUtpbmQsXG4gIFJFUE9SVF9DQURFTkNFUyxcbiAgUkVQT1JUX1RFTVBMQVRFUyxcbiAgUkVQT1JUX1JVTl9TVEFUVVNFUyxcbiAgUkVQT1JUX1BBVVNFX1JFQVNPTlMsXG4gIFJFUE9SVF9TQ09QRV9LSU5EUyxcbiAgdHlwZSBEYXNoYm9hcmQsXG4gIHR5cGUgRGFzaGJvYXJkSW5zZXJ0LFxuICB0eXBlIERhc2hib2FyZFVwZGF0ZSxcbiAgdHlwZSBEYXNoYm9hcmRQYW5lbCxcbiAgdHlwZSBEYXNoYm9hcmRQYW5lbEluc2VydCxcbiAgb3JnQWxlcnREZXN0aW5hdGlvbixcbiAgb3JnQWxlcnRSdWxlLFxuICB0eXBlIE9yZ0FsZXJ0RGVzdGluYXRpb24sXG4gIHR5cGUgT3JnQWxlcnREZXN0aW5hdGlvbkluc2VydCxcbiAgdHlwZSBIZWFsdGhCcmVha2Rvd24sXG4gIFBVQkxJU0hFUl9USUVSUyxcbiAgdHlwZSBQdWJsaXNoZXJUaWVyLFxuICB0eXBlIFB1Ymxpc2hSZXF1ZXN0S2luZCxcbiAgdHlwZSBQdWJsaXNoUmVxdWVzdFN0YXR1cyxcbiAgT1BFTl9QVUJMSVNIX1JFUVVFU1RfU1RBVFVTRVMsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RMYW5lLFxuICBJTlNUQUxMX1ZFUlNJT05fUE9MSUNJRVMsXG4gIHR5cGUgSW5zdGFsbFZlcnNpb25Qb2xpY3ksXG4gIHR5cGUgSW5zdGFsbFN0YXR1cyxcbiAgdHlwZSBJbnN0YWxsQ2hhbmdlUmVxdWVzdCxcbiAgdHlwZSBCbG9ja09uQWR2aXNvcnksXG4gIHR5cGUgT2ZmaWNpYWxJbnN0YWxscyxcbiAgdHlwZSBSZXZpZXdTdGF0dXMsXG4gIHR5cGUgUmV2aWV3SG9sZFJlYXNvbixcbiAgUkVWSUVXX1JFUE9SVF9DQVRFR09SSUVTLFxuICB0eXBlIFJldmlld1JlcG9ydENhdGVnb3J5LFxuICB0eXBlIEFkdmlzb3J5U2V2ZXJpdHksXG4gIHR5cGUgQWR2aXNvcnlTdGF0ZSxcbiAgdHlwZSBBZHZpc29yeVNvdXJjZSxcbiAgdHlwZSBTdWJtaXNzaW9uQ2F0YWxvZyxcbiAgdHlwZSBTdWJtaXNzaW9uU3RhdHVzLFxuICBwdWJsaXNoZXIsXG4gIHBsdWdpbkxpc3RpbmcsXG4gIHR5cGUgTGlzdGluZ1ZlcnNpb25TcGVjU25hcHNob3QsXG4gIHBsdWdpbkxpc3RpbmdWZXJzaW9uLFxuICBwbHVnaW5BZHZpc29yeSxcbiAgZWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgcGx1Z2luUHVibGlzaFJlcXVlc3QsXG4gIGVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgZWNvc3lzdGVtU2V0dGluZyxcbiAgcGx1Z2luUmV2aWV3LFxuICBwbHVnaW5SZXZpZXdSZXBseSxcbiAgcGx1Z2luUmV2aWV3UmVwb3J0LFxuICBwbHVnaW5SZXZpZXdWb3RlLFxuICBwbHVnaW5SZXZpZXdIaXN0b3J5LFxuICBwbHVnaW5TdGF0cyxcbiAgcGx1Z2luU3VibWlzc2lvbixcbiAgZWNvc3lzdGVtU2VhcmNoTWlzcyxcbiAgZWNvc3lzdGVtTm90aWZpY2F0aW9uUXVldWUsXG4gIHBpcGVsaW5lU3RlcE1hbmlmZXN0LFxuICBwbHVnaW5JbnN0YWxsLFxuICBwbHVnaW5JbnN0YWxsUG9saWN5LFxuICBwbHVnaW5BZHZpc29yeURlbGl2ZXJ5LFxuICBwbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvblByZWYsXG4gIHB1YmxpY0xpc3RpbmdzLFxuICBwdWJsaWNMaXN0ZWRWZXJzaW9ucyxcbiAgcHVibGljQWR2aXNvcmllcyxcbiAgcHVibGljUmV2aWV3cyxcbiAgT0ZGSUNJQUxfUFVCTElTSEVSX0hBTkRMRSxcbiAgQ09NTVVOSVRZX1BVQkxJU0hFUl9IQU5ETEUsXG4gIHR5cGUgUHVibGlzaGVyLFxuICB0eXBlIFB1Ymxpc2hlckluc2VydCxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nLFxuICB0eXBlIFBsdWdpbkxpc3RpbmdJbnNlcnQsXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb24sXG4gIHR5cGUgUGx1Z2luTGlzdGluZ1ZlcnNpb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnksXG4gIHR5cGUgUGx1Z2luQWR2aXNvcnlJbnNlcnQsXG4gIHR5cGUgRWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZSxcbiAgdHlwZSBFY29zeXN0ZW1BdXRvQXBwcm92YWxSdWxlSW5zZXJ0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0LFxuICB0eXBlIFBsdWdpblB1Ymxpc2hSZXF1ZXN0SW5zZXJ0LFxuICB0eXBlIEVjb3N5c3RlbVJlc2VydmVkTmFtZSxcbiAgdHlwZSBQbHVnaW5SZXZpZXcsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5LFxuICB0eXBlIFBsdWdpblJldmlld1JlcGx5SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld1JlcG9ydCxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBvcnRJbnNlcnQsXG4gIHR5cGUgUGx1Z2luUmV2aWV3SGlzdG9yeUluc2VydCxcbiAgdHlwZSBQbHVnaW5TdGF0cyxcbiAgdHlwZSBQbHVnaW5TdGF0c0luc2VydCxcbiAgdHlwZSBQbHVnaW5TdWJtaXNzaW9uLFxuICB0eXBlIFBsdWdpblN1Ym1pc3Npb25JbnNlcnQsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3ksXG4gIHR5cGUgUGx1Z2luSW5zdGFsbFBvbGljeUluc2VydCxcbiAgdHlwZSBQbHVnaW5TZWN1cml0eU5vdGlmaWNhdGlvblByZWYsXG4gIHR5cGUgUHVibGljUmV2aWV3LFxufSBmcm9tICcuL2RyaXp6bGUtc2NoZW1hLmpzJztcbmV4cG9ydCB7XG4gIGdldFNzbENvbmZpZyxcbiAgZ2V0Q29ubmVjdGlvbixcbiAgY2xvc2VDb25uZWN0aW9uLFxuICB0ZXN0Q29ubmVjdGlvbixcbiAgdHlwZSBDb25uZWN0aW9uT3B0aW9ucyxcbiAgQ29ubmVjdGlvbixcbiAgZGIsXG59IGZyb20gJy4vcG9zdGdyZXMtY29ubmVjdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JldHJ5LXN0cmF0ZWd5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vdGVuYW5jeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1yZWFkZXIuanMnO1xuLy8gVGhlIHJlYWQtcmVwbGljYSBwb29sLiBFeHBvcnRlZCBhbG9uZ3NpZGUgcHVibGljLXJlYWRlciBiZWNhdXNlIHRoZXkgYXJlIHRoZVxuLy8gc2FtZSBzaGFwZTogYSBzZWNvbmQsIHNtYWxsZXIgcG9vbCB3aXRoIGEgbmFycm93ZXIgcmVtaXQgdGhhbiB0aGUgcHJpbWFyeS5cbmV4cG9ydCAqIGZyb20gJy4vcmVhZC1jb25uZWN0aW9uLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVhZC1sYWcuanMnO1xuZXhwb3J0IHtcbiAgaXNVbmlxdWVWaW9sYXRpb24sXG4gIHJlc3VsdFJvd3MsXG4gIGV4ZWN1dGVSb3dzLFxuICB0eXBlIFNxbEV4ZWN1dG9yLFxufSBmcm9tICcuL3BnLXJlc3VsdC5qcyc7XG4iXX0=
14
+ export { isUniqueViolation, resultRows, executeRows, anyText, } from './pg-result.js';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFDTCxNQUFNLEVBTU4sTUFBTSxFQUlOLG9CQUFvQixFQUlwQixRQUFRLEVBQ1IsZ0JBQWdCLEVBRWhCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLFFBQVEsRUFDUixZQUFZLEVBS1osZ0JBQWdCLEVBTWhCLE9BQU8sRUFJUCxpQkFBaUIsRUFRakIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsY0FBYyxFQUNkLHNCQUFzQixFQUN0QixnQ0FBZ0MsRUFDaEMseUJBQXlCLEVBU3pCLFNBQVMsRUFDVCxjQUFjO0FBQ2Qsc0JBQXNCO0FBQ3RCLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLGVBQWUsRUFlZixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixvQkFBb0IsRUFDcEIsa0JBQWtCLEVBTWxCLG1CQUFtQixFQUNuQixZQUFZLEVBSVosZUFBZSxFQUlmLDZCQUE2QixFQUU3Qix3QkFBd0IsRUFReEIsd0JBQXdCLEVBT3hCLFNBQVMsRUFDVCxhQUFhLEVBRWIsb0JBQW9CLEVBQ3BCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLDhCQUE4QixFQUM5QixjQUFjLEVBQ2Qsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IseUJBQXlCLEVBQ3pCLDBCQUEwQixHQStCM0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsWUFBWSxFQUNaLGFBQWEsRUFDYixlQUFlLEVBQ2YsY0FBYyxFQUVkLFVBQVUsRUFDVixFQUFFLEdBQ0gsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFdBQVcsRUFDWCxPQUFPLEdBRVIsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5leHBvcnQge1xuICBzY2hlbWEsXG4gIHR5cGUgUGx1Z2luU2VjcmV0LFxuICB0eXBlIEltYWdlU291cmNlLFxuICB0eXBlIFBsdWdpbkxpZmVjeWNsZSxcbiAgdHlwZSBQbHVnaW5Db250cmFjdFZhbHVlVHlwZSxcbiAgdHlwZSBQbHVnaW5JY29uLFxuICBwbHVnaW4sXG4gIHR5cGUgUGx1Z2luLFxuICB0eXBlIFBsdWdpbkluc2VydCxcbiAgdHlwZSBQbHVnaW5VcGRhdGUsXG4gIHBsdWdpbktlcHRTZXR1cEltYWdlLFxuICB0eXBlIFBsdWdpbktlcHRTZXR1cEltYWdlLFxuICB0eXBlIFBsdWdpbktlcHRTZXR1cEltYWdlSW5zZXJ0LFxuICB0eXBlIEtlcHRTZXR1cEltYWdlQnVpbGQsXG4gIHBpcGVsaW5lLFxuICBwaXBlbGluZVJlZ2lzdHJ5LFxuICB0eXBlIEV2ZW50U291cmNlLFxuICBwaXBlbGluZUV2ZW50LFxuICBkZXBsb3ltZW50T3V0Y29tZSxcbiAgaW5nZXN0SGVhbHRoLFxuICBpbmNpZGVudCxcbiAgZG9yYVNldHRpbmdzLFxuICB0eXBlIFBpcGVsaW5lLFxuICB0eXBlIFBpcGVsaW5lSW5zZXJ0LFxuICB0eXBlIEluY2lkZW50LFxuICB0eXBlIFBpcGVsaW5lVXBkYXRlLFxuICBwaXBlbGluZVRlbXBsYXRlLFxuICB0eXBlIFBpcGVsaW5lVGVtcGxhdGUsXG4gIHR5cGUgUGlwZWxpbmVUZW1wbGF0ZUluc2VydCxcbiAgdHlwZSBQaXBlbGluZVRlbXBsYXRlVXBkYXRlLFxuICB0eXBlIE1lc3NhZ2VUeXBlLFxuICB0eXBlIE1lc3NhZ2VQcmlvcml0eSxcbiAgbWVzc2FnZSxcbiAgdHlwZSBNZXNzYWdlLFxuICB0eXBlIE1lc3NhZ2VJbnNlcnQsXG4gIHR5cGUgTWVzc2FnZVVwZGF0ZSxcbiAgbWVzc2FnZUF0dGFjaG1lbnQsXG4gIHR5cGUgTWVzc2FnZUF0dGFjaG1lbnQsXG4gIHR5cGUgUnVsZVNldmVyaXR5LFxuICB0eXBlIFJ1bGVUYXJnZXQsXG4gIHR5cGUgUnVsZU9wZXJhdG9yLFxuICB0eXBlIFJ1bGVDb25kaXRpb25Nb2RlLFxuICB0eXBlIFJ1bGVTY29wZSxcbiAgdHlwZSBSdWxlQ29uZGl0aW9uLFxuICBjb21wbGlhbmNlUG9saWN5LFxuICBjb21wbGlhbmNlUnVsZSxcbiAgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LFxuICBjb21wbGlhbmNlQXVkaXRMb2csXG4gIGNvbXBsaWFuY2VFeGVtcHRpb24sXG4gIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICBjb21wbGlhbmNlU2NhbixcbiAgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2csXG4gIHR5cGUgQ29tcGxpYW5jZVBvbGljeSxcbiAgdHlwZSBDb21wbGlhbmNlUG9saWN5SW5zZXJ0LFxuICB0eXBlIENvbXBsaWFuY2VSdWxlLFxuICB0eXBlIENvbXBsaWFuY2VSdWxlSW5zZXJ0LFxuICB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb24sXG4gIHR5cGUgQ29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24sXG4gIHR5cGUgQ29tcGxpYW5jZVNjYW4sXG4gIHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGRhc2hib2FyZCxcbiAgZGFzaGJvYXJkUGFuZWwsXG4gIC8vIFN0YWtlaG9sZGVyIHJlcG9ydHNcbiAgcmVwb3J0RGVmaW5pdGlvbixcbiAgcmVwb3J0UnVuLFxuICByZXBvcnRTaGFyZUxpbmssXG4gIHJlcG9ydFJlY2lwaWVudCxcbiAgdHlwZSBSZXBvcnREZWZpbml0aW9uLFxuICB0eXBlIFJlcG9ydERlZmluaXRpb25JbnNlcnQsXG4gIHR5cGUgUmVwb3J0UnVuLFxuICB0eXBlIFJlcG9ydFJ1bkluc2VydCxcbiAgdHlwZSBSZXBvcnRTaGFyZUxpbmssXG4gIHR5cGUgUmVwb3J0U2hhcmVMaW5rSW5zZXJ0LFxuICB0eXBlIFJlcG9ydFJlY2lwaWVudCxcbiAgdHlwZSBSZXBvcnRSZWNpcGllbnRJbnNlcnQsXG4gIHR5cGUgUmVwb3J0Q2FkZW5jZSxcbiAgdHlwZSBSZXBvcnRUZW1wbGF0ZSxcbiAgdHlwZSBSZXBvcnRSdW5TdGF0dXMsXG4gIHR5cGUgUmVwb3J0UGF1c2VSZWFzb24sXG4gIHR5cGUgUmVwb3J0U2NvcGUsXG4gIHR5cGUgUmVwb3J0U2NvcGVLaW5kLFxuICBSRVBPUlRfQ0FERU5DRVMsXG4gIFJFUE9SVF9URU1QTEFURVMsXG4gIFJFUE9SVF9SVU5fU1RBVFVTRVMsXG4gIFJFUE9SVF9QQVVTRV9SRUFTT05TLFxuICBSRVBPUlRfU0NPUEVfS0lORFMsXG4gIHR5cGUgRGFzaGJvYXJkLFxuICB0eXBlIERhc2hib2FyZEluc2VydCxcbiAgdHlwZSBEYXNoYm9hcmRVcGRhdGUsXG4gIHR5cGUgRGFzaGJvYXJkUGFuZWwsXG4gIHR5cGUgRGFzaGJvYXJkUGFuZWxJbnNlcnQsXG4gIG9yZ0FsZXJ0RGVzdGluYXRpb24sXG4gIG9yZ0FsZXJ0UnVsZSxcbiAgdHlwZSBPcmdBbGVydERlc3RpbmF0aW9uLFxuICB0eXBlIE9yZ0FsZXJ0RGVzdGluYXRpb25JbnNlcnQsXG4gIHR5cGUgSGVhbHRoQnJlYWtkb3duLFxuICBQVUJMSVNIRVJfVElFUlMsXG4gIHR5cGUgUHVibGlzaGVyVGllcixcbiAgdHlwZSBQdWJsaXNoUmVxdWVzdEtpbmQsXG4gIHR5cGUgUHVibGlzaFJlcXVlc3RTdGF0dXMsXG4gIE9QRU5fUFVCTElTSF9SRVFVRVNUX1NUQVRVU0VTLFxuICB0eXBlIFB1Ymxpc2hSZXF1ZXN0TGFuZSxcbiAgSU5TVEFMTF9WRVJTSU9OX1BPTElDSUVTLFxuICB0eXBlIEluc3RhbGxWZXJzaW9uUG9saWN5LFxuICB0eXBlIEluc3RhbGxTdGF0dXMsXG4gIHR5cGUgSW5zdGFsbENoYW5nZVJlcXVlc3QsXG4gIHR5cGUgQmxvY2tPbkFkdmlzb3J5LFxuICB0eXBlIE9mZmljaWFsSW5zdGFsbHMsXG4gIHR5cGUgUmV2aWV3U3RhdHVzLFxuICB0eXBlIFJldmlld0hvbGRSZWFzb24sXG4gIFJFVklFV19SRVBPUlRfQ0FURUdPUklFUyxcbiAgdHlwZSBSZXZpZXdSZXBvcnRDYXRlZ29yeSxcbiAgdHlwZSBBZHZpc29yeVNldmVyaXR5LFxuICB0eXBlIEFkdmlzb3J5U3RhdGUsXG4gIHR5cGUgQWR2aXNvcnlTb3VyY2UsXG4gIHR5cGUgU3VibWlzc2lvbkNhdGFsb2csXG4gIHR5cGUgU3VibWlzc2lvblN0YXR1cyxcbiAgcHVibGlzaGVyLFxuICBwbHVnaW5MaXN0aW5nLFxuICB0eXBlIExpc3RpbmdWZXJzaW9uU3BlY1NuYXBzaG90LFxuICBwbHVnaW5MaXN0aW5nVmVyc2lvbixcbiAgcGx1Z2luQWR2aXNvcnksXG4gIGVjb3N5c3RlbUF1dG9BcHByb3ZhbFJ1bGUsXG4gIHBsdWdpblB1Ymxpc2hSZXF1ZXN0LFxuICBlY29zeXN0ZW1SZXNlcnZlZE5hbWUsXG4gIGVjb3N5c3RlbVNldHRpbmcsXG4gIHBsdWdpblJldmlldyxcbiAgcGx1Z2luUmV2aWV3UmVwbHksXG4gIHBsdWdpblJldmlld1JlcG9ydCxcbiAgcGx1Z2luUmV2aWV3Vm90ZSxcbiAgcGx1Z2luUmV2aWV3SGlzdG9yeSxcbiAgcGx1Z2luU3RhdHMsXG4gIHBsdWdpblN1Ym1pc3Npb24sXG4gIGVjb3N5c3RlbVNlYXJjaE1pc3MsXG4gIGVjb3N5c3RlbU5vdGlmaWNhdGlvblF1ZXVlLFxuICBwaXBlbGluZVN0ZXBNYW5pZmVzdCxcbiAgcGx1Z2luSW5zdGFsbCxcbiAgcGx1Z2luSW5zdGFsbFBvbGljeSxcbiAgcGx1Z2luQWR2aXNvcnlEZWxpdmVyeSxcbiAgcGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25QcmVmLFxuICBwdWJsaWNMaXN0aW5ncyxcbiAgcHVibGljTGlzdGVkVmVyc2lvbnMsXG4gIHB1YmxpY0Fkdmlzb3JpZXMsXG4gIHB1YmxpY1Jldmlld3MsXG4gIE9GRklDSUFMX1BVQkxJU0hFUl9IQU5ETEUsXG4gIENPTU1VTklUWV9QVUJMSVNIRVJfSEFORExFLFxuICB0eXBlIFB1Ymxpc2hlcixcbiAgdHlwZSBQdWJsaXNoZXJJbnNlcnQsXG4gIHR5cGUgUGx1Z2luTGlzdGluZyxcbiAgdHlwZSBQbHVnaW5MaXN0aW5nSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkxpc3RpbmdWZXJzaW9uLFxuICB0eXBlIFBsdWdpbkxpc3RpbmdWZXJzaW9uSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkFkdmlzb3J5LFxuICB0eXBlIFBsdWdpbkFkdmlzb3J5SW5zZXJ0LFxuICB0eXBlIEVjb3N5c3RlbUF1dG9BcHByb3ZhbFJ1bGUsXG4gIHR5cGUgRWNvc3lzdGVtQXV0b0FwcHJvdmFsUnVsZUluc2VydCxcbiAgdHlwZSBQbHVnaW5QdWJsaXNoUmVxdWVzdCxcbiAgdHlwZSBQbHVnaW5QdWJsaXNoUmVxdWVzdEluc2VydCxcbiAgdHlwZSBFY29zeXN0ZW1SZXNlcnZlZE5hbWUsXG4gIHR5cGUgUGx1Z2luUmV2aWV3LFxuICB0eXBlIFBsdWdpblJldmlld0luc2VydCxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBseSxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBseUluc2VydCxcbiAgdHlwZSBQbHVnaW5SZXZpZXdSZXBvcnQsXG4gIHR5cGUgUGx1Z2luUmV2aWV3UmVwb3J0SW5zZXJ0LFxuICB0eXBlIFBsdWdpblJldmlld0hpc3RvcnlJbnNlcnQsXG4gIHR5cGUgUGx1Z2luU3RhdHMsXG4gIHR5cGUgUGx1Z2luU3RhdHNJbnNlcnQsXG4gIHR5cGUgUGx1Z2luU3VibWlzc2lvbixcbiAgdHlwZSBQbHVnaW5TdWJtaXNzaW9uSW5zZXJ0LFxuICB0eXBlIFBsdWdpbkluc3RhbGwsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbEluc2VydCxcbiAgdHlwZSBQbHVnaW5JbnN0YWxsUG9saWN5LFxuICB0eXBlIFBsdWdpbkluc3RhbGxQb2xpY3lJbnNlcnQsXG4gIHR5cGUgUGx1Z2luU2VjdXJpdHlOb3RpZmljYXRpb25QcmVmLFxuICB0eXBlIFB1YmxpY1Jldmlldyxcbn0gZnJvbSAnLi9kcml6emxlLXNjaGVtYS5qcyc7XG5leHBvcnQge1xuICBnZXRTc2xDb25maWcsXG4gIGdldENvbm5lY3Rpb24sXG4gIGNsb3NlQ29ubmVjdGlvbixcbiAgdGVzdENvbm5lY3Rpb24sXG4gIHR5cGUgQ29ubmVjdGlvbk9wdGlvbnMsXG4gIENvbm5lY3Rpb24sXG4gIGRiLFxufSBmcm9tICcuL3Bvc3RncmVzLWNvbm5lY3Rpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9yZXRyeS1zdHJhdGVneS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3RlbmFuY3kuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtcmVhZGVyLmpzJztcbi8vIFRoZSByZWFkLXJlcGxpY2EgcG9vbC4gRXhwb3J0ZWQgYWxvbmdzaWRlIHB1YmxpYy1yZWFkZXIgYmVjYXVzZSB0aGV5IGFyZSB0aGVcbi8vIHNhbWUgc2hhcGU6IGEgc2Vjb25kLCBzbWFsbGVyIHBvb2wgd2l0aCBhIG5hcnJvd2VyIHJlbWl0IHRoYW4gdGhlIHByaW1hcnkuXG5leHBvcnQgKiBmcm9tICcuL3JlYWQtY29ubmVjdGlvbi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JlYWQtbGFnLmpzJztcbmV4cG9ydCB7XG4gIGlzVW5pcXVlVmlvbGF0aW9uLFxuICByZXN1bHRSb3dzLFxuICBleGVjdXRlUm93cyxcbiAgYW55VGV4dCxcbiAgdHlwZSBTcWxFeGVjdXRvcixcbn0gZnJvbSAnLi9wZy1yZXN1bHQuanMnO1xuIl19
@@ -1,4 +1,4 @@
1
- import type { SQL } from 'drizzle-orm';
1
+ import { type SQL } from 'drizzle-orm';
2
2
  /** PostgreSQL SQLSTATE for `unique_violation`. */
3
3
  export declare const PG_UNIQUE_VIOLATION = "23505";
4
4
  /**
@@ -17,3 +17,13 @@ export interface SqlExecutor {
17
17
  }
18
18
  /** Run a raw SQL query and return its rows typed as `T`. */
19
19
  export declare function executeRows<T>(executor: SqlExecutor, query: SQL): Promise<T[]>;
20
+ /**
21
+ * `ANY(<one text[] parameter>)` for a raw `sql` template.
22
+ *
23
+ * Never write `= ANY(${values})`: Drizzle expands a JS array into a parameter
24
+ * LIST, so that renders `ANY(($1, $2))`, a row value Postgres rejects
25
+ * ("op ANY/ALL (array) requires array on right side", or "malformed array
26
+ * literal" for one element). This binds the whole array as a single parameter
27
+ * that node-postgres sends as a real array. An empty list matches nothing.
28
+ */
29
+ export declare function anyText(values: Iterable<string>): SQL;
@@ -1,5 +1,6 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
+ import { sql } from 'drizzle-orm';
3
4
  /** PostgreSQL SQLSTATE for `unique_violation`. */
4
5
  export const PG_UNIQUE_VIOLATION = '23505';
5
6
  /**
@@ -29,4 +30,16 @@ export function resultRows(res) {
29
30
  export async function executeRows(executor, query) {
30
31
  return resultRows(await executor.execute(query));
31
32
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGctcmVzdWx0LmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcGctcmVzdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFJdEMsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztBQUUzQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsR0FBWTtJQUM1QyxJQUFJLEdBQUcsR0FBWSxHQUFHLENBQUM7SUFDdkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDekUsSUFBSyxHQUEwQixDQUFDLElBQUksS0FBSyxtQkFBbUI7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMxRSxHQUFHLEdBQUksR0FBMkIsQ0FBQyxLQUFLLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUksR0FBWTtJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFVLENBQUM7SUFDMUMsTUFBTSxJQUFJLEdBQUksR0FBNkMsRUFBRSxJQUFJLENBQUM7SUFDbEUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBT0QsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsV0FBVyxDQUFJLFFBQXFCLEVBQUUsS0FBVTtJQUNwRSxPQUFPLFVBQVUsQ0FBSSxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuXG4vKiogUG9zdGdyZVNRTCBTUUxTVEFURSBmb3IgYHVuaXF1ZV92aW9sYXRpb25gLiAqL1xuZXhwb3J0IGNvbnN0IFBHX1VOSVFVRV9WSU9MQVRJT04gPSAnMjM1MDUnO1xuXG4vKipcbiAqIFRydWUgd2hlbiBgZXJyYCBpcyBhIFBvc3RncmVTUUwgdW5pcXVlLWNvbnN0cmFpbnQgdmlvbGF0aW9uLiBEcml6emxlIG1heVxuICogd3JhcCB0aGUgZHJpdmVyIGVycm9yLCBzbyB0aGUgYGNhdXNlYCBjaGFpbiBpcyBjaGVja2VkIHRvby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5pcXVlVmlvbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBsZXQgY3VyOiB1bmtub3duID0gZXJyO1xuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgNSAmJiBjdXIgJiYgdHlwZW9mIGN1ciA9PT0gJ29iamVjdCc7IGRlcHRoKyspIHtcbiAgICBpZiAoKGN1ciBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09IFBHX1VOSVFVRV9WSU9MQVRJT04pIHJldHVybiB0cnVlO1xuICAgIGN1ciA9IChjdXIgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJvd3Mgb2YgYSByYXcgYGV4ZWN1dGUoc3FsXFxg4oCmXFxgKWAgcmVzdWx0LiBub2RlLXBvc3RncmVzIHJldHVybnNcbiAqIGB7IHJvd3MgfWA7IHNvbWUgZHJpdmVycyAoYW5kIHRlc3QgZmFrZXMpIHJldHVybiB0aGUgYmFyZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VsdFJvd3M8VD4ocmVzOiB1bmtub3duKTogVFtdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuIHJlcyBhcyBUW107XG4gIGNvbnN0IHJvd3MgPSAocmVzIGFzIHsgcm93cz86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpPy5yb3dzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IChyb3dzIGFzIFRbXSkgOiBbXTtcbn1cblxuLyoqIEFueXRoaW5nIHdpdGggRHJpenpsZSdzIHJhdyBgZXhlY3V0ZWAg4oCUIHRoZSBkYiBoYW5kbGUgb3IgYSB0cmFuc2FjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FsRXhlY3V0b3Ige1xuICBleGVjdXRlKHF1ZXJ5OiBTUUwpOiBQcm9taXNlTGlrZTx1bmtub3duPjtcbn1cblxuLyoqIFJ1biBhIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybiBpdHMgcm93cyB0eXBlZCBhcyBgVGAuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJvd3M8VD4oZXhlY3V0b3I6IFNxbEV4ZWN1dG9yLCBxdWVyeTogU1FMKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIHJlc3VsdFJvd3M8VD4oYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSkpO1xufVxuIl19
33
+ /**
34
+ * `ANY(<one text[] parameter>)` for a raw `sql` template.
35
+ *
36
+ * Never write `= ANY(${values})`: Drizzle expands a JS array into a parameter
37
+ * LIST, so that renders `ANY(($1, $2))`, a row value Postgres rejects
38
+ * ("op ANY/ALL (array) requires array on right side", or "malformed array
39
+ * literal" for one element). This binds the whole array as a single parameter
40
+ * that node-postgres sends as a real array. An empty list matches nothing.
41
+ */
42
+ export function anyText(values) {
43
+ return sql `ANY(${sql.param([...values])}::text[])`;
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGctcmVzdWx0LmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcGctcmVzdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLEdBQUcsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQUU1QyxrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBRTNDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFZO0lBQzVDLElBQUksR0FBRyxHQUFZLEdBQUcsQ0FBQztJQUN2QixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN6RSxJQUFLLEdBQTBCLENBQUMsSUFBSSxLQUFLLG1CQUFtQjtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzFFLEdBQUcsR0FBSSxHQUEyQixDQUFDLEtBQUssQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUFZO0lBQ3hDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQVUsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBSSxHQUE2QyxFQUFFLElBQUksQ0FBQztJQUNsRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFFLElBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ2xELENBQUM7QUFPRCw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUksUUFBcUIsRUFBRSxLQUFVO0lBQ3BFLE9BQU8sVUFBVSxDQUFJLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBd0I7SUFDOUMsT0FBTyxHQUFHLENBQUEsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBzcWwsIHR5cGUgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuXG4vKiogUG9zdGdyZVNRTCBTUUxTVEFURSBmb3IgYHVuaXF1ZV92aW9sYXRpb25gLiAqL1xuZXhwb3J0IGNvbnN0IFBHX1VOSVFVRV9WSU9MQVRJT04gPSAnMjM1MDUnO1xuXG4vKipcbiAqIFRydWUgd2hlbiBgZXJyYCBpcyBhIFBvc3RncmVTUUwgdW5pcXVlLWNvbnN0cmFpbnQgdmlvbGF0aW9uLiBEcml6emxlIG1heVxuICogd3JhcCB0aGUgZHJpdmVyIGVycm9yLCBzbyB0aGUgYGNhdXNlYCBjaGFpbiBpcyBjaGVja2VkIHRvby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5pcXVlVmlvbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBsZXQgY3VyOiB1bmtub3duID0gZXJyO1xuICBmb3IgKGxldCBkZXB0aCA9IDA7IGRlcHRoIDwgNSAmJiBjdXIgJiYgdHlwZW9mIGN1ciA9PT0gJ29iamVjdCc7IGRlcHRoKyspIHtcbiAgICBpZiAoKGN1ciBhcyB7IGNvZGU/OiB1bmtub3duIH0pLmNvZGUgPT09IFBHX1VOSVFVRV9WSU9MQVRJT04pIHJldHVybiB0cnVlO1xuICAgIGN1ciA9IChjdXIgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJvd3Mgb2YgYSByYXcgYGV4ZWN1dGUoc3FsXFxg4oCmXFxgKWAgcmVzdWx0LiBub2RlLXBvc3RncmVzIHJldHVybnNcbiAqIGB7IHJvd3MgfWA7IHNvbWUgZHJpdmVycyAoYW5kIHRlc3QgZmFrZXMpIHJldHVybiB0aGUgYmFyZSBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VsdFJvd3M8VD4ocmVzOiB1bmtub3duKTogVFtdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkgcmV0dXJuIHJlcyBhcyBUW107XG4gIGNvbnN0IHJvd3MgPSAocmVzIGFzIHsgcm93cz86IHVua25vd24gfSB8IG51bGwgfCB1bmRlZmluZWQpPy5yb3dzO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShyb3dzKSA/IChyb3dzIGFzIFRbXSkgOiBbXTtcbn1cblxuLyoqIEFueXRoaW5nIHdpdGggRHJpenpsZSdzIHJhdyBgZXhlY3V0ZWAg4oCUIHRoZSBkYiBoYW5kbGUgb3IgYSB0cmFuc2FjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3FsRXhlY3V0b3Ige1xuICBleGVjdXRlKHF1ZXJ5OiBTUUwpOiBQcm9taXNlTGlrZTx1bmtub3duPjtcbn1cblxuLyoqIFJ1biBhIHJhdyBTUUwgcXVlcnkgYW5kIHJldHVybiBpdHMgcm93cyB0eXBlZCBhcyBgVGAuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJvd3M8VD4oZXhlY3V0b3I6IFNxbEV4ZWN1dG9yLCBxdWVyeTogU1FMKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIHJlc3VsdFJvd3M8VD4oYXdhaXQgZXhlY3V0b3IuZXhlY3V0ZShxdWVyeSkpO1xufVxuXG4vKipcbiAqIGBBTlkoPG9uZSB0ZXh0W10gcGFyYW1ldGVyPilgIGZvciBhIHJhdyBgc3FsYCB0ZW1wbGF0ZS5cbiAqXG4gKiBOZXZlciB3cml0ZSBgPSBBTlkoJHt2YWx1ZXN9KWA6IERyaXp6bGUgZXhwYW5kcyBhIEpTIGFycmF5IGludG8gYSBwYXJhbWV0ZXJcbiAqIExJU1QsIHNvIHRoYXQgcmVuZGVycyBgQU5ZKCgkMSwgJDIpKWAsIGEgcm93IHZhbHVlIFBvc3RncmVzIHJlamVjdHNcbiAqIChcIm9wIEFOWS9BTEwgKGFycmF5KSByZXF1aXJlcyBhcnJheSBvbiByaWdodCBzaWRlXCIsIG9yIFwibWFsZm9ybWVkIGFycmF5XG4gKiBsaXRlcmFsXCIgZm9yIG9uZSBlbGVtZW50KS4gVGhpcyBiaW5kcyB0aGUgd2hvbGUgYXJyYXkgYXMgYSBzaW5nbGUgcGFyYW1ldGVyXG4gKiB0aGF0IG5vZGUtcG9zdGdyZXMgc2VuZHMgYXMgYSByZWFsIGFycmF5LiBBbiBlbXB0eSBsaXN0IG1hdGNoZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFueVRleHQodmFsdWVzOiBJdGVyYWJsZTxzdHJpbmc+KTogU1FMIHtcbiAgcmV0dXJuIHNxbGBBTlkoJHtzcWwucGFyYW0oWy4uLnZhbHVlc10pfTo6dGV4dFtdKWA7XG59XG4iXX0=
@@ -11,6 +11,7 @@
11
11
  "advisoryRangeProblem": "function",
12
12
  "allSections": "function",
13
13
  "anonymizeReviewsByAuthor": "function",
14
+ "anyText": "function",
14
15
  "applyDeployOutcome": "function",
15
16
  "applyPolicyUpdate": "function",
16
17
  "assignCase": "function",
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "typescript": "npm:@typescript/typescript6@^6.0.2"
25
25
  },
26
26
  "dependencies": {
27
- "@pipeline-builder/api-core": "5.2.7",
27
+ "@pipeline-builder/api-core": "5.2.8",
28
28
  "drizzle-orm": "0.45.4",
29
29
  "pg": "8.23.1"
30
30
  },
@@ -86,7 +86,7 @@
86
86
  "registry": "https://registry.npmjs.org/",
87
87
  "provenance": true
88
88
  },
89
- "version": "4.3.7",
89
+ "version": "4.3.9",
90
90
  "bugs": {
91
91
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
92
92
  },