@ultipa-graph/ultipa-driver 6.2.4 → 6.2.5

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.
package/dist/client.d.ts CHANGED
@@ -183,7 +183,7 @@ export declare class GqldbClient {
183
183
  insertEdgesBatchAuto(graphName: string, edges: EdgeData[], config?: InsertEdgesConfig): Promise<InsertEdgesResult>;
184
184
  /**
185
185
  * Delete nodes by id list. Emits
186
- * `MATCH (n) WHERE id(n) IN [...] DETACH DELETE n RETURN n`.
186
+ * `MATCH (n) WHERE n._id IN [...] DETACH DELETE n RETURN n`.
187
187
  *
188
188
  * Empty/null `nodeIds` short-circuits without contacting the server.
189
189
  *
@@ -202,9 +202,11 @@ export declare class GqldbClient {
202
202
  */
203
203
  deleteNodesByCondition(labels: string[] | undefined, where: string | undefined, limit?: number, config?: DeleteConfig): Promise<Response>;
204
204
  /**
205
- * Delete edges by id list. Emits 5-column GQL with `id(e)` so the
206
- * same emit works on graphs with or without EDGE_ID enabled, then
205
+ * Delete edges by id list. Emits 5-column GQL keyed on `e._id`, then
207
206
  * reshapes the response into a single "e" column holding GqldbEdge.
207
+ * Requires EDGE_ID ENABLED: on a disabled graph the server returns
208
+ * `[5017]` guiding the caller to `ALTER GRAPH <g> SET EDGE_ID ENABLED`
209
+ * (deletion does NOT fall back to the discouraged `internal_id(e)`).
208
210
  */
209
211
  deleteEdgesByIds(edgeIds: string[], config?: DeleteConfig): Promise<Response>;
210
212
  /**
@@ -484,7 +486,7 @@ export declare class GqldbClient {
484
486
  *
485
487
  * 2. `insertEdges(edges, config?)` — convenience GQL emitter
486
488
  * (added after 6.0.0). Per edge synthesizes
487
- * `MATCH (src WHERE id(src) = 'from'), (dst WHERE id(dst) = 'to') INSERT (src)-[e0:Label {...}]->(dst) RETURN e0`.
489
+ * `MATCH (src WHERE src._id = 'from'), (dst WHERE dst._id = 'to') INSERT (src)-[e0:Label {...}]->(dst) RETURN e0`.
488
490
  * Returns a merged `Response` with columns `e0, e1, ...`.
489
491
  */
490
492
  insertEdges(graphName: string, edges: EdgeData[], config?: InsertEdgesConfig): Promise<InsertEdgesResult>;
package/dist/client.js CHANGED
@@ -406,7 +406,7 @@ class GqldbClient {
406
406
  }
407
407
  /**
408
408
  * Delete nodes by id list. Emits
409
- * `MATCH (n) WHERE id(n) IN [...] DETACH DELETE n RETURN n`.
409
+ * `MATCH (n) WHERE n._id IN [...] DETACH DELETE n RETURN n`.
410
410
  *
411
411
  * Empty/null `nodeIds` short-circuits without contacting the server.
412
412
  *
@@ -420,7 +420,7 @@ class GqldbClient {
420
420
  if (!nodeIds || nodeIds.length === 0) {
421
421
  return new response_1.Response([], [], 0, false, [], 0);
422
422
  }
423
- let gql = `MATCH (n) WHERE id(n) IN [${formatStringList(nodeIds)}] DETACH DELETE n`;
423
+ let gql = `MATCH (n) WHERE n._id IN [${formatStringList(nodeIds)}] DETACH DELETE n`;
424
424
  if (cfg.returnDeleted !== false)
425
425
  gql += ' RETURN n';
426
426
  return this.gql(gql, cfg);
@@ -454,18 +454,20 @@ class GqldbClient {
454
454
  return this.gql(gql, cfg);
455
455
  }
456
456
  /**
457
- * Delete edges by id list. Emits 5-column GQL with `id(e)` so the
458
- * same emit works on graphs with or without EDGE_ID enabled, then
457
+ * Delete edges by id list. Emits 5-column GQL keyed on `e._id`, then
459
458
  * reshapes the response into a single "e" column holding GqldbEdge.
459
+ * Requires EDGE_ID ENABLED: on a disabled graph the server returns
460
+ * `[5017]` guiding the caller to `ALTER GRAPH <g> SET EDGE_ID ENABLED`
461
+ * (deletion does NOT fall back to the discouraged `internal_id(e)`).
460
462
  */
461
463
  async deleteEdgesByIds(edgeIds, config) {
462
464
  const cfg = { returnDeleted: true, allowDeleteAll: false, ...config };
463
465
  if (!edgeIds || edgeIds.length === 0) {
464
466
  return new response_1.Response([], [], 0, false, [], 0);
465
467
  }
466
- let gql = `MATCH ()-[e]->() WHERE id(e) IN [${formatStringList(edgeIds)}] DELETE e`;
468
+ let gql = `MATCH ()-[e]->() WHERE e._id IN [${formatStringList(edgeIds)}] DELETE e`;
467
469
  if (cfg.returnDeleted !== false) {
468
- gql += ' RETURN id(e), e._from, e._to, labels(e)[0], properties(e)';
470
+ gql += ' RETURN e._id, e._from, e._to, labels(e)[0], properties(e)';
469
471
  }
470
472
  const raw = await this.gql(gql, cfg);
471
473
  return cfg.returnDeleted === false ? raw : reshapeEdgeDelete(raw);
@@ -495,7 +497,7 @@ class GqldbClient {
495
497
  gql += ` LIMIT ${limit}`;
496
498
  gql += ' DELETE e';
497
499
  if (cfg.returnDeleted !== false) {
498
- gql += ' RETURN id(e), e._from, e._to, labels(e)[0], properties(e)';
500
+ gql += ' RETURN e._id, e._from, e._to, labels(e)[0], properties(e)';
499
501
  }
500
502
  const raw = await this.gql(gql, cfg);
501
503
  return cfg.returnDeleted === false ? raw : reshapeEdgeDelete(raw);
@@ -1108,8 +1110,8 @@ class GqldbClient {
1108
1110
  }
1109
1111
  const propStr = (0, types_1.buildPropertiesValueString)(props);
1110
1112
  const edgePart = propStr ? `[${varName}${labelPart} ${propStr}]` : `[${varName}${labelPart}]`;
1111
- const gqlStr = `MATCH (src WHERE id(src) = '${edge.fromNodeId}'), `
1112
- + `(dst WHERE id(dst) = '${edge.toNodeId}') `
1113
+ const gqlStr = `MATCH (src WHERE src._id = '${edge.fromNodeId}'), `
1114
+ + `(dst WHERE dst._id = '${edge.toNodeId}') `
1113
1115
  + `${insertKeyword} (src)-${edgePart}->(dst) RETURN ${varName}`;
1114
1116
  const resp = await this.gql(gqlStr, config);
1115
1117
  totalAffected += resp.rowsAffected;
@@ -1588,4 +1590,4 @@ function reshapeEdgeDelete(raw) {
1588
1590
  }
1589
1591
  return new response_1.Response(['e'], newRows, newRows.length, raw.hasMore, raw.warnings, raw.rowsAffected, raw.currentGraph, raw.timeCostNs, raw.diskCostNs, raw.computeCostNs);
1590
1592
  }
1591
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBVW9CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBOENpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBK0QxQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUE0QjtJQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxrQkFBVSxDQUFDLFNBQVM7WUFDdkIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixLQUFLLGtCQUFVLENBQUMsTUFBTTtZQUNwQixPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQWEsV0FBVztJQUNkLE1BQU0sQ0FBYztJQUNwQixPQUFPLENBQWlCO0lBQ3hCLFFBQVEsQ0FBaUI7SUFDekIsU0FBUyxDQUFxQjtJQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLHdDQUF3QztJQUNoQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUVqQyxxRUFBcUU7SUFDN0QsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUN0QixlQUFlLENBQTJCO0lBQzFDLGtCQUFrQixDQUF1QjtJQUN6QyxHQUFHLENBQWtCO0lBRTdCLG9CQUFvQjtJQUNaLGNBQWMsQ0FBaUI7SUFDL0IsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBZ0I7SUFDN0IsWUFBWSxD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QUFDLG9CQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLElBQUksbUJBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQzVDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxFQUNoRCxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1haW4gY2xpZW50IGZvciBHUUxEQiBOb2RlLmpzIGRyaXZlci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBncnBjIGZyb20gJ0BncnBjL2dycGMtanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEVtcHR5UXVlcnlFcnJvciwgTG9naW5GYWlsZWRFcnJvciwgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIFJlc3BvbnNlLFxuICBSb3csXG4gIEluc2VydE5vZGVzUmVzdWx0LFxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgRWRnZUlkTW9kZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxuICBUcmFuc2FjdGlvblJvdyxcbiAgREJUeXBlLFxuICBJbnNlcnRUeXBlLFxuICBQcm9wZXJ0eVR5cGUsXG4gIExhYmVsSW5mbyxcbiAgTm9kZVR5cGVJbmZvLFxuICBFZGdlVHlwZUluZm8sXG4gIExhYmVsRGVmLFxuICBDb252UHJvcGVydHlEZWYsXG4gIEluZGV4UHJvcGVydHksXG4gIEluZGV4SW5mbyxcbiAgRnVsbHRleHRJbmZvLFxuICBUYXNrSW5mbyxcbiAgUHJvY2Vzc0luZm8sXG4gIEdyYXBoU3RhdHMsXG4gIEFsZ29JbmZvLFxuICBBaVN0YWdlLFxuICBBaVJlYWRSZXN1bHQsXG4gIHBhcnNlUHJvcGVydHlTdHJpbmcsXG4gIGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcsXG4gIGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcsXG4gIHVzZUdyYXBoUHJlZml4LFxuICBkYlR5cGVUb0tleXdvcmQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmljZUNsaWVudHMsIHByb21pc2lmeUNhbGwsIHByb21pc2lmeUNhbGxXaXRoRGVhZGxpbmUgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNlcnZpY2VDb250ZXh0LFxuICBTZXJ2aWNlQ2xpZW50cyxcbiAgU2Vzc2lvblNlcnZpY2UsXG4gIFF1ZXJ5U2VydmljZSxcbiAgR3JhcGhTZXJ2aWNlLFxuICBUcmFuc2FjdGlvblNlcnZpY2UsXG4gIERhdGFTZXJ2aWNlLFxuICBIZWFsdGhTZXJ2aWNlLFxuICBBZG1pblNlcnZpY2UsXG4gIEJ1bGtJbXBvcnRTZXJ2aWNlLFxufSBmcm9tICcuL3NlcnZpY2VzL2luZGV4JztcblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGEgcXVlcnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDb25maWcge1xuICBncmFwaE5hbWU/OiBzdHJpbmc7XG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB0cmFuc2FjdGlvbklkPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICByZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBNYXggcGF0aHMgdG8gcmV0dXJuIGZyb20gcGF0aCBxdWVyaWVzICgwID0gdW5saW1pdGVkKSAqL1xuICBtYXhQYXRoUmVzdWx0cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnROb2RlcyAvIGluc2VydEVkZ2VzIGNvbnZlbmllbmNlIG1ldGhvZHMuXG4gKiBFeHRlbmRzIFF1ZXJ5Q29uZmlnIHdpdGggaW5zZXJ0LXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Q29uZmlnIGV4dGVuZHMgUXVlcnlDb25maWcge1xuICAvKiogSW5zZXJ0IG1vZGUuIERlZmF1bHRzIHRvIEluc2VydFR5cGUuTm9ybWFsIHdoZW4gb21pdHRlZC4gKi9cbiAgaW5zZXJ0VHlwZT86IEluc2VydFR5cGU7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIG5ldyBHUUwtZW1pdHRlciBkZWxldGUgQVBJXG4gKiAoZGVsZXRlTm9kZXNCeUlkcyAvIGRlbGV0ZU5vZGVzQnlDb25kaXRpb24gL1xuICogIGRlbGV0ZUVkZ2VzQnlJZHMgLyBkZWxldGVFZGdlc0J5Q29uZGl0aW9uKS5cbiAqXG4gKiBFeHRlbmRzIFF1ZXJ5Q29uZmlnIHNvIHBlci1jYWxsIGBncmFwaE5hbWVgIHdvcmtzIHRoZSBzYW1lIGFzXG4gKiBgSW5zZXJ0Q29uZmlnYC4gVHdvIGRlbGV0ZS1zcGVjaWZpYyBrbm9iczpcbiAqICAgLSBgcmV0dXJuRGVsZXRlZGAgKGRlZmF1bHQgdHJ1ZSkg4oCUIGVtaXQgYFJFVFVSTiAuLi5gIHNvIHRoZVxuICogICAgIHJlc3BvbnNlIGNhcnJpZXMgdGhlIGZ1bGwgZGVsZXRlZCBub2RlL2VkZ2UgZGF0YS4gU2V0IHRvIGZhbHNlXG4gKiAgICAgb24gbGFyZ2UgYnVsayBkZWxldGVzIHRvIHNhdmUgYmFuZHdpZHRoOyBgcm93c0FmZmVjdGVkYCBzdGlsbFxuICogICAgIGNhcnJpZXMgdGhlIGNvdW50LlxuICogICAtIGBhbGxvd0RlbGV0ZUFsbGAgKGRlZmF1bHQgZmFsc2UpIOKAlCBzYWZldHkgbGF0Y2guIFdpdGggZW1wdHlcbiAqICAgICBsYWJlbHMvaWRzIEFORCBlbXB0eSB3aGVyZSwgdGhlIFNESyB3b3VsZCBvdGhlcndpc2UgZW1pdCBhXG4gKiAgICAgZ3JhcGgtd2lkZSBkZWxldGU7IHRoaXMgZmxhZyBtdXN0IGJlIGV4cGxpY2l0bHkgdHJ1ZSB0byBvcHQgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQ29uZmlnIGV4dGVuZHMgUXVlcnlDb25maWcge1xuICByZXR1cm5EZWxldGVkPzogYm9vbGVhbjtcbiAgYWxsb3dEZWxldGVBbGw/OiBib29sZWFuO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IG5vZGVzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydE5vZGVzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgZWRnZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0RWRnZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWFsdGggd2F0Y2hlciBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZyBoZWFsdGggdXBkYXRlcy5cbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1hcCBhbiBgSW5zZXJ0VHlwZWAgdmFsdWUgdG8gdGhlIEdRTCBrZXl3b3JkKHMpIHNlbGVjdGluZyB0aGVcbiAqIG1hdGNoaW5nIHNlcnZlci1zaWRlIHNlbWFudGljcy5cbiAqXG4gKiAgIC0gYEluc2VydFR5cGUuTm9ybWFsYCAgICAtPiBgXCJJTlNFUlRcImAgKGVycm9yIG9uIGR1cGxpY2F0ZSBgX2lkYClcbiAqICAgLSBgSW5zZXJ0VHlwZS5PdmVyd3JpdGVgIC0+IGBcIklOU0VSVCBPVkVSV1JJVEVcImAgKHJlcGxhY2Ugb24gZHVwbGljYXRlKVxuICogICAtIGBJbnNlcnRUeXBlLlVwc2VydGAgICAgLT4gYFwiVVBTRVJUXCJgIChtZXJnZSBvbiBkdXBsaWNhdGUpXG4gKlxuICogYE92ZXJ3cml0ZWAgYW5kIGBVcHNlcnRgIGFyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIGV4aXN0aW5nIHJvd3M7XG4gKiB0aGV5IGFyZSBOT1QgaW50ZXJjaGFuZ2VhYmxlLiBTZWUge0BsaW5rIEluc2VydFR5cGV9IGRvY3MuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEtleXdvcmRGb3JUeXBlKHR5cGU6IEluc2VydFR5cGUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEluc2VydFR5cGUuT3ZlcndyaXRlOlxuICAgICAgcmV0dXJuICdJTlNFUlQgT1ZFUldSSVRFJztcbiAgICBjYXNlIEluc2VydFR5cGUuVXBzZXJ0OlxuICAgICAgcmV0dXJuICdVUFNFUlQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ0lOU0VSVCc7XG4gIH1cbn1cblxuLyoqIE1haW4gY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIEdRTERCICovXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogR3FsZGJDb25maWc7XG4gIHByaXZhdGUgY2xpZW50czogU2VydmljZUNsaWVudHM7XG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xuICBwcml2YXRlIHR4TWFuYWdlcjogVHJhbnNhY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIC8vIFN0b3JlZCBjcmVkZW50aWFscyBmb3IgYXV0by1yZWNvbm5lY3RcbiAgcHJpdmF0ZSBzdG9yZWRVc2VybmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHN0b3JlZEdyYXBoOiBzdHJpbmcgPSAnJztcblxuICAvLyBDYWNoZWQgZ1JQQyBwbHVtYmluZyBzbyB3ZSBjYW4gcmVidWlsZCB0aGUgY2hhbm5lbCBvbiBVTkFWQUlMQUJMRS5cbiAgcHJpdmF0ZSBncnBjSG9zdDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgZ3JwY0NyZWRlbnRpYWxzITogZ3JwYy5DaGFubmVsQ3JlZGVudGlhbHM7XG4gIHByaXZhdGUgZ3JwY0NoYW5uZWxPcHRpb25zITogZ3JwYy5DaGFubmVsT3B0aW9ucztcbiAgcHJpdmF0ZSBjdHghOiBTZXJ2aWNlQ29udGV4dDtcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICBpZiAodGhpcy5jbGllbnRTZXNzaW9uSWQpIHtcbiAgICAgIG1ldGFkYXRhLmFkZCgneC11bHRpcGEtc2Vzc2lvbi1pZCcsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWJsZSBwZXItY2xpZW50IGxvZ2ljYWwgc2Vzc2lvbiBpZCBzdXJmYWNlZCB1bmRlciB0aGVcbiAgICogdHJhbnNhY3Rpb24tYnJhbmNoIG1vZGVsLiBTZWUgVFJBTlNBQ1RJT05TX0RSSVZFUl9HVUlERS5tZCDCpzIuMOKAkzIuMS5cbiAgICogRmFsbHMgYmFjayB0byBhIFVVSUQgdjQgaGV4IGdlbmVyYXRlZCBhdCBjb25zdHJ1Y3Rpb24gd2hlblxuICAgKiBgY29uZmlnLnNlc3Npb25JZGAgaXMgbm90IHNldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnRTZXNzaW9uSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG4gICAgLy8gQm9vdHN0cmFwIHN0YWJsZSBwZXItY2xpZW50IHNlc3Npb24gaWQgKHVzZWQgYXMgYHgtdWx0aXBhLXNlc3Npb24taWRgXG4gICAgLy8gbWV0YWRhdGEgd2hlbiDCpzIuMSBvcHQtaW4gaXMgZW5hYmxlZCwgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IFRyYW5zYWN0aW9uKS5cbiAgICBjb25zdCBjZmdTaWQgPSAoY29uZmlnIGFzIGFueSkuc2Vzc2lvbklkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsaWVudFNlc3Npb25JZCA9IGNmZ1NpZCAmJiBjZmdTaWQubGVuZ3RoID4gMFxuICAgICAgPyBjZmdTaWRcbiAgICAgIDogcmVxdWlyZSgnY3J5cHRvJykucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIENyZWF0ZSBnUlBDIGNyZWRlbnRpYWxzXG4gICAgbGV0IGNyZWRlbnRpYWxzOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uczogZ3JwYy5DaGFubmVsT3B0aW9ucyA9IHtcbiAgICAgICdncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA2NCAqIDEwMjQgKiAxMDI0LFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVfbXMnOiAzMDAwMCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lb3V0X21zJzogMTAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfcGVybWl0X3dpdGhvdXRfY2FsbHMnOiAxLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgc2VydmljZSBjbGllbnRzIGZvciB0aGUgZmlyc3QgaG9zdFxuICAgIGNvbnN0IGhvc3QgPSBjb25maWcuaG9zdHNbMF07XG4gICAgdGhpcy5ncnBjSG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5ncnBjQ3JlZGVudGlhbHMgPSBjcmVkZW50aWFscztcbiAgICB0aGlzLmdycGNDaGFubmVsT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jbGllbnRzID0gY3JlYXRlU2VydmljZUNsaWVudHMoaG9zdCwgY3JlZGVudGlhbHMsIG9wdGlvbnMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2aWNlIGNvbnRleHRcbiAgICBjb25zdCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQodGhpcy5jb25maWcsIHRoaXMuc2Vzc2lvbnMsIHRoaXMudHhNYW5hZ2VyLCB0aGlzLmNsaWVudHMsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcbiAgICB0aGlzLmN0eCA9IGN0eDtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogUmVidWlsZCBldmVyeSBnUlBDIGNsaWVudCB1c2VkIGJ5IHRoaXMgY29ubmVjdGlvbiBzbyB0aGUgbmV4dCBjYWxsXG4gICAqIGdldHMgYSBmcmVzaCBjaGFubmVsLiAgQ2FsbGVkIGJ5IHdpdGhBdXRvUmVjb25uZWN0IHdoZW4gYSBjYWxsXG4gICAqIGZhaWxzIHdpdGggVU5BVkFJTEFCTEUgLyBjb25uZWN0aW9uIHJlc2V0LiAgRG9lcyBOT1QgY2xvc2Ugb2xkXG4gICAqIGNsaWVudHMgc3luY2hyb25vdXNseSDigJQgaW4tZmxpZ2h0IGNhbGxzIGhvbGQgdGhlbSBhbGl2ZSBhbmQgZ1JQQ1xuICAgKiBjbG9zZXMgdGhlbSBvbmNlIHRob3NlIGNhbGxzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JjZVJlY29ubmVjdEFsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBmcmVzaCA9IGNyZWF0ZVNlcnZpY2VDbGllbnRzKFxuICAgICAgdGhpcy5ncnBjSG9zdCxcbiAgICAgIHRoaXMuZ3JwY0NyZWRlbnRpYWxzLFxuICAgICAgdGhpcy5ncnBjQ2hhbm5lbE9wdGlvbnNcbiAgICApO1xuICAgIC8vIE11dGF0ZSBpbiBwbGFjZSBzbyBleGlzdGluZyBzZXJ2aWNlIGluc3RhbmNlcyBwaWNrIHVwIHRoZSBuZXdcbiAgICAvLyBjbGllbnRzICh0aGV5IGhvbGQgYSByZWZlcmVuY2UgdG8gdGhpcy5jdHguY2xpZW50cykuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNsaWVudHMsIGZyZXNoKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY3R4LmNsaWVudHMsIGZyZXNoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGZuIHdpdGggdHdvIHJlY292ZXJ5IGJlaGF2aW91cnM6XG4gICAqICAgLSBVTkFVVEhFTlRJQ0FURUQg4oCUIGlmIHN0b3JlZCBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlLCByZS1sb2dpblxuICAgKiAgICAgYW5kIHJldHJ5IGZuIG9uY2UuXG4gICAqICAgLSBVTkFWQUlMQUJMRSAvIGNvbm5lY3Rpb24gcmVzZXQg4oCUIHJlYnVpbGQgZXZlcnkgZ1JQQyBjbGllbnQgc29cbiAgICogICAgIHRoZSBORVhUIGNhbGwgZ2V0cyBhIGZyZXNoIGNoYW5uZWwuICBUaGUgY3VycmVudCBjYWxsIGlzIE5PVFxuICAgKiAgICAgcmV0cmllZDsgY2FsbGVyIGRlY2lkZXMgKHdyaXRlLXNpZGUgY2FsbHMgYXJlIG9mdGVuIG5vdFxuICAgKiAgICAgaWRlbXBvdGVudCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdpdGhBdXRvUmVjb25uZWN0PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnTG93ZXIgPSBlPy5tZXNzYWdlID8gU3RyaW5nKGUubWVzc2FnZSkudG9Mb3dlckNhc2UoKSA6ICcnO1xuICAgICAgY29uc3QgaXNVbmF1dGhlbnRpY2F0ZWQgPVxuICAgICAgICAoZT8uY29kZSA9PT0gZ3JwYy5zdGF0dXMuVU5BVVRIRU5USUNBVEVEKSB8fFxuICAgICAgICBtc2dMb3dlci5pbmNsdWRlcygndW5hdXRoZW50aWNhdGVkJykgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3Nlc3Npb24gbm90IGZvdW5kJykgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3Nlc3Npb24gZXhwaXJlZCcpO1xuICAgICAgaWYgKGlzVW5hdXRoZW50aWNhdGVkICYmIHRoaXMuc3RvcmVkVXNlcm5hbWUpIHtcbiAgICAgICAgLy8gU2F2ZSBjdXJyZW50IGdyYXBoIGNvbnRleHQgYmVmb3JlIHJlLWxvZ2luXG4gICAgICAgIGNvbnN0IHNhdmVkR3JhcGggPSB0aGlzLnN0b3JlZEdyYXBoO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9naW4odGhpcy5zdG9yZWRVc2VybmFtZSwgdGhpcy5zdG9yZWRQYXNzd29yZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRocm93IGU7IC8vIFJldHVybiBvcmlnaW5hbCBlcnJvciBpZiByZS1sb2dpbiBmYWlsc1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RvcmUgZ3JhcGggY29udGV4dCBhZnRlciByZS1sb2dpblxuICAgICAgICBpZiAoc2F2ZWRHcmFwaCAmJiBzYXZlZEdyYXBoICE9PSAnX19zeXN0ZW1fXycpIHtcbiAgICAgICAgICB0cnkgeyBhd2FpdCB0aGlzLnVzZUdyYXBoKHNhdmVkR3JhcGgpOyB9IGNhdGNoIHsgLyogYmVzdCBlZmZvcnQgKi8gfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbigpOyAvLyBSZXRyeSBvbmNlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzVW5hdmFpbGFibGUgPVxuICAgICAgICAoZT8uY29kZSA9PT0gZ3JwYy5zdGF0dXMuVU5BVkFJTEFCTEUpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdjb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXInKSB8fFxuICAgICAgICBtc2dMb3dlci5pbmNsdWRlcygnc29ja2V0IGNsb3NlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCd0cmFuc3BvcnQgaXMgY2xvc2luZycpO1xuICAgICAgaWYgKGlzVW5hdmFpbGFibGUpIHtcbiAgICAgICAgdHJ5IHsgdGhpcy5mb3JjZVJlY29ubmVjdEFsbCgpOyB9IGNhdGNoIHsgLyogYmVzdCBlZmZvcnQgKi8gfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dvdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UubG9nb3V0KCk7XG4gIH1cblxuICAvKiogQ2hlY2sgdGhlIGNvbm5lY3Rpb24gYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xuICBhc3luYyBwaW5nKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvblNlcnZpY2UucGluZygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFF1ZXJ5IFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovXG4gIGFzeW5jIGdxbChxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5ncWwocXVlcnksIGNvbmZpZykpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBHUUwgcXVlcnkgYW5kIHN0cmVhbSB0aGUgcmVzdWx0cyAqL1xuICBhc3luYyBncWxTdHJlYW0oXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZyxcbiAgICBjYWxsYmFjaz86IChyZXNwb25zZTogUmVzcG9uc2UpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsU3RyZWFtKHF1ZXJ5LCBjb25maWcsIGNhbGxiYWNrKSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHRoZSBleGVjdXRpb24gcGxhbiBmb3IgYSBxdWVyeSAqL1xuICBhc3luYyBleHBsYWluKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5leHBsYWluKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgcXVlcnkgd2l0aCBwcm9maWxpbmcgYW5kIHJldHVybiBzdGF0aXN0aWNzICovXG4gIGFzeW5jIHByb2ZpbGUocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLnByb2ZpbGUocXVlcnksIGNvbmZpZykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEdyYXBoIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBncmFwaC5cbiAgICpcbiAgICogV2hlbiBgZWRnZUlkYCBpcyBwcm92aWRlZCwgdGhlIGRyaXZlciBpc3N1ZXMgYSBmb2xsb3ctdXBcbiAgICogYEFMVEVSIEdSQVBIIDxuYW1lPiBTRVQgRURHRV9JRCBFTkFCTEVEfERJU0FCTEVEYCB2aWEgR1FMIGFmdGVyIHRoZVxuICAgKiBnUlBDIGNyZWF0ZSBjYWxsLiBXaGVuIGBlZGdlSWRgIGlzIHVuZGVmaW5lZCwgYmVoYXZpb3IgaXMgdW5jaGFuZ2VkXG4gICAqIGFuZCBubyBBTFRFUiBzdGF0ZW1lbnQgaXMgc2VudC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUdyYXBoKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJyxcbiAgICBlZGdlSWQ/OiBFZGdlSWRNb2RlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ3JhcGhTZXJ2aWNlLmNyZWF0ZUdyYXBoKG5hbWUsIGdyYXBoVHlwZSwgZGVzY3JpcHRpb24pO1xuICAgIGlmIChlZGdlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3RhdGUgPSBlZGdlSWQgPT09IEVkZ2VJZE1vZGUuRU5BQkxFRCA/ICdFTkFCTEVEJyA6ICdESVNBQkxFRCc7XG4gICAgICBhd2FpdCB0aGlzLmdxbChgQUxURVIgR1JBUEggJHtuYW1lfSBTRVQgRURHRV9JRCAke3N0YXRlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmJlZ2luVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCByZWFkT25seSwgdGltZW91dCk7XG4gICAgLy8gU3VyZmFjZSB0aGUgcGVyLWNsaWVudCBsb2dpY2FsIHNlc3Npb24gaWQgb24gdGhlIHJldHVybmVkIHR4XG4gICAgLy8gKHRyYW5zYWN0aW9uLWJyYW5jaCBlcmdvbm9taWMsIHNlZSBUUkFOU0FDVElPTlNfRFJJVkVSX0dVSURFLm1kKS5cbiAgICAodHggYXMgYW55KS5jbGllbnRTZXNzaW9uSWQgPSB0aGlzLmNsaWVudFNlc3Npb25JZDtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQ29tbWl0IGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5jb21taXQodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyByb2xsYmFjayh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi9cbiAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucygpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmxpc3RUcmFuc2FjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGZuOiAodHhJZDogbnVtYmVyKSA9PiBQcm9taXNlPFQ+LFxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLndpdGhUcmFuc2FjdGlvbihncmFwaE5hbWUsIGZuLCByZWFkT25seSk7XG4gIH1cblxuICAvLyAtLS0tIEFkbWluIERETCBzdXJmYWNlICh0cmFuc2FjdGlvbi1icmFuY2gpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgdmlhIHRoZSBHUUwgYWRtaW4gRERMIGBTSE9XIFRSQU5TQUNUSU9OU2AuXG4gICAqIEVhY2ggcm93IG1pcnJvcnMgdGhlIDUtY29sdW1uIHNlcnZlci1zaWRlIHNjaGVtYTpcbiAgICogYHRyYW5zYWN0aW9uSWQgLyBzdGF0dXMgLyByZWFkT25seSAvIHN0YXJ0VGltZSAvIHNlc3Npb25JZGAuXG4gICAqIGBzZXNzaW9uSWRgIGlzIGAnJ2AgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIGF1dG8tZGVyaXZlZCBvbmUgZnJvbSBwZWVyXG4gICAqIGluZm8gb3IgdGhlIGRyaXZlciBleHBsaWNpdGx5IHN1cmZhY2VzIGB4LXVsdGlwYS1zZXNzaW9uLWlkYCBtZXRhZGF0YS5cbiAgICpcbiAgICogRGlzdGluY3QgZnJvbSBgbGlzdFRyYW5zYWN0aW9ucygpYCB3aGljaCB1c2VzIHRoZSBsZWdhY3kgZ1JQQy5cbiAgICovXG4gIGFzeW5jIHNob3dUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJvd1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIFRSQU5TQUNUSU9OUycpO1xuICAgIGNvbnN0IGlkeDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHJlc3AuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiB7IGlkeFtjXSA9IGk7IH0pO1xuICAgIGNvbnN0IHJvd3M6IFRyYW5zYWN0aW9uUm93W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXNwLnJvd3MpIHtcbiAgICAgIGNvbnN0IGdldCA9IChuOiBzdHJpbmcsIGZhbGxiYWNrOiBhbnkgPSAnJykgPT4ge1xuICAgICAgICBjb25zdCBpID0gaWR4W25dO1xuICAgICAgICByZXR1cm4gaSA9PT0gdW5kZWZpbmVkID8gZmFsbGJhY2sgOiAocm93LnZhbHVlc1tpXSBhcyBhbnkpPy52YWx1ZSA/PyByb3cudmFsdWVzW2ldO1xuICAgICAgfTtcbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IFN0cmluZyhnZXQoJ3RyYW5zYWN0aW9uX2lkJywgJycpID8/ICcnKSxcbiAgICAgICAgc3RhdHVzOiBTdHJpbmcoZ2V0KCdzdGF0dXMnLCAnJykgPz8gJycpLFxuICAgICAgICByZWFkT25seTogQm9vbGVhbihnZXQoJ3JlYWRfb25seScsIGZhbHNlKSksXG4gICAgICAgIHN0YXJ0VGltZTogU3RyaW5nKGdldCgnc3RhcnRfdGltZScsICcnKSA/PyAnJyksXG4gICAgICAgIHNlc3Npb25JZDogU3RyaW5nKGdldCgnc2Vzc2lvbl9pZCcsICcnKSA/PyAnJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGJ5IGlkIHZpYSBgS0lMTCBUUkFOU0FDVElPTiAnPGlkPidgLlxuICAgKiBgdHJhbnNhY3Rpb25JZGAgaGVyZSBpcyB0aGUgKipzdHJpbmcqKiBpZCBzdXJmYWNlZCBieVxuICAgKiBgc2hvd1RyYW5zYWN0aW9ucygpYCAoZS5nLiBgJ3R4X2EzOTZjNTMxLS4uLidgKSwgZGlzdGluY3QgZnJvbSB0aGVcbiAgICogYG51bWJlcmAgaWQgcmV0dXJuZWQgYnkgYGJlZ2luKClgLlxuICAgKi9cbiAgYXN5bmMga2lsbFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBlc2NhcGVkID0gU3RyaW5nKHRyYW5zYWN0aW9uSWQpLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEtJTEwgVFJBTlNBQ1RJT04gJyR7ZXNjYXBlZH0nYCk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGV2ZXJ5IGFjdGl2ZSB0cmFuc2FjdGlvbiB2aWEgYFJFU0VUIFRSQU5TQUNUSU9OU2AuIEFkbWluLW9ubHkuXG4gICAqIEludGVuZGVkIGFzIGFuIGVzY2FwZSBoYXRjaCB3aGVuIGFuIG9ycGhhbiB0eCBibG9ja3MgbmV3IEJFR0lOcy5cbiAgICovXG4gIGFzeW5jIHJlc2V0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoJ1JFU0VUIFRSQU5TQUNUSU9OUycpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERhdGEgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIG5vZGVzIGludG8gYSBncmFwaCB1c2luZyBnUlBDIGJ1bGsgaW5zZXJ0ICovXG4gIGFzeW5jIGluc2VydE5vZGVzQmF0Y2hBdXRvKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhncmFwaE5hbWUsIG5vZGVzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnRFZGdlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0RWRnZXMoZ3JhcGhOYW1lLCBlZGdlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbm9kZXMgYnkgaWQgbGlzdC4gRW1pdHNcbiAgICogYE1BVENIIChuKSBXSEVSRSBpZChuKSBJTiBbLi4uXSBERVRBQ0ggREVMRVRFIG4gUkVUVVJOIG5gLlxuICAgKlxuICAgKiBFbXB0eS9udWxsIGBub2RlSWRzYCBzaG9ydC1jaXJjdWl0cyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMgUmVzcG9uc2Ugd2l0aCBvbmUgcm93IHBlciBhY3R1YWxseS1kZWxldGVkIG5vZGUsIGNvbHVtblxuICAgKiAgIFwiblwiIGhvbGRpbmcgdGhlIEdxbGRiTm9kZS4gVXNlIGByZXNwb25zZS5hbGlhcyhcIm5cIikuYXNOb2RlcygpYC5cbiAgICogICBXaXRoIGByZXR1cm5EZWxldGVkPWZhbHNlYCB0aGUgcmVzcG9uc2UgY2FycmllcyBvbmx5XG4gICAqICAgYHJvd3NBZmZlY3RlZGA7IHJvd3MgaXMgZW1wdHkuXG4gICAqL1xuICBhc3luYyBkZWxldGVOb2Rlc0J5SWRzKFxuICAgIG5vZGVJZHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgaWYgKCFub2RlSWRzIHx8IG5vZGVJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcbiAgICB9XG4gICAgbGV0IGdxbCA9IGBNQVRDSCAobikgV0hFUkUgaWQobikgSU4gWyR7Zm9ybWF0U3RyaW5nTGlzdChub2RlSWRzKX1dIERFVEFDSCBERUxFVEUgbmA7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkgZ3FsICs9ICcgUkVUVVJOIG4nO1xuICAgIHJldHVybiB0aGlzLmdxbChncWwsIGNmZyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG5vZGVzIG1hdGNoaW5nIGxhYmVscyBhbmQvb3Igd2hlcmUgY2xhdXNlLiBFbWl0c1xuICAgKiBgTUFUQ0ggKG46TDF8TDIpIFdIRVJFIDx3aGVyZT4gREVUQUNIIERFTEVURSBuIFJFVFVSTiBuYC5cbiAgICpcbiAgICogVGhyb3dzIGlmIGJvdGggbGFiZWxzIGFuZCB3aGVyZSBhcmUgZW1wdHkgdW5sZXNzXG4gICAqIGBjb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlYC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZU5vZGVzQnlDb25kaXRpb24oXG4gICAgbGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICB3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgY29uc3Qgbm9MYWJlbHMgPSAhbGFiZWxzIHx8IGxhYmVscy5sZW5ndGggPT09IDA7XG4gICAgY29uc3Qgbm9XaGVyZSA9ICF3aGVyZSB8fCAhd2hlcmUudHJpbSgpO1xuICAgIGlmIChub0xhYmVscyAmJiBub1doZXJlICYmICFjZmcuYWxsb3dEZWxldGVBbGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2RlbGV0ZU5vZGVzQnlDb25kaXRpb24gd2l0aCBubyBsYWJlbHMgYW5kIG5vIHdoZXJlIHdvdWxkIGRlbGV0ZSBldmVyeSAnXG4gICAgICAgICsgJ25vZGUgaW4gdGhlIGdyYXBoLiBJZiB0aGlzIGlzIGludGVudGlvbmFsLCBzZXQgRGVsZXRlQ29uZmlnLmFsbG93RGVsZXRlQWxsID0gdHJ1ZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgZ3FsID0gJ01BVENIIChuJztcbiAgICBpZiAoIW5vTGFiZWxzKSBncWwgKz0gJzonICsgbGFiZWxzIS5tYXAobCA9PiBgXFxgJHtsfVxcYGApLmpvaW4oJ3wnKTtcbiAgICBncWwgKz0gJyknO1xuICAgIGlmICghbm9XaGVyZSkgZ3FsICs9ICcgV0hFUkUgJyArIHdoZXJlO1xuICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID4gMCkgZ3FsICs9IGAgTElNSVQgJHtsaW1pdH1gO1xuICAgIGdxbCArPSAnIERFVEFDSCBERUxFVEUgbic7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkgZ3FsICs9ICcgUkVUVVJOIG4nO1xuICAgIHJldHVybiB0aGlzLmdxbChncWwsIGNmZyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVkZ2VzIGJ5IGlkIGxpc3QuIEVtaXRzIDUtY29sdW1uIEdRTCB3aXRoIGBpZChlKWAgc28gdGhlXG4gICAqIHNhbWUgZW1pdCB3b3JrcyBvbiBncmFwaHMgd2l0aCBvciB3aXRob3V0IEVER0VfSUQgZW5hYmxlZCwgdGhlblxuICAgKiByZXNoYXBlcyB0aGUgcmVzcG9uc2UgaW50byBhIHNpbmdsZSBcImVcIiBjb2x1bW4gaG9sZGluZyBHcWxkYkVkZ2UuXG4gICAqL1xuICBhc3luYyBkZWxldGVFZGdlc0J5SWRzKFxuICAgIGVkZ2VJZHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgaWYgKCFlZGdlSWRzIHx8IGVkZ2VJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcbiAgICB9XG4gICAgbGV0IGdxbCA9IGBNQVRDSCAoKS1bZV0tPigpIFdIRVJFIGlkKGUpIElOIFske2Zvcm1hdFN0cmluZ0xpc3QoZWRnZUlkcyl9XSBERUxFVEUgZWA7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkge1xuICAgICAgZ3FsICs9ICcgUkVUVVJOIGlkKGUpLCBlLl9mcm9tLCBlLl90bywgbGFiZWxzKGUpWzBdLCBwcm9wZXJ0aWVzKGUpJztcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjZmcpO1xuICAgIHJldHVybiBjZmcucmV0dXJuRGVsZXRlZCA9PT0gZmFsc2UgPyByYXcgOiByZXNoYXBlRWRnZURlbGV0ZShyYXcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBlZGdlcyBtYXRjaGluZyBsYWJlbCBhbmQvb3Igd2hlcmUuIEVtaXRzIDUtY29sdW1uIEdRTCxcbiAgICogdGhlbiByZXNoYXBlcyBpbnRvIGEgc2luZ2xlIFwiZVwiIGNvbHVtbi5cbiAgICpcbiAgICogVGhyb3dzIGlmIGJvdGggbGFiZWwgYW5kIHdoZXJlIGFyZSBlbXB0eSB1bmxlc3NcbiAgICogYGNvbmZpZy5hbGxvd0RlbGV0ZUFsbCA9IHRydWVgLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXNCeUNvbmRpdGlvbihcbiAgICBsYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHdoZXJlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgY29uZmlnPzogRGVsZXRlQ29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZmc6IERlbGV0ZUNvbmZpZyA9IHsgcmV0dXJuRGVsZXRlZDogdHJ1ZSwgYWxsb3dEZWxldGVBbGw6IGZhbHNlLCAuLi5jb25maWcgfTtcbiAgICBjb25zdCBub0xhYmVsID0gIWxhYmVsO1xuICAgIGNvbnN0IG5vV2hlcmUgPSAhd2hlcmUgfHwgIXdoZXJlLnRyaW0oKTtcbiAgICBpZiAobm9MYWJlbCAmJiBub1doZXJlICYmICFjZmcuYWxsb3dEZWxldGVBbGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2RlbGV0ZUVkZ2VzQnlDb25kaXRpb24gd2l0aCBubyBsYWJlbCBhbmQgbm8gd2hlcmUgd291bGQgZGVsZXRlIGV2ZXJ5ICdcbiAgICAgICAgKyAnZWRnZSBpbiB0aGUgZ3JhcGguIElmIHRoaXMgaXMgaW50ZW50aW9uYWwsIHNldCBEZWxldGVDb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBncWwgPSAnTUFUQ0ggKCktW2UnO1xuICAgIGlmICghbm9MYWJlbCkgZ3FsICs9IGA6XFxgJHtsYWJlbH1cXGBgO1xuICAgIGdxbCArPSAnXS0+KCknO1xuICAgIGlmICghbm9XaGVyZSkgZ3FsICs9ICcgV0hFUkUgJyArIHdoZXJlO1xuICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID4gMCkgZ3FsICs9IGAgTElNSVQgJHtsaW1pdH1gO1xuICAgIGdxbCArPSAnIERFTEVURSBlJztcbiAgICBpZiAoY2ZnLnJldHVybkRlbGV0ZWQgIT09IGZhbHNlKSB7XG4gICAgICBncWwgKz0gJyBSRVRVUk4gaWQoZSksIGUuX2Zyb20sIGUuX3RvLCBsYWJlbHMoZSlbMF0sIHByb3BlcnRpZXMoZSknO1xuICAgIH1cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNmZyk7XG4gICAgcmV0dXJuIGNmZy5yZXR1cm5EZWxldGVkID09PSBmYWxzZSA/IHJhdyA6IHJlc2hhcGVFZGdlRGVsZXRlKHJhdyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGdyYXBoIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKHN0cmVhbWluZykuXG4gICAqIEBwYXJhbSBjb25maWcgRXhwb3J0IGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZvciBlYWNoIGV4cG9ydGVkIGNodW5rXG4gICAqL1xuICBhc3luYyBleHBvcnQoXG4gICAgY29uZmlnOiBFeHBvcnRDb25maWcsXG4gICAgY2FsbGJhY2s/OiAoY2h1bms6IEV4cG9ydENodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydChjb25maWcsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gbm9kZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydE5vZGVzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0RWRnZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0RWRnZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGVhbHRoIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENoZWNrIHRoZSBoZWFsdGggb2YgYSBzZXJ2aWNlICovXG4gIGFzeW5jIGhlYWx0aENoZWNrKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxIZWFsdGhTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLmhlYWx0aENoZWNrKHNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGhlYWx0aCBzdGF0dXMgY2hhbmdlcyB2aWEgc2VydmVyLXNpZGUgc3RyZWFtaW5nLlxuICAgKiBSZXR1cm5zIGEgSGVhbHRoV2F0Y2hlciB0aGF0IGVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyB2YWx1ZXMuXG4gICAqIENhbGwgc3RvcCgpIHRvIGNhbmNlbCB0aGUgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSAtIE9wdGlvbmFsIHNlcnZpY2UgbmFtZSB0byB3YXRjaFxuICAgKiBAcmV0dXJucyBIZWFsdGhXYXRjaGVyIC0gRXZlbnRFbWl0dGVyIHdpdGggc3RvcCgpIG1ldGhvZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHdhdGNoZXIgPSBjbGllbnQud2F0Y2goKTtcbiAgICogd2F0Y2hlci5vbignc3RhdHVzJywgKHN0YXR1czogSGVhbHRoU3RhdHVzKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ0hlYWx0aCBzdGF0dXM6Jywgc3RhdHVzKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1dhdGNoIGVycm9yOicsIGVycik7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ1dhdGNoIHN0cmVhbSBlbmRlZCcpO1xuICAgKiB9KTtcbiAgICogLy8gTGF0ZXIsIHRvIHN0b3Agd2F0Y2hpbmc6XG4gICAqIHdhdGNoZXIuc3RvcCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHdhdGNoKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogSGVhbHRoV2F0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS53YXRjaChzZXJ2aWNlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBQcmUtYWxsb2NhdGUgcGFyc2VyIGluc3RhbmNlcyAqL1xuICBhc3luYyB3YXJtdXBQYXJzZXIoY291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YXJtdXBQYXJzZXIoY291bnQpO1xuICB9XG5cbiAgLyoqIFJldHVybiBjYWNoZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTxDYWNoZVN0YXRzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldENhY2hlU3RhdHMoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBDbGVhciB0aGUgc3BlY2lmaWVkIGNhY2hlICovXG4gIGFzeW5jIGNsZWFyQ2FjaGUoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNsZWFyQ2FjaGUoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gZGF0YWJhc2Ugc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRTdGF0aXN0aWNzKGdyYXBoTmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPFN0YXRpc3RpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3RhdGlzdGljcyhncmFwaE5hbWUpO1xuICB9XG5cbiAgLyoqIEludmFsaWRhdGUgdGhlIFJCQUMgcGVybWlzc2lvbiBjYWNoZSAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5pbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3lzdGVtLWxldmVsIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBkaXNrIEkvTywgc3RvcmFnZSwgbmV0d29yaykgKi9cbiAgYXN5bmMgZ2V0U3lzdGVtTWV0cmljcygpOiBQcm9taXNlPFN5c3RlbU1ldHJpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3lzdGVtTWV0cmljcygpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgbWFudWFsIGNvbXBhY3Rpb24gb2YgdGhlIGRhdGFiYXNlIHN0b3JhZ2UgKi9cbiAgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPENvbXBhY3RSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY29tcGFjdCgpO1xuICB9XG5cbiAgLyoqIFdhaXQgZm9yIHRoZSBjb21wdXRpbmcgZW5naW5lIHRvcG9sb2d5IHRvIGJlIHJlYWR5ICovXG4gIGFzeW5jIHdhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lOiBzdHJpbmcsIHRpbWVvdXRNczogbnVtYmVyID0gMCk6IFByb21pc2U8Q29tcHV0ZVRvcG9sb2d5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lLCB0aW1lb3V0TXMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJ1bGsgSW1wb3J0IFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgYnVsayBpbXBvcnQgc2Vzc2lvbiBmb3Igb3B0aW1pemVkIGhpZ2gtdGhyb3VnaHB1dCBpbnNlcnRzLlxuICAgKiBAcGFyYW0gZ3JhcGhOYW1lIFRhcmdldCBncmFwaCBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGJ1bGsgaW1wb3J0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEJ1bGtJbXBvcnRPcHRpb25zKTogUHJvbWlzZTxCdWxrSW1wb3J0U2Vzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLnN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIENoZWNrcG9pbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVXNlIGVuZEJ1bGtJbXBvcnQoKSB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoLlxuICAgKi9cbiAgYXN5bmMgY2hlY2twb2ludChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q2hlY2twb2ludFJlc3VsdD4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVjb3JkQ291bnQ6IDAsXG4gICAgICBsYXN0Q2hlY2twb2ludENvdW50OiAwLFxuICAgICAgbWVzc2FnZTogJ0NoZWNrcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIGVuZEJ1bGtJbXBvcnQgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aCBhIGZpbmFsIGNoZWNrcG9pbnQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8RW5kQnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aG91dCBmaW5hbCBzeW5jLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QWJvcnRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhIGJ1bGsgaW1wb3J0IHNlc3Npb24uXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa0ltcG9ydFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBNZXRob2RzIOKAlCBHZXR0ZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiAqL1xuICBnZXRTZXNzaW9uKCk6IFNlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlc3Npb24gKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xuICBnZXRDb25maWcoKTogR3FsZGJDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0byBhIGNsdXN0ZXIgZGVwbG95bWVudCAqL1xuICBnZXQgaXNDbHVzdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uaXNDbHVzdGVyIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2x1c3RlciBJRCAoZW1wdHkgc3RyaW5nIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBjbHVzdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmNsdXN0ZXJJZCB8fCAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBhcnRpdGlvbiBjb3VudCAoMCBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgcGFydGl0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LnBhcnRpdGlvbkNvdW50IHx8IDA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW50ZXJuYWwgSGVscGVycyDigJQgTmFtZSBRdW90aW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBXcmFwIGEgbmFtZSBpbiBiYWNrdGlja3MgZm9yIHNhZmUgdXNlIGluIEdRTCBzdGF0ZW1lbnRzLlxuICAgKiBMYWJlbCBuYW1lcyBhbmQgcHJvcGVydHkgbmFtZXMgc2hvdWxkIGJlIHF1b3RlZDsgZ3JhcGggbmFtZXMsIGluZGV4IG5hbWVzLFxuICAgKiBhbmQgZnVsbHRleHQgbmFtZXMgc2hvdWxkIE5PVCBiZSB3cmFwcGVkIGluIGJhY2t0aWNrcy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYCcgKyBuYW1lICsgJ2AnO1xuICB9XG5cbiAgLyoqIFdyYXAgZWFjaCBsYWJlbCBuYW1lIGluIGJhY2t0aWNrcyBhbmQgam9pbiB3aXRoIFwiLCBcIiAqL1xuICBwcml2YXRlIHN0YXRpYyBxdW90ZUxhYmVscyguLi5uYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lcy5tYXAobiA9PiAnYCcgKyBuICsgJ2AnKS5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqIEpvaW4gbmFtZXMgd2l0aCBcIiwgXCIgd2l0aG91dCBiYWNrdGljayB3cmFwcGluZyAqL1xuICBwcml2YXRlIHN0YXRpYyBqb2luTmFtZXMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEdyYXBoIE9wZXJhdGlvbnMgKDYgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBvcGVuIChzY2hlbWEtbGVzcykgZ3JhcGhcbiAgICpcbiAgICogdjYgR1FMOiBgQ1JFQVRFIEdSQVBIIGdgIC0+IE9QRU47IGBDUkVBVEUgR1JBUEggZyB7fWAgLT4gQ0xPU0VELiBUaGVcbiAgICogYnJhY2UtbGVzcyBmb3JtIGlzIHJlcXVpcmVkIHRvIGFjdHVhbGx5IGdldCBhbiBPUEVOIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlT3BlbkdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IGNsb3NlZCAoc2NoZW1hLWVuZm9yY2VkKSBncmFwaCB3aXRoIG5vZGUgYW5kIGVkZ2UgbGFiZWwgZGVmaW5pdGlvbnMgKi9cbiAgYXN5bmMgY3JlYXRlQ2xvc2VkR3JhcGgobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBHUkFQSCAke25hbWV9IHt9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBncmFwaCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdyYXBoIHdhcyBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVHcmFwaElmTm90RXhpc3QoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnLFxuICAgIGVkZ2VJZD86IEVkZ2VJZE1vZGVcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbiwgZWRnZUlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgbXNnID0gKGUubWVzc2FnZSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChtc2cuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3QnKSB8fCBtc2cuaW5jbHVkZXMoJ2R1cGxpY2F0ZScpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoZWNrIHdoZXRoZXIgYSBncmFwaCB3aXRoIHRoZSBnaXZlbiBuYW1lIGV4aXN0cyAqL1xuICBhc3luYyBoYXNHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBncmFwaHMgPSBhd2FpdCB0aGlzLmxpc3RHcmFwaHMoKTtcbiAgICByZXR1cm4gZ3JhcGhzLnNvbWUoZyA9PiBnLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIGdyYXBoICovXG4gIGFzeW5jIGFsdGVyR3JhcGgoZ3JhcGhOYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke2dyYXBoTmFtZX0gUkVOQU1FIFRPICR7bmV3TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhbGwgZGF0YSBmcm9tIGEgZ3JhcGggd2hpbGUga2VlcGluZyBpdHMgc3RydWN0dXJlICovXG4gIGFzeW5jIHRydW5jYXRlKGdyYXBoTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFRSVU5DQVRFIEdSQVBIICR7Z3JhcGhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBMYWJlbCBPcGVyYXRpb25zICgxNiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBsYWJlbHMgKG5vZGUgYW5kIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgbGFiZWxzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlTGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwLCAnTk9ERScpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0VkZ2VMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3AsICdFREdFJyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIHR5cGVzIHdpdGggdGhlaXIgcHJvcGVydGllcyAqL1xuICBhc3luYyBzaG93Tm9kZVR5cGVzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxOb2RlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIFRZUEVTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSB0eXBlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgc2hvd0VkZ2VUeXBlcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBUWVBFUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBzcGVjaWZpYyBsYWJlbCBieSBuYW1lIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGgsIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgKiBNYXRjaGVzIGVudHJpZXMgd2hlcmUgYG5hbWVgIGlzIG9uZSBvZiB0aGUgLmxhYmVscyAoc3VwcG9ydHMgbXVsdGktbGFiZWwgZ3JvdXBzKS5cbiAgICovXG4gIGFzeW5jIGdldExhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICByZXR1cm4gbGFiZWxzLmZpbmQobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBub2RlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPE5vZGVUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd05vZGVUeXBlcyhjb25maWcpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIGVkZ2UgdHlwZSBieSBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RWRnZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93RWRnZVR5cGVzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbm9kZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVOb2RlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIE5PREUgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgke3Byb3BTdHJ9KSB9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gZWRnZSBsYWJlbCBpbiB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBjcmVhdGVFZGdlTGFiZWwoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gQUREIEVER0UgeyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9ICgpLVske3Byb3BTdHJ9XS0+KCkgfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgbGFiZWwgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wTm9kZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gRFJPUCBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3Agb25lIG9yIG1vcmUgZWRnZSBsYWJlbHMgZnJvbSB0aGUgY3VycmVudCBncmFwaCAoY2xvc2VkIGdyYXBoKSAqL1xuICBhc3luYyBkcm9wRWRnZUxhYmVsKC4uLm5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICAvLyBMYXN0IGFyZyBtYXkgYmUgYSBRdWVyeUNvbmZpZyAob3IgdW5kZWZpbmVkKTsgdHJlYXQgbm9uLXN0cmluZyBhcyBjb25maWcuXG4gICAgbGV0IGNvbmZpZzogUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5hbWVzOiBzdHJpbmdbXTtcbiAgICBpZiAobmFtZXNPckNvbmZpZy5sZW5ndGggPiAwICYmIHR5cGVvZiBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcgPSBuYW1lc09yQ29uZmlnW25hbWVzT3JDb25maWcubGVuZ3RoIC0gMV0gYXMgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcuc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lcyA9IG5hbWVzT3JDb25maWcgYXMgc3RyaW5nW107XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IERST1AgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGxhYmVsIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVMYWJlbElmTm90RXhpc3QoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsYWJlbHMgPSBhd2FpdCB0aGlzLnNob3dMYWJlbHMoY29uZmlnKTtcbiAgICBjb25zdCB0YXJnZXRUeXBlID0gbm9kZU9yRWRnZSA9PT0gREJUeXBlLkVER0UgPyAnRURHRScgOiAnTk9ERSc7XG5cbiAgICBpZiAobGFiZWxzLnNvbWUobCA9PiBsLmxhYmVscy5pbmNsdWRlcyhuYW1lKSAmJiBsLnR5cGUgPT09IHRhcmdldFR5cGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZU5vZGVMYWJlbChuYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVFZGdlTGFiZWwobmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJOb2RlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBhbHRlckVkZ2VMYWJlbChvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGFsZ29yaXRobXMgKi9cbiAgYXN5bmMgc2hvd0FsZ29zKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBbGdvSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEFMR09TJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBQcm9wZXJ0eSBPcGVyYXRpb25zICgxMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Byb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0VkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBzaG93Tm9kZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBudCA9IGF3YWl0IHRoaXMuZ2V0Tm9kZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIW50KSB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gbnQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBzaG93RWRnZVByb3BlcnR5KGxhYmVsTmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBjb25zdCBldCA9IGF3YWl0IHRoaXMuZ2V0RWRnZUxhYmVsKGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBpZiAoIWV0KSB0aHJvdyBuZXcgRXJyb3IoYEVkZ2UgbGFiZWwgXCIke2xhYmVsTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICByZXR1cm4gZXQucHJvcGVydGllcztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICBjb25zdCBwcm9wcyA9IGF3YWl0IHRoaXMuc2hvd1Byb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICByZXR1cm4gcHJvcHMuZmluZChwID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBub2RlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuTk9ERSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhbiBlZGdlIGxhYmVsLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXRFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZiB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQlR5cGUuRURHRSwgbGFiZWxOYW1lLCBwcm9wTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIGxhYmVsIChub2RlIG9yIGVkZ2UpICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBBREQgUFJPUEVSVFkgJHtwcm9wU3RyfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBkcm9wUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5kcm9wTm9kZVByb3BlcnR5KGxhYmVsTmFtZSwgLi4ubmFtZXMsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRyb3BFZGdlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5uYW1lcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcE5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgZHJvcEVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gRFJPUCBQUk9QRVJUWSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLm5hbWVzKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBwcm9wZXJ0aWVzIG9uIGEgbGFiZWwgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIGFueSBwcm9wZXJ0aWVzIHdlcmUgY3JlYXRlZCwgZmFsc2UgaWYgYWxsIGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVByb3BlcnR5SWZOb3RFeGlzdChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGNvbnN0IGV4aXN0aW5nU2V0ID0gbmV3IFNldChleGlzdGluZy5tYXAocCA9PiBwLm5hbWUpKTtcbiAgICBjb25zdCBuZXdQcm9wcyA9IHByb3BzLmZpbHRlcihwID0+ICFleGlzdGluZ1NldC5oYXMocC5uYW1lKSk7XG5cbiAgICBpZiAobmV3UHJvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBhd2FpdCB0aGlzLmNyZWF0ZVByb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmV3UHJvcHMsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBDb25zdHJhaW50IE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLy8gU2VydmVyIHJlcGxhY2VkIGBBTFRFUiAuLi4gQUREL0RST1AgQ09OU1RSQUlOVGAgd2l0aCB0aGVcbiAgLy8gYENSRUFURSBDT05TVFJBSU5UIDxuYW1lPiBGT1IgLi4uIFJFUVVJUkUgLi4uIElTIE5PVCBOVUxML1VOSVFVRWBcbiAgLy8gZm9ybS4gQ29uc3RyYWludCBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHtraW5kfV97bm9kZXxlZGdlfV97bGFiZWx9X3twcm9wfVxuICAvLyBzbyBjcmVhdGUvZHJvcCBwcm9kdWNlIG1hdGNoaW5nIGlkZW50aWZpZXJzIHdpdGhvdXQgZXhwb3NpbmcgbmFtaW5nLlxuICBwcml2YXRlIHN0YXRpYyBjb25zdHJhaW50TmFtZShcbiAgICBraW5kOiAnbm4nIHwgJ3VxJyxcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWVzOiBzdHJpbmdbXVxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGVudCA9IG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFID8gJ25vZGUnIDogJ2VkZ2UnO1xuICAgIGNvbnN0IHByb3BzID0gcHJvcE5hbWVzLm1hcChwID0+IHAudG9Mb3dlckNhc2UoKSkuam9pbignXycpO1xuICAgIHJldHVybiBgJHtraW5kfV8ke2VudH1fJHtsYWJlbE5hbWUudG9Mb3dlckNhc2UoKX1fJHtwcm9wc31gO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29uc3RyYWludFRhcmdldChub2RlT3JFZGdlOiBEQlR5cGUsIGxhYmVsTmFtZTogc3RyaW5nKTogeyBwYXR0ZXJuOiBzdHJpbmc7IHZhcmlhYmxlOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgcWwgPSBHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSk7XG4gICAgcmV0dXJuIG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFXG4gICAgICA/IHsgcGF0dGVybjogYChuOiR7cWx9KWAsIHZhcmlhYmxlOiAnbicgfVxuICAgICAgOiB7IHBhdHRlcm46IGAoKS1bZToke3FsfV0tPigpYCwgdmFyaWFibGU6ICdlJyB9O1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgb24gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBjcmVhdGVOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCdubicsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgW3Byb3BOYW1lXSk7XG4gICAgY29uc3QgeyBwYXR0ZXJuLCB2YXJpYWJsZSB9ID0gR3FsZGJDbGllbnQuY29uc3RyYWludFRhcmdldChub2RlT3JFZGdlLCBsYWJlbE5hbWUpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIENPTlNUUkFJTlQgJHtuYW1lfSBGT1IgJHtwYXR0ZXJufSBSRVFVSVJFICR7dmFyaWFibGV9LiR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChwcm9wTmFtZSl9IElTIE5PVCBOVUxMYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBVTklRVUUgY29uc3RyYWludCBvbiBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgY29uc3QgY25hbWUgPSBHcWxkYkNsaWVudC5jb25zdHJhaW50TmFtZSgndXEnLCBub2RlT3JFZGdlLCBsYWJlbE5hbWUsIG5hbWVzKTtcbiAgICBjb25zdCB7IHBhdHRlcm4sIHZhcmlhYmxlIH0gPSBHcWxkYkNsaWVudC5jb25zdHJhaW50VGFyZ2V0KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSk7XG4gICAgY29uc3QgcHJvcHNMaXN0ID0gbmFtZXMubWFwKG4gPT4gYCR7dmFyaWFibGV9LiR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuKX1gKS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHJlcXVpcmVFeHByID0gbmFtZXMubGVuZ3RoID4gMSA/IGAoJHtwcm9wc0xpc3R9KWAgOiBwcm9wc0xpc3Q7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgQ09OU1RSQUlOVCAke2NuYW1lfSBGT1IgJHtwYXR0ZXJufSBSRVFVSVJFICR7cmVxdWlyZUV4cHJ9IElTIFVOSVFVRWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgTk9UIE5VTEwgY29uc3RyYWludCBmcm9tIGEgcHJvcGVydHkgKi9cbiAgYXN5bmMgZHJvcE5vdE51bGxDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBuYW1lID0gR3FsZGJDbGllbnQuY29uc3RyYWludE5hbWUoJ25uJywgbm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBbcHJvcE5hbWVdKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgQ09OU1RSQUlOVCAke25hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBVTklRVUUgY29uc3RyYWludCBmcm9tIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgZHJvcFVuaXF1ZUNvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgY29uc3QgY25hbWUgPSBHcWxkYkNsaWVudC5jb25zdHJhaW50TmFtZSgndXEnLCBub2RlT3JFZGdlLCBsYWJlbE5hbWUsIG5hbWVzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgQ09OU1RSQUlOVCAke2NuYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBJbmRleCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0luZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93Tm9kZUluZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dFZGdlSW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUluZGV4KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbmRleFByb3BlcnR5W10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtwcm9wU3RyfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcE5vZGVJbmRleChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIE5PREUgSU5ERVggJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGFuIGVkZ2UgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wRWRnZUluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgRURHRSBJTkRFWCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRnVsbHRleHQgT3BlcmF0aW9ucyAoNyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBmdWxsdGV4dCBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGZ1bGx0ZXh0IGluZGV4ZXMgKi9cbiAgYXN5bmMgc2hvd05vZGVGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93RWRnZUZ1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVOb2RlRnVsbHRleHQoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBGVUxMVEVYVCAke2luZGV4TmFtZX0gT04gTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ucHJvcHMpfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIGZ1bGx0ZXh0IGluZGV4IG9uIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BOb2RlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIEZVTExURVhUICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhbiBlZGdlIGZ1bGx0ZXh0IGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcEVkZ2VGdWxsdGV4dChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFRhc2sgT3BlcmF0aW9ucyAoMyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCB0YXNrcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93VGFza3MoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFRhc2tJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgVEFTS1MnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSB0YXNrIGJ5IElEICovXG4gIGFzeW5jIGRlbGV0ZVRhc2sodGFza0lkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgREVMRVRFIFRBU0sgJHt0YXNrSWR9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBTdG9wIGEgcnVubmluZyB0YXNrIGJ5IElEICovXG4gIGFzeW5jIHN0b3BUYXNrKHRhc2tJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYFNUT1AgVEFTSyAke3Rhc2tJZH1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgRGF0YSBJbnNlcnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5zZXJ0IG5vZGVzIOKAlCBiYWNrd2FyZC1jb21wYXRpYmxlIG92ZXJsb2FkZWQgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFR3byBjYWxsIHNoYXBlcyBhcmUgYWNjZXB0ZWQ7IHRoZSBydW50aW1lIGRpc3BhdGNoZXMgb24gdGhlIGZpcnN0XG4gICAqIGFyZ3VtZW50J3MgdHlwZTpcbiAgICpcbiAgICogICAxLiBgaW5zZXJ0Tm9kZXMoZ3JhcGhOYW1lOiBzdHJpbmcsIG5vZGVzLCBjb25maWc/KWAg4oCUIG9yaWdpbmFsXG4gICAqICAgICAgNi4wLjAgc2lnbmF0dXJlLCByb3V0ZXMgdGhyb3VnaCB0aGUgYnVsay1pbXBvcnQgZ1JQQyBwYXRoXG4gICAqICAgICAgKGBEYXRhU2VydmljZS5JbnNlcnROb2Rlc2ApLiBSZXR1cm5zIGBJbnNlcnROb2Rlc1Jlc3VsdGAgd2l0aFxuICAgKiAgICAgIGdSUEMtbGV2ZWwgbWV0YWRhdGEuIFByZXNlcnZlcyBzb3VyY2UgY29tcGF0aWJpbGl0eSBmb3JcbiAgICogICAgICBjYWxsZXJzIHdyaXR0ZW4gYWdhaW5zdCA2LjAuMCAoZS5nLiBncWxkYi1tYW5hZ2VyKS5cbiAgICpcbiAgICogICAyLiBgaW5zZXJ0Tm9kZXMobm9kZXMsIGNvbmZpZz8pYCDigJQgY29udmVuaWVuY2UgR1FMIGVtaXR0ZXIgKGFkZGVkXG4gICAqICAgICAgYWZ0ZXIgNi4wLjApLiBTeW50aGVzaXplc1xuICAgKiAgICAgIGBJTlNFUlQgKG4wOkxhYmVsIHsuLi59KSwgKG4xOkxhYmVsIHsuLi59KSBSRVRVUk4gbjAsIG4xYCxcbiAgICogICAgICB3aXRoIGBJTlNFUlQgT1ZFUldSSVRFYCB3aGVuIGBjb25maWcuaW5zZXJ0VHlwZWAgaXNcbiAgICogICAgICBgSW5zZXJ0VHlwZS5PdmVyd3JpdGVgLiBSZXR1cm5zIHRoZSByYXcgYFJlc3BvbnNlYC5cbiAgICogICAgICBgTm9kZURhdGEuaWRgLCB3aGVuIHNldCwgaXMgZW1pdHRlZCBhcyB0aGUgYF9pZGAgcHJvcGVydHkuXG4gICAqL1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0PjtcbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+O1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBhcmcxOiBzdHJpbmcgfCBOb2RlRGF0YVtdLFxuICAgIGFyZzI/OiBOb2RlRGF0YVtdIHwgSW5zZXJ0Q29uZmlnLFxuICAgIGFyZzM/OiBJbnNlcnROb2Rlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydE5vZGVzUmVzdWx0IHwgUmVzcG9uc2U+IHtcbiAgICAvLyBQYXRoIDE6IGxlZ2FjeSBidWxrLWdSUEMgc2lnbmF0dXJlIChncmFwaE5hbWUsIG5vZGVzLCBjb25maWc/KVxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydE5vZGVzKFxuICAgICAgICBhcmcxLFxuICAgICAgICBhcmcyIGFzIE5vZGVEYXRhW10sXG4gICAgICAgIGFyZzNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGF0aCAyOiBjb252ZW5pZW5jZSBHUUwtZW1pdHRlciBzaWduYXR1cmUgKG5vZGVzLCBjb25maWc/KVxuICAgIGNvbnN0IG5vZGVzID0gYXJnMTtcbiAgICBjb25zdCBjb25maWcgPSBhcmcyIGFzIEluc2VydENvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgUmVzcG9uc2UoW10sIFtdLCAwLCBmYWxzZSwgW10sIDApO1xuXG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZSwgaSkgPT4ge1xuICAgICAgaWYgKCFub2RlLmxhYmVscyB8fCBub2RlLmxhYmVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGF0IGluZGV4ICR7aX0gaGFzIG5vIGxhYmVscy4gQXQgbGVhc3Qgb25lIGxhYmVsIGlzIHJlcXVpcmVkLmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdmFyTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcGFydHMgPSBub2Rlcy5tYXAoKG5vZGUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhck5hbWUgPSBgbiR7aX1gO1xuICAgICAgdmFyTmFtZXMucHVzaCh2YXJOYW1lKTtcbiAgICAgIC8vIEdRTCBJTlNFUlQgb25seSBzdXBwb3J0cyBzaW5nbGUgbGFiZWwgcGVyIG5vZGVcbiAgICAgIGNvbnN0IGxhYmVsID0gR3FsZGJDbGllbnQucXVvdGVMYWJlbChub2RlLmxhYmVsc1swXSk7XG4gICAgICAvLyBCdWlsZCBwcm9wZXJ0aWVzIGluY2x1ZGluZyBfaWQgaWYgc2V0XG4gICAgICBsZXQgcHJvcHMgPSBub2RlLnByb3BlcnRpZXM7XG4gICAgICBpZiAobm9kZS5pZCkge1xuICAgICAgICBwcm9wcyA9IHsgX2lkOiBub2RlLmlkLCAuLi5wcm9wcyB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nKHByb3BzKTtcbiAgICAgIHJldHVybiBwcm9wU3RyID8gYCgke3Zhck5hbWV9OiR7bGFiZWx9ICR7cHJvcFN0cn0pYCA6IGAoJHt2YXJOYW1lfToke2xhYmVsfSlgO1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydEtleXdvcmRGb3JUeXBlKGNvbmZpZz8uaW5zZXJ0VHlwZSk7XG4gICAgY29uc3QgZ3FsU3RyID0gaW5zZXJ0S2V5d29yZCArICcgJyArIHBhcnRzLmpvaW4oJywgJykgKyAnIFJFVFVSTiAnICsgdmFyTmFtZXMuam9pbignLCAnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoZ3FsU3RyLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBlZGdlcyDigJQgYmFja3dhcmQtY29tcGF0aWJsZSBvdmVybG9hZGVkIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBUd28gY2FsbCBzaGFwZXMgYXJlIGFjY2VwdGVkOyB0aGUgcnVudGltZSBkaXNwYXRjaGVzIG9uIHRoZSBmaXJzdFxuICAgKiBhcmd1bWVudCdzIHR5cGU6XG4gICAqXG4gICAqICAgMS4gYGluc2VydEVkZ2VzKGdyYXBoTmFtZTogc3RyaW5nLCBlZGdlcywgY29uZmlnPylgIOKAlCBvcmlnaW5hbFxuICAgKiAgICAgIDYuMC4wIHNpZ25hdHVyZSwgcm91dGVzIHRocm91Z2ggdGhlIGJ1bGstaW1wb3J0IGdSUEMgcGF0aFxuICAgKiAgICAgIChgRGF0YVNlcnZpY2UuSW5zZXJ0RWRnZXNgKS4gUmV0dXJucyBgSW5zZXJ0RWRnZXNSZXN1bHRgIHdpdGhcbiAgICogICAgICBnUlBDLWxldmVsIG1ldGFkYXRhLiBQcmVzZXJ2ZXMgc291cmNlIGNvbXBhdGliaWxpdHkgZm9yXG4gICAqICAgICAgNi4wLjAgY2FsbGVycy5cbiAgICpcbiAgICogICAyLiBgaW5zZXJ0RWRnZXMoZWRnZXMsIGNvbmZpZz8pYCDigJQgY29udmVuaWVuY2UgR1FMIGVtaXR0ZXJcbiAgICogICAgICAoYWRkZWQgYWZ0ZXIgNi4wLjApLiBQZXIgZWRnZSBzeW50aGVzaXplc1xuICAgKiAgICAgIGBNQVRDSCAoc3JjIFdIRVJFIGlkKHNyYykgPSAnZnJvbScpLCAoZHN0IFdIRVJFIGlkKGRzdCkgPSAndG8nKSBJTlNFUlQgKHNyYyktW2UwOkxhYmVsIHsuLi59XS0+KGRzdCkgUkVUVVJOIGUwYC5cbiAgICogICAgICBSZXR1cm5zIGEgbWVyZ2VkIGBSZXNwb25zZWAgd2l0aCBjb2x1bW5zIGBlMCwgZTEsIC4uLmAuXG4gICAqL1xuICBhc3luYyBpbnNlcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PjtcbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+O1xuICBhc3luYyBpbnNlcnRFZGdlcyhcbiAgICBhcmcxOiBzdHJpbmcgfCBFZGdlRGF0YVtdLFxuICAgIGFyZzI/OiBFZGdlRGF0YVtdIHwgSW5zZXJ0Q29uZmlnLFxuICAgIGFyZzM/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0IHwgUmVzcG9uc2U+IHtcbiAgICAvLyBQYXRoIDE6IGxlZ2FjeSBidWxrLWdSUEMgc2lnbmF0dXJlXG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0RWRnZXMoXG4gICAgICAgIGFyZzEsXG4gICAgICAgIGFyZzIgYXMgRWRnZURhdGFbXSxcbiAgICAgICAgYXJnM1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQYXRoIDI6IGNvbnZlbmllbmNlIEdRTC1lbWl0dGVyIHNpZ25hdHVyZVxuICAgIGNvbnN0IGVkZ2VzID0gYXJnMTtcbiAgICBjb25zdCBjb25maWcgPSBhcmcyIGFzIEluc2VydENvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChlZGdlcy5sZW5ndGggPT09IDApIHJldHVybiBuZXcgUmVzcG9uc2UoW10sIFtdLCAwLCBmYWxzZSwgW10sIDApO1xuXG4gICAgY29uc3QgaW5zZXJ0S2V5d29yZCA9IGluc2VydEtleXdvcmRGb3JUeXBlKGNvbmZpZz8uaW5zZXJ0VHlwZSk7XG4gICAgY29uc3QgYWxsQ29sdW1uczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhbGxWYWx1ZXM6IGFueVtdID0gW107XG4gICAgbGV0IHRvdGFsQWZmZWN0ZWQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVkZ2UgPSBlZGdlc1tpXTtcbiAgICAgIGNvbnN0IHZhck5hbWUgPSBgZSR7aX1gO1xuICAgICAgY29uc3QgbGFiZWxQYXJ0ID0gZWRnZS5sYWJlbCA/ICc6JyArIEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwoZWRnZS5sYWJlbCkgOiAnJztcbiAgICAgIC8vIEJ1aWxkIHByb3BlcnRpZXMgaW5jbHVkaW5nIF9pZCBpZiBzZXQg4oCUIG1pcnJvcnMgdGhlIG5vZGVcbiAgICAgIC8vIGVtaXR0ZXIuICBUaGUgc2VydmVyJ3MgR1FMIHBhcnNlciBhY2NlcHRzXG4gICAgICAvLyBgW2UwOktub3dzIHtfaWQ6Jy4uLicsIC4uLn1dYCBhbmQgc3RvcmVzIHRoZSBlZGdlIGlkIHZlcmJhdGltXG4gICAgICAvLyB3aGVuIEVER0VfSUQgaXMgZW5hYmxlZCBvbiB0aGUgZ3JhcGguXG4gICAgICBsZXQgcHJvcHMgPSBlZGdlLnByb3BlcnRpZXM7XG4gICAgICBpZiAoZWRnZS5pZCAmJiBlZGdlLmlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcHJvcHMgPSB7IF9pZDogZWRnZS5pZCwgLi4uKGVkZ2UucHJvcGVydGllcyA/PyB7fSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhwcm9wcyk7XG4gICAgICBjb25zdCBlZGdlUGFydCA9IHByb3BTdHIgPyBgWyR7dmFyTmFtZX0ke2xhYmVsUGFydH0gJHtwcm9wU3RyfV1gIDogYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9XWA7XG4gICAgICBjb25zdCBncWxTdHIgPSBgTUFUQ0ggKHNyYyBXSEVSRSBpZChzcmMpID0gJyR7ZWRnZS5mcm9tTm9kZUlkfScpLCBgXG4gICAgICAgICsgYChkc3QgV0hFUkUgaWQoZHN0KSA9ICcke2VkZ2UudG9Ob2RlSWR9JykgYFxuICAgICAgICArIGAke2luc2VydEtleXdvcmR9IChzcmMpLSR7ZWRnZVBhcnR9LT4oZHN0KSBSRVRVUk4gJHt2YXJOYW1lfWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsU3RyLCBjb25maWcpO1xuICAgICAgdG90YWxBZmZlY3RlZCArPSByZXNwLnJvd3NBZmZlY3RlZDtcbiAgICAgIGFsbENvbHVtbnMucHVzaCh2YXJOYW1lKTtcbiAgICAgIGlmIChyZXNwLnJvd3MubGVuZ3RoID4gMCAmJiByZXNwLnJvd3NbMF0udmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWxsVmFsdWVzLnB1c2gocmVzcC5yb3dzWzBdLnZhbHVlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lcmdlZFJvdyA9IG5ldyBSb3coYWxsVmFsdWVzKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGFsbENvbHVtbnMsIFttZXJnZWRSb3ddLCAxLCBmYWxzZSwgW10sIHRvdGFsQWZmZWN0ZWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgU3lzdGVtICYgUHJvY2VzcyBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gY3VycmVudGx5IHJ1bm5pbmcgcHJvY2Vzc2VzIChxdWVyaWVzKSAqL1xuICBhc3luYyB0b3AoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFByb2Nlc3NJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1RPUCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSBhIHJ1bm5pbmcgcXVlcnkgYnkgaXRzIHF1ZXJ5IElEICovXG4gIGFzeW5jIGtpbGwocXVlcnlJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEtJTEwgJyR7cXVlcnlJZH0nYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgZ3JhcGggdXNpbmcgZGIuc3RhdHMoKSAqL1xuICBhc3luYyBzdGF0cyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8R3JhcGhTdGF0cz4ge1xuICAgIGNvbnN0IGN1cnJlbnRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdSRVRVUk4gZGIuc3RhdHMoKSBBUyBzdGF0cycsIGNvbmZpZyk7XG4gICAgY29uc3QgZ3MgPSBwYXJzZUdyYXBoU3RhdHMocmVzcCk7XG4gICAgaWYgKCFncy5ncmFwaE5hbWUpIGdzLmdyYXBoTmFtZSA9IGN1cnJlbnRHcmFwaDtcbiAgICByZXR1cm4gZ3M7XG4gIH1cblxuICAvKiogU2VuZCBhIHBpbmcgdG8gdGhlIHNlcnZlciBhbmQgcmV0dXJuIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzICovXG4gIGFzeW5jIHRlc3QoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5waW5nKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBBSSBPcGVyYXRpb25zICgyIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBZSUVMRCBjb2x1bW5zIGVtaXR0ZWQgYnkgQ0FMTCBhaS5yZWFkIC8gYWkuZ3FsIChrZXB0IGluIHN5bmMgd2l0aCBzZXJ2ZXIpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBSV9ZSUVMRF9DT0xTID1cbiAgICAnc3RhZ2UsIGRldGFpbCwgZWxhcHNlZF9tcywgdG9rZW5zX2lucHV0LCB0b2tlbnNfb3V0cHV0LCB0b2tlbnNfY2FjaGVkLCBkYXRhJztcblxuICAvKipcbiAgICogQXNrIHRoZSBBSSB0byBnZW5lcmF0ZSBhIEdRTCBzdGF0ZW1lbnQgYW5kIGF1dG8tZXhlY3V0ZSBpdC5cbiAgICpcbiAgICogV3JhcHMgYENBTEwgYWkucmVhZChcIjxwcm9tcHQ+XCIpIFlJRUxEIC4uLmAsIHN0cmVhbXMgc3RhZ2Ugcm93cyBmcm9tIHRoZVxuICAgKiBzZXJ2ZXIsIGFuZCByZS1ydW5zIHRoZSBzeW50aGVzaXplZCBHUUwgc28gYEFpUmVhZFJlc3VsdC5kYXRhYCBob2xkcyB0aGVcbiAgICogcmVhbCBxdWVyeSB7QGxpbmsgUmVzcG9uc2V9IChyb3dzIC8gY29sdW1ucykg4oCUIG1hdGNoaW5nIHdoYXQgTWFuYWdlciBVSVxuICAgKiBkaXNwbGF5cy5cbiAgICpcbiAgICogT25seSB0cmFuc3BvcnQtbGV2ZWwgZXJyb3JzIHJlamVjdCB0aGUgUHJvbWlzZS4gQUktc2lkZSBlcnJvcnMgc2V0XG4gICAqIGBzdWNjZXNzPWZhbHNlYCBhbmQgcG9wdWxhdGUgYGVycm9yYCwgd2l0aCBgZGF0YT1udWxsYC5cbiAgICovXG4gIGFzeW5jIGFpUmVhZChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFpUmVhZFJlc3VsdD4ge1xuICAgIGNvbnN0IGdxbCA9IGBDQUxMIGFpLnJlYWQoXCIke0dxbGRiQ2xpZW50LmVzY2FwZUFpUHJvbXB0KHByb21wdCl9XCIpIFlJRUxEICR7R3FsZGJDbGllbnQuQUlfWUlFTERfQ09MU31gO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZUFpUmVzdWx0KHJlc3ApO1xuICAgIC8vIEF1dG8gcmUtcnVuIHRoZSBnZW5lcmF0ZWQgR1FMIHNvIGBkYXRhYCBpcyBhIHByb3BlciBSZXNwb25zZSAocm93cy9jb2x1bW5zKSxcbiAgICAvLyBub3QgdGhlIGV4ZWN1dGlvbiBtZXRhZGF0YSBkaWN0IHJldHVybmVkIGluIHRoZSBmaW5hbCBzdGFnZS5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmdlbmVyYXRlZEdxbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSBhd2FpdCB0aGlzLmdxbChyZXN1bHQuZ2VuZXJhdGVkR3FsLCBjb25maWcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGBHZW5lcmF0ZWQgR1FMIGZhaWxlZCB0byBleGVjdXRlOiAke2U/Lm1lc3NhZ2UgPz8gU3RyaW5nKGUpfWA7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgQUkgdG8gZ2VuZXJhdGUgYSBHUUwgc3RhdGVtZW50ICp3aXRob3V0KiBleGVjdXRpbmcgaXQuXG4gICAqXG4gICAqIFRoZSBnZW5lcmF0ZWQgR1FMIGlzIGV4cG9zZWQgdmlhIGBBaVJlYWRSZXN1bHQuZ2VuZXJhdGVkR3FsYCBzbyB0aGVcbiAgICogY2FsbGVyIGNhbiByZXZpZXcgLyBlZGl0IGl0IGJlZm9yZSBydW5uaW5nIGl0IG1hbnVhbGx5IHZpYSBgY2xpZW50LmdxbCgpYC5cbiAgICogYEFpUmVhZFJlc3VsdC5kYXRhYCBpcyBhbHdheXMgbnVsbCBmb3IgYGFpR3FsYC5cbiAgICovXG4gIGFzeW5jIGFpR3FsKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWlSZWFkUmVzdWx0PiB7XG4gICAgY29uc3QgZ3FsID0gYENBTEwgYWkuZ3FsKFwiJHtHcWxkYkNsaWVudC5lc2NhcGVBaVByb21wdChwcm9tcHQpfVwiKSBZSUVMRCAke0dxbGRiQ2xpZW50LkFJX1lJRUxEX0NPTFN9YDtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VBaVJlc3VsdChyZXNwKTtcbiAgICAvLyBhaV9ncWwgaXMgXCJnZW5lcmF0ZSBvbmx5XCIg4oCUIG5ldmVyIGF1dG8tZXhlY3V0ZS5cbiAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBFc2NhcGUgYSBwcm9tcHQgc28gaXQgY2FuIGJlIHNhZmVseSBlbWJlZGRlZCBpbiBhIGRvdWJsZS1xdW90ZWQgR1FMIHN0cmluZy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYXBlQWlQcm9tcHQocHJvbXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9tcHQucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gIH1cblxuICAvKiogUGFyc2UgYSBDQUxMIGFpLnJlYWQgLyBhaS5ncWwgWUlFTEQgcmVzcG9uc2UgaW50byBhbiBBaVJlYWRSZXN1bHQuICovXG4gIHByaXZhdGUgcGFyc2VBaVJlc3VsdChyZXNwOiBSZXNwb25zZSk6IEFpUmVhZFJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBBaVJlYWRSZXN1bHQgPSB7XG4gICAgICBzdGFnZXM6IFtdLFxuICAgICAgZ2VuZXJhdGVkR3FsOiBudWxsLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRvdGFsRWxhcHNlZE1zOiAwLFxuICAgICAgdG90YWxUb2tlbnNJbnB1dDogMCxcbiAgICAgIHRvdGFsVG9rZW5zT3V0cHV0OiAwLFxuICAgICAgdG90YWxUb2tlbnNDYWNoZWQ6IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbElkeDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2xJZHhbcmVzcC5jb2x1bW5zW2ldXSA9IGk7XG4gICAgfVxuICAgIGNvbnN0IGdldENvbCA9IChyb3c6IFJvdywgbmFtZTogc3RyaW5nKTogYW55ID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IGNvbElkeFtuYW1lXTtcbiAgICAgIGlmIChpZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcm93LmdldChpZHgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXNwLnJvd3MpIHtcbiAgICAgIGNvbnN0IHN0YWdlVmFsID0gZ2V0Q29sKHJvdywgJ3N0YWdlJyk7XG4gICAgICBjb25zdCBkZXRhaWxWYWwgPSBnZXRDb2wocm93LCAnZGV0YWlsJyk7XG4gICAgICBjb25zdCBlbGFwc2VkVmFsID0gZ2V0Q29sKHJvdywgJ2VsYXBzZWRfbXMnKTtcbiAgICAgIGNvbnN0IHRJblZhbCA9IGdldENvbChyb3csICd0b2tlbnNfaW5wdXQnKTtcbiAgICAgIGNvbnN0IHRPdXRWYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX291dHB1dCcpO1xuICAgICAgY29uc3QgdENhY2hlZFZhbCA9IGdldENvbChyb3csICd0b2tlbnNfY2FjaGVkJyk7XG4gICAgICBjb25zdCBkYXRhVmFsID0gZ2V0Q29sKHJvdywgJ2RhdGEnKTtcblxuICAgICAgY29uc3Qgc3RhZ2U6IEFpU3RhZ2UgPSB7XG4gICAgICAgIHN0YWdlOiBzdGFnZVZhbCA9PSBudWxsID8gJycgOiBTdHJpbmcoc3RhZ2VWYWwpLFxuICAgICAgICBkZXRhaWw6IGRldGFpbFZhbCA9PSBudWxsID8gJycgOiBTdHJpbmcoZGV0YWlsVmFsKSxcbiAgICAgICAgZWxhcHNlZE1zOiBlbGFwc2VkVmFsID09IG51bGwgPyAwIDogTnVtYmVyKGVsYXBzZWRWYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc0lucHV0OiB0SW5WYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodEluVmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNPdXRwdXQ6IHRPdXRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodE91dFZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zQ2FjaGVkOiB0Q2FjaGVkVmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRDYWNoZWRWYWwpIHx8IDAsXG4gICAgICAgIGRhdGE6IGRhdGFWYWwsXG4gICAgICB9O1xuICAgICAgcmVzdWx0LnN0YWdlcy5wdXNoKHN0YWdlKTtcblxuICAgICAgLy8gVHJhY2sgYWdncmVnYXRlczogZWxhcHNlZF9tcyBpcyBjdW11bGF0aXZlIG9uIHNlcnZlciBzaWRlLCB0YWtlIG1heC5cbiAgICAgIGlmIChzdGFnZS5lbGFwc2VkTXMgPiByZXN1bHQudG90YWxFbGFwc2VkTXMpIHtcbiAgICAgICAgcmVzdWx0LnRvdGFsRWxhcHNlZE1zID0gc3RhZ2UuZWxhcHNlZE1zO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zSW5wdXQgKz0gc3RhZ2UudG9rZW5zSW5wdXQ7XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNPdXRwdXQgKz0gc3RhZ2UudG9rZW5zT3V0cHV0O1xuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zQ2FjaGVkICs9IHN0YWdlLnRva2Vuc0NhY2hlZDtcblxuICAgICAgLy8gRXh0cmFjdCBnZW5lcmF0ZWQgR1FMIGZyb20gYW55IHN0YWdlJ3MgZGF0YS5ncWwgLyAuZmluYWxfZ3FsIC8gLmNhbmRpZGF0ZVxuICAgICAgaWYgKHN0YWdlLmRhdGEgJiYgdHlwZW9mIHN0YWdlLmRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHN0YWdlLmRhdGEpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFsnZ3FsJywgJ2ZpbmFsX2dxbCcsICdjYW5kaWRhdGUnXSkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IChzdGFnZS5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5nZW5lcmF0ZWRHcWwgPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YWdlLnN0YWdlID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IHN0YWdlLmRldGFpbCB8fCAnQUkgc3RhZ2UgcmVwb3J0ZWQgZXJyb3InO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhZ2Uuc3RhZ2UgPT09ICdmaW5hbCcpIHtcbiAgICAgICAgLy8gU2VydmVyIGVtaXRzIGV4ZWN1dGlvbiBtZXRhZGF0YSBkaWN0IGhlcmU7IGFpUmVhZCBvdmVyd3JpdGVzIHdpdGggYSByZWFsXG4gICAgICAgIC8vIFJlc3BvbnNlIGFmdGVyIHJlLWV4ZWN1dGluZyB0aGUgZ2VuZXJhdGVkIEdRTC4gVGhlIGBhbnlgIGhlcmUgaXMgdW5hdm9pZGFibGVcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgc2VydmVyIGhhbmRzIGJhY2sgYSBKU09OIGRpY3QgYmVmb3JlIHdlIGtub3cgdGhlIGZpbmFsIHNoYXBlLlxuICAgICAgICAocmVzdWx0IGFzIGFueSkuZGF0YSA9IHN0YWdlLmRhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGlmIGdlbmVyYXRlZF9ncWwgd2FzIG5ldmVyIGNhcHR1cmVkIGZyb20gYSBkYXRhIGRpY3QsXG4gICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBmaW5hbCBzdGFnZSdzIGRldGFpbCBzdHJpbmcuXG4gICAgaWYgKHJlc3VsdC5nZW5lcmF0ZWRHcWwgPT09IG51bGwpIHtcbiAgICAgIGZvciAobGV0IGkgPSByZXN1bHQuc3RhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHMgPSByZXN1bHQuc3RhZ2VzW2ldO1xuICAgICAgICBpZiAocy5zdGFnZSA9PT0gJ2ZpbmFsJyAmJiBzLmRldGFpbCkge1xuICAgICAgICAgIHJlc3VsdC5nZW5lcmF0ZWRHcWwgPSBzLmRldGFpbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEludGVybmFsIEhlbHBlcnMg4oCUIFRyYWlsaW5nIENvbmZpZyBTcGxpdHRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTcGxpdCBhIHZhcmlhZGljIGFyZyBsaXN0IHdoZXJlIHRoZSBsYXN0IGVsZW1lbnQgKm1heSogYmUgYSBRdWVyeUNvbmZpZ1xuICogaW50byBzZXBhcmF0ZSBzdHJpbmcgbmFtZXMgYW5kIGFuIG9wdGlvbmFsIGNvbmZpZy4gUHl0aG9uIHVzZXMga2V5d29yZC1vbmx5XG4gKiBgY29uZmlnYCBpbiB0aGVzZSBBUElzOyB0aGUgVHlwZVNjcmlwdCBlcXVpdmFsZW50IGlzIGFuIG9wdGlvbmFsIHRyYWlsaW5nXG4gKiBjb25maWcgb2JqZWN0IGRldGVjdGVkIGJ5IFwibm90IGEgc3RyaW5nXCIuXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VHJhaWxpbmdDb25maWcoXG4gIGFyZ3M6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuKTogeyBuYW1lczogc3RyaW5nW107IGNvbmZpZz86IFF1ZXJ5Q29uZmlnIH0ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7IG5hbWVzOiBbXSB9O1xuICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICBpZiAobGFzdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsYXN0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IG5hbWVzOiBhcmdzLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXSwgY29uZmlnOiBsYXN0IGFzIFF1ZXJ5Q29uZmlnIH07XG4gIH1cbiAgLy8gSWYgbGFzdCBpcyB1bmRlZmluZWQsIHN0cmlwIGl0IGFzIGEgdHJhaWxpbmcgb3B0aW9uYWwgY29uZmlnIHBsYWNlaG9sZGVyLlxuICBpZiAobGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGFyZ3Muc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdIH07XG4gIH1cbiAgcmV0dXJuIHsgbmFtZXM6IGFyZ3MgYXMgc3RyaW5nW10gfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEludGVybmFsIEhlbHBlcnMg4oCUIFBhcnNpbmcgUmVzcG9uc2UgUm93c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEZpbmQgdGhlIGluZGV4IG9mIGEgY29sdW1uIGJ5IG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUpLCBvciAtMSBpZiBub3QgZm91bmQgKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW5JbmRleChyZXNwOiBSZXNwb25zZSwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlc3AuY29sdW1uc1tpXS50b0xvd2VyQ2FzZSgpID09PSBsb3dlcikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogU2FmZWx5IGV4dHJhY3QgYSBzdHJpbmcgZnJvbSBhIHJvdyBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG5mdW5jdGlvbiBnZXRTdHJpbmdWYWwocm93OiBSb3csIGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGlkeCA8IDApIHJldHVybiAnJztcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWwgPSByb3cuZ2V0KGlkeCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdCBhIG51bWJlciBmcm9tIGEgcm93IGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbmZ1bmN0aW9uIGdldE51bWJlclZhbChyb3c6IFJvdywgaWR4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuIDA7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsID0gcm93LmdldChpZHgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgIHJldHVybiBpc05hTihudW0pID8gMCA6IG51bTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGxhYmVsIGNvbHVtbiB2YWx1ZSB0byBhIHN0cmluZyBhcnJheS5cbiAqXG4gKiBTZXJ2ZXIgcmV0dXJucyBhIGxpc3QgKG11bHRpLWxhYmVsIHN1cHBvcnQpLiBBY2NlcHQgbGlzdCBvZiBzdHJpbmdzLFxuICogYSBzaW5nbGUgc3RyaW5nIChkZWdyYWRlZCBzZXJ2ZXJzKSwgb3IgbnVsbC91bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGFiZWxzVmFsdWUodmFsOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAoKHg6IGFueSkgPT4gU3RyaW5nKHgpKTtcbiAgcmV0dXJuIFtTdHJpbmcodmFsKV07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwOiBSZXNwb25zZSwgZm9yY2VkVHlwZT86IHN0cmluZyk6IExhYmVsSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbGFiZWxJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGlmIChsYWJlbElkeCA8IDApIGxhYmVsSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGxldCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGlmICh0eXBlSWR4IDwgMCkgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZWxlbWVudF90eXBlJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCByYXdMYWJlbCA9IGxhYmVsSWR4ID49IDAgPyByb3cuZ2V0KGxhYmVsSWR4KSA6IG51bGw7XG4gICAgY29uc3QgdHlwZSA9IGZvcmNlZFR5cGUgIT09IHVuZGVmaW5lZCA/IGZvcmNlZFR5cGUgOiBnZXRTdHJpbmdWYWwocm93LCB0eXBlSWR4KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWxzOiBwYXJzZUxhYmVsc1ZhbHVlKHJhd0xhYmVsKSxcbiAgICAgIHR5cGUsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9kZVR5cGVJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IE5vZGVUeXBlSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IHByb3BzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG5cbiAgaWYgKG5hbWVJZHggPCAwKSBuYW1lSWR4ID0gdHlwZUlkeDtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBwcm9wZXJ0aWVzOiBwYXJzZVByb3BlcnR5U3RyaW5nKGdldFN0cmluZ1ZhbChyb3csIHByb3BzSWR4KSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFZGdlVHlwZUluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogRWRnZVR5cGVJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgcHJvcHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcblxuICBpZiAobmFtZUlkeCA8IDApIG5hbWVJZHggPSB0eXBlSWR4O1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIHByb3BlcnRpZXM6IHBhcnNlUHJvcGVydHlTdHJpbmcoZ2V0U3RyaW5nVmFsKHJvdywgcHJvcHNJZHgpKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUFsZ29JbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEFsZ29JbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgZGVzY0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZGVzY3JpcHRpb24nKTtcbiAgY29uc3QgdmVySWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd2ZXJzaW9uJyk7XG4gIGNvbnN0IHBhcmFtc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncGFyYW1ldGVycycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRTdHJpbmdWYWwocm93LCBkZXNjSWR4KSxcbiAgICB2ZXJzaW9uOiBnZXRTdHJpbmdWYWwocm93LCB2ZXJJZHgpLFxuICAgIHBhcmFtZXRlcnM6IGdldFN0cmluZ1ZhbChyb3csIHBhcmFtc0lkeCksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogSW5kZXhJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeE5hbWUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4X25hbWUnKTtcbiAgY29uc3QgaWR4RW50aXR5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbnRpdHlfdHlwZScpO1xuICBjb25zdCBpZHhMYWJlbCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbGFiZWwnKTtcbiAgY29uc3QgaWR4UHJvcCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydHknKTtcbiAgY29uc3QgaWR4UHJlZml4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcmVmaXhfbGVuZ3RoJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuICBjb25zdCBpZHhJbmRleGVkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleGVkX2NvdW50Jyk7XG4gIGNvbnN0IGlkeFRvdGFsID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0b3RhbF9jb3VudCcpO1xuICBjb25zdCBpZHhFcnJvciA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZXJyb3InKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IGluZm86IEluZGV4SW5mbyA9IHtcbiAgICAgIGluZGV4TmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TmFtZSksXG4gICAgICBlbnRpdHlUeXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFbnRpdHkpLFxuICAgICAgbGFiZWw6IGdldFN0cmluZ1ZhbChyb3csIGlkeExhYmVsKSxcbiAgICAgIHByb3BlcnR5OiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9wKSxcbiAgICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gICAgICBpbmRleGVkQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeEluZGV4ZWQpLFxuICAgICAgdG90YWxDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4VG90YWwpLFxuICAgICAgZXJyb3I6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVycm9yKSxcbiAgICB9O1xuICAgIGlmIChpZHhQcmVmaXggPj0gMCkge1xuICAgICAgaW5mby5wcmVmaXhMZW5ndGggPSBnZXROdW1iZXJWYWwocm93LCBpZHhQcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEZ1bGx0ZXh0SW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhOYW1lID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleF9uYW1lJyk7XG4gIGNvbnN0IGlkeEVudGl0eSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZW50aXR5X3R5cGUnKTtcbiAgY29uc3QgaWR4U2NoZW1hID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzY2hlbWFfbmFtZScpO1xuICBjb25zdCBpZHhQcm9wcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuICBjb25zdCBpZHhBbmFseXplciA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnYW5hbHl6ZXInKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4RG9jQ291bnQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2RvY19jb3VudCcpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBpbmRleE5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeE5hbWUpLFxuICAgIGVudGl0eVR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVudGl0eSksXG4gICAgc2NoZW1hTmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U2NoZW1hKSxcbiAgICBwcm9wZXJ0aWVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9wcyksXG4gICAgYW5hbHl6ZXI6IGdldFN0cmluZ1ZhbChyb3csIGlkeEFuYWx5emVyKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgZG9jQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeERvY0NvdW50KSxcbiAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFza0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogVGFza0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4SWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Rhc2tfaWQnKTtcbiAgY29uc3QgaWR4VHlwZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBpZHhRdWVyeSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnknKTtcbiAgY29uc3QgaWR4QWxnbyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnYWxnb19uYW1lJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeFN0YXJ0ZWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXJ0ZWRfYXQnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG4gIGNvbnN0IGlkeFBhcmFtcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncGFyYW1ldGVycycpO1xuICBjb25zdCBpZHhOb2RlcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbm9kZXNfd3JpdHRlbicpO1xuICBjb25zdCBpZHhDb21wdXRlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdjb21wdXRlX3RpbWVfbXMnKTtcbiAgY29uc3QgaWR4V3JpdGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3dyaXRlX3RpbWVfbXMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICB0YXNrSWQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeElkKSxcbiAgICB0eXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhUeXBlKSxcbiAgICBxdWVyeTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UXVlcnkpLFxuICAgIGFsZ29OYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhBbGdvKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgc3RhcnRlZEF0OiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGFydGVkKSxcbiAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICAgIHBhcmFtZXRlcnM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFBhcmFtcyksXG4gICAgbm9kZXNXcml0dGVuOiBnZXROdW1iZXJWYWwocm93LCBpZHhOb2RlcyksXG4gICAgY29tcHV0ZVRpbWVNczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4Q29tcHV0ZSksXG4gICAgd3JpdGVUaW1lTXM6IGdldE51bWJlclZhbChyb3csIGlkeFdyaXRlKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVByb2Nlc3NJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IFByb2Nlc3NJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeElkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeV9pZCcpO1xuICBjb25zdCBpZHhUZXh0ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeV90ZXh0Jyk7XG4gIGNvbnN0IGlkeFN0YXJ0ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGFydF90aW1lJyk7XG4gIGNvbnN0IGlkeER1cmF0aW9uID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkdXJhdGlvbl9tcycpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIHF1ZXJ5SWQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeElkKSxcbiAgICBxdWVyeVRleHQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeFRleHQpLFxuICAgIHN0YXJ0VGltZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhcnQpLFxuICAgIGR1cmF0aW9uTXM6IGdldE51bWJlclZhbChyb3csIGlkeER1cmF0aW9uKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VHcmFwaFN0YXRzKHJlc3A6IFJlc3BvbnNlKTogR3JhcGhTdGF0cyB7XG4gIGNvbnN0IGdzOiBHcmFwaFN0YXRzID0ge1xuICAgIGdyYXBoTmFtZTogJycsXG4gICAgbm9kZUNvdW50OiAwLFxuICAgIGVkZ2VDb3VudDogMCxcbiAgICBsYWJlbENvdW50czoge30sXG4gICAgZWRnZUxhYmVsQ291bnRzOiB7fSxcbiAgICBub2RlUHJvcGVydHlTdGF0czoge30sXG4gICAgZWRnZVByb3BlcnR5U3RhdHM6IHt9LFxuICB9O1xuXG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gZ3M7XG5cbiAgbGV0IHN0YXRzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0cycpO1xuICBpZiAoc3RhdHNJZHggPCAwKSBzdGF0c0lkeCA9IDA7XG5cbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDAgfHwgc3RhdHNJZHggPj0gcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGgpIHJldHVybiBncztcblxuICBjb25zdCB2YWwgPSByZXNwLnJvd3NbMF0uZ2V0KHN0YXRzSWR4KTtcbiAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgIGlmICh2YWwuZ3JhcGhfbmFtZSAhPT0gdW5kZWZpbmVkKSBncy5ncmFwaE5hbWUgPSBTdHJpbmcodmFsLmdyYXBoX25hbWUpO1xuICAgIGlmICh2YWwubm9kZV9jb3VudCAhPT0gdW5kZWZpbmVkKSBncy5ub2RlQ291bnQgPSBOdW1iZXIodmFsLm5vZGVfY291bnQpIHx8IDA7XG4gICAgaWYgKHZhbC5lZGdlX2NvdW50ICE9PSB1bmRlZmluZWQpIGdzLmVkZ2VDb3VudCA9IE51bWJlcih2YWwuZWRnZV9jb3VudCkgfHwgMDtcbiAgfVxuXG4gIHJldHVybiBncztcbn1cblxuLy8gLS0tIERlbGV0ZSBBUEkgaGVscGVycyAtLS1cblxuZnVuY3Rpb24gZm9ybWF0U3RyaW5nTGlzdChpZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgLy8gRXNjYXBlIHNpbmdsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzIGZvciBzYWZlIEdRTCBpbmplY3Rpb24uXG4gIHJldHVybiBpZHMubWFwKGlkID0+IHtcbiAgICBpZiAoaWQgPT0gbnVsbCkgcmV0dXJuIFwiJydcIjtcbiAgICBjb25zdCBlc2NhcGVkID0gaWQucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIik7XG4gICAgcmV0dXJuIGAnJHtlc2NhcGVkfSdgO1xuICB9KS5qb2luKCcsICcpO1xufVxuXG4vKipcbiAqIFJlc2hhcGUgcmF3IDUtY29sIGVkZ2UtZGVsZXRlIHJlc3BvbnNlIGludG8gc2luZ2xlIFwiZVwiIGNvbHVtblxuICogaG9sZGluZyBHcWxkYkVkZ2Ugb2JqZWN0cyDigJQgc3ltbWV0cmljIHdpdGggdGhlIG5vZGUgcGF0aFxuICogKGByZXNwb25zZS5hbGlhcyhcIm5cIikuYXNOb2RlcygpYCB2cyBgcmVzcG9uc2UuYWxpYXMoXCJlXCIpLmFzRWRnZXMoKWApLlxuICogUm93cyB3aXRoIGEgbnVsbCBpZCBhcmUgc2tpcHBlZCAobm8gaWQgPSBubyBtZWFuaW5nZnVsIEVkZ2UpLlxuICovXG5mdW5jdGlvbiByZXNoYXBlRWRnZURlbGV0ZShyYXc6IFJlc3BvbnNlKTogUmVzcG9uc2Uge1xuICBjb25zdCBuZXdSb3dzOiBSb3dbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHIgb2YgcmF3LnJvd3MpIHtcbiAgICBjb25zdCBpZCA9IHIubGVuZ3RoID4gMCA/IHIuZ2V0KDApIDogbnVsbDtcbiAgICBpZiAoaWQgPT0gbnVsbCkgY29udGludWU7XG4gICAgY29uc3QgZnJvbSAgPSByLmxlbmd0aCA+IDEgPyByLmdldCgxKSA6IG51bGw7XG4gICAgY29uc3QgdG8gICAgPSByLmxlbmd0aCA+IDIgPyByLmdldCgyKSA6IG51bGw7XG4gICAgY29uc3QgbGFiZWwgPSByLmxlbmd0aCA+IDMgPyByLmdldCgzKSA6IG51bGw7XG4gICAgY29uc3QgcHJvcHMgPSByLmxlbmd0aCA+IDQgPyByLmdldCg0KSA6IHt9O1xuICAgIGNvbnN0IGVkZ2UgPSB7XG4gICAgICBpZDogU3RyaW5nKGlkKSxcbiAgICAgIHV1aWQ6ICcnLFxuICAgICAgbGFiZWw6IGxhYmVsID8gU3RyaW5nKGxhYmVsKSA6ICcnLFxuICAgICAgZnJvbU5vZGVJZDogZnJvbSA/IFN0cmluZyhmcm9tKSA6ICcnLFxuICAgICAgdG9Ob2RlSWQ6IHRvID8gU3RyaW5nKHRvKSA6ICcnLFxuICAgICAgcHJvcGVydGllczogKHByb3BzICYmIHR5cGVvZiBwcm9wcyA9PT0gJ29iamVjdCcpID8gcHJvcHMgOiB7fSxcbiAgICB9O1xuICAgIC8vIE1hcmsgdGhlIGNvbHVtbiBhcyBQcm9wZXJ0eVR5cGUuRURHRSBzbyBBbGlhc1Jlc3VsdC5hc0VkZ2VzKCkgcGlja3MgaXQgdXAuXG4gICAgbmV3Um93cy5wdXNoKG5ldyBSb3coW2VkZ2VdLCBbUHJvcGVydHlUeXBlLkVER0VdKSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZXNwb25zZShbJ2UnXSwgbmV3Um93cywgbmV3Um93cy5sZW5ndGgsIHJhdy5oYXNNb3JlLFxuICAgICAgICAgICAgICAgICAgICAgcmF3Lndhcm5pbmdzLCByYXcucm93c0FmZmVjdGVkLCByYXcuY3VycmVudEdyYXBoLFxuICAgICAgICAgICAgICAgICAgICAgcmF3LnRpbWVDb3N0TnMsIHJhdy5kaXNrQ29zdE5zLCByYXcuY29tcHV0ZUNvc3ROcyk7XG59XG4iXX0=
1593
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBVW9CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBOENpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBK0QxQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUE0QjtJQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxrQkFBVSxDQUFDLFNBQVM7WUFDdkIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixLQUFLLGtCQUFVLENBQUMsTUFBTTtZQUNwQixPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQWEsV0FBVztJQUNkLE1BQU0sQ0FBYztJQUNwQixPQUFPLENBQWlCO0lBQ3hCLFFBQVEsQ0FBaUI7SUFDekIsU0FBUyxDQUFxQjtJQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLHdDQUF3QztJQUNoQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUVqQyxxRUFBcUU7SUFDN0QsUUFBUSxHQUFXLEVBQUUsQ0FBQztJQUN0QixlQUFlLENBQTJCO0lBQzFDLGtCQUFrQixDQUF1QjtJQUN6QyxHQUFHLENBQWtCO0lBRTdCLG9CQUFvQjtJQUNaLGNBQWMsQ0FBaUI7SUFDL0IsWUFBWSxDQUFlO0lBQzNCLFlBQVksQ0FBZTtJQUMzQixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBQ3pCLGFBQWEsQ0FBZ0I7SUFDN0IsWUFBWSxD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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNDLE1BQU0sSUFBSSxHQUFHO1lBQ1gsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDZCxJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDcEMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLFVBQVUsRUFBRSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQzlELENBQUM7UUFDRiw2RUFBNkU7UUFDN0UsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sSUFBSSxtQkFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFDNUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQ2hELEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFpbiBjbGllbnQgZm9yIEdRTERCIE5vZGUuanMgZHJpdmVyLlxuICovXG5cbmltcG9ydCAqIGFzIGdycGMgZnJvbSAnQGdycGMvZ3JwYy1qcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgR3FsZGJDb25maWcsIHZhbGlkYXRlQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgRW1wdHlRdWVyeUVycm9yLCBMb2dpbkZhaWxlZEVycm9yLCBRdWVyeUZhaWxlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgUmVzcG9uc2UsXG4gIFJvdyxcbiAgSW5zZXJ0Tm9kZXNSZXN1bHQsXG4gIEluc2VydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnROb2Rlc1Jlc3VsdCxcbiAgRXhwb3J0RWRnZXNSZXN1bHQsXG4gIEV4cG9ydENvbmZpZyxcbiAgRXhwb3J0Q2h1bmssXG4gIEV4cG9ydFN0YXRzLFxufSBmcm9tICcuL3Jlc3BvbnNlJztcbmltcG9ydCB7IFNlc3Npb24sIFNlc3Npb25NYW5hZ2VyIH0gZnJvbSAnLi9zZXNzaW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbk1hbmFnZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIEdyYXBoSW5mbyxcbiAgR3JhcGhUeXBlLFxuICBFZGdlSWRNb2RlLFxuICBIZWFsdGhTdGF0dXMsXG4gIENhY2hlU3RhdHMsXG4gIENhY2hlVHlwZSxcbiAgU3RhdGlzdGljcyxcbiAgQ29tcGFjdFJlc3VsdCxcbiAgQ29tcHV0ZVRvcG9sb2d5UmVzdWx0LFxuICBTeXN0ZW1NZXRyaWNzLFxuICBOb2RlRGF0YSxcbiAgRWRnZURhdGEsXG4gIEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnMsXG4gIEJ1bGtDcmVhdGVFZGdlc09wdGlvbnMsXG4gIEJ1bGtJbXBvcnRPcHRpb25zLFxuICBCdWxrSW1wb3J0U2Vzc2lvbixcbiAgQ2hlY2twb2ludFJlc3VsdCxcbiAgRW5kQnVsa0ltcG9ydFJlc3VsdCxcbiAgQWJvcnRCdWxrSW1wb3J0UmVzdWx0LFxuICBCdWxrSW1wb3J0U3RhdHVzLFxuICBUcmFuc2FjdGlvbkluZm8sXG4gIFRyYW5zYWN0aW9uUm93LFxuICBEQlR5cGUsXG4gIEluc2VydFR5cGUsXG4gIFByb3BlcnR5VHlwZSxcbiAgTGFiZWxJbmZvLFxuICBOb2RlVHlwZUluZm8sXG4gIEVkZ2VUeXBlSW5mbyxcbiAgTGFiZWxEZWYsXG4gIENvbnZQcm9wZXJ0eURlZixcbiAgSW5kZXhQcm9wZXJ0eSxcbiAgSW5kZXhJbmZvLFxuICBGdWxsdGV4dEluZm8sXG4gIFRhc2tJbmZvLFxuICBQcm9jZXNzSW5mbyxcbiAgR3JhcGhTdGF0cyxcbiAgQWxnb0luZm8sXG4gIEFpU3RhZ2UsXG4gIEFpUmVhZFJlc3VsdCxcbiAgcGFyc2VQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0eURlZlN0cmluZyxcbiAgYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nLFxuICBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyxcbiAgdXNlR3JhcGhQcmVmaXgsXG4gIGRiVHlwZVRvS2V5d29yZCxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXJ2aWNlQ2xpZW50cywgcHJvbWlzaWZ5Q2FsbCwgcHJvbWlzaWZ5Q2FsbFdpdGhEZWFkbGluZSB9IGZyb20gJy4vc2VydmljZXMnO1xuaW1wb3J0IHtcbiAgU2VydmljZUNvbnRleHQsXG4gIFNlcnZpY2VDbGllbnRzLFxuICBTZXNzaW9uU2VydmljZSxcbiAgUXVlcnlTZXJ2aWNlLFxuICBHcmFwaFNlcnZpY2UsXG4gIFRyYW5zYWN0aW9uU2VydmljZSxcbiAgRGF0YVNlcnZpY2UsXG4gIEhlYWx0aFNlcnZpY2UsXG4gIEFkbWluU2VydmljZSxcbiAgQnVsa0ltcG9ydFNlcnZpY2UsXG59IGZyb20gJy4vc2VydmljZXMvaW5kZXgnO1xuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgYSBxdWVyeSAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XG4gIGdyYXBoTmFtZT86IHN0cmluZztcbiAgcGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHRyYW5zYWN0aW9uSWQ/OiBudW1iZXI7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbiAgLyoqIE1heCBwYXRocyB0byByZXR1cm4gZnJvbSBwYXRoIHF1ZXJpZXMgKDAgPSB1bmxpbWl0ZWQpICovXG4gIG1heFBhdGhSZXN1bHRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydE5vZGVzIC8gaW5zZXJ0RWRnZXMgY29udmVuaWVuY2UgbWV0aG9kcy5cbiAqIEV4dGVuZHMgUXVlcnlDb25maWcgd2l0aCBpbnNlcnQtc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb25maWcgZXh0ZW5kcyBRdWVyeUNvbmZpZyB7XG4gIC8qKiBJbnNlcnQgbW9kZS4gRGVmYXVsdHMgdG8gSW5zZXJ0VHlwZS5Ob3JtYWwgd2hlbiBvbWl0dGVkLiAqL1xuICBpbnNlcnRUeXBlPzogSW5zZXJ0VHlwZTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgbmV3IEdRTC1lbWl0dGVyIGRlbGV0ZSBBUElcbiAqIChkZWxldGVOb2Rlc0J5SWRzIC8gZGVsZXRlTm9kZXNCeUNvbmRpdGlvbiAvXG4gKiAgZGVsZXRlRWRnZXNCeUlkcyAvIGRlbGV0ZUVkZ2VzQnlDb25kaXRpb24pLlxuICpcbiAqIEV4dGVuZHMgUXVlcnlDb25maWcgc28gcGVyLWNhbGwgYGdyYXBoTmFtZWAgd29ya3MgdGhlIHNhbWUgYXNcbiAqIGBJbnNlcnRDb25maWdgLiBUd28gZGVsZXRlLXNwZWNpZmljIGtub2JzOlxuICogICAtIGByZXR1cm5EZWxldGVkYCAoZGVmYXVsdCB0cnVlKSDigJQgZW1pdCBgUkVUVVJOIC4uLmAgc28gdGhlXG4gKiAgICAgcmVzcG9uc2UgY2FycmllcyB0aGUgZnVsbCBkZWxldGVkIG5vZGUvZWRnZSBkYXRhLiBTZXQgdG8gZmFsc2VcbiAqICAgICBvbiBsYXJnZSBidWxrIGRlbGV0ZXMgdG8gc2F2ZSBiYW5kd2lkdGg7IGByb3dzQWZmZWN0ZWRgIHN0aWxsXG4gKiAgICAgY2FycmllcyB0aGUgY291bnQuXG4gKiAgIC0gYGFsbG93RGVsZXRlQWxsYCAoZGVmYXVsdCBmYWxzZSkg4oCUIHNhZmV0eSBsYXRjaC4gV2l0aCBlbXB0eVxuICogICAgIGxhYmVscy9pZHMgQU5EIGVtcHR5IHdoZXJlLCB0aGUgU0RLIHdvdWxkIG90aGVyd2lzZSBlbWl0IGFcbiAqICAgICBncmFwaC13aWRlIGRlbGV0ZTsgdGhpcyBmbGFnIG11c3QgYmUgZXhwbGljaXRseSB0cnVlIHRvIG9wdCBpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWxldGVDb25maWcgZXh0ZW5kcyBRdWVyeUNvbmZpZyB7XG4gIHJldHVybkRlbGV0ZWQ/OiBib29sZWFuO1xuICBhbGxvd0RlbGV0ZUFsbD86IGJvb2xlYW47XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgbm9kZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Tm9kZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZU5vZGVzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGluc2VydCBlZGdlcyAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRFZGdlc0NvbmZpZyB7XG4gIG9wdGlvbnM/OiBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zO1xuICBidWxrSW1wb3J0U2Vzc2lvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhlYWx0aCB3YXRjaGVyIGludGVyZmFjZSBmb3Igc3RyZWFtaW5nIGhlYWx0aCB1cGRhdGVzLlxuICogRW1pdHMgJ3N0YXR1cycgZXZlbnRzIHdpdGggSGVhbHRoU3RhdHVzIGFuZCAnZXJyb3InIGV2ZW50cyBvbiBmYWlsdXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aFdhdGNoZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKiogU3RvcCB3YXRjaGluZyBoZWFsdGggdXBkYXRlcyAqL1xuICBzdG9wKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogTWFwIGFuIGBJbnNlcnRUeXBlYCB2YWx1ZSB0byB0aGUgR1FMIGtleXdvcmQocykgc2VsZWN0aW5nIHRoZVxuICogbWF0Y2hpbmcgc2VydmVyLXNpZGUgc2VtYW50aWNzLlxuICpcbiAqICAgLSBgSW5zZXJ0VHlwZS5Ob3JtYWxgICAgIC0+IGBcIklOU0VSVFwiYCAoZXJyb3Igb24gZHVwbGljYXRlIGBfaWRgKVxuICogICAtIGBJbnNlcnRUeXBlLk92ZXJ3cml0ZWAgLT4gYFwiSU5TRVJUIE9WRVJXUklURVwiYCAocmVwbGFjZSBvbiBkdXBsaWNhdGUpXG4gKiAgIC0gYEluc2VydFR5cGUuVXBzZXJ0YCAgICAtPiBgXCJVUFNFUlRcImAgKG1lcmdlIG9uIGR1cGxpY2F0ZSlcbiAqXG4gKiBgT3ZlcndyaXRlYCBhbmQgYFVwc2VydGAgYXJlIGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gZXhpc3Rpbmcgcm93cztcbiAqIHRoZXkgYXJlIE5PVCBpbnRlcmNoYW5nZWFibGUuIFNlZSB7QGxpbmsgSW5zZXJ0VHlwZX0gZG9jcy5cbiAqL1xuZnVuY3Rpb24gaW5zZXJ0S2V5d29yZEZvclR5cGUodHlwZTogSW5zZXJ0VHlwZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgSW5zZXJ0VHlwZS5PdmVyd3JpdGU6XG4gICAgICByZXR1cm4gJ0lOU0VSVCBPVkVSV1JJVEUnO1xuICAgIGNhc2UgSW5zZXJ0VHlwZS5VcHNlcnQ6XG4gICAgICByZXR1cm4gJ1VQU0VSVCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAnSU5TRVJUJztcbiAgfVxufVxuXG4vKiogTWFpbiBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggR1FMREIgKi9cbmV4cG9ydCBjbGFzcyBHcWxkYkNsaWVudCB7XG4gIHByaXZhdGUgY29uZmlnOiBHcWxkYkNvbmZpZztcbiAgcHJpdmF0ZSBjbGllbnRzOiBTZXJ2aWNlQ2xpZW50cztcbiAgcHJpdmF0ZSBzZXNzaW9uczogU2Vzc2lvbk1hbmFnZXI7XG4gIHByaXZhdGUgdHhNYW5hZ2VyOiBUcmFuc2FjdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgLy8gU3RvcmVkIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICBwcml2YXRlIHN0b3JlZFVzZXJuYW1lOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBzdG9yZWRQYXNzd29yZDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkR3JhcGg6IHN0cmluZyA9ICcnO1xuXG4gIC8vIENhY2hlZCBnUlBDIHBsdW1iaW5nIHNvIHdlIGNhbiByZWJ1aWxkIHRoZSBjaGFubmVsIG9uIFVOQVZBSUxBQkxFLlxuICBwcml2YXRlIGdycGNIb3N0OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBncnBjQ3JlZGVudGlhbHMhOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgcHJpdmF0ZSBncnBjQ2hhbm5lbE9wdGlvbnMhOiBncnBjLkNoYW5uZWxPcHRpb25zO1xuICBwcml2YXRlIGN0eCE6IFNlcnZpY2VDb250ZXh0O1xuXG4gIC8vIFNlcnZpY2UgaW5zdGFuY2VzXG4gIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlO1xuICBwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlO1xuICBwcml2YXRlIGdyYXBoU2VydmljZTogR3JhcGhTZXJ2aWNlO1xuICBwcml2YXRlIHRyYW5zYWN0aW9uU2VydmljZTogVHJhbnNhY3Rpb25TZXJ2aWNlO1xuICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZTtcbiAgcHJpdmF0ZSBoZWFsdGhTZXJ2aWNlOiBIZWFsdGhTZXJ2aWNlO1xuICBwcml2YXRlIGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlO1xuICBwcml2YXRlIGJ1bGtJbXBvcnRTZXJ2aWNlOiBCdWxrSW1wb3J0U2VydmljZTtcblxuICAvKiogR2V0IHNlc3Npb24gbWV0YWRhdGEgZm9yIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgKi9cbiAgcHJpdmF0ZSBnZXRTZXNzaW9uTWV0YWRhdGEoKTogZ3JwYy5NZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBuZXcgZ3JwYy5NZXRhZGF0YSgpO1xuICAgIGNvbnN0IHNlc3Npb24gPSB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKTtcbiAgICBtZXRhZGF0YS5hZGQoJ3Nlc3Npb24taWQnLCBzZXNzaW9uPy5pZD8udG9TdHJpbmcoKSB8fCAnMCcpO1xuICAgIGlmICh0aGlzLmNsaWVudFNlc3Npb25JZCkge1xuICAgICAgbWV0YWRhdGEuYWRkKCd4LXVsdGlwYS1zZXNzaW9uLWlkJywgdGhpcy5jbGllbnRTZXNzaW9uSWQpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU3RhYmxlIHBlci1jbGllbnQgbG9naWNhbCBzZXNzaW9uIGlkIHN1cmZhY2VkIHVuZGVyIHRoZVxuICAgKiB0cmFuc2FjdGlvbi1icmFuY2ggbW9kZWwuIFNlZSBUUkFOU0FDVElPTlNfRFJJVkVSX0dVSURFLm1kIMKnMi4w4oCTMi4xLlxuICAgKiBGYWxscyBiYWNrIHRvIGEgVVVJRCB2NCBoZXggZ2VuZXJhdGVkIGF0IGNvbnN0cnVjdGlvbiB3aGVuXG4gICAqIGBjb25maWcuc2Vzc2lvbklkYCBpcyBub3Qgc2V0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudFNlc3Npb25JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogR3FsZGJDb25maWcpIHtcbiAgICB2YWxpZGF0ZUNvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbk1hbmFnZXIoKTtcbiAgICB0aGlzLnR4TWFuYWdlciA9IG5ldyBUcmFuc2FjdGlvbk1hbmFnZXIoKTtcbiAgICAvLyBCb290c3RyYXAgc3RhYmxlIHBlci1jbGllbnQgc2Vzc2lvbiBpZCAodXNlZCBhcyBgeC11bHRpcGEtc2Vzc2lvbi1pZGBcbiAgICAvLyBtZXRhZGF0YSB3aGVuIMKnMi4xIG9wdC1pbiBpcyBlbmFibGVkLCBhbmQgc3VyZmFjZWQgb24gZXZlcnkgVHJhbnNhY3Rpb24pLlxuICAgIGNvbnN0IGNmZ1NpZCA9IChjb25maWcgYXMgYW55KS5zZXNzaW9uSWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xpZW50U2Vzc2lvbklkID0gY2ZnU2lkICYmIGNmZ1NpZC5sZW5ndGggPiAwXG4gICAgICA/IGNmZ1NpZFxuICAgICAgOiByZXF1aXJlKCdjcnlwdG8nKS5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgLy8gQ3JlYXRlIGdSUEMgY3JlZGVudGlhbHNcbiAgICBsZXQgY3JlZGVudGlhbHM6IGdycGMuQ2hhbm5lbENyZWRlbnRpYWxzO1xuICAgIGlmIChjb25maWcudGxzT3B0aW9ucykge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZVNzbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcmVkZW50aWFscyA9IGdycGMuY3JlZGVudGlhbHMuY3JlYXRlSW5zZWN1cmUoKTtcbiAgICB9XG5cbiAgICAvLyBDaGFubmVsIG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zOiBncnBjLkNoYW5uZWxPcHRpb25zID0ge1xuICAgICAgJ2dycGMubWF4X3JlY2VpdmVfbWVzc2FnZV9sZW5ndGgnOiBjb25maWcubWF4UmVjdlNpemUgPz8gNjQgKiAxMDI0ICogMTAyNCxcbiAgICAgICdncnBjLm1heF9zZW5kX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfdGltZV9tcyc6IDMwMDAwLFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVvdXRfbXMnOiAxMDAwMCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV9wZXJtaXRfd2l0aG91dF9jYWxscyc6IDEsXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGNsaWVudHMgZm9yIHRoZSBmaXJzdCBob3N0XG4gICAgY29uc3QgaG9zdCA9IGNvbmZpZy5ob3N0c1swXTtcbiAgICB0aGlzLmdycGNIb3N0ID0gaG9zdDtcbiAgICB0aGlzLmdycGNDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xuICAgIHRoaXMuZ3JwY0NoYW5uZWxPcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNsaWVudHMgPSBjcmVhdGVTZXJ2aWNlQ2xpZW50cyhob3N0LCBjcmVkZW50aWFscywgb3B0aW9ucyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHNlcnZpY2UgY29udGV4dFxuICAgIGNvbnN0IGN0eCA9IG5ldyBTZXJ2aWNlQ29udGV4dCh0aGlzLmNvbmZpZywgdGhpcy5zZXNzaW9ucywgdGhpcy50eE1hbmFnZXIsIHRoaXMuY2xpZW50cywgdGhpcy5jbGllbnRTZXNzaW9uSWQpO1xuICAgIHRoaXMuY3R4ID0gY3R4O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2aWNlIGluc3RhbmNlc1xuICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UgPSBuZXcgU2Vzc2lvblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLnF1ZXJ5U2VydmljZSA9IG5ldyBRdWVyeVNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmdyYXBoU2VydmljZSA9IG5ldyBHcmFwaFNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uU2VydmljZSA9IG5ldyBUcmFuc2FjdGlvblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlID0gbmV3IERhdGFTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5oZWFsdGhTZXJ2aWNlID0gbmV3IEhlYWx0aFNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmFkbWluU2VydmljZSA9IG5ldyBBZG1pblNlcnZpY2UoY3R4KTtcbiAgICB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlID0gbmV3IEJ1bGtJbXBvcnRTZXJ2aWNlKGN0eCk7XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIGNsaWVudCBhbmQgYWxsIGNvbm5lY3Rpb25zICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNsb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnNlc3Npb25zLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dvdXQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWdub3JlIGxvZ291dCBlcnJvcnMgZHVyaW5nIGNsb3NlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgYWxsIHNlcnZpY2UgY2xpZW50c1xuICAgIHRyeSB7XG4gICAgICAodGhpcy5jbGllbnRzLnNlc3Npb25TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5xdWVyeVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmdyYXBoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMudHJhbnNhY3Rpb25TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5kYXRhU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuaGVhbHRoU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYWRtaW5TZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5idWxrSW1wb3J0U2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY2xvc2UgZXJyb3JzXG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNlc3Npb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQXV0aGVudGljYXRlIHRoZSB1c2VyIGFuZCBjcmVhdGUgYSBzZXNzaW9uICovXG4gIGFzeW5jIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5zZXNzaW9uU2VydmljZS5sb2dpbih1c2VybmFtZSwgcGFzc3dvcmQsIHRoaXMuY29uZmlnLmRlZmF1bHRHcmFwaCB8fCAnJyk7XG4gICAgLy8gU3RvcmUgY3JlZGVudGlhbHMgZm9yIGF1dG8tcmVjb25uZWN0XG4gICAgdGhpcy5zdG9yZWRVc2VybmFtZSA9IHVzZXJuYW1lO1xuICAgIHRoaXMuc3RvcmVkUGFzc3dvcmQgPSBwYXNzd29yZDtcbiAgICByZXR1cm4gc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJ1aWxkIGV2ZXJ5IGdSUEMgY2xpZW50IHVzZWQgYnkgdGhpcyBjb25uZWN0aW9uIHNvIHRoZSBuZXh0IGNhbGxcbiAgICogZ2V0cyBhIGZyZXNoIGNoYW5uZWwuICBDYWxsZWQgYnkgd2l0aEF1dG9SZWNvbm5lY3Qgd2hlbiBhIGNhbGxcbiAgICogZmFpbHMgd2l0aCBVTkFWQUlMQUJMRSAvIGNvbm5lY3Rpb24gcmVzZXQuICBEb2VzIE5PVCBjbG9zZSBvbGRcbiAgICogY2xpZW50cyBzeW5jaHJvbm91c2x5IOKAlCBpbi1mbGlnaHQgY2FsbHMgaG9sZCB0aGVtIGFsaXZlIGFuZCBnUlBDXG4gICAqIGNsb3NlcyB0aGVtIG9uY2UgdGhvc2UgY2FsbHMgY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGZvcmNlUmVjb25uZWN0QWxsKCk6IHZvaWQge1xuICAgIGNvbnN0IGZyZXNoID0gY3JlYXRlU2VydmljZUNsaWVudHMoXG4gICAgICB0aGlzLmdycGNIb3N0LFxuICAgICAgdGhpcy5ncnBjQ3JlZGVudGlhbHMsXG4gICAgICB0aGlzLmdycGNDaGFubmVsT3B0aW9uc1xuICAgICk7XG4gICAgLy8gTXV0YXRlIGluIHBsYWNlIHNvIGV4aXN0aW5nIHNlcnZpY2UgaW5zdGFuY2VzIHBpY2sgdXAgdGhlIG5ld1xuICAgIC8vIGNsaWVudHMgKHRoZXkgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGlzLmN0eC5jbGllbnRzKS5cbiAgICBPYmplY3QuYXNzaWduKHRoaXMuY2xpZW50cywgZnJlc2gpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jdHguY2xpZW50cywgZnJlc2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgZm4gd2l0aCB0d28gcmVjb3ZlcnkgYmVoYXZpb3VyczpcbiAgICogICAtIFVOQVVUSEVOVElDQVRFRCDigJQgaWYgc3RvcmVkIGNyZWRlbnRpYWxzIGFyZSBhdmFpbGFibGUsIHJlLWxvZ2luXG4gICAqICAgICBhbmQgcmV0cnkgZm4gb25jZS5cbiAgICogICAtIFVOQVZBSUxBQkxFIC8gY29ubmVjdGlvbiByZXNldCDigJQgcmVidWlsZCBldmVyeSBnUlBDIGNsaWVudCBzb1xuICAgKiAgICAgdGhlIE5FWFQgY2FsbCBnZXRzIGEgZnJlc2ggY2hhbm5lbC4gIFRoZSBjdXJyZW50IGNhbGwgaXMgTk9UXG4gICAqICAgICByZXRyaWVkOyBjYWxsZXIgZGVjaWRlcyAod3JpdGUtc2lkZSBjYWxscyBhcmUgb2Z0ZW4gbm90XG4gICAqICAgICBpZGVtcG90ZW50KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2l0aEF1dG9SZWNvbm5lY3Q8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBtc2dMb3dlciA9IGU/Lm1lc3NhZ2UgPyBTdHJpbmcoZS5tZXNzYWdlKS50b0xvd2VyQ2FzZSgpIDogJyc7XG4gICAgICBjb25zdCBpc1VuYXV0aGVudGljYXRlZCA9XG4gICAgICAgIChlPy5jb2RlID09PSBncnBjLnN0YXR1cy5VTkFVVEhFTlRJQ0FURUQpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCd1bmF1dGhlbnRpY2F0ZWQnKSB8fFxuICAgICAgICBtc2dMb3dlci5pbmNsdWRlcygnc2Vzc2lvbiBub3QgZm91bmQnKSB8fFxuICAgICAgICBtc2dMb3dlci5pbmNsdWRlcygnc2Vzc2lvbiBleHBpcmVkJyk7XG4gICAgICBpZiAoaXNVbmF1dGhlbnRpY2F0ZWQgJiYgdGhpcy5zdG9yZWRVc2VybmFtZSkge1xuICAgICAgICAvLyBTYXZlIGN1cnJlbnQgZ3JhcGggY29udGV4dCBiZWZvcmUgcmUtbG9naW5cbiAgICAgICAgY29uc3Qgc2F2ZWRHcmFwaCA9IHRoaXMuc3RvcmVkR3JhcGg7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2dpbih0aGlzLnN0b3JlZFVzZXJuYW1lLCB0aGlzLnN0b3JlZFBhc3N3b3JkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhyb3cgZTsgLy8gUmV0dXJuIG9yaWdpbmFsIGVycm9yIGlmIHJlLWxvZ2luIGZhaWxzXG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVzdG9yZSBncmFwaCBjb250ZXh0IGFmdGVyIHJlLWxvZ2luXG4gICAgICAgIGlmIChzYXZlZEdyYXBoICYmIHNhdmVkR3JhcGggIT09ICdfX3N5c3RlbV9fJykge1xuICAgICAgICAgIHRyeSB7IGF3YWl0IHRoaXMudXNlR3JhcGgoc2F2ZWRHcmFwaCk7IH0gY2F0Y2ggeyAvKiBiZXN0IGVmZm9ydCAqLyB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuKCk7IC8vIFJldHJ5IG9uY2VcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNVbmF2YWlsYWJsZSA9XG4gICAgICAgIChlPy5jb2RlID09PSBncnBjLnN0YXR1cy5VTkFWQUlMQUJMRSkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ2Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcicpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzb2NrZXQgY2xvc2VkJykgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3RyYW5zcG9ydCBpcyBjbG9zaW5nJyk7XG4gICAgICBpZiAoaXNVbmF2YWlsYWJsZSkge1xuICAgICAgICB0cnkgeyB0aGlzLmZvcmNlUmVjb25uZWN0QWxsKCk7IH0gY2F0Y2ggeyAvKiBiZXN0IGVmZm9ydCAqLyB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSB0aGUgY3VycmVudCBzZXNzaW9uICovXG4gIGFzeW5jIGxvZ291dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5sb2dvdXQoKTtcbiAgfVxuXG4gIC8qKiBDaGVjayB0aGUgY29ubmVjdGlvbiBhbmQgcmV0dXJuIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzICovXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9uU2VydmljZS5waW5nKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUXVlcnkgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKi9cbiAgYXN5bmMgZ3FsKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbChxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIEdRTCBxdWVyeSBhbmQgc3RyZWFtIHRoZSByZXN1bHRzICovXG4gIGFzeW5jIGdxbFN0cmVhbShcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5ncWxTdHJlYW0ocXVlcnksIGNvbmZpZywgY2FsbGJhY2spKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIGV4ZWN1dGlvbiBwbGFuIGZvciBhIHF1ZXJ5ICovXG4gIGFzeW5jIGV4cGxhaW4ocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmV4cGxhaW4ocXVlcnksIGNvbmZpZykpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBxdWVyeSB3aXRoIHByb2ZpbGluZyBhbmQgcmV0dXJuIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgcHJvZmlsZShxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UucHJvZmlsZShxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gR3JhcGggU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGdyYXBoLlxuICAgKlxuICAgKiBXaGVuIGBlZGdlSWRgIGlzIHByb3ZpZGVkLCB0aGUgZHJpdmVyIGlzc3VlcyBhIGZvbGxvdy11cFxuICAgKiBgQUxURVIgR1JBUEggPG5hbWU+IFNFVCBFREdFX0lEIEVOQUJMRUR8RElTQUJMRURgIHZpYSBHUUwgYWZ0ZXIgdGhlXG4gICAqIGdSUEMgY3JlYXRlIGNhbGwuIFdoZW4gYGVkZ2VJZGAgaXMgdW5kZWZpbmVkLCBiZWhhdmlvciBpcyB1bmNoYW5nZWRcbiAgICogYW5kIG5vIEFMVEVSIHN0YXRlbWVudCBpcyBzZW50LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnLFxuICAgIGVkZ2VJZD86IEVkZ2VJZE1vZGVcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5ncmFwaFNlcnZpY2UuY3JlYXRlR3JhcGgobmFtZSwgZ3JhcGhUeXBlLCBkZXNjcmlwdGlvbik7XG4gICAgaWYgKGVkZ2VJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGVkZ2VJZCA9PT0gRWRnZUlkTW9kZS5FTkFCTEVEID8gJ0VOQUJMRUQnIDogJ0RJU0FCTEVEJztcbiAgICAgIGF3YWl0IHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke25hbWV9IFNFVCBFREdFX0lEICR7c3RhdGV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIERlbGV0ZSBhIGdyYXBoICovXG4gIGFzeW5jIGRyb3BHcmFwaChuYW1lOiBzdHJpbmcsIGlmRXhpc3RzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZHJvcEdyYXBoKG5hbWUsIGlmRXhpc3RzKTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGN1cnJlbnQgZ3JhcGggZm9yIHRoZSBzZXNzaW9uICovXG4gIGFzeW5jIHVzZUdyYXBoKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZ3JhcGhTZXJ2aWNlLnVzZUdyYXBoKG5hbWUpO1xuICAgIHRoaXMuc3RvcmVkR3JhcGggPSBuYW1lO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgYXZhaWxhYmxlIGdyYXBocyAqL1xuICBhc3luYyBsaXN0R3JhcGhzKCk6IFByb21pc2U8R3JhcGhJbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UubGlzdEdyYXBocygpO1xuICB9XG5cbiAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGdyYXBoICovXG4gIGFzeW5jIGdldEdyYXBoSW5mbyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEdyYXBoSW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5nZXRHcmFwaEluZm8obmFtZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJhbnNhY3Rpb24gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbihcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICByZWFkT25seTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIHRpbWVvdXQ6IG51bWJlciA9IDBcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuYmVnaW5UcmFuc2FjdGlvbihncmFwaE5hbWUsIHJlYWRPbmx5LCB0aW1lb3V0KTtcbiAgICAvLyBTdXJmYWNlIHRoZSBwZXItY2xpZW50IGxvZ2ljYWwgc2Vzc2lvbiBpZCBvbiB0aGUgcmV0dXJuZWQgdHhcbiAgICAvLyAodHJhbnNhY3Rpb24tYnJhbmNoIGVyZ29ub21pYywgc2VlIFRSQU5TQUNUSU9OU19EUklWRVJfR1VJREUubWQpLlxuICAgICh0eCBhcyBhbnkpLmNsaWVudFNlc3Npb25JZCA9IHRoaXMuY2xpZW50U2Vzc2lvbklkO1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBDb21taXQgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyBjb21taXQodHJhbnNhY3Rpb25JZDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmNvbW1pdCh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSb2xsYmFjayBhIHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIHJvbGxiYWNrKHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5yb2xsYmFjayh0cmFuc2FjdGlvbklkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyAqL1xuICBhc3luYyBsaXN0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8VHJhbnNhY3Rpb25JbmZvW10+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UubGlzdFRyYW5zYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqIEV4ZWN1dGUgYSBmdW5jdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZm46ICh0eElkOiBudW1iZXIpID0+IFByb21pc2U8VD4sXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uud2l0aFRyYW5zYWN0aW9uKGdyYXBoTmFtZSwgZm4sIHJlYWRPbmx5KTtcbiAgfVxuXG4gIC8vIC0tLS0gQWRtaW4gRERMIHN1cmZhY2UgKHRyYW5zYWN0aW9uLWJyYW5jaCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWN0aXZlIHRyYW5zYWN0aW9ucyB2aWEgdGhlIEdRTCBhZG1pbiBEREwgYFNIT1cgVFJBTlNBQ1RJT05TYC5cbiAgICogRWFjaCByb3cgbWlycm9ycyB0aGUgNS1jb2x1bW4gc2VydmVyLXNpZGUgc2NoZW1hOlxuICAgKiBgdHJhbnNhY3Rpb25JZCAvIHN0YXR1cyAvIHJlYWRPbmx5IC8gc3RhcnRUaW1lIC8gc2Vzc2lvbklkYC5cbiAgICogYHNlc3Npb25JZGAgaXMgYCcnYCB1bmxlc3MgdGhlIHNlcnZlciBoYXMgYXV0by1kZXJpdmVkIG9uZSBmcm9tIHBlZXJcbiAgICogaW5mbyBvciB0aGUgZHJpdmVyIGV4cGxpY2l0bHkgc3VyZmFjZXMgYHgtdWx0aXBhLXNlc3Npb24taWRgIG1ldGFkYXRhLlxuICAgKlxuICAgKiBEaXN0aW5jdCBmcm9tIGBsaXN0VHJhbnNhY3Rpb25zKClgIHdoaWNoIHVzZXMgdGhlIGxlZ2FjeSBnUlBDLlxuICAgKi9cbiAgYXN5bmMgc2hvd1RyYW5zYWN0aW9ucygpOiBQcm9taXNlPFRyYW5zYWN0aW9uUm93W10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgVFJBTlNBQ1RJT05TJyk7XG4gICAgY29uc3QgaWR4OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcmVzcC5jb2x1bW5zLmZvckVhY2goKGMsIGkpID0+IHsgaWR4W2NdID0gaTsgfSk7XG4gICAgY29uc3Qgcm93czogVHJhbnNhY3Rpb25Sb3dbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3Aucm93cykge1xuICAgICAgY29uc3QgZ2V0ID0gKG46IHN0cmluZywgZmFsbGJhY2s6IGFueSA9ICcnKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBpZHhbbl07XG4gICAgICAgIHJldHVybiBpID09PSB1bmRlZmluZWQgPyBmYWxsYmFjayA6IChyb3cudmFsdWVzW2ldIGFzIGFueSk/LnZhbHVlID8/IHJvdy52YWx1ZXNbaV07XG4gICAgICB9O1xuICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogU3RyaW5nKGdldCgndHJhbnNhY3Rpb25faWQnLCAnJykgPz8gJycpLFxuICAgICAgICBzdGF0dXM6IFN0cmluZyhnZXQoJ3N0YXR1cycsICcnKSA/PyAnJyksXG4gICAgICAgIHJlYWRPbmx5OiBCb29sZWFuKGdldCgncmVhZF9vbmx5JywgZmFsc2UpKSxcbiAgICAgICAgc3RhcnRUaW1lOiBTdHJpbmcoZ2V0KCdzdGFydF90aW1lJywgJycpID8/ICcnKSxcbiAgICAgICAgc2Vzc2lvbklkOiBTdHJpbmcoZ2V0KCdzZXNzaW9uX2lkJywgJycpID8/ICcnKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsIGJhY2sgYSBzaW5nbGUgdHJhbnNhY3Rpb24gYnkgaWQgdmlhIGBLSUxMIFRSQU5TQUNUSU9OICc8aWQ+J2AuXG4gICAqIGB0cmFuc2FjdGlvbklkYCBoZXJlIGlzIHRoZSAqKnN0cmluZyoqIGlkIHN1cmZhY2VkIGJ5XG4gICAqIGBzaG93VHJhbnNhY3Rpb25zKClgIChlLmcuIGAndHhfYTM5NmM1MzEtLi4uJ2ApLCBkaXN0aW5jdCBmcm9tIHRoZVxuICAgKiBgbnVtYmVyYCBpZCByZXR1cm5lZCBieSBgYmVnaW4oKWAuXG4gICAqL1xuICBhc3luYyBraWxsVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGVzY2FwZWQgPSBTdHJpbmcodHJhbnNhY3Rpb25JZCkucmVwbGFjZSgvJy9nLCBcIicnXCIpO1xuICAgIHJldHVybiB0aGlzLmdxbChgS0lMTCBUUkFOU0FDVElPTiAnJHtlc2NhcGVkfSdgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xsIGJhY2sgZXZlcnkgYWN0aXZlIHRyYW5zYWN0aW9uIHZpYSBgUkVTRVQgVFJBTlNBQ1RJT05TYC4gQWRtaW4tb25seS5cbiAgICogSW50ZW5kZWQgYXMgYW4gZXNjYXBlIGhhdGNoIHdoZW4gYW4gb3JwaGFuIHR4IGJsb2NrcyBuZXcgQkVHSU5zLlxuICAgKi9cbiAgYXN5bmMgcmVzZXRUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbCgnUkVTRVQgVFJBTlNBQ1RJT05TJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRGF0YSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBJbnNlcnQgbXVsdGlwbGUgbm9kZXMgaW50byBhIGdyYXBoIHVzaW5nIGdSUEMgYnVsayBpbnNlcnQgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXNCYXRjaEF1dG8oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydE5vZGVzKGdyYXBoTmFtZSwgbm9kZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIGVkZ2VzIGludG8gYSBncmFwaCB1c2luZyBnUlBDIGJ1bGsgaW5zZXJ0ICovXG4gIGFzeW5jIGluc2VydEVkZ2VzQmF0Y2hBdXRvKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhncmFwaE5hbWUsIGVkZ2VzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBub2RlcyBieSBpZCBsaXN0LiBFbWl0c1xuICAgKiBgTUFUQ0ggKG4pIFdIRVJFIG4uX2lkIElOIFsuLi5dIERFVEFDSCBERUxFVEUgbiBSRVRVUk4gbmAuXG4gICAqXG4gICAqIEVtcHR5L251bGwgYG5vZGVJZHNgIHNob3J0LWNpcmN1aXRzIHdpdGhvdXQgY29udGFjdGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBSZXNwb25zZSB3aXRoIG9uZSByb3cgcGVyIGFjdHVhbGx5LWRlbGV0ZWQgbm9kZSwgY29sdW1uXG4gICAqICAgXCJuXCIgaG9sZGluZyB0aGUgR3FsZGJOb2RlLiBVc2UgYHJlc3BvbnNlLmFsaWFzKFwiblwiKS5hc05vZGVzKClgLlxuICAgKiAgIFdpdGggYHJldHVybkRlbGV0ZWQ9ZmFsc2VgIHRoZSByZXNwb25zZSBjYXJyaWVzIG9ubHlcbiAgICogICBgcm93c0FmZmVjdGVkYDsgcm93cyBpcyBlbXB0eS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZU5vZGVzQnlJZHMoXG4gICAgbm9kZUlkczogc3RyaW5nW10sXG4gICAgY29uZmlnPzogRGVsZXRlQ29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZmc6IERlbGV0ZUNvbmZpZyA9IHsgcmV0dXJuRGVsZXRlZDogdHJ1ZSwgYWxsb3dEZWxldGVBbGw6IGZhbHNlLCAuLi5jb25maWcgfTtcbiAgICBpZiAoIW5vZGVJZHMgfHwgbm9kZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoW10sIFtdLCAwLCBmYWxzZSwgW10sIDApO1xuICAgIH1cbiAgICBsZXQgZ3FsID0gYE1BVENIIChuKSBXSEVSRSBuLl9pZCBJTiBbJHtmb3JtYXRTdHJpbmdMaXN0KG5vZGVJZHMpfV0gREVUQUNIIERFTEVURSBuYDtcbiAgICBpZiAoY2ZnLnJldHVybkRlbGV0ZWQgIT09IGZhbHNlKSBncWwgKz0gJyBSRVRVUk4gbic7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGdxbCwgY2ZnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbm9kZXMgbWF0Y2hpbmcgbGFiZWxzIGFuZC9vciB3aGVyZSBjbGF1c2UuIEVtaXRzXG4gICAqIGBNQVRDSCAobjpMMXxMMikgV0hFUkUgPHdoZXJlPiBERVRBQ0ggREVMRVRFIG4gUkVUVVJOIG5gLlxuICAgKlxuICAgKiBUaHJvd3MgaWYgYm90aCBsYWJlbHMgYW5kIHdoZXJlIGFyZSBlbXB0eSB1bmxlc3NcbiAgICogYGNvbmZpZy5hbGxvd0RlbGV0ZUFsbCA9IHRydWVgLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTm9kZXNCeUNvbmRpdGlvbihcbiAgICBsYWJlbHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgIHdoZXJlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgY29uZmlnPzogRGVsZXRlQ29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZmc6IERlbGV0ZUNvbmZpZyA9IHsgcmV0dXJuRGVsZXRlZDogdHJ1ZSwgYWxsb3dEZWxldGVBbGw6IGZhbHNlLCAuLi5jb25maWcgfTtcbiAgICBjb25zdCBub0xhYmVscyA9ICFsYWJlbHMgfHwgbGFiZWxzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBub1doZXJlID0gIXdoZXJlIHx8ICF3aGVyZS50cmltKCk7XG4gICAgaWYgKG5vTGFiZWxzICYmIG5vV2hlcmUgJiYgIWNmZy5hbGxvd0RlbGV0ZUFsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnZGVsZXRlTm9kZXNCeUNvbmRpdGlvbiB3aXRoIG5vIGxhYmVscyBhbmQgbm8gd2hlcmUgd291bGQgZGVsZXRlIGV2ZXJ5ICdcbiAgICAgICAgKyAnbm9kZSBpbiB0aGUgZ3JhcGguIElmIHRoaXMgaXMgaW50ZW50aW9uYWwsIHNldCBEZWxldGVDb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBncWwgPSAnTUFUQ0ggKG4nO1xuICAgIGlmICghbm9MYWJlbHMpIGdxbCArPSAnOicgKyBsYWJlbHMhLm1hcChsID0+IGBcXGAke2x9XFxgYCkuam9pbignfCcpO1xuICAgIGdxbCArPSAnKSc7XG4gICAgaWYgKCFub1doZXJlKSBncWwgKz0gJyBXSEVSRSAnICsgd2hlcmU7XG4gICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgPiAwKSBncWwgKz0gYCBMSU1JVCAke2xpbWl0fWA7XG4gICAgZ3FsICs9ICcgREVUQUNIIERFTEVURSBuJztcbiAgICBpZiAoY2ZnLnJldHVybkRlbGV0ZWQgIT09IGZhbHNlKSBncWwgKz0gJyBSRVRVUk4gbic7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGdxbCwgY2ZnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZWRnZXMgYnkgaWQgbGlzdC4gRW1pdHMgNS1jb2x1bW4gR1FMIGtleWVkIG9uIGBlLl9pZGAsIHRoZW5cbiAgICogcmVzaGFwZXMgdGhlIHJlc3BvbnNlIGludG8gYSBzaW5nbGUgXCJlXCIgY29sdW1uIGhvbGRpbmcgR3FsZGJFZGdlLlxuICAgKiBSZXF1aXJlcyBFREdFX0lEIEVOQUJMRUQ6IG9uIGEgZGlzYWJsZWQgZ3JhcGggdGhlIHNlcnZlciByZXR1cm5zXG4gICAqIGBbNTAxN11gIGd1aWRpbmcgdGhlIGNhbGxlciB0byBgQUxURVIgR1JBUEggPGc+IFNFVCBFREdFX0lEIEVOQUJMRURgXG4gICAqIChkZWxldGlvbiBkb2VzIE5PVCBmYWxsIGJhY2sgdG8gdGhlIGRpc2NvdXJhZ2VkIGBpbnRlcm5hbF9pZChlKWApLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXNCeUlkcyhcbiAgICBlZGdlSWRzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBEZWxldGVDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNmZzogRGVsZXRlQ29uZmlnID0geyByZXR1cm5EZWxldGVkOiB0cnVlLCBhbGxvd0RlbGV0ZUFsbDogZmFsc2UsIC4uLmNvbmZpZyB9O1xuICAgIGlmICghZWRnZUlkcyB8fCBlZGdlSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG4gICAgfVxuICAgIGxldCBncWwgPSBgTUFUQ0ggKCktW2VdLT4oKSBXSEVSRSBlLl9pZCBJTiBbJHtmb3JtYXRTdHJpbmdMaXN0KGVkZ2VJZHMpfV0gREVMRVRFIGVgO1xuICAgIGlmIChjZmcucmV0dXJuRGVsZXRlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGdxbCArPSAnIFJFVFVSTiBlLl9pZCwgZS5fZnJvbSwgZS5fdG8sIGxhYmVscyhlKVswXSwgcHJvcGVydGllcyhlKSc7XG4gICAgfVxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZ3FsKGdxbCwgY2ZnKTtcbiAgICByZXR1cm4gY2ZnLnJldHVybkRlbGV0ZWQgPT09IGZhbHNlID8gcmF3IDogcmVzaGFwZUVkZ2VEZWxldGUocmF3KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZWRnZXMgbWF0Y2hpbmcgbGFiZWwgYW5kL29yIHdoZXJlLiBFbWl0cyA1LWNvbHVtbiBHUUwsXG4gICAqIHRoZW4gcmVzaGFwZXMgaW50byBhIHNpbmdsZSBcImVcIiBjb2x1bW4uXG4gICAqXG4gICAqIFRocm93cyBpZiBib3RoIGxhYmVsIGFuZCB3aGVyZSBhcmUgZW1wdHkgdW5sZXNzXG4gICAqIGBjb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlYC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUVkZ2VzQnlDb25kaXRpb24oXG4gICAgbGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgY29uc3Qgbm9MYWJlbCA9ICFsYWJlbDtcbiAgICBjb25zdCBub1doZXJlID0gIXdoZXJlIHx8ICF3aGVyZS50cmltKCk7XG4gICAgaWYgKG5vTGFiZWwgJiYgbm9XaGVyZSAmJiAhY2ZnLmFsbG93RGVsZXRlQWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdkZWxldGVFZGdlc0J5Q29uZGl0aW9uIHdpdGggbm8gbGFiZWwgYW5kIG5vIHdoZXJlIHdvdWxkIGRlbGV0ZSBldmVyeSAnXG4gICAgICAgICsgJ2VkZ2UgaW4gdGhlIGdyYXBoLiBJZiB0aGlzIGlzIGludGVudGlvbmFsLCBzZXQgRGVsZXRlQ29uZmlnLmFsbG93RGVsZXRlQWxsID0gdHJ1ZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgZ3FsID0gJ01BVENIICgpLVtlJztcbiAgICBpZiAoIW5vTGFiZWwpIGdxbCArPSBgOlxcYCR7bGFiZWx9XFxgYDtcbiAgICBncWwgKz0gJ10tPigpJztcbiAgICBpZiAoIW5vV2hlcmUpIGdxbCArPSAnIFdIRVJFICcgKyB3aGVyZTtcbiAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCA+IDApIGdxbCArPSBgIExJTUlUICR7bGltaXR9YDtcbiAgICBncWwgKz0gJyBERUxFVEUgZSc7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkge1xuICAgICAgZ3FsICs9ICcgUkVUVVJOIGUuX2lkLCBlLl9mcm9tLCBlLl90bywgbGFiZWxzKGUpWzBdLCBwcm9wZXJ0aWVzKGUpJztcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjZmcpO1xuICAgIHJldHVybiBjZmcucmV0dXJuRGVsZXRlZCA9PT0gZmFsc2UgPyByYXcgOiByZXNoYXBlRWRnZURlbGV0ZShyYXcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBncmFwaCBkYXRhIGluIEpTT04gTGluZXMgZm9ybWF0IChzdHJlYW1pbmcpLlxuICAgKiBAcGFyYW0gY29uZmlnIEV4cG9ydCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmb3IgZWFjaCBleHBvcnRlZCBjaHVua1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0KFxuICAgIGNvbmZpZzogRXhwb3J0Q29uZmlnLFxuICAgIGNhbGxiYWNrPzogKGNodW5rOiBFeHBvcnRDaHVuaykgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnQoY29uZmlnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogU3RyZWFtIG5vZGVzIGZyb20gYSBncmFwaFxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZXhwb3J0KCkgd2l0aCBFeHBvcnRDb25maWcgaW5zdGVhZFxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxzPzogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlciA9IDAsXG4gICAgY2FsbGJhY2s/OiAocmVzdWx0OiBFeHBvcnROb2Rlc1Jlc3VsdCkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5leHBvcnROb2RlcyhncmFwaE5hbWUsIGxhYmVscywgbGltaXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gZWRnZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnRFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydEVkZ2VzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydEVkZ2VzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhlYWx0aCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDaGVjayB0aGUgaGVhbHRoIG9mIGEgc2VydmljZSAqL1xuICBhc3luYyBoZWFsdGhDaGVjayhzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8SGVhbHRoU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS5oZWFsdGhDaGVjayhzZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBoZWFsdGggc3RhdHVzIGNoYW5nZXMgdmlhIHNlcnZlci1zaWRlIHN0cmVhbWluZy5cbiAgICogUmV0dXJucyBhIEhlYWx0aFdhdGNoZXIgdGhhdCBlbWl0cyAnc3RhdHVzJyBldmVudHMgd2l0aCBIZWFsdGhTdGF0dXMgdmFsdWVzLlxuICAgKiBDYWxsIHN0b3AoKSB0byBjYW5jZWwgdGhlIHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2UgLSBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gd2F0Y2hcbiAgICogQHJldHVybnMgSGVhbHRoV2F0Y2hlciAtIEV2ZW50RW1pdHRlciB3aXRoIHN0b3AoKSBtZXRob2RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3YXRjaGVyID0gY2xpZW50LndhdGNoKCk7XG4gICAqIHdhdGNoZXIub24oJ3N0YXR1cycsIChzdGF0dXM6IEhlYWx0aFN0YXR1cykgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdIZWFsdGggc3RhdHVzOicsIHN0YXR1cyk7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICogICBjb25zb2xlLmVycm9yKCdXYXRjaCBlcnJvcjonLCBlcnIpO1xuICAgKiB9KTtcbiAgICogd2F0Y2hlci5vbignZW5kJywgKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdXYXRjaCBzdHJlYW0gZW5kZWQnKTtcbiAgICogfSk7XG4gICAqIC8vIExhdGVyLCB0byBzdG9wIHdhdGNoaW5nOlxuICAgKiB3YXRjaGVyLnN0b3AoKTtcbiAgICogYGBgXG4gICAqL1xuICB3YXRjaChzZXJ2aWNlOiBzdHJpbmcgPSAnJyk6IEhlYWx0aFdhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmhlYWx0aFNlcnZpY2Uud2F0Y2goc2VydmljZSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWRtaW4gU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUHJlLWFsbG9jYXRlIHBhcnNlciBpbnN0YW5jZXMgKi9cbiAgYXN5bmMgd2FybXVwUGFyc2VyKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2Uud2FybXVwUGFyc2VyKGNvdW50KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gY2FjaGUgc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRDYWNoZVN0YXRzKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8Q2FjaGVTdGF0cz4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5nZXRDYWNoZVN0YXRzKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNwZWNpZmllZCBjYWNoZSAqL1xuICBhc3luYyBjbGVhckNhY2hlKGNhY2hlVHlwZTogQ2FjaGVUeXBlID0gQ2FjaGVUeXBlLkFMTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5jbGVhckNhY2hlKGNhY2hlVHlwZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIGRhdGFiYXNlIHN0YXRpc3RpY3MgKi9cbiAgYXN5bmMgZ2V0U3RhdGlzdGljcyhncmFwaE5hbWU6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxTdGF0aXN0aWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN0YXRpc3RpY3MoZ3JhcGhOYW1lKTtcbiAgfVxuXG4gIC8qKiBJbnZhbGlkYXRlIHRoZSBSQkFDIHBlcm1pc3Npb24gY2FjaGUgKi9cbiAgYXN5bmMgaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuaW52YWxpZGF0ZVBlcm1pc3Npb25DYWNoZSh1c2VybmFtZSk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN5c3RlbS1sZXZlbCBtZXRyaWNzIChDUFUsIG1lbW9yeSwgZGlzayBJL08sIHN0b3JhZ2UsIG5ldHdvcmspICovXG4gIGFzeW5jIGdldFN5c3RlbU1ldHJpY3MoKTogUHJvbWlzZTxTeXN0ZW1NZXRyaWNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldFN5c3RlbU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIG1hbnVhbCBjb21wYWN0aW9uIG9mIHRoZSBkYXRhYmFzZSBzdG9yYWdlICovXG4gIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTxDb21wYWN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNvbXBhY3QoKTtcbiAgfVxuXG4gIC8qKiBXYWl0IGZvciB0aGUgY29tcHV0aW5nIGVuZ2luZSB0b3BvbG9neSB0byBiZSByZWFkeSAqL1xuICBhc3luYyB3YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZTogc3RyaW5nLCB0aW1lb3V0TXM6IG51bWJlciA9IDApOiBQcm9taXNlPENvbXB1dGVUb3BvbG9neVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YWl0Rm9yQ29tcHV0ZVRvcG9sb2d5KGdyYXBoTmFtZSwgdGltZW91dE1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCdWxrIEltcG9ydCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIGJ1bGsgaW1wb3J0IHNlc3Npb24gZm9yIG9wdGltaXplZCBoaWdoLXRocm91Z2hwdXQgaW5zZXJ0cy5cbiAgICogQHBhcmFtIGdyYXBoTmFtZSBUYXJnZXQgZ3JhcGggbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBidWxrIGltcG9ydCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBzdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBCdWxrSW1wb3J0T3B0aW9ucyk6IFByb21pc2U8QnVsa0ltcG9ydFNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5zdGFydEJ1bGtJbXBvcnQoZ3JhcGhOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBDaGVja3BvaW50IGlzIG5vIGxvbmdlciBuZWVkZWQuIFVzZSBlbmRCdWxrSW1wb3J0KCkgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaC5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPENoZWNrcG9pbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHJlY29yZENvdW50OiAwLFxuICAgICAgbGFzdENoZWNrcG9pbnRDb3VudDogMCxcbiAgICAgIG1lc3NhZ2U6ICdDaGVja3BvaW50IGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSBlbmRCdWxrSW1wb3J0IHdoaWNoIHBlcmZvcm1zIGEgZmluYWwgZmx1c2gnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGggYSBmaW5hbCBjaGVja3BvaW50LlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEVuZEJ1bGtJbXBvcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5lbmRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIHRoZSBidWxrIGltcG9ydCBzZXNzaW9uIHdpdGhvdXQgZmluYWwgc3luYy5cbiAgICogQHBhcmFtIHNlc3Npb25JZCBCdWxrIGltcG9ydCBzZXNzaW9uIElEXG4gICAqL1xuICBhc3luYyBhYm9ydEJ1bGtJbXBvcnQoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFib3J0QnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgYSBidWxrIGltcG9ydCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtJbXBvcnRTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5idWxrSW1wb3J0U2VydmljZS5nZXRCdWxrSW1wb3J0U3RhdHVzKHNlc3Npb25JZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgTWV0aG9kcyDigJQgR2V0dGVyc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBzZXNzaW9uICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuaXNMb2dnZWRJbigpO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKi9cbiAgZ2V0Q29uZmlnKCk6IEdxbGRiQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8gYSBjbHVzdGVyIGRlcGxveW1lbnQgKi9cbiAgZ2V0IGlzQ2x1c3RlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmlzQ2x1c3RlciB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGNsdXN0ZXIgSUQgKGVtcHR5IHN0cmluZyBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgY2x1c3RlcklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5jbHVzdGVySWQgfHwgJyc7XG4gIH1cblxuICAvKiogR2V0IHRoZSBwYXJ0aXRpb24gY291bnQgKDAgaWYgbm90IGEgY2x1c3RlcikgKi9cbiAgZ2V0IHBhcnRpdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbnMuZ2V0U2Vzc2lvbigpPy5wYXJ0aXRpb25Db3VudCB8fCAwO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIEhlbHBlcnMg4oCUIE5hbWUgUXVvdGluZ1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogV3JhcCBhIG5hbWUgaW4gYmFja3RpY2tzIGZvciBzYWZlIHVzZSBpbiBHUUwgc3RhdGVtZW50cy5cbiAgICogTGFiZWwgbmFtZXMgYW5kIHByb3BlcnR5IG5hbWVzIHNob3VsZCBiZSBxdW90ZWQ7IGdyYXBoIG5hbWVzLCBpbmRleCBuYW1lcyxcbiAgICogYW5kIGZ1bGx0ZXh0IG5hbWVzIHNob3VsZCBOT1QgYmUgd3JhcHBlZCBpbiBiYWNrdGlja3MuICovXG4gIHByaXZhdGUgc3RhdGljIHF1b3RlTGFiZWwobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2AnICsgbmFtZSArICdgJztcbiAgfVxuXG4gIC8qKiBXcmFwIGVhY2ggbGFiZWwgbmFtZSBpbiBiYWNrdGlja3MgYW5kIGpvaW4gd2l0aCBcIiwgXCIgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbHMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG4gPT4gJ2AnICsgbiArICdgJykuam9pbignLCAnKTtcbiAgfVxuXG4gIC8qKiBKb2luIG5hbWVzIHdpdGggXCIsIFwiIHdpdGhvdXQgYmFja3RpY2sgd3JhcHBpbmcgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgam9pbk5hbWVzKC4uLm5hbWVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWVzLmpvaW4oJywgJyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBHcmFwaCBPcGVyYXRpb25zICg2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgb3BlbiAoc2NoZW1hLWxlc3MpIGdyYXBoXG4gICAqXG4gICAqIHY2IEdRTDogYENSRUFURSBHUkFQSCBnYCAtPiBPUEVOOyBgQ1JFQVRFIEdSQVBIIGcge31gIC0+IENMT1NFRC4gVGhlXG4gICAqIGJyYWNlLWxlc3MgZm9ybSBpcyByZXF1aXJlZCB0byBhY3R1YWxseSBnZXQgYW4gT1BFTiBncmFwaC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZU9wZW5HcmFwaChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEdSQVBIICR7bmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBjbG9zZWQgKHNjaGVtYS1lbmZvcmNlZCkgZ3JhcGggd2l0aCBub2RlIGFuZCBlZGdlIGxhYmVsIGRlZmluaXRpb25zICovXG4gIGFzeW5jIGNyZWF0ZUNsb3NlZEdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfSB7fWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZ3JhcGggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBncmFwaCB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGhJZk5vdEV4aXN0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBncmFwaFR5cGU6IEdyYXBoVHlwZSA9IEdyYXBoVHlwZS5PUEVOLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJyxcbiAgICBlZGdlSWQ/OiBFZGdlSWRNb2RlXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUdyYXBoKG5hbWUsIGdyYXBoVHlwZSwgZGVzY3JpcHRpb24sIGVkZ2VJZCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZyA9IChlLm1lc3NhZ2UgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobXNnLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0JykgfHwgbXNnLmluY2x1ZGVzKCdkdXBsaWNhdGUnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGVjayB3aGV0aGVyIGEgZ3JhcGggd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMgKi9cbiAgYXN5bmMgaGFzR3JhcGgobmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZ3JhcGhzID0gYXdhaXQgdGhpcy5saXN0R3JhcGhzKCk7XG4gICAgcmV0dXJuIGdyYXBocy5zb21lKGcgPT4gZy5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYSBncmFwaCAqL1xuICBhc3luYyBhbHRlckdyYXBoKGdyYXBoTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHtncmFwaE5hbWV9IFJFTkFNRSBUTyAke25ld05hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYWxsIGRhdGEgZnJvbSBhIGdyYXBoIHdoaWxlIGtlZXBpbmcgaXRzIHN0cnVjdHVyZSAqL1xuICBhc3luYyB0cnVuY2F0ZShncmFwaE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBUUlVOQ0FURSBHUkFQSCAke2dyYXBoTmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgTGFiZWwgT3BlcmF0aW9ucyAoMTYgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgbGFiZWxzIChub2RlIGFuZCBlZGdlKSBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93TGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGxhYmVscyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93Tm9kZUxhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCwgJ05PREUnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgbGFiZWxzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dFZGdlTGFiZWxzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIExBQkVMUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwLCAnRURHRScpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSB0eXBlcyB3aXRoIHRoZWlyIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgc2hvd05vZGVUeXBlcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Tm9kZVR5cGVJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBUWVBFUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlTm9kZVR5cGVJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dFZGdlVHlwZXMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEVkZ2VUeXBlSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgVFlQRVMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUVkZ2VUeXBlSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgc3BlY2lmaWMgbGFiZWwgYnkgbmFtZSBmcm9tIHRoZSBjdXJyZW50IGdyYXBoLCBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAgICogTWF0Y2hlcyBlbnRyaWVzIHdoZXJlIGBuYW1lYCBpcyBvbmUgb2YgdGhlIC5sYWJlbHMgKHN1cHBvcnRzIG11bHRpLWxhYmVsIGdyb3VwcykuXG4gICAqL1xuICBhc3luYyBnZXRMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxMYWJlbEluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgbGFiZWxzID0gYXdhaXQgdGhpcy5zaG93TGFiZWxzKGNvbmZpZyk7XG4gICAgcmV0dXJuIGxhYmVscy5maW5kKGwgPT4gbC5sYWJlbHMuaW5jbHVkZXMobmFtZSkpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgbm9kZSB0eXBlIGJ5IG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldE5vZGVMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxOb2RlVHlwZUluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLnNob3dOb2RlVHlwZXMoY29uZmlnKTtcbiAgICByZXR1cm4gdHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBlZGdlIHR5cGUgYnkgbmFtZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0RWRnZUxhYmVsKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEVkZ2VUeXBlSW5mbyB8IG51bGw+IHtcbiAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuc2hvd0VkZ2VUeXBlcyhjb25maWcpO1xuICAgIHJldHVybiB0eXBlcy5maW5kKHQgPT4gdC5uYW1lID09PSBuYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5vZGUgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IEFERCBOT0RFIHsgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfSAoJHtwcm9wU3RyfSkgfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGFuIGVkZ2UgbGFiZWwgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZUxhYmVsKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10gPSBbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IEFERCBFREdFIHsgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfSAoKS1bJHtwcm9wU3RyfV0tPigpIH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGxhYmVsIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgZHJvcE5vZGVMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7dGFyZ2V0R3JhcGh9IERST1AgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIG9uZSBvciBtb3JlIGVkZ2UgbGFiZWxzIGZyb20gdGhlIGN1cnJlbnQgZ3JhcGggKGNsb3NlZCBncmFwaCkgKi9cbiAgYXN5bmMgZHJvcEVkZ2VMYWJlbCguLi5uYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgLy8gTGFzdCBhcmcgbWF5IGJlIGEgUXVlcnlDb25maWcgKG9yIHVuZGVmaW5lZCk7IHRyZWF0IG5vbi1zdHJpbmcgYXMgY29uZmlnLlxuICAgIGxldCBjb25maWc6IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuYW1lczogc3RyaW5nW107XG4gICAgaWYgKG5hbWVzT3JDb25maWcubGVuZ3RoID4gMCAmJiB0eXBlb2YgbmFtZXNPckNvbmZpZ1tuYW1lc09yQ29uZmlnLmxlbmd0aCAtIDFdICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gbmFtZXNPckNvbmZpZ1tuYW1lc09yQ29uZmlnLmxlbmd0aCAtIDFdIGFzIFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgICAgbmFtZXMgPSBuYW1lc09yQ29uZmlnLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZXMgPSBuYW1lc09yQ29uZmlnIGFzIHN0cmluZ1tdO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBEUk9QIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsYWJlbCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlTGFiZWxJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbGFiZWxzID0gYXdhaXQgdGhpcy5zaG93TGFiZWxzKGNvbmZpZyk7XG4gICAgY29uc3QgdGFyZ2V0VHlwZSA9IG5vZGVPckVkZ2UgPT09IERCVHlwZS5FREdFID8gJ0VER0UnIDogJ05PREUnO1xuXG4gICAgaWYgKGxhYmVscy5zb21lKGwgPT4gbC5sYWJlbHMuaW5jbHVkZXMobmFtZSkgJiYgbC50eXBlID09PSB0YXJnZXRUeXBlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVOb2RlTGFiZWwobmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRWRnZUxhYmVsKG5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBSZW5hbWUgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGFsdGVyTm9kZUxhYmVsKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG9sZE5hbWUpfSBSRU5BTUUgVE8gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5ld05hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVuYW1lIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgYWx0ZXJFZGdlTGFiZWwob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwob2xkTmFtZSl9IFJFTkFNRSBUTyAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobmV3TmFtZSl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBhbGdvcml0aG1zICovXG4gIGFzeW5jIHNob3dBbGdvcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWxnb0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBBTEdPUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlQWxnb0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgUHJvcGVydHkgT3BlcmF0aW9ucyAoMTMgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhIGxhYmVsIChub2RlIG9yIGVkZ2UpIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2hvd05vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgc2hvd05vZGVQcm9wZXJ0eShsYWJlbE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgbnQgPSBhd2FpdCB0aGlzLmdldE5vZGVMYWJlbChsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgaWYgKCFudCkgdGhyb3cgbmV3IEVycm9yKGBOb2RlIGxhYmVsIFwiJHtsYWJlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4gICAgcmV0dXJuIG50LnByb3BlcnRpZXM7XG4gIH1cblxuICAvKiogUmV0dXJuIHByb3BlcnRpZXMgZm9yIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgc2hvd0VkZ2VQcm9wZXJ0eShsYWJlbE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPENvbnZQcm9wZXJ0eURlZltdPiB7XG4gICAgY29uc3QgZXQgPSBhd2FpdCB0aGlzLmdldEVkZ2VMYWJlbChsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgaWYgKCFldCkgdGhyb3cgbmV3IEVycm9yKGBFZGdlIGxhYmVsIFwiJHtsYWJlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4gICAgcmV0dXJuIGV0LnByb3BlcnRpZXM7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0UHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgY29uc3QgcHJvcHMgPSBhd2FpdCB0aGlzLnNob3dQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHByb3BzLmZpbmQocCA9PiBwLm5hbWUgPT09IHByb3BOYW1lKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGEgbm9kZSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0Tm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREJUeXBlLk5PREUsIGxhYmVsTmFtZSwgcHJvcE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgcHJvcGVydHkgZGVmaW5pdGlvbiBmb3IgYW4gZWRnZSBsYWJlbCwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi9cbiAgYXN5bmMgZ2V0RWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWYgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoREJUeXBlLkVER0UsIGxhYmVsTmFtZSwgcHJvcE5hbWUsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYSBsYWJlbCAobm9kZSBvciBlZGdlKSAqL1xuICBhc3luYyBjcmVhdGVQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFZGdlUHJvcGVydHkobGFiZWxOYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gQUREIFBST1BFUlRZICR7cHJvcFN0cn1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGFuIGVkZ2UgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlRWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gQUREIFBST1BFUlRZICR7cHJvcFN0cn1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgKi9cbiAgYXN5bmMgZHJvcFByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGlmIChub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJvcE5vZGVQcm9wZXJ0eShsYWJlbE5hbWUsIC4uLm5hbWVzLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kcm9wRWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgLi4ubmFtZXMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGRyb3BOb2RlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgUFJPUEVSVFkgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGRyb3BFZGdlUHJvcGVydHkoXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IERST1AgUFJPUEVSVFkgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5uYW1lcyl9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgcHJvcGVydGllcyBvbiBhIGxhYmVsIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgcHJvcGVydGllcyB3ZXJlIGNyZWF0ZWQsIGZhbHNlIGlmIGFsbCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVQcm9wZXJ0eUlmTm90RXhpc3QoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuc2hvd1Byb3BlcnR5KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgICBjb25zdCBleGlzdGluZ1NldCA9IG5ldyBTZXQoZXhpc3RpbmcubWFwKHAgPT4gcC5uYW1lKSk7XG4gICAgY29uc3QgbmV3UHJvcHMgPSBwcm9wcy5maWx0ZXIocCA9PiAhZXhpc3RpbmdTZXQuaGFzKHAubmFtZSkpO1xuXG4gICAgaWYgKG5ld1Byb3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIG5ld1Byb3BzLCBjb25maWcpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgQ29uc3RyYWludCBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8vIFNlcnZlciByZXBsYWNlZCBgQUxURVIgLi4uIEFERC9EUk9QIENPTlNUUkFJTlRgIHdpdGggdGhlXG4gIC8vIGBDUkVBVEUgQ09OU1RSQUlOVCA8bmFtZT4gRk9SIC4uLiBSRVFVSVJFIC4uLiBJUyBOT1QgTlVMTC9VTklRVUVgXG4gIC8vIGZvcm0uIENvbnN0cmFpbnQgbmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB7a2luZH1fe25vZGV8ZWRnZX1fe2xhYmVsfV97cHJvcH1cbiAgLy8gc28gY3JlYXRlL2Ryb3AgcHJvZHVjZSBtYXRjaGluZyBpZGVudGlmaWVycyB3aXRob3V0IGV4cG9zaW5nIG5hbWluZy5cbiAgcHJpdmF0ZSBzdGF0aWMgY29uc3RyYWludE5hbWUoXG4gICAga2luZDogJ25uJyB8ICd1cScsXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lczogc3RyaW5nW11cbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBlbnQgPSBub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERSA/ICdub2RlJyA6ICdlZGdlJztcbiAgICBjb25zdCBwcm9wcyA9IHByb3BOYW1lcy5tYXAocCA9PiBwLnRvTG93ZXJDYXNlKCkpLmpvaW4oJ18nKTtcbiAgICByZXR1cm4gYCR7a2luZH1fJHtlbnR9XyR7bGFiZWxOYW1lLnRvTG93ZXJDYXNlKCl9XyR7cHJvcHN9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNvbnN0cmFpbnRUYXJnZXQobm9kZU9yRWRnZTogREJUeXBlLCBsYWJlbE5hbWU6IHN0cmluZyk6IHsgcGF0dGVybjogc3RyaW5nOyB2YXJpYWJsZTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHFsID0gR3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpO1xuICAgIHJldHVybiBub2RlT3JFZGdlID09PSBEQlR5cGUuTk9ERVxuICAgICAgPyB7IHBhdHRlcm46IGAobjoke3FsfSlgLCB2YXJpYWJsZTogJ24nIH1cbiAgICAgIDogeyBwYXR0ZXJuOiBgKCktW2U6JHtxbH1dLT4oKWAsIHZhcmlhYmxlOiAnZScgfTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBOT1QgTlVMTCBjb25zdHJhaW50IG9uIGEgcHJvcGVydHkgKi9cbiAgYXN5bmMgY3JlYXRlTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBHcWxkYkNsaWVudC5jb25zdHJhaW50TmFtZSgnbm4nLCBub2RlT3JFZGdlLCBsYWJlbE5hbWUsIFtwcm9wTmFtZV0pO1xuICAgIGNvbnN0IHsgcGF0dGVybiwgdmFyaWFibGUgfSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnRUYXJnZXQobm9kZU9yRWRnZSwgbGFiZWxOYW1lKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBDT05TVFJBSU5UICR7bmFtZX0gRk9SICR7cGF0dGVybn0gUkVRVUlSRSAke3ZhcmlhYmxlfS4ke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwocHJvcE5hbWUpfSBJUyBOT1QgTlVMTGAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgVU5JUVVFIGNvbnN0cmFpbnQgb24gb25lIG9yIG1vcmUgcHJvcGVydGllcyAqL1xuICBhc3luYyBjcmVhdGVVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGNvbnN0IGNuYW1lID0gR3FsZGJDbGllbnQuY29uc3RyYWludE5hbWUoJ3VxJywgbm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBuYW1lcyk7XG4gICAgY29uc3QgeyBwYXR0ZXJuLCB2YXJpYWJsZSB9ID0gR3FsZGJDbGllbnQuY29uc3RyYWludFRhcmdldChub2RlT3JFZGdlLCBsYWJlbE5hbWUpO1xuICAgIGNvbnN0IHByb3BzTGlzdCA9IG5hbWVzLm1hcChuID0+IGAke3ZhcmlhYmxlfS4ke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobil9YCkuam9pbignLCAnKTtcbiAgICBjb25zdCByZXF1aXJlRXhwciA9IG5hbWVzLmxlbmd0aCA+IDEgPyBgKCR7cHJvcHNMaXN0fSlgIDogcHJvcHNMaXN0O1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIENPTlNUUkFJTlQgJHtjbmFtZX0gRk9SICR7cGF0dGVybn0gUkVRVUlSRSAke3JlcXVpcmVFeHByfSBJUyBVTklRVUVgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIE5PVCBOVUxMIGNvbnN0cmFpbnQgZnJvbSBhIHByb3BlcnR5ICovXG4gIGFzeW5jIGRyb3BOb3ROdWxsQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCdubicsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgW3Byb3BOYW1lXSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIENPTlNUUkFJTlQgJHtuYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGEgVU5JUVVFIGNvbnN0cmFpbnQgZnJvbSBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIGRyb3BVbmlxdWVDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICAuLi5wcm9wTmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IG5hbWVzLCBjb25maWcgfSA9IHNwbGl0VHJhaWxpbmdDb25maWcocHJvcE5hbWVzT3JDb25maWcpO1xuICAgIGNvbnN0IGNuYW1lID0gR3FsZGJDbGllbnQuY29uc3RyYWludE5hbWUoJ3VxJywgbm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBuYW1lcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIENPTlNUUkFJTlQgJHtjbmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgSW5kZXggT3BlcmF0aW9ucyAoNyBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGFsbCBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBub2RlIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd05vZGVJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTk9ERSBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGVkZ2UgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUluZGV4KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxJbmRleEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBpbmRleCBvbiBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUluZGV4KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBJbmRleFByb3BlcnR5W10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcocHJvcHMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIElOREVYICR7aW5kZXhOYW1lfSBPTiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtwcm9wU3RyfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBpbmRleCBvbiBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW5kZXhQcm9wZXJ0eVtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7cHJvcFN0cn0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BOb2RlSW5kZXgoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBOT0RFIElOREVYICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhbiBlZGdlIGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcEVkZ2VJbmRleChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIEVER0UgSU5ERVggJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEZ1bGx0ZXh0IE9wZXJhdGlvbnMgKDcgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgZnVsbHRleHQgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBmdWxsdGV4dCBpbmRleGVzICovXG4gIGFzeW5jIHNob3dOb2RlRnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGZ1bGx0ZXh0IGluZGV4ZXMgKi9cbiAgYXN5bmMgc2hvd0VkZ2VGdWxsdGV4dChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8RnVsbHRleHRJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBmdWxsdGV4dCBpbmRleCBvbiBhIG5vZGUgbGFiZWwgKi9cbiAgYXN5bmMgY3JlYXRlTm9kZUZ1bGx0ZXh0KFxuICAgIGluZGV4TmFtZTogc3RyaW5nLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgRlVMTFRFWFQgJHtpbmRleE5hbWV9IE9OIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWxzKC4uLnByb3BzKX0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBmdWxsdGV4dCBpbmRleCBvbiBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VGdWxsdGV4dChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogc3RyaW5nW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEZVTExURVhUICR7aW5kZXhOYW1lfSBPTiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5wcm9wcyl9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgZnVsbHRleHQgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUZ1bGx0ZXh0KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgTk9ERSBGVUxMVEVYVCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBmdWxsdGV4dCBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlRnVsbHRleHQoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBFREdFIEZVTExURVhUICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBUYXNrIE9wZXJhdGlvbnMgKDMgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgdGFza3MgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd1Rhc2tzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxUYXNrSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIFRBU0tTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VUYXNrSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogRGVsZXRlIGEgdGFzayBieSBJRCAqL1xuICBhc3luYyBkZWxldGVUYXNrKHRhc2tJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERFTEVURSBUQVNLICR7dGFza0lkfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogU3RvcCBhIHJ1bm5pbmcgdGFzayBieSBJRCAqL1xuICBhc3luYyBzdG9wVGFzayh0YXNrSWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBTVE9QIFRBU0sgJHt0YXNrSWR9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIERhdGEgSW5zZXJ0IE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluc2VydCBub2RlcyDigJQgYmFja3dhcmQtY29tcGF0aWJsZSBvdmVybG9hZGVkIGVudHJ5IHBvaW50LlxuICAgKlxuICAgKiBUd28gY2FsbCBzaGFwZXMgYXJlIGFjY2VwdGVkOyB0aGUgcnVudGltZSBkaXNwYXRjaGVzIG9uIHRoZSBmaXJzdFxuICAgKiBhcmd1bWVudCdzIHR5cGU6XG4gICAqXG4gICAqICAgMS4gYGluc2VydE5vZGVzKGdyYXBoTmFtZTogc3RyaW5nLCBub2RlcywgY29uZmlnPylgIOKAlCBvcmlnaW5hbFxuICAgKiAgICAgIDYuMC4wIHNpZ25hdHVyZSwgcm91dGVzIHRocm91Z2ggdGhlIGJ1bGstaW1wb3J0IGdSUEMgcGF0aFxuICAgKiAgICAgIChgRGF0YVNlcnZpY2UuSW5zZXJ0Tm9kZXNgKS4gUmV0dXJucyBgSW5zZXJ0Tm9kZXNSZXN1bHRgIHdpdGhcbiAgICogICAgICBnUlBDLWxldmVsIG1ldGFkYXRhLiBQcmVzZXJ2ZXMgc291cmNlIGNvbXBhdGliaWxpdHkgZm9yXG4gICAqICAgICAgY2FsbGVycyB3cml0dGVuIGFnYWluc3QgNi4wLjAgKGUuZy4gZ3FsZGItbWFuYWdlcikuXG4gICAqXG4gICAqICAgMi4gYGluc2VydE5vZGVzKG5vZGVzLCBjb25maWc/KWAg4oCUIGNvbnZlbmllbmNlIEdRTCBlbWl0dGVyIChhZGRlZFxuICAgKiAgICAgIGFmdGVyIDYuMC4wKS4gU3ludGhlc2l6ZXNcbiAgICogICAgICBgSU5TRVJUIChuMDpMYWJlbCB7Li4ufSksIChuMTpMYWJlbCB7Li4ufSkgUkVUVVJOIG4wLCBuMWAsXG4gICAqICAgICAgd2l0aCBgSU5TRVJUIE9WRVJXUklURWAgd2hlbiBgY29uZmlnLmluc2VydFR5cGVgIGlzXG4gICAqICAgICAgYEluc2VydFR5cGUuT3ZlcndyaXRlYC4gUmV0dXJucyB0aGUgcmF3IGBSZXNwb25zZWAuXG4gICAqICAgICAgYE5vZGVEYXRhLmlkYCwgd2hlbiBzZXQsIGlzIGVtaXR0ZWQgYXMgdGhlIGBfaWRgIHByb3BlcnR5LlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgbm9kZXM6IE5vZGVEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdD47XG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydENvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgYXN5bmMgaW5zZXJ0Tm9kZXMoXG4gICAgYXJnMTogc3RyaW5nIHwgTm9kZURhdGFbXSxcbiAgICBhcmcyPzogTm9kZURhdGFbXSB8IEluc2VydENvbmZpZyxcbiAgICBhcmczPzogSW5zZXJ0Tm9kZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnROb2Rlc1Jlc3VsdCB8IFJlc3BvbnNlPiB7XG4gICAgLy8gUGF0aCAxOiBsZWdhY3kgYnVsay1nUlBDIHNpZ25hdHVyZSAoZ3JhcGhOYW1lLCBub2RlcywgY29uZmlnPylcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhcbiAgICAgICAgYXJnMSxcbiAgICAgICAgYXJnMiBhcyBOb2RlRGF0YVtdLFxuICAgICAgICBhcmczXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBhdGggMjogY29udmVuaWVuY2UgR1FMLWVtaXR0ZXIgc2lnbmF0dXJlIChub2RlcywgY29uZmlnPylcbiAgICBjb25zdCBub2RlcyA9IGFyZzE7XG4gICAgY29uc3QgY29uZmlnID0gYXJnMiBhcyBJbnNlcnRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobm9kZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIG5vZGVzLmZvckVhY2goKG5vZGUsIGkpID0+IHtcbiAgICAgIGlmICghbm9kZS5sYWJlbHMgfHwgbm9kZS5sYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSBhdCBpbmRleCAke2l9IGhhcyBubyBsYWJlbHMuIEF0IGxlYXN0IG9uZSBsYWJlbCBpcyByZXF1aXJlZC5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHZhck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHBhcnRzID0gbm9kZXMubWFwKChub2RlLCBpKSA9PiB7XG4gICAgICBjb25zdCB2YXJOYW1lID0gYG4ke2l9YDtcbiAgICAgIHZhck5hbWVzLnB1c2godmFyTmFtZSk7XG4gICAgICAvLyBHUUwgSU5TRVJUIG9ubHkgc3VwcG9ydHMgc2luZ2xlIGxhYmVsIHBlciBub2RlXG4gICAgICBjb25zdCBsYWJlbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobm9kZS5sYWJlbHNbMF0pO1xuICAgICAgLy8gQnVpbGQgcHJvcGVydGllcyBpbmNsdWRpbmcgX2lkIGlmIHNldFxuICAgICAgbGV0IHByb3BzID0gbm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgaWYgKG5vZGUuaWQpIHtcbiAgICAgICAgcHJvcHMgPSB7IF9pZDogbm9kZS5pZCwgLi4ucHJvcHMgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnRpZXNWYWx1ZVN0cmluZyhwcm9wcyk7XG4gICAgICByZXR1cm4gcHJvcFN0ciA/IGAoJHt2YXJOYW1lfToke2xhYmVsfSAke3Byb3BTdHJ9KWAgOiBgKCR7dmFyTmFtZX06JHtsYWJlbH0pYDtcbiAgICB9KTtcblxuICAgIGNvbnN0IGluc2VydEtleXdvcmQgPSBpbnNlcnRLZXl3b3JkRm9yVHlwZShjb25maWc/Lmluc2VydFR5cGUpO1xuICAgIGNvbnN0IGdxbFN0ciA9IGluc2VydEtleXdvcmQgKyAnICcgKyBwYXJ0cy5qb2luKCcsICcpICsgJyBSRVRVUk4gJyArIHZhck5hbWVzLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGdxbFN0ciwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgZWRnZXMg4oCUIGJhY2t3YXJkLWNvbXBhdGlibGUgb3ZlcmxvYWRlZCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogVHdvIGNhbGwgc2hhcGVzIGFyZSBhY2NlcHRlZDsgdGhlIHJ1bnRpbWUgZGlzcGF0Y2hlcyBvbiB0aGUgZmlyc3RcbiAgICogYXJndW1lbnQncyB0eXBlOlxuICAgKlxuICAgKiAgIDEuIGBpbnNlcnRFZGdlcyhncmFwaE5hbWU6IHN0cmluZywgZWRnZXMsIGNvbmZpZz8pYCDigJQgb3JpZ2luYWxcbiAgICogICAgICA2LjAuMCBzaWduYXR1cmUsIHJvdXRlcyB0aHJvdWdoIHRoZSBidWxrLWltcG9ydCBnUlBDIHBhdGhcbiAgICogICAgICAoYERhdGFTZXJ2aWNlLkluc2VydEVkZ2VzYCkuIFJldHVybnMgYEluc2VydEVkZ2VzUmVzdWx0YCB3aXRoXG4gICAqICAgICAgZ1JQQy1sZXZlbCBtZXRhZGF0YS4gUHJlc2VydmVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IGZvclxuICAgKiAgICAgIDYuMC4wIGNhbGxlcnMuXG4gICAqXG4gICAqICAgMi4gYGluc2VydEVkZ2VzKGVkZ2VzLCBjb25maWc/KWAg4oCUIGNvbnZlbmllbmNlIEdRTCBlbWl0dGVyXG4gICAqICAgICAgKGFkZGVkIGFmdGVyIDYuMC4wKS4gUGVyIGVkZ2Ugc3ludGhlc2l6ZXNcbiAgICogICAgICBgTUFUQ0ggKHNyYyBXSEVSRSBzcmMuX2lkID0gJ2Zyb20nKSwgKGRzdCBXSEVSRSBkc3QuX2lkID0gJ3RvJykgSU5TRVJUIChzcmMpLVtlMDpMYWJlbCB7Li4ufV0tPihkc3QpIFJFVFVSTiBlMGAuXG4gICAqICAgICAgUmV0dXJucyBhIG1lcmdlZCBgUmVzcG9uc2VgIHdpdGggY29sdW1ucyBgZTAsIGUxLCAuLi5gLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgZWRnZXM6IEVkZ2VEYXRhW10sXG4gICAgY29uZmlnPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdD47XG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydENvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPjtcbiAgYXN5bmMgaW5zZXJ0RWRnZXMoXG4gICAgYXJnMTogc3RyaW5nIHwgRWRnZURhdGFbXSxcbiAgICBhcmcyPzogRWRnZURhdGFbXSB8IEluc2VydENvbmZpZyxcbiAgICBhcmczPzogSW5zZXJ0RWRnZXNDb25maWdcbiAgKTogUHJvbWlzZTxJbnNlcnRFZGdlc1Jlc3VsdCB8IFJlc3BvbnNlPiB7XG4gICAgLy8gUGF0aCAxOiBsZWdhY3kgYnVsay1nUlBDIHNpZ25hdHVyZVxuICAgIGlmICh0eXBlb2YgYXJnMSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmluc2VydEVkZ2VzKFxuICAgICAgICBhcmcxLFxuICAgICAgICBhcmcyIGFzIEVkZ2VEYXRhW10sXG4gICAgICAgIGFyZzNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGF0aCAyOiBjb252ZW5pZW5jZSBHUUwtZW1pdHRlciBzaWduYXR1cmVcbiAgICBjb25zdCBlZGdlcyA9IGFyZzE7XG4gICAgY29uc3QgY29uZmlnID0gYXJnMiBhcyBJbnNlcnRDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZWRnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcblxuICAgIGNvbnN0IGluc2VydEtleXdvcmQgPSBpbnNlcnRLZXl3b3JkRm9yVHlwZShjb25maWc/Lmluc2VydFR5cGUpO1xuICAgIGNvbnN0IGFsbENvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYWxsVmFsdWVzOiBhbnlbXSA9IFtdO1xuICAgIGxldCB0b3RhbEFmZmVjdGVkID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVkZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlZGdlID0gZWRnZXNbaV07XG4gICAgICBjb25zdCB2YXJOYW1lID0gYGUke2l9YDtcbiAgICAgIGNvbnN0IGxhYmVsUGFydCA9IGVkZ2UubGFiZWwgPyAnOicgKyBHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGVkZ2UubGFiZWwpIDogJyc7XG4gICAgICAvLyBCdWlsZCBwcm9wZXJ0aWVzIGluY2x1ZGluZyBfaWQgaWYgc2V0IOKAlCBtaXJyb3JzIHRoZSBub2RlXG4gICAgICAvLyBlbWl0dGVyLiAgVGhlIHNlcnZlcidzIEdRTCBwYXJzZXIgYWNjZXB0c1xuICAgICAgLy8gYFtlMDpLbm93cyB7X2lkOicuLi4nLCAuLi59XWAgYW5kIHN0b3JlcyB0aGUgZWRnZSBpZCB2ZXJiYXRpbVxuICAgICAgLy8gd2hlbiBFREdFX0lEIGlzIGVuYWJsZWQgb24gdGhlIGdyYXBoLlxuICAgICAgbGV0IHByb3BzID0gZWRnZS5wcm9wZXJ0aWVzO1xuICAgICAgaWYgKGVkZ2UuaWQgJiYgZWRnZS5pZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb3BzID0geyBfaWQ6IGVkZ2UuaWQsIC4uLihlZGdlLnByb3BlcnRpZXMgPz8ge30pIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcocHJvcHMpO1xuICAgICAgY29uc3QgZWRnZVBhcnQgPSBwcm9wU3RyID8gYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9ICR7cHJvcFN0cn1dYCA6IGBbJHt2YXJOYW1lfSR7bGFiZWxQYXJ0fV1gO1xuICAgICAgY29uc3QgZ3FsU3RyID0gYE1BVENIIChzcmMgV0hFUkUgc3JjLl9pZCA9ICcke2VkZ2UuZnJvbU5vZGVJZH0nKSwgYFxuICAgICAgICArIGAoZHN0IFdIRVJFIGRzdC5faWQgPSAnJHtlZGdlLnRvTm9kZUlkfScpIGBcbiAgICAgICAgKyBgJHtpbnNlcnRLZXl3b3JkfSAoc3JjKS0ke2VkZ2VQYXJ0fS0+KGRzdCkgUkVUVVJOICR7dmFyTmFtZX1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbFN0ciwgY29uZmlnKTtcbiAgICAgIHRvdGFsQWZmZWN0ZWQgKz0gcmVzcC5yb3dzQWZmZWN0ZWQ7XG4gICAgICBhbGxDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICBpZiAocmVzcC5yb3dzLmxlbmd0aCA+IDAgJiYgcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGFsbFZhbHVlcy5wdXNoKHJlc3Aucm93c1swXS52YWx1ZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXJnZWRSb3cgPSBuZXcgUm93KGFsbFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShhbGxDb2x1bW5zLCBbbWVyZ2VkUm93XSwgMSwgZmFsc2UsIFtdLCB0b3RhbEFmZmVjdGVkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFN5c3RlbSAmIFByb2Nlc3MgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogUmV0dXJuIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3NlcyAocXVlcmllcykgKi9cbiAgYXN5bmMgdG9wKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxQcm9jZXNzSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdUT1AnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZVByb2Nlc3NJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgYSBydW5uaW5nIHF1ZXJ5IGJ5IGl0cyBxdWVyeSBJRCAqL1xuICBhc3luYyBraWxsKHF1ZXJ5SWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBLSUxMICcke3F1ZXJ5SWR9J2AsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIHN0YXRpc3RpY3MgZm9yIHRoZSBjdXJyZW50IGdyYXBoIHVzaW5nIGRiLnN0YXRzKCkgKi9cbiAgYXN5bmMgc3RhdHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEdyYXBoU3RhdHM+IHtcbiAgICBjb25zdCBjdXJyZW50R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnUkVUVVJOIGRiLnN0YXRzKCkgQVMgc3RhdHMnLCBjb25maWcpO1xuICAgIGNvbnN0IGdzID0gcGFyc2VHcmFwaFN0YXRzKHJlc3ApO1xuICAgIGlmICghZ3MuZ3JhcGhOYW1lKSBncy5ncmFwaE5hbWUgPSBjdXJyZW50R3JhcGg7XG4gICAgcmV0dXJuIGdzO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBwaW5nIHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBpbiBuYW5vc2Vjb25kcyAqL1xuICBhc3luYyB0ZXN0KCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMucGluZygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgQUkgT3BlcmF0aW9ucyAoMiBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogWUlFTEQgY29sdW1ucyBlbWl0dGVkIGJ5IENBTEwgYWkucmVhZCAvIGFpLmdxbCAoa2VwdCBpbiBzeW5jIHdpdGggc2VydmVyKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQUlfWUlFTERfQ09MUyA9XG4gICAgJ3N0YWdlLCBkZXRhaWwsIGVsYXBzZWRfbXMsIHRva2Vuc19pbnB1dCwgdG9rZW5zX291dHB1dCwgdG9rZW5zX2NhY2hlZCwgZGF0YSc7XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgQUkgdG8gZ2VuZXJhdGUgYSBHUUwgc3RhdGVtZW50IGFuZCBhdXRvLWV4ZWN1dGUgaXQuXG4gICAqXG4gICAqIFdyYXBzIGBDQUxMIGFpLnJlYWQoXCI8cHJvbXB0PlwiKSBZSUVMRCAuLi5gLCBzdHJlYW1zIHN0YWdlIHJvd3MgZnJvbSB0aGVcbiAgICogc2VydmVyLCBhbmQgcmUtcnVucyB0aGUgc3ludGhlc2l6ZWQgR1FMIHNvIGBBaVJlYWRSZXN1bHQuZGF0YWAgaG9sZHMgdGhlXG4gICAqIHJlYWwgcXVlcnkge0BsaW5rIFJlc3BvbnNlfSAocm93cyAvIGNvbHVtbnMpIOKAlCBtYXRjaGluZyB3aGF0IE1hbmFnZXIgVUlcbiAgICogZGlzcGxheXMuXG4gICAqXG4gICAqIE9ubHkgdHJhbnNwb3J0LWxldmVsIGVycm9ycyByZWplY3QgdGhlIFByb21pc2UuIEFJLXNpZGUgZXJyb3JzIHNldFxuICAgKiBgc3VjY2Vzcz1mYWxzZWAgYW5kIHBvcHVsYXRlIGBlcnJvcmAsIHdpdGggYGRhdGE9bnVsbGAuXG4gICAqL1xuICBhc3luYyBhaVJlYWQocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBaVJlYWRSZXN1bHQ+IHtcbiAgICBjb25zdCBncWwgPSBgQ0FMTCBhaS5yZWFkKFwiJHtHcWxkYkNsaWVudC5lc2NhcGVBaVByb21wdChwcm9tcHQpfVwiKSBZSUVMRCAke0dxbGRiQ2xpZW50LkFJX1lJRUxEX0NPTFN9YDtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VBaVJlc3VsdChyZXNwKTtcbiAgICAvLyBBdXRvIHJlLXJ1biB0aGUgZ2VuZXJhdGVkIEdRTCBzbyBgZGF0YWAgaXMgYSBwcm9wZXIgUmVzcG9uc2UgKHJvd3MvY29sdW1ucyksXG4gICAgLy8gbm90IHRoZSBleGVjdXRpb24gbWV0YWRhdGEgZGljdCByZXR1cm5lZCBpbiB0aGUgZmluYWwgc3RhZ2UuXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIHJlc3VsdC5nZW5lcmF0ZWRHcWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gYXdhaXQgdGhpcy5ncWwocmVzdWx0LmdlbmVyYXRlZEdxbCwgY29uZmlnKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSBgR2VuZXJhdGVkIEdRTCBmYWlsZWQgdG8gZXhlY3V0ZTogJHtlPy5tZXNzYWdlID8/IFN0cmluZyhlKX1gO1xuICAgICAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgdGhlIEFJIHRvIGdlbmVyYXRlIGEgR1FMIHN0YXRlbWVudCAqd2l0aG91dCogZXhlY3V0aW5nIGl0LlxuICAgKlxuICAgKiBUaGUgZ2VuZXJhdGVkIEdRTCBpcyBleHBvc2VkIHZpYSBgQWlSZWFkUmVzdWx0LmdlbmVyYXRlZEdxbGAgc28gdGhlXG4gICAqIGNhbGxlciBjYW4gcmV2aWV3IC8gZWRpdCBpdCBiZWZvcmUgcnVubmluZyBpdCBtYW51YWxseSB2aWEgYGNsaWVudC5ncWwoKWAuXG4gICAqIGBBaVJlYWRSZXN1bHQuZGF0YWAgaXMgYWx3YXlzIG51bGwgZm9yIGBhaUdxbGAuXG4gICAqL1xuICBhc3luYyBhaUdxbChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFpUmVhZFJlc3VsdD4ge1xuICAgIGNvbnN0IGdxbCA9IGBDQUxMIGFpLmdxbChcIiR7R3FsZGJDbGllbnQuZXNjYXBlQWlQcm9tcHQocHJvbXB0KX1cIikgWUlFTEQgJHtHcWxkYkNsaWVudC5BSV9ZSUVMRF9DT0xTfWA7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbCwgY29uZmlnKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlQWlSZXN1bHQocmVzcCk7XG4gICAgLy8gYWlfZ3FsIGlzIFwiZ2VuZXJhdGUgb25seVwiIOKAlCBuZXZlciBhdXRvLWV4ZWN1dGUuXG4gICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogRXNjYXBlIGEgcHJvbXB0IHNvIGl0IGNhbiBiZSBzYWZlbHkgZW1iZWRkZWQgaW4gYSBkb3VibGUtcXVvdGVkIEdRTCBzdHJpbmcuICovXG4gIHByaXZhdGUgc3RhdGljIGVzY2FwZUFpUHJvbXB0KHByb21wdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvbXB0LnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpO1xuICB9XG5cbiAgLyoqIFBhcnNlIGEgQ0FMTCBhaS5yZWFkIC8gYWkuZ3FsIFlJRUxEIHJlc3BvbnNlIGludG8gYW4gQWlSZWFkUmVzdWx0LiAqL1xuICBwcml2YXRlIHBhcnNlQWlSZXN1bHQocmVzcDogUmVzcG9uc2UpOiBBaVJlYWRSZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdDogQWlSZWFkUmVzdWx0ID0ge1xuICAgICAgc3RhZ2VzOiBbXSxcbiAgICAgIGdlbmVyYXRlZEdxbDogbnVsbCxcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB0b3RhbEVsYXBzZWRNczogMCxcbiAgICAgIHRvdGFsVG9rZW5zSW5wdXQ6IDAsXG4gICAgICB0b3RhbFRva2Vuc091dHB1dDogMCxcbiAgICAgIHRvdGFsVG9rZW5zQ2FjaGVkOiAwLFxuICAgIH07XG5cbiAgICBjb25zdCBjb2xJZHg6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29sSWR4W3Jlc3AuY29sdW1uc1tpXV0gPSBpO1xuICAgIH1cbiAgICBjb25zdCBnZXRDb2wgPSAocm93OiBSb3csIG5hbWU6IHN0cmluZyk6IGFueSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBjb2xJZHhbbmFtZV07XG4gICAgICBpZiAoaWR4ID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJvdy5nZXQoaWR4KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgcmVzcC5yb3dzKSB7XG4gICAgICBjb25zdCBzdGFnZVZhbCA9IGdldENvbChyb3csICdzdGFnZScpO1xuICAgICAgY29uc3QgZGV0YWlsVmFsID0gZ2V0Q29sKHJvdywgJ2RldGFpbCcpO1xuICAgICAgY29uc3QgZWxhcHNlZFZhbCA9IGdldENvbChyb3csICdlbGFwc2VkX21zJyk7XG4gICAgICBjb25zdCB0SW5WYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX2lucHV0Jyk7XG4gICAgICBjb25zdCB0T3V0VmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19vdXRwdXQnKTtcbiAgICAgIGNvbnN0IHRDYWNoZWRWYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX2NhY2hlZCcpO1xuICAgICAgY29uc3QgZGF0YVZhbCA9IGdldENvbChyb3csICdkYXRhJyk7XG5cbiAgICAgIGNvbnN0IHN0YWdlOiBBaVN0YWdlID0ge1xuICAgICAgICBzdGFnZTogc3RhZ2VWYWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKHN0YWdlVmFsKSxcbiAgICAgICAgZGV0YWlsOiBkZXRhaWxWYWwgPT0gbnVsbCA/ICcnIDogU3RyaW5nKGRldGFpbFZhbCksXG4gICAgICAgIGVsYXBzZWRNczogZWxhcHNlZFZhbCA9PSBudWxsID8gMCA6IE51bWJlcihlbGFwc2VkVmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNJbnB1dDogdEluVmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRJblZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zT3V0cHV0OiB0T3V0VmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRPdXRWYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc0NhY2hlZDogdENhY2hlZFZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0Q2FjaGVkVmFsKSB8fCAwLFxuICAgICAgICBkYXRhOiBkYXRhVmFsLFxuICAgICAgfTtcbiAgICAgIHJlc3VsdC5zdGFnZXMucHVzaChzdGFnZSk7XG5cbiAgICAgIC8vIFRyYWNrIGFnZ3JlZ2F0ZXM6IGVsYXBzZWRfbXMgaXMgY3VtdWxhdGl2ZSBvbiBzZXJ2ZXIgc2lkZSwgdGFrZSBtYXguXG4gICAgICBpZiAoc3RhZ2UuZWxhcHNlZE1zID4gcmVzdWx0LnRvdGFsRWxhcHNlZE1zKSB7XG4gICAgICAgIHJlc3VsdC50b3RhbEVsYXBzZWRNcyA9IHN0YWdlLmVsYXBzZWRNcztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc0lucHV0ICs9IHN0YWdlLnRva2Vuc0lucHV0O1xuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zT3V0cHV0ICs9IHN0YWdlLnRva2Vuc091dHB1dDtcbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc0NhY2hlZCArPSBzdGFnZS50b2tlbnNDYWNoZWQ7XG5cbiAgICAgIC8vIEV4dHJhY3QgZ2VuZXJhdGVkIEdRTCBmcm9tIGFueSBzdGFnZSdzIGRhdGEuZ3FsIC8gLmZpbmFsX2dxbCAvIC5jYW5kaWRhdGVcbiAgICAgIGlmIChzdGFnZS5kYXRhICYmIHR5cGVvZiBzdGFnZS5kYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShzdGFnZS5kYXRhKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBbJ2dxbCcsICdmaW5hbF9ncWwnLCAnY2FuZGlkYXRlJ10pIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSAoc3RhZ2UuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldO1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwudHJpbSgpKSB7XG4gICAgICAgICAgICByZXN1bHQuZ2VuZXJhdGVkR3FsID0gdmFsO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFnZS5zdGFnZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICByZXN1bHQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICByZXN1bHQuZXJyb3IgPSBzdGFnZS5kZXRhaWwgfHwgJ0FJIHN0YWdlIHJlcG9ydGVkIGVycm9yJztcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YWdlLnN0YWdlID09PSAnZmluYWwnKSB7XG4gICAgICAgIC8vIFNlcnZlciBlbWl0cyBleGVjdXRpb24gbWV0YWRhdGEgZGljdCBoZXJlOyBhaVJlYWQgb3ZlcndyaXRlcyB3aXRoIGEgcmVhbFxuICAgICAgICAvLyBSZXNwb25zZSBhZnRlciByZS1leGVjdXRpbmcgdGhlIGdlbmVyYXRlZCBHUUwuIFRoZSBgYW55YCBoZXJlIGlzIHVuYXZvaWRhYmxlXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHNlcnZlciBoYW5kcyBiYWNrIGEgSlNPTiBkaWN0IGJlZm9yZSB3ZSBrbm93IHRoZSBmaW5hbCBzaGFwZS5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLmRhdGEgPSBzdGFnZS5kYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBpZiBnZW5lcmF0ZWRfZ3FsIHdhcyBuZXZlciBjYXB0dXJlZCBmcm9tIGEgZGF0YSBkaWN0LFxuICAgIC8vIGZhbGwgYmFjayB0byB0aGUgZmluYWwgc3RhZ2UncyBkZXRhaWwgc3RyaW5nLlxuICAgIGlmIChyZXN1bHQuZ2VuZXJhdGVkR3FsID09PSBudWxsKSB7XG4gICAgICBmb3IgKGxldCBpID0gcmVzdWx0LnN0YWdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBzID0gcmVzdWx0LnN0YWdlc1tpXTtcbiAgICAgICAgaWYgKHMuc3RhZ2UgPT09ICdmaW5hbCcgJiYgcy5kZXRhaWwpIHtcbiAgICAgICAgICByZXN1bHQuZ2VuZXJhdGVkR3FsID0gcy5kZXRhaWw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBUcmFpbGluZyBDb25maWcgU3BsaXR0ZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU3BsaXQgYSB2YXJpYWRpYyBhcmcgbGlzdCB3aGVyZSB0aGUgbGFzdCBlbGVtZW50ICptYXkqIGJlIGEgUXVlcnlDb25maWdcbiAqIGludG8gc2VwYXJhdGUgc3RyaW5nIG5hbWVzIGFuZCBhbiBvcHRpb25hbCBjb25maWcuIFB5dGhvbiB1c2VzIGtleXdvcmQtb25seVxuICogYGNvbmZpZ2AgaW4gdGhlc2UgQVBJczsgdGhlIFR5cGVTY3JpcHQgZXF1aXZhbGVudCBpcyBhbiBvcHRpb25hbCB0cmFpbGluZ1xuICogY29uZmlnIG9iamVjdCBkZXRlY3RlZCBieSBcIm5vdCBhIHN0cmluZ1wiLlxuICovXG5mdW5jdGlvbiBzcGxpdFRyYWlsaW5nQ29uZmlnKFxuICBhcmdzOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbik6IHsgbmFtZXM6IHN0cmluZ1tdOyBjb25maWc/OiBRdWVyeUNvbmZpZyB9IHtcbiAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4geyBuYW1lczogW10gfTtcbiAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3QgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgbGFzdCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyBuYW1lczogYXJncy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW10sIGNvbmZpZzogbGFzdCBhcyBRdWVyeUNvbmZpZyB9O1xuICB9XG4gIC8vIElmIGxhc3QgaXMgdW5kZWZpbmVkLCBzdHJpcCBpdCBhcyBhIHRyYWlsaW5nIG9wdGlvbmFsIGNvbmZpZyBwbGFjZWhvbGRlci5cbiAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7IG5hbWVzOiBhcmdzLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXSB9O1xuICB9XG4gIHJldHVybiB7IG5hbWVzOiBhcmdzIGFzIHN0cmluZ1tdIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJbnRlcm5hbCBIZWxwZXJzIOKAlCBQYXJzaW5nIFJlc3BvbnNlIFJvd3Ncbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBGaW5kIHRoZSBpbmRleCBvZiBhIGNvbHVtbiBieSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgb3IgLTEgaWYgbm90IGZvdW5kICovXG5mdW5jdGlvbiBmaW5kQ29sdW1uSW5kZXgocmVzcDogUmVzcG9uc2UsIG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGNvbnN0IGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyZXNwLmNvbHVtbnNbaV0udG9Mb3dlckNhc2UoKSA9PT0gbG93ZXIpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgc3RyaW5nIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0U3RyaW5nVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gJyc7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsID0gcm93LmdldChpZHgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gU3RyaW5nKHZhbCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG4vKiogU2FmZWx5IGV4dHJhY3QgYSBudW1iZXIgZnJvbSBhIHJvdyBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG5mdW5jdGlvbiBnZXROdW1iZXJWYWwocm93OiBSb3csIGlkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGlkeCA8IDApIHJldHVybiAwO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcbiAgICBjb25zdCBudW0gPSBOdW1iZXIodmFsKTtcbiAgICByZXR1cm4gaXNOYU4obnVtKSA/IDAgOiBudW07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbi8qKiBOb3JtYWxpemUgYSBsYWJlbCBjb2x1bW4gdmFsdWUgdG8gYSBzdHJpbmcgYXJyYXkuXG4gKlxuICogU2VydmVyIHJldHVybnMgYSBsaXN0IChtdWx0aS1sYWJlbCBzdXBwb3J0KS4gQWNjZXB0IGxpc3Qgb2Ygc3RyaW5ncyxcbiAqIGEgc2luZ2xlIHN0cmluZyAoZGVncmFkZWQgc2VydmVycyksIG9yIG51bGwvdW5kZWZpbmVkLlxuICovXG5mdW5jdGlvbiBwYXJzZUxhYmVsc1ZhbHVlKHZhbDogYW55KTogc3RyaW5nW10ge1xuICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHJldHVybiB2YWwubWFwKCh4OiBhbnkpID0+IFN0cmluZyh4KSk7XG4gIHJldHVybiBbU3RyaW5nKHZhbCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UsIGZvcmNlZFR5cGU/OiBzdHJpbmcpOiBMYWJlbEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IGxhYmVsSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBpZiAobGFiZWxJZHggPCAwKSBsYWJlbElkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBsZXQgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBpZiAodHlwZUlkeCA8IDApIHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VsZW1lbnRfdHlwZScpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgcmF3TGFiZWwgPSBsYWJlbElkeCA+PSAwID8gcm93LmdldChsYWJlbElkeCkgOiBudWxsO1xuICAgIGNvbnN0IHR5cGUgPSBmb3JjZWRUeXBlICE9PSB1bmRlZmluZWQgPyBmb3JjZWRUeXBlIDogZ2V0U3RyaW5nVmFsKHJvdywgdHlwZUlkeCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsczogcGFyc2VMYWJlbHNWYWx1ZShyYXdMYWJlbCksXG4gICAgICB0eXBlLFxuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5vZGVUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBOb2RlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRWRnZVR5cGVJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEVkZ2VUeXBlSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IHByb3BzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG5cbiAgaWYgKG5hbWVJZHggPCAwKSBuYW1lSWR4ID0gdHlwZUlkeDtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBwcm9wZXJ0aWVzOiBwYXJzZVByb3BlcnR5U3RyaW5nKGdldFN0cmluZ1ZhbChyb3csIHByb3BzSWR4KSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBbGdvSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBBbGdvSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IGRlc2NJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Rlc2NyaXB0aW9uJyk7XG4gIGNvbnN0IHZlcklkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndmVyc2lvbicpO1xuICBjb25zdCBwYXJhbXNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBkZXNjcmlwdGlvbjogZ2V0U3RyaW5nVmFsKHJvdywgZGVzY0lkeCksXG4gICAgdmVyc2lvbjogZ2V0U3RyaW5nVmFsKHJvdywgdmVySWR4KSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBwYXJhbXNJZHgpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEluZGV4SW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhOYW1lID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleF9uYW1lJyk7XG4gIGNvbnN0IGlkeEVudGl0eSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZW50aXR5X3R5cGUnKTtcbiAgY29uc3QgaWR4TGFiZWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGNvbnN0IGlkeFByb3AgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnR5Jyk7XG4gIGNvbnN0IGlkeFByZWZpeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJlZml4X2xlbmd0aCcpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4SW5kZXhlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhlZF9jb3VudCcpO1xuICBjb25zdCBpZHhUb3RhbCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndG90YWxfY291bnQnKTtcbiAgY29uc3QgaWR4RXJyb3IgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2Vycm9yJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCBpbmZvOiBJbmRleEluZm8gPSB7XG4gICAgICBpbmRleE5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeE5hbWUpLFxuICAgICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICAgIGxhYmVsOiBnZXRTdHJpbmdWYWwocm93LCBpZHhMYWJlbCksXG4gICAgICBwcm9wZXJ0eTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcCksXG4gICAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICAgICAgaW5kZXhlZENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhJbmRleGVkKSxcbiAgICAgIHRvdGFsQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeFRvdGFsKSxcbiAgICAgIGVycm9yOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFcnJvciksXG4gICAgfTtcbiAgICBpZiAoaWR4UHJlZml4ID49IDApIHtcbiAgICAgIGluZm8ucHJlZml4TGVuZ3RoID0gZ2V0TnVtYmVyVmFsKHJvdywgaWR4UHJlZml4KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBGdWxsdGV4dEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeFNjaGVtYSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc2NoZW1hX25hbWUnKTtcbiAgY29uc3QgaWR4UHJvcHMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcbiAgY29uc3QgaWR4QW5hbHl6ZXIgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FuYWx5emVyJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeERvY0NvdW50ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkb2NfY291bnQnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICBlbnRpdHlUeXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFbnRpdHkpLFxuICAgIHNjaGVtYU5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFNjaGVtYSksXG4gICAgcHJvcGVydGllczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvcHMpLFxuICAgIGFuYWx5emVyOiBnZXRTdHJpbmdWYWwocm93LCBpZHhBbmFseXplciksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIGRvY0NvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhEb2NDb3VudCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRhc2tJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IFRhc2tJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeElkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0YXNrX2lkJyk7XG4gIGNvbnN0IGlkeFR5cGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgaWR4UXVlcnkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5Jyk7XG4gIGNvbnN0IGlkeEFsZ28gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2FsZ29fbmFtZScpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhTdGFydGVkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGFydGVkX2F0Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuICBjb25zdCBpZHhQYXJhbXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3BhcmFtZXRlcnMnKTtcbiAgY29uc3QgaWR4Tm9kZXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25vZGVzX3dyaXR0ZW4nKTtcbiAgY29uc3QgaWR4Q29tcHV0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnY29tcHV0ZV90aW1lX21zJyk7XG4gIGNvbnN0IGlkeFdyaXRlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd3cml0ZV90aW1lX21zJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgdGFza0lkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgdHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VHlwZSksXG4gICAgcXVlcnk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFF1ZXJ5KSxcbiAgICBhbGdvTmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QWxnbyksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgIHN0YXJ0ZWRBdDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhcnRlZCksXG4gICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICBwYXJhbWV0ZXJzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQYXJhbXMpLFxuICAgIG5vZGVzV3JpdHRlbjogZ2V0TnVtYmVyVmFsKHJvdywgaWR4Tm9kZXMpLFxuICAgIGNvbXB1dGVUaW1lTXM6IGdldE51bWJlclZhbChyb3csIGlkeENvbXB1dGUpLFxuICAgIHdyaXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhXcml0ZSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VQcm9jZXNzSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBQcm9jZXNzSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfaWQnKTtcbiAgY29uc3QgaWR4VGV4dCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnlfdGV4dCcpO1xuICBjb25zdCBpZHhTdGFydCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRfdGltZScpO1xuICBjb25zdCBpZHhEdXJhdGlvbiA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZHVyYXRpb25fbXMnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBxdWVyeUlkOiBnZXRTdHJpbmdWYWwocm93LCBpZHhJZCksXG4gICAgcXVlcnlUZXh0OiBnZXRTdHJpbmdWYWwocm93LCBpZHhUZXh0KSxcbiAgICBzdGFydFRpbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0KSxcbiAgICBkdXJhdGlvbk1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhEdXJhdGlvbiksXG4gICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlR3JhcGhTdGF0cyhyZXNwOiBSZXNwb25zZSk6IEdyYXBoU3RhdHMge1xuICBjb25zdCBnczogR3JhcGhTdGF0cyA9IHtcbiAgICBncmFwaE5hbWU6ICcnLFxuICAgIG5vZGVDb3VudDogMCxcbiAgICBlZGdlQ291bnQ6IDAsXG4gICAgbGFiZWxDb3VudHM6IHt9LFxuICAgIGVkZ2VMYWJlbENvdW50czoge30sXG4gICAgbm9kZVByb3BlcnR5U3RhdHM6IHt9LFxuICAgIGVkZ2VQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgfTtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGdzO1xuXG4gIGxldCBzdGF0c0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHMnKTtcbiAgaWYgKHN0YXRzSWR4IDwgMCkgc3RhdHNJZHggPSAwO1xuXG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwIHx8IHN0YXRzSWR4ID49IHJlc3Aucm93c1swXS52YWx1ZXMubGVuZ3RoKSByZXR1cm4gZ3M7XG5cbiAgY29uc3QgdmFsID0gcmVzcC5yb3dzWzBdLmdldChzdGF0c0lkeCk7XG4gIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAodmFsLmdyYXBoX25hbWUgIT09IHVuZGVmaW5lZCkgZ3MuZ3JhcGhOYW1lID0gU3RyaW5nKHZhbC5ncmFwaF9uYW1lKTtcbiAgICBpZiAodmFsLm5vZGVfY291bnQgIT09IHVuZGVmaW5lZCkgZ3Mubm9kZUNvdW50ID0gTnVtYmVyKHZhbC5ub2RlX2NvdW50KSB8fCAwO1xuICAgIGlmICh2YWwuZWRnZV9jb3VudCAhPT0gdW5kZWZpbmVkKSBncy5lZGdlQ291bnQgPSBOdW1iZXIodmFsLmVkZ2VfY291bnQpIHx8IDA7XG4gIH1cblxuICByZXR1cm4gZ3M7XG59XG5cbi8vIC0tLSBEZWxldGUgQVBJIGhlbHBlcnMgLS0tXG5cbmZ1bmN0aW9uIGZvcm1hdFN0cmluZ0xpc3QoaWRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIC8vIEVzY2FwZSBzaW5nbGUgcXVvdGVzIGFuZCBiYWNrc2xhc2hlcyBmb3Igc2FmZSBHUUwgaW5qZWN0aW9uLlxuICByZXR1cm4gaWRzLm1hcChpZCA9PiB7XG4gICAgaWYgKGlkID09IG51bGwpIHJldHVybiBcIicnXCI7XG4gICAgY29uc3QgZXNjYXBlZCA9IGlkLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpO1xuICAgIHJldHVybiBgJyR7ZXNjYXBlZH0nYDtcbiAgfSkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBSZXNoYXBlIHJhdyA1LWNvbCBlZGdlLWRlbGV0ZSByZXNwb25zZSBpbnRvIHNpbmdsZSBcImVcIiBjb2x1bW5cbiAqIGhvbGRpbmcgR3FsZGJFZGdlIG9iamVjdHMg4oCUIHN5bW1ldHJpYyB3aXRoIHRoZSBub2RlIHBhdGhcbiAqIChgcmVzcG9uc2UuYWxpYXMoXCJuXCIpLmFzTm9kZXMoKWAgdnMgYHJlc3BvbnNlLmFsaWFzKFwiZVwiKS5hc0VkZ2VzKClgKS5cbiAqIFJvd3Mgd2l0aCBhIG51bGwgaWQgYXJlIHNraXBwZWQgKG5vIGlkID0gbm8gbWVhbmluZ2Z1bCBFZGdlKS5cbiAqL1xuZnVuY3Rpb24gcmVzaGFwZUVkZ2VEZWxldGUocmF3OiBSZXNwb25zZSk6IFJlc3BvbnNlIHtcbiAgY29uc3QgbmV3Um93czogUm93W10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJhdy5yb3dzKSB7XG4gICAgY29uc3QgaWQgPSByLmxlbmd0aCA+IDAgPyByLmdldCgwKSA6IG51bGw7XG4gICAgaWYgKGlkID09IG51bGwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZyb20gID0gci5sZW5ndGggPiAxID8gci5nZXQoMSkgOiBudWxsO1xuICAgIGNvbnN0IHRvICAgID0gci5sZW5ndGggPiAyID8gci5nZXQoMikgOiBudWxsO1xuICAgIGNvbnN0IGxhYmVsID0gci5sZW5ndGggPiAzID8gci5nZXQoMykgOiBudWxsO1xuICAgIGNvbnN0IHByb3BzID0gci5sZW5ndGggPiA0ID8gci5nZXQoNCkgOiB7fTtcbiAgICBjb25zdCBlZGdlID0ge1xuICAgICAgaWQ6IFN0cmluZyhpZCksXG4gICAgICB1dWlkOiAnJyxcbiAgICAgIGxhYmVsOiBsYWJlbCA/IFN0cmluZyhsYWJlbCkgOiAnJyxcbiAgICAgIGZyb21Ob2RlSWQ6IGZyb20gPyBTdHJpbmcoZnJvbSkgOiAnJyxcbiAgICAgIHRvTm9kZUlkOiB0byA/IFN0cmluZyh0bykgOiAnJyxcbiAgICAgIHByb3BlcnRpZXM6IChwcm9wcyAmJiB0eXBlb2YgcHJvcHMgPT09ICdvYmplY3QnKSA/IHByb3BzIDoge30sXG4gICAgfTtcbiAgICAvLyBNYXJrIHRoZSBjb2x1bW4gYXMgUHJvcGVydHlUeXBlLkVER0Ugc28gQWxpYXNSZXN1bHQuYXNFZGdlcygpIHBpY2tzIGl0IHVwLlxuICAgIG5ld1Jvd3MucHVzaChuZXcgUm93KFtlZGdlXSwgW1Byb3BlcnR5VHlwZS5FREdFXSkpO1xuICB9XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoWydlJ10sIG5ld1Jvd3MsIG5ld1Jvd3MubGVuZ3RoLCByYXcuaGFzTW9yZSxcbiAgICAgICAgICAgICAgICAgICAgIHJhdy53YXJuaW5ncywgcmF3LnJvd3NBZmZlY3RlZCwgcmF3LmN1cnJlbnRHcmFwaCxcbiAgICAgICAgICAgICAgICAgICAgIHJhdy50aW1lQ29zdE5zLCByYXcuZGlza0Nvc3ROcywgcmF3LmNvbXB1dGVDb3N0TnMpO1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ultipa-graph/ultipa-driver",
3
- "version": "6.2.4",
3
+ "version": "6.2.5",
4
4
  "description": "NodeJS SDK for Ultipa GQL",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",