@decaf-ts/for-nest 0.11.2-refactor.4 → 0.11.2-refactor.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/for-nest.js CHANGED
@@ -12,7 +12,7 @@ import { pickBy, negate, isUndefined as isUndefined$1, isArray, isString } from
12
12
 
13
13
  import { ApiExcludeEndpoint, ApiParam, ApiBearerAuth, ApiSecurity, ApiQuery, ApiOperation, ApiOkResponse, ApiNoContentResponse, ApiTags, ApiExtraModels, ApiBody, ApiCreatedResponse, getSchemaPath, ApiBadRequestResponse, ApiUnprocessableEntityResponse, ApiNotFoundResponse, DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
14
14
 
15
- import { OperationKeys, BulkCrudOperationKeys, BaseError, InternalError, DBKeys, ValidationError } from "@decaf-ts/db-decorators";
15
+ import { OperationKeys, BulkCrudOperationKeys, BaseError, InternalError, DBKeys } from "@decaf-ts/db-decorators";
16
16
 
17
17
  import { __decorate, __param, __metadata } from "tslib";
18
18
 
@@ -740,10 +740,10 @@ class DecafModelController extends DecafController {
740
740
  persistence(ctx) {
741
741
  if (!this._persistence) try {
742
742
  this._persistence = Service$1.get(this.class);
743
- } catch (e) {
743
+ } catch {
744
744
  try {
745
745
  this._persistence = ModelService.getService(this.class);
746
- } catch (e) {
746
+ } catch {
747
747
  this._persistence = Repository$1.forModel(this.class);
748
748
  }
749
749
  }
@@ -1031,7 +1031,6 @@ class FromModelController {
1031
1031
  }
1032
1032
  static createQueryRoutesFromRepository(persistence, prefix = PersistenceKeys.QUERY) {
1033
1033
  const repo = persistence instanceof ModelService ? persistence.repo : persistence;
1034
- const ModelConstr = repo.class;
1035
1034
  const queryMethods = Metadata.get(repo.constructor, Metadata.key(PersistenceKeys.QUERY)) ?? {};
1036
1035
  const routeMethods = Metadata.get(persistence.constructor, Metadata.key(DECAF_ROUTE)) ?? {};
1037
1036
  class QueryController extends DecafModelController {
@@ -1121,7 +1120,7 @@ class FromModelController {
1121
1120
  });
1122
1121
  for (const route of sortedRoutes) {
1123
1122
  const methodName = route.implementation?.name || route.method.toLowerCase();
1124
- const registration = FromModelController.matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName, factoryPersistence);
1123
+ const registration = FromModelController.matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName);
1125
1124
  if (!registration) continue;
1126
1125
  const {methodName: registeredMethodName, handler: handler, decorators: decorators, paramDecorators: paramDecorators} = registration;
1127
1126
  const descriptor = FromModelController.defineMethod(DynamicModelController, registeredMethodName, handler);
@@ -1186,7 +1185,7 @@ class FromModelController {
1186
1185
  methodDecorators.forEach(d => d(proto, methodName, descriptor));
1187
1186
  paramDecorators.forEach(({decorator: decorator, index: index}) => decorator(proto, methodName, index));
1188
1187
  }
1189
- static matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName, persistence) {
1188
+ static matchRoute(methodName, route, pkPath, apiProperties, getPK, ModelConstr, modelClazzName) {
1190
1189
  const {method: method, path: path} = route;
1191
1190
  const normalizedPath = path.replace(/^\/+|\/+$/g, "");
1192
1191
  const handler = route.implementation;
@@ -1389,247 +1388,6 @@ class FromModelController {
1389
1388
  }
1390
1389
  return params;
1391
1390
  }
1392
- static createCreateHandler(ModelConstr, modelClazzName) {
1393
- return async function create(data, resp) {
1394
- const {ctx: ctx, log: log} = (await this.logCtx([], OperationKeys.CREATE, true)).for(create);
1395
- log.verbose(`creating new ${modelClazzName}`);
1396
- let created;
1397
- try {
1398
- created = await this.persistence(ctx).create(data, ctx);
1399
- } catch (e) {
1400
- log.error(`Failed to create new ${modelClazzName}`, e);
1401
- throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
1402
- }
1403
- log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
1404
- if (resp) ctx.toResponse(resp);
1405
- return created;
1406
- };
1407
- }
1408
- static createBulkCreateHandler(ModelConstr, modelClazzName) {
1409
- return async function createAll(data, resp) {
1410
- const {ctx: ctx, log: log} = (await this.logCtx([], BulkCrudOperationKeys.CREATE_ALL, true)).for(createAll);
1411
- log.verbose(`creating new ${modelClazzName}`);
1412
- let created;
1413
- try {
1414
- created = await this.persistence(ctx).createAll(data.map(d => new ModelConstr(d)), ctx);
1415
- } catch (e) {
1416
- log.error(`Failed to create new ${modelClazzName}`, e);
1417
- throw FromModelController.toDecafError(e, `Failed to create new ${modelClazzName}`);
1418
- }
1419
- log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
1420
- if (resp) ctx.toResponse(resp);
1421
- return created;
1422
- };
1423
- }
1424
- static createBulkReadHandler(modelClazzName) {
1425
- return async function readAll(ids) {
1426
- const {ctx: ctx, log: log} = (await this.logCtx([], BulkCrudOperationKeys.READ_ALL, true)).for(readAll);
1427
- const normalizedIds = Array.isArray(ids) ? ids : [ ids ];
1428
- let read;
1429
- try {
1430
- log.debug(`reading ${normalizedIds} ${modelClazzName}`);
1431
- read = await this.persistence(ctx).readAll(normalizedIds, ctx);
1432
- } catch (e) {
1433
- log.error(`Failed to read ${modelClazzName}`, e);
1434
- throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName}`);
1435
- }
1436
- log.info(`read ${read.length} ${modelClazzName}`);
1437
- return read;
1438
- };
1439
- }
1440
- static createBulkUpdateHandler(modelClazzName) {
1441
- return async function updateAll(body, resp) {
1442
- const {ctx: ctx, log: log} = (await this.logCtx([], BulkCrudOperationKeys.UPDATE_ALL, true)).for(updateAll);
1443
- let updated;
1444
- try {
1445
- log.info(`updating ${body.length} ${modelClazzName}`);
1446
- updated = await this.persistence(ctx).updateAll(body, ctx);
1447
- } catch (e) {
1448
- log.error(e);
1449
- throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName}`);
1450
- }
1451
- if (resp) ctx.toResponse(resp);
1452
- return updated;
1453
- };
1454
- }
1455
- static createBulkDeleteHandler(modelClazzName) {
1456
- return async function deleteAll(ids, resp) {
1457
- const {ctx: ctx, log: log} = (await this.logCtx([], BulkCrudOperationKeys.DELETE_ALL, true)).for(deleteAll);
1458
- const normalizedIds = Array.isArray(ids) ? ids : [ ids ];
1459
- let read;
1460
- try {
1461
- log.debug(`deleting ${normalizedIds.length} ${modelClazzName}`);
1462
- read = await this.persistence(ctx).deleteAll(normalizedIds, ctx);
1463
- } catch (e) {
1464
- log.error(`Failed to delete ${modelClazzName}`, e);
1465
- throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName}`);
1466
- }
1467
- log.info(`deleted ${read.length} ${modelClazzName}`);
1468
- if (resp) ctx.toResponse(resp);
1469
- return read;
1470
- };
1471
- }
1472
- static createReadHandler(getPK, modelClazzName) {
1473
- return async function read(routeParams) {
1474
- const {ctx: ctx, log: log} = (await this.logCtx([], OperationKeys.READ, true)).for(read);
1475
- const id = getPK(...routeParams.valuesInOrder);
1476
- if (typeof id === "undefined") throw new ValidationError(`No ${this.pk} provided`);
1477
- let readResult;
1478
- try {
1479
- log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
1480
- readResult = await this.persistence(ctx).read(id, ctx);
1481
- } catch (e) {
1482
- log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
1483
- throw FromModelController.toDecafError(e, `Failed to read ${modelClazzName} with id ${id}`);
1484
- }
1485
- log.info(`read ${modelClazzName} with id ${readResult[this.pk]}`);
1486
- return readResult;
1487
- };
1488
- }
1489
- static createUpdateHandler(getPK, ModelConstr, modelClazzName) {
1490
- return async function update(routeParams, body, resp) {
1491
- const {ctx: ctx, log: log} = (await this.logCtx([], OperationKeys.UPDATE, true)).for(update);
1492
- const id = getPK(...routeParams.valuesInOrder);
1493
- if (typeof id === "undefined") throw new ValidationError(`No ${this.pk} provided`);
1494
- let updated;
1495
- try {
1496
- log.info(`updating ${modelClazzName} with ${this.pk} ${id}`);
1497
- const payload = JSON.parse(JSON.stringify(body));
1498
- updated = await this.persistence(ctx).update(new ModelConstr({
1499
- ...payload,
1500
- [this.pk]: id
1501
- }), ctx);
1502
- } catch (e) {
1503
- log.error(e);
1504
- throw FromModelController.toDecafError(e, `Failed to update ${modelClazzName} with id ${id}`);
1505
- }
1506
- if (resp) ctx.toResponse(resp);
1507
- return updated;
1508
- };
1509
- }
1510
- static createDeleteHandler(getPK, modelClazzName) {
1511
- return async function remove(routeParams, resp) {
1512
- const {ctx: ctx, log: log} = (await this.logCtx([], OperationKeys.DELETE, true)).for(remove);
1513
- const id = getPK(...routeParams.valuesInOrder);
1514
- if (typeof id === "undefined") throw new ValidationError(`No ${this.pk} provided`);
1515
- let del;
1516
- try {
1517
- log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
1518
- del = await this.persistence(ctx).delete(id, ctx);
1519
- } catch (e) {
1520
- log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
1521
- throw FromModelController.toDecafError(e, `Failed to delete ${modelClazzName} with id ${id}`);
1522
- }
1523
- log.info(`deleted ${modelClazzName} with id ${id}`);
1524
- if (resp) ctx.toResponse(resp);
1525
- return del;
1526
- };
1527
- }
1528
- static createStatementHandler(modelClazzName) {
1529
- return async function statement(name, args, details) {
1530
- const {ctx: ctx} = (await this.logCtx([], PersistenceKeys.STATEMENT, true)).for(statement);
1531
- const {direction: direction, offset: offset, limit: limit, bookmark: bookmark} = details;
1532
- args = args.map(a => (typeof a === "string" ? parseInt(a) : a) || a);
1533
- const pathDirection = args.length > 1 ? args[1] : undefined;
1534
- const resolvedDirection = direction ?? pathDirection;
1535
- if (resolvedDirection && args.length > 1) args[1] = resolvedDirection;
1536
- switch (name) {
1537
- case PreparedStatementKeys.FIND:
1538
- case PreparedStatementKeys.FIND_BY:
1539
- break;
1540
-
1541
- case PreparedStatementKeys.LIST_BY:
1542
- args.push(direction);
1543
- break;
1544
-
1545
- case PreparedStatementKeys.PAGE:
1546
- case PreparedStatementKeys.PAGE_BY:
1547
- args = [ args[0], resolvedDirection, {
1548
- limit: limit,
1549
- offset: offset,
1550
- bookmark: bookmark
1551
- } ];
1552
- break;
1553
-
1554
- case PreparedStatementKeys.FIND_ONE_BY:
1555
- break;
1556
-
1557
- case PreparedStatementKeys.COUNT_OF:
1558
- case PreparedStatementKeys.MAX_OF:
1559
- case PreparedStatementKeys.MIN_OF:
1560
- case PreparedStatementKeys.AVG_OF:
1561
- case PreparedStatementKeys.SUM_OF:
1562
- case PreparedStatementKeys.DISTINCT_OF:
1563
- case PreparedStatementKeys.GROUP_OF:
1564
- break;
1565
- }
1566
- return this.persistence(ctx).statement(name, ...args, ctx);
1567
- };
1568
- }
1569
- static createStatementShortcutHandler(statementKey, modelClazzName) {
1570
- return async function statementShortcut(...args) {
1571
- const {ctx: ctx} = (await this.logCtx([], statementKey, true)).for(statementShortcut);
1572
- switch (statementKey) {
1573
- case PreparedStatementKeys.LIST_BY:
1574
- {
1575
- const [key, details] = args;
1576
- return this.persistence(ctx).listBy(key, details?.direction, ctx);
1577
- }
1578
-
1579
- case PreparedStatementKeys.PAGE_BY:
1580
- {
1581
- const [key, page, details] = args;
1582
- return this.persistence(ctx).paginateBy(key, details?.direction, {
1583
- limit: details?.limit,
1584
- offset: details?.offset,
1585
- page: page
1586
- }, ctx);
1587
- }
1588
-
1589
- case PreparedStatementKeys.FIND:
1590
- {
1591
- const [value, details] = args;
1592
- const direction = details?.direction ?? OrderDirection.ASC;
1593
- const persistence = this.persistence(ctx);
1594
- if (typeof persistence.find === "function") return persistence.find(value, direction, ctx);
1595
- return persistence.statement(PreparedStatementKeys.FIND, value, direction, ctx);
1596
- }
1597
-
1598
- case PreparedStatementKeys.PAGE:
1599
- {
1600
- const [value, details] = args;
1601
- const ref = {
1602
- offset: details?.offset ?? 1,
1603
- limit: details?.limit ?? 10,
1604
- bookmark: details?.bookmark
1605
- };
1606
- const persistence = this.persistence(ctx);
1607
- const direction = details?.direction ?? OrderDirection.ASC;
1608
- if (typeof persistence.page === "function") return persistence.page(value, direction, ref, ctx);
1609
- return persistence.statement(PreparedStatementKeys.PAGE, value, direction, ref, ctx);
1610
- }
1611
-
1612
- case PreparedStatementKeys.FIND_ONE_BY:
1613
- {
1614
- const [key, value] = args;
1615
- return this.persistence(ctx).findOneBy(key, value, ctx);
1616
- }
1617
-
1618
- case PreparedStatementKeys.FIND_BY:
1619
- {
1620
- const [key, value] = args;
1621
- return this.persistence(ctx).for(ctx.toOverrides()).findBy(key, value, ctx);
1622
- }
1623
-
1624
- default:
1625
- if (statementKey === PreparedStatementKeys.COUNT_OF || statementKey === PreparedStatementKeys.MAX_OF || statementKey === PreparedStatementKeys.MIN_OF || statementKey === PreparedStatementKeys.AVG_OF || statementKey === PreparedStatementKeys.SUM_OF || statementKey === PreparedStatementKeys.DISTINCT_OF || statementKey === PreparedStatementKeys.GROUP_OF) {
1626
- const [field] = args;
1627
- return this.persistence(ctx).statement(statementKey, field, ctx);
1628
- }
1629
- throw new InternalError(`Unknown statement: ${statementKey}`);
1630
- }
1631
- };
1632
- }
1633
1391
  static createComplexQueryHandler(methodName) {
1634
1392
  return async function complexQuery(...args) {
1635
1393
  const log = this.log?.for?.(complexQuery);
@@ -1657,24 +1415,6 @@ class FromModelController {
1657
1415
  }
1658
1416
  };
1659
1417
  }
1660
- static createCustomRouteHandler(methodName) {
1661
- return async function customRoute(...args) {
1662
- const log = this.log?.for?.(customRoute);
1663
- const {ctx: ctx} = (await this.logCtx([], methodName, true)).for(customRoute);
1664
- const persistence = this.persistence(ctx);
1665
- const spreadArgs = FromModelController.normalizeQueryArgs(args);
1666
- if (persistence?.repo && typeof persistence.repo[methodName] === "function") {
1667
- return persistence.repo[methodName](...spreadArgs);
1668
- }
1669
- if (typeof persistence[methodName] === "function") {
1670
- return persistence[methodName](...spreadArgs);
1671
- }
1672
- if (typeof persistence.statement === "function") {
1673
- return persistence.statement(methodName, ...spreadArgs, ctx);
1674
- }
1675
- throw new InternalError(`Method "${methodName}" not found on ${persistence?.constructor?.name} or its repo`);
1676
- };
1677
- }
1678
1418
  static extractQueryArgs(args) {
1679
1419
  if (args.length === 0) return args;
1680
1420
  const last = args[args.length - 1];
@@ -2336,7 +2076,7 @@ class NestBootstraper {
2336
2076
  const helmet = require("helmet");
2337
2077
  this.app.use(helmet(options));
2338
2078
  this.logger.log("Helmet middleware enabled successfully.");
2339
- } catch (e) {
2079
+ } catch {
2340
2080
  this.logger.warn("Helmet not installed. Skipping middleware.");
2341
2081
  }
2342
2082
  return this;
@@ -2767,9 +2507,9 @@ function repoForModel(model) {
2767
2507
 
2768
2508
  const VERSION = "0.11.2-refactor.4";
2769
2509
 
2770
- const COMMIT = "55b8f3e";
2510
+ const COMMIT = "1b4f98c";
2771
2511
 
2772
- const FULL_VERSION = "0.11.2-refactor.4-55b8f3e";
2512
+ const FULL_VERSION = "0.11.2-refactor.4-1b4f98c";
2773
2513
 
2774
2514
  const PACKAGE_NAME = "@decaf-ts/for-nest";
2775
2515
 
@@ -2780,4 +2520,4 @@ Metadata.registerLibrary(PACKAGE_NAME, VERSION);
2780
2520
  Metadata.allowReregistration(false);
2781
2521
 
2782
2522
  export { AUTH_HANDLER, AUTH_META_KEY, ApiOperationFromModel, ApiParamsFromModel, ApiProperty, Auth, AuthInterceptor, BulkApiOperationFromModel, COMMIT, CorsError, DECAF_ADAPTER_ID, DECAF_CONTEXT_KEY, DECAF_CONTROLLER_CONFIG, DECAF_EXPOSE, DECAF_HANDLERS, DECAF_MODULE_OPTIONS, DECAF_ROUTE, DECAF_TASK_SERVICE_ID, DECORATORS, DECORATORS_PREFIX, DecafAuthHandler, DecafAuthModule, DecafBody, DecafController, DecafCoreModule, DecafExceptionFilter, DecafHandlerExecutor, DecafModelController, DecafModule, DecafParams, DecafRequestContext, DecafRequestHandlerInterceptor, DecafResponseInterceptor, DecafRoleAuthHandler, DecafStreamModule, DtoFor, EventsController, FULL_VERSION, FromModelController, IS_PUBLIC_KEY, NestBootstraper, PACKAGE_NAME, Public, REQUIRED_ROLES_KEY, Repository, RequireRoles, SKIP_MODEL_ROLES_KEY, Service, SwaggerBuilder, UseDecafFilter, UseDecafHeaders, VERSION, applyApiDecorators, controllerConfig, createApiPropertyDecorator, createPropertyDecorator, createRouteHandler, defineRouteMethod, expose, getApiDecorators, getEnumType, getEnumValues, getModuleFor, getRegisteredDecafProviders, isUndefined, repoForModel, resolvePersistenceMethod, runMigrations };
2783
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aE1vZHVsZS50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmSGFuZGxlckV4ZWN1dG9yLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXNwb25zZUludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2NvbnRyb2xsZXJzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL01vZGVsQnVpbGRlckV4dGVuc2lvbnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRnJvbU1vZGVsQ29udHJvbGxlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9EZWNhZk1vZGVsTW9kdWxlLnRzIiwiLi4vc3JjL2RlY29yYXRpb24udHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvY29ycy50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy90aHJvdHRsaW5nLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9EZWNhZkVycm9yRmlsdGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9jb25zdGFudHMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJDdXN0b21VSS50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckJ1aWxkZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9OZXN0Qm9vdHN0cmFwZXIudHMiLCIuLi9zcmMvaW50ZXJjZXB0b3JzL0RlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1RhcmdldChcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8QyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHg+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmZ1bmN0aW9uIHRvRGVjYWZFcnJvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICBDT05URVhUIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBIdHRwRGVjYWZDb250cm9sbGVyPFJlcXVlc3QsIGFueSwgRGVjYWZSZXF1ZXN0Q29udGV4dD4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZNb2RlbENvbnRyb2xsZXI8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPEM+IHtcbiAgcHJpdmF0ZSBfcGVyc2lzdGVuY2U/OiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIF9uYW1lKTtcbiAgfVxuXG4gIGFic3RyYWN0IGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPE0+O1xuXG4gIHBlcnNpc3RlbmNlKGN0eD86IENvbnRleHQ8YW55Pik6IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxNPj4odGhpcy5jbGFzcyk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKFxuICAgICAgICAgICAgdGhpcy5jbGFzc1xuICAgICAgICAgICkgYXMgTW9kZWxTZXJ2aWNlPE0+O1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmNsaWVudENvbnRleHQudG9PdmVycmlkZXMoKTtcblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUob3ZlcnJpZGVzKVxuICAgICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlLmZvcihvdmVycmlkZXMpXG4gICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkdG9DYWNoZSA9IG5ldyBNYXA8XG4gIE9wZXJhdGlvbktleXMsXG4gIFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj5cbj4oKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBOZXN0L1N3YWdnZXIgRFRPIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIENSVUQgb3BlcmF0aW9uLlxuICpcbiAqIFJ1bGVzOlxuICogIC0gT25seSBDUkVBVEUgYW5kIFVQREFURSAoYW5kIHRoZWlyIGJ1bGsgdmFyaWFudHMpIHByb2R1Y2UgYSBEVE87XG4gKiAgICBhbGwgb3RoZXIgb3BlcmF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIG1vZGVsIGNsYXNzIHVuY2hhbmdlZC5cbiAqICAtIEBnZW5lcmF0ZWQoKSBwcm9wZXJ0aWVzIChjcmVhdGVkQXQsIHVwZGF0ZWRBdCwgY3JlYXRlZEJ5LCB1cGRhdGVkQnksXG4gKiAgICB1dWlkLCB2ZXJzaW9uLCBAY29tcG9zZWQgcGtzLCDigKYpIGFyZSAqKm5ldmVyKiogZXhwb3NlZCBpbiBhbnkgRFRPLlxuICogIC0gVGhlIEBwaygpIHByb3BlcnR5OlxuICogICAgICDigKIgVVBEQVRFIOKAkyBhbHdheXMgaW5jbHVkZWQuXG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBpbmNsdWRlZCBvbmx5IHdoZW4gdGhlIHBrIGlzIE5PVCBhdXRvLWdlbmVyYXRlZFxuICogICAgICAgICAgICAgICAgICAoY2hlY2tlZCB2aWEgTW9kZWwucGtQcm9wcygpLmdlbmVyYXRlZCBBTkQgTW9kZWwuZ2VuZXJhdGVkKCkpLlxuICogIC0gUmVsYXRpb24gcHJvcGVydGllcyAoQG9uZVRvT25lLCBAb25lVG9NYW55LCDigKYpOlxuICogICAgICDigKIgQ1JFQVRFICDigJMgbmVzdGVkIGFzIER0b0ZvcihDUkVBVEUsIFJlbGF0ZWRNb2RlbCkuIFdoZW4gdGhlIHJlbGF0aW9uXG4gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgKG1vZGVsIEEg4oaSIG1vZGVsIEIg4oaSIG1vZGVsIEEpLFxuICogICAgICAgICAgICAgICAgICB0aGUgYmFjay1yZWZlcmVuY2UgdXNlcyB0aGUgcmVsYXRlZCBtb2RlbCdzIFBLIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVhayB0aGUgY3ljbGUuXG4gKiAgICAgIOKAoiBVUERBVEUgIOKAkyB1bmlvbiBvZiBEdG9Gb3IoVVBEQVRFLCBSZWxhdGVkTW9kZWwpICoqb3IqKiB0aGVcbiAqICAgICAgICAgICAgICAgICAgcmVsYXRlZCBtb2RlbCdzIHByaW1hcnkta2V5IHR5cGUgKHN0cmluZyAvIGludGVnZXIpLFxuICogICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBTd2FnZ2VyIG9uZU9mLiBDaXJjdWxhciBiYWNrLXJlZmVyZW5jZXNcbiAqICAgICAgICAgICAgICAgICAgb21pdCB0aGUgRFRPICRyZWYgYW5kIG9ubHkgaW5jbHVkZSB0aGUgUEsgdHlwZS5cbiAqXG4gKiBNZXRhZGF0YS5wcm9wZXJ0aWVzKCkgbm93IHJldHVybnMgQUxMIHByb3BlcnRpZXMgYWNyb3NzIHRoZSBwcm90b3R5cGUgY2hhaW4sXG4gKiBzbyBEVE8gaW5oZXJpdGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZXZlcnkgRFRPIGlzIGEgZmxhdCBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIER0b0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBzdGFjazogU2V0PENvbnN0cnVjdG9yPGFueT4+ID0gbmV3IFNldCgpXG4pOiBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgaWYgKCFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMuaW5jbHVkZXMob3ApKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXREdG9DYWNoZShvcCk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtb2RlbCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgaXNVcGRhdGVPcCA9IFtcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgXS5pbmNsdWRlcyhvcCBhcyBhbnkpO1xuXG4gIGNsYXNzIER5bmFtaWNEVE8ge31cbiAgY2FjaGUuc2V0KG1vZGVsLCBEeW5hbWljRFRPKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTywgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYCR7dG9QYXNjYWxDYXNlKG1vZGVsLm5hbWUpfSR7dG9QYXNjYWxDYXNlKG9wKX1EVE9gLFxuICB9KTtcblxuICBjb25zdCBwa1Byb3AgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTW9kZWwucGsobW9kZWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gcGtQcm9wID8gTW9kZWwucGtQcm9wcyhtb2RlbCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa0Rlc2lnblR5cGUgPSBwa1Byb3BcbiAgICA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHBrUHJvcCBhcyBzdHJpbmcpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrVHlwZUlzTnVtZXJpYyA9XG4gICAgcGtEZXNpZ25UeXBlID09PSBOdW1iZXIgfHwgcGtEZXNpZ25UeXBlID09PSBCaWdJbnQ7XG4gIGNvbnN0IHBrSXNHZW5lcmF0ZWQgPVxuICAgICEhcGtQcm9wc01ldGFkYXRhPy5nZW5lcmF0ZWQgfHxcbiAgICAocGtQcm9wXG4gICAgICA/IE1vZGVsLmdlbmVyYXRlZEJ5U2VxdWVuY2UobW9kZWwgYXMgYW55LCBwa1Byb3AgYXMgYW55KSB8fFxuICAgICAgICBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHBrUHJvcCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHBrVHlwZUlzTnVtZXJpY1xuICAgICAgOiBmYWxzZSk7XG5cbiAgY29uc3QgYWxsUHJvcHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoTWV0YWRhdGEucHJvcGVydGllcyhtb2RlbCkgfHwgW10pKTtcbiAgY29uc3QgcmVsYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KChNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gIGNvbnN0IHNjYWxhclByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBhbGxQcm9wcykge1xuICAgIGlmICghcHJvcCkgY29udGludWU7XG4gICAgaWYgKHJlbGF0aW9ucy5oYXMocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByb3AgPT09IHBrUHJvcCAmJiAhaXNVcGRhdGVPcCAmJiBwa0lzR2VuZXJhdGVkKSBjb250aW51ZTtcbiAgICBpZiAocHJvcCAhPT0gcGtQcm9wICYmIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHNjYWxhclByb3BzLnB1c2gocHJvcCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGFyUHJvcHMpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISF2YWxpZGF0aW9uPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuICAgIGNvbnN0IHR5cGVIaW50ID1cbiAgICAgIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkgPz9cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgfTtcbiAgICBpZiAodHlwZUhpbnQpIGFwaU9wdGlvbnMudHlwZSA9IHR5cGVIaW50O1xuXG4gICAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKSA/PyB0eXBlSGludDtcbiAgICBpZiAodHlwZW9mIGRlc2lnblR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgZGVzaWduVHlwZSxcbiAgICAgICAgRHluYW1pY0RUTy5wcm90b3R5cGUsXG4gICAgICAgIHByb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSBNZXRhZGF0YS5yZWxhdGlvbnMobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgaWYgKCFyZWxhdGlvbk1ldGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNZXRhZGF0YSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9XG4gICAgICByZWxhdGlvbk1ldGEuY2xhc3MgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICBpZiAodHlwZW9mIHJlbGF0aW9uVHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICFyZWxhdGlvblR5cGUubmFtZSkge1xuICAgICAgcmVsYXRpb25UeXBlID0gKHJlbGF0aW9uVHlwZSBhcyBhbnkpKCk7XG4gICAgfVxuICAgIGlmICghcmVsYXRpb25UeXBlIHx8IHR5cGVvZiByZWxhdGlvblR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFR5cGUgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoIU1vZGVsLmdldChyZWxhdGlvblR5cGUubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGNvbnN0IGlzQXJyYXkgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5MSVNUXTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuXG4gICAgLy8gRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZTogaWYgdGhlIHJlbGF0ZWQgbW9kZWwgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAvLyByZWN1cnNpb24gc3RhY2ssIHVzZSB0aGUgUEsgdHlwZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVha1xuICAgIC8vIHRoZSBjeWNsZS4gVGhpcyBwcmV2ZW50cyBAbmVzdGpzL3N3YWdnZXIncyBTY2hlbWFPYmplY3RGYWN0b3J5IGZyb21cbiAgICAvLyBpbmZpbml0ZWx5IHJlY3Vyc2luZyB3aGVuIGV4cGxvcmluZyB0aGUgc2NoZW1hcy5cbiAgICBjb25zdCBpc0NpcmN1bGFyID0gc3RhY2suaGFzKHJlbGF0aW9uVHlwZSk7XG5cbiAgICBpZiAoaXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgICAgIGFkZFJlbGF0aW9uUGtSZWYoRHluYW1pY0RUTywgcmVsYXRpb24sIHBrVHlwZU5hbWUsIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25EdG8gPSBEdG9Gb3Iob3AsIHJlbGF0aW9uVHlwZSwgbmV3IFNldChzdGFjaykuYWRkKG1vZGVsKSk7XG5cbiAgICBpZiAoaXNVcGRhdGVPcCkge1xuICAgICAgYWRkUmVsYXRpb25VcGRhdGUoXG4gICAgICAgIER5bmFtaWNEVE8sXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICByZWxhdGlvblR5cGUsXG4gICAgICAgIHJlbGF0aW9uRHRvLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBpc1JlcXVpcmVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRSZWxhdGlvbihEeW5hbWljRFRPLCByZWxhdGlvbiwgcmVsYXRpb25EdG8sIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEeW5hbWljRFRPO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvbihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICB0eXBlOiByZWxhdGlvbkR0byxcbiAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICBpc0FycmF5LFxuICB9O1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogcmVsYXRpb25EdG8sXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHJlbGF0aW9uIHByb3BlcnR5IHRoYXQgdXNlcyB0aGUgUEsgdHlwZSAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2ZcbiAqIGEgZnVsbCBEVE8gY2xhc3MuIFVzZWQgdG8gYnJlYWsgY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBDdXN0b21lciDihpIgT3JkZXIg4oaSIEN1c3RvbWVyKS5cbiAqL1xuZnVuY3Rpb24gYWRkUmVsYXRpb25Qa1JlZihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcGtUeXBlTmFtZTogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBwa1R5cGVOYW1lIH0sIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogcGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcsIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IChwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZyksXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uVXBkYXRlKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4sXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBleHRyYU1vZGVscyA9XG4gICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsIER0b0NsYXNzKSB8fCBbXTtcbiAgaWYgKCFleHRyYU1vZGVscy5pbmNsdWRlcyhyZWxhdGlvbkR0bykpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLFxuICAgICAgWy4uLmV4dHJhTW9kZWxzLCByZWxhdGlvbkR0b10sXG4gICAgICBEdG9DbGFzc1xuICAgICk7XG4gIH1cblxuICBjb25zdCBkdG9SZWYgPSBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHtyZWxhdGlvbkR0by5uYW1lfWA7XG4gIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gIGNvbnN0IG9uZU9mSXRlbXMgPSBbeyAkcmVmOiBkdG9SZWYgfSwgeyB0eXBlOiBwa1R5cGVOYW1lIH1dO1xuXG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpO1xuXG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiBPYmplY3QsXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBNb2RlbC5wa1Byb3BzKHJlbGF0aW9uVHlwZSBhcyBhbnkpO1xuICAgIGNvbnN0IHBrVHlwZSA9IHBrUHJvcHNNZXRhZGF0YT8udHlwZTtcbiAgICBpZiAocGtUeXBlID09PSBOdW1iZXIgfHwgcGtUeXBlID09PSBCaWdJbnQpIHJldHVybiBcImludGVnZXJcIjtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBpZiAoTW9kZWwuZ2VuZXJhdGVkKGN1cnJlbnQsIHByb3AgYXMgYW55KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IoY3VycmVudCwgcHJvcCBhcyBhbnkpO1xuICAgIGlmICh2YWxpZGF0aW9uKSByZXR1cm4gdmFsaWRhdGlvbiBhcyBhbnk7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZyk6IGFueSB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoY3VycmVudCwgcHJvcCk7XG4gICAgaWYgKHR5cGUpIHJldHVybiB0eXBlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RHRvQ2FjaGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzXG4pOiBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+IHtcbiAgaWYgKCFkdG9DYWNoZS5oYXMob3ApKSB7XG4gICAgZHRvQ2FjaGUuc2V0KG9wLCBuZXcgV2Vha01hcCgpKTtcbiAgfVxuICByZXR1cm4gZHRvQ2FjaGUuZ2V0KG9wKSE7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7IENvbnRyb2xsZXIsIFBhcmFtLCBRdWVyeSwgUmVzcG9uc2UsIFNldE1ldGFkYXRhIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UsXG4gIEFwaUJvZHksXG4gIEFwaUNyZWF0ZWRSZXNwb25zZSxcbiAgQXBpRXh0cmFNb2RlbHMsXG4gIEFwaU5vQ29udGVudFJlc3BvbnNlLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlRdWVyeSxcbiAgQXBpVGFncyxcbiAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlLFxuICBnZXRTY2hlbWFQYXRoLFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIERpcmVjdGlvbkxpbWl0T2Zmc2V0LFxuICBNb2RlbFNlcnZpY2UsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFByZXBhcmVkU3RhdGVtZW50S2V5cyxcbiAgdHlwZSBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgREJLZXlzLFxuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIEFwaU9wZXJhdGlvbkZyb21Nb2RlbCxcbiAgQXBpUGFyYW1zRnJvbU1vZGVsLFxuICB0eXBlIERlY2FmQXBpUHJvcGVydHksXG4gIERlY2FmQm9keSxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuLi9hdXRoL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aCwgUHVibGljLCBSZXF1aXJlUm9sZXMgfSBmcm9tIFwiLi4vYXV0aC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgQXV0aENvbmZpZyxcbiAgdHlwZSBTZXJ2ZXJSb3V0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEZyb21Nb2RlbENvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuXG4gIHByaXZhdGUgc3RhdGljIHRvRGVjYWZFcnJvcihcbiAgICBlcnJvcjogdW5rbm93bixcbiAgICBmYWxsYmFja01lc3NhZ2U6IHN0cmluZ1xuICApOiBCYXNlRXJyb3Ige1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBNb2RlbENvbnN0cjogQ29uc3RydWN0b3IgPSByZXBvLmNsYXNzO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgcGFyYW1zXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcGFyYW1zLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIildXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQ6IHN0cmluZykgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHBhcmFtcy5odHRwTWV0aG9kIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgcGFyYW1zLmh0dHBNZXRob2RcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVlcnlDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4sXG4gICAgZ2xvYmFsRGVmYXVsdHM/OiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihnbG9iYWxEZWZhdWx0cyB8fCB7fSksXG4gICAgICAuLi4oZGVjb3JhdG9yQ29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLihtb2R1bGVPdmVycmlkZSB8fCB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IEZhY3RvcnlDb250cm9sbGVyID0gTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGU8VD4oXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZSxcbiAgICAgIG1lcmdlZENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgZmFjdG9yeVJvdXRlcyA9IChGYWN0b3J5Q29udHJvbGxlciBhcyBhbnkpLl9fcm91dGVzX18gYXNcbiAgICAgIHwgU2VydmVyUm91dGVbXVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7IGdldFBLLCBhcGlQcm9wZXJ0aWVzLCBwYXRoOiBwa1BhdGggfSA9XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudClcbiAgICAgICAgICByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzb3J0ZWRSb3V0ZXMpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IHJvdXRlLmltcGxlbWVudGF0aW9uPy5uYW1lIHx8IHJvdXRlLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBmYWN0b3J5UGVyc2lzdGVuY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtZXRob2ROYW1lOiByZWdpc3RlcmVkTWV0aG9kTmFtZSxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIGRlY29yYXRvcnMsXG4gICAgICAgICAgcGFyYW1EZWNvcmF0b3JzLFxuICAgICAgICB9ID0gcmVnaXN0cmF0aW9uO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHJvdXRlLm1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICAgICAgcm91dGUucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICAgIHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdLFxuICAgICAgICAgICAgcGFyYW1EZWNvcmF0b3JzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyIGFzIGFueTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWw8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKToge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXTtcbiAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBwayA9IE1vZGVsLnBrKE1vZGVsQ2xhenopIGFzIGtleW9mIE1vZGVsPGFueT47XG4gICAgY29uc3QgY29tcG9zZWQgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENsYXp6LFxuICAgICAgTWV0YWRhdGEua2V5KERCS2V5cy5DT01QT1NFRCwgcGspXG4gICAgKTtcbiAgICBjb25zdCBjb21wb3NlZEtleXMgPSBjb21wb3NlZD8uYXJncyA/PyBbXTtcblxuICAgIGNvbnN0IHVuaXF1ZUtleXMgPVxuICAgICAgQXJyYXkuaXNBcnJheShjb21wb3NlZEtleXMpICYmIGNvbXBvc2VkS2V5cy5sZW5ndGggPiAwXG4gICAgICAgID8gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5jb21wb3NlZEtleXNdKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKG5ldyBTZXQoW3BrXSkpO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6KSA/PyBcIlwiO1xuICAgIGNvbnN0IHBhdGggPSBgOiR7dW5pcXVlS2V5cy5qb2luKFwiLzpcIil9YDtcbiAgICBjb25zdCBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10gPSB1bmlxdWVLZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgIGRlc2NyaXB0aW9uOiBNZXRhZGF0YS5kZXNjcmlwdGlvbihNb2RlbENsYXp6LCBrZXkpLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXRoLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgZ2V0UEs6ICguLi5wYXJhbXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+XG4gICAgICAgIGNvbXBvc2VkPy5zZXBhcmF0b3IgPyBwYXJhbXMuam9pbihjb21wb3NlZC5zZXBhcmF0b3IpIDogcGFyYW1zLmpvaW4oXCJcIiksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHJvdXRlUGFyYW1EZWNvcmF0b3JzKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBsZXQgcGFyYW1JbmRleCA9IDA7XG4gICAgcmV0dXJuIHBhdGhcbiAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5mbGF0TWFwKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH1dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoXCIqXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFt7IGRlY29yYXRvcjogUGFyYW0oc2VnbWVudC5zbGljZSgxKSkgYXMgYW55LCBpbmRleDogcGFyYW1JbmRleCsrIH1dO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmaW5lTWV0aG9kKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdXG4gICkge1xuICAgIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2ROYW1lKTtcbiAgICBtZXRob2REZWNvcmF0b3JzLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgICBwYXJhbURlY29yYXRvcnMuZm9yRWFjaCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+XG4gICAgICBkZWNvcmF0b3IocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaFJvdXRlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZTogU2VydmVyUm91dGUsXG4gICAgcGtQYXRoOiBzdHJpbmcsXG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdLFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBwZXJzaXN0ZW5jZT86IGFueVxuICApOiB7XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nO1xuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+O1xuICB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbiBhcyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJjcmVhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrUmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa1VwZGF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJkZWxldGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrRGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfSwgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9XVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBhcGlQcm9wZXJ0aWVzLCBwa1BhdGgpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICBpbmRleDogaW5kZXggKyAxLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID0gRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2VkIFBLIGZhbGxiYWNrIHJvdXRlcyAoZmlsdGVyRW1wdHkpIOKAlCBwYXRoIGRpZmZlcnMgZnJvbSBwa1BhdGhcbiAgICBjb25zdCBmYWxsYmFja1NlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpc0FsbFBhcmFtcyA9IGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJiBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9IEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYHJlYWRCeSR7c3VmZml4fWAsXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgZmFsbGJhY2tBcGlQcm9wcywgbm9ybWFsaXplZFBhdGgpLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgICBkZWNvcmF0b3IsXG4gICAgICAgICAgICAgIGluZGV4OiBpbmRleCArIDEsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIikge1xuICAgICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgICAgYGRlbGV0ZUJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICByb3V0ZVBhcmFtc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInN0YXRlbWVudFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcIm1ldGhvZFwiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKFwiYXJnc1wiKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiAyIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBub3JtYWxpemVkUGF0aCxcbiAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQllcbiAgICAgICAgKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGVtZW50Um91dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICAgIFwicGFnaW5hdGVCeS86a2V5LzpwYWdlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFX0JZLFxuICAgICAgXCJmaW5kLzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCxcbiAgICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgICBcImZpbmRPbmVCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlksXG4gICAgICBcImZpbmRCeS86a2V5Lzp2YWx1ZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWSxcbiAgICAgIFwiY291bnRPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GLFxuICAgICAgXCJtYXhPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRixcbiAgICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgICBcImF2Z09mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GLFxuICAgICAgXCJzdW1PZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRixcbiAgICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgICAgXCJncm91cE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0YsXG4gICAgfTtcblxuICAgIGNvbnN0IHN0YXRlbWVudEtleSA9IHN0YXRlbWVudFJvdXRlc1tub3JtYWxpemVkUGF0aF07XG4gICAgaWYgKHN0YXRlbWVudEtleSAmJiBtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRNZXRob2ROYW1lKG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lLCBub3JtYWxpemVkUGF0aCwgc3RhdGVtZW50S2V5KSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBjb25zdCBxdWVyeU1ldGhvZCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpLnNwbGl0KFwiL1wiKVswXTtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKHF1ZXJ5TWV0aG9kLCBub3JtYWxpemVkUGF0aCwgXCJHRVRcIiwgdHJ1ZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIiwgXCJmaW5kQnlcIiwgXCJmaW5kQnlQYWdpbmF0ZVwiLCBcImZpbmRPbmVCeVwiLCBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLCBcInBhZ2VcIiwgXCJjb3VudE9mXCIsIFwibWF4T2ZcIiwgXCJtaW5PZlwiLCBcImF2Z09mXCIsIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLCBcImdyb3VwT2ZcIiwgXCJzdGF0ZW1lbnRcIiwgXCJidWxrXCIsIFwicXVlcnlcIixcbiAgICBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikgJiZcbiAgICAgICFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKFwic3RhdGVtZW50L1wiKSAmJlxuICAgICAgIWtub3duUHJlZml4ZXMuaGFzKHBhdGhTZWdtZW50c1swXSlcbiAgICApIHtcbiAgICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBwYXRoU2VnbWVudHNcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSlcbiAgICAgICAgLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgW1xuICAgICAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuXCIgfSksXG4gICAgICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVIYW5kbGVyKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gY3JlYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgZGF0YTogYW55LFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGUpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGUoZGF0YSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIG5ldyAke21vZGVsQ2xhenpOYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KGNyZWF0ZWQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrQ3JlYXRlSGFuZGxlcihcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGRhdGE6IGFueVtdLFxuICAgICAgcmVzcD86IGFueVxuICAgICk6IFByb21pc2U8TW9kZWxbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLkNSRUFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcihjcmVhdGVBbGwpO1xuICAgICAgbG9nLnZlcmJvc2UoYGNyZWF0aW5nIG5ldyAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgbGV0IGNyZWF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3JlYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5jcmVhdGVBbGwoXG4gICAgICAgICAgZGF0YS5tYXAoKGQpID0+IG5ldyBNb2RlbENvbnN0cihkKSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZEFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWRBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHtub3JtYWxpemVkSWRzfSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWRBbGwobm9ybWFsaXplZElkcyBhcyBhbnksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgYm9keTogYW55W10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGVBbGwpO1xuICAgICAgbGV0IHVwZGF0ZWQ6IGFueVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7Ym9keS5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlQWxsKGJvZHksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSAke21vZGVsQ2xhenpOYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXNwKSBjdHgudG9SZXNwb25zZShyZXNwKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVCdWxrRGVsZXRlSGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW10sXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbFtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuREVMRVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKGRlbGV0ZUFsbCk7XG4gICAgICBjb25zdCBub3JtYWxpemVkSWRzID0gQXJyYXkuaXNBcnJheShpZHMpID8gaWRzIDogW2lkc107XG4gICAgICBsZXQgcmVhZDogTW9kZWxbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgZGVsZXRpbmcgJHtub3JtYWxpemVkSWRzLmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgcmVhZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS5kZWxldGVBbGwobm9ybWFsaXplZElkcywgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IEZyb21Nb2RlbENvbnRyb2xsZXIudG9EZWNhZkVycm9yKFxuICAgICAgICAgIGUsXG4gICAgICAgICAgYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke3JlYWQubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHJlYWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlYWRIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHJlYWQoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICByb3V0ZVBhcmFtczogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbD4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5SRUFELCB0cnVlKVxuICAgICAgKS5mb3IocmVhZCk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IHJlYWRSZXN1bHQ6IE1vZGVsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGByZWFkaW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICByZWFkUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWQoaWQsIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYHJlYWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhyZWFkUmVzdWx0IGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICByZXR1cm4gcmVhZFJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlVXBkYXRlSGFuZGxlcihcbiAgICBnZXRQSzogKC4uLnA6IEFycmF5PHN0cmluZyB8IG51bWJlcj4pID0+IHN0cmluZyxcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnksXG4gICAgICBib2R5OiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIE9wZXJhdGlvbktleXMuVVBEQVRFLCB0cnVlKVxuICAgICAgKS5mb3IodXBkYXRlKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmluZm8oYHVwZGF0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShib2R5KSk7XG4gICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkudXBkYXRlKFxuICAgICAgICAgIG5ldyBNb2RlbENvbnN0cih7IC4uLnBheWxvYWQsIFt0aGlzLnBrXTogaWQgfSksXG4gICAgICAgICAgY3R4XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZURlbGV0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlbW92ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IGRlbDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBkZWwgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBGcm9tTW9kZWxDb250cm9sbGVyLnRvRGVjYWZFcnJvcihcbiAgICAgICAgICBlLFxuICAgICAgICAgIGBGYWlsZWQgdG8gZGVsZXRlICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgZGVsZXRlZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gZGVsO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc3RhdGVtZW50KFxuICAgICAgdGhpczogYW55LFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgYXJnczogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIGRldGFpbHM6IERpcmVjdGlvbkxpbWl0T2Zmc2V0XG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBQZXJzaXN0ZW5jZUtleXMuU1RBVEVNRU5ULCB0cnVlKVxuICAgICAgKS5mb3Ioc3RhdGVtZW50KTtcbiAgICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBvZmZzZXQsIGxpbWl0LCBib29rbWFyayB9ID0gZGV0YWlscztcbiAgICAgIGFyZ3MgPSBhcmdzLm1hcChcbiAgICAgICAgKGEpID0+ICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KGEgYXMgc3RyaW5nKSA6IGEpIHx8IGFcbiAgICAgICkgYXMgYW55W107XG4gICAgICBjb25zdCBwYXRoRGlyZWN0aW9uID0gYXJncy5sZW5ndGggPiAxID8gYXJnc1sxXSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHJlc29sdmVkRGlyZWN0aW9uID0gKGRpcmVjdGlvbiA/PyBwYXRoRGlyZWN0aW9uKSBhc1xuICAgICAgICB8IHN0cmluZ1xuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChyZXNvbHZlZERpcmVjdGlvbiAmJiBhcmdzLmxlbmd0aCA+IDEpIGFyZ3NbMV0gPSByZXNvbHZlZERpcmVjdGlvbjtcbiAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5MSVNUX0JZOlxuICAgICAgICAgIGFyZ3MucHVzaChkaXJlY3Rpb24gYXMgc3RyaW5nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRTpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWTpcbiAgICAgICAgICBhcmdzID0gW1xuICAgICAgICAgICAgYXJnc1swXSxcbiAgICAgICAgICAgIHJlc29sdmVkRGlyZWN0aW9uIGFzIGFueSxcbiAgICAgICAgICAgIHsgbGltaXQsIG9mZnNldCwgYm9va21hcmsgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX09ORV9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQ09VTlRfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1BWF9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQobmFtZSwgLi4uYXJncywgY3R4KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyKFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nLFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudFNob3J0Y3V0KFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIHN0YXRlbWVudEtleSwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudFNob3J0Y3V0KTtcblxuICAgICAgc3dpdGNoIChzdGF0ZW1lbnRLZXkpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmxpc3RCeShcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiBhcyBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHBhZ2UsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnBhZ2luYXRlQnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCxcbiAgICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQsXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgIGN0eFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDoge1xuICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgZGV0YWlsc10gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9XG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gPz8gT3JkZXJEaXJlY3Rpb24uQVNDO1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGlmICh0eXBlb2YgcGVyc2lzdGVuY2UuZmluZCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLmZpbmQodmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELCB2YWx1ZSwgZGlyZWN0aW9uLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCByZWYgPSB7XG4gICAgICAgICAgICBvZmZzZXQ6IChkZXRhaWxzIGFzIGFueSk/Lm9mZnNldCA/PyAxLFxuICAgICAgICAgICAgbGltaXQ6IChkZXRhaWxzIGFzIGFueSk/LmxpbWl0ID8/IDEwLFxuICAgICAgICAgICAgYm9va21hcms6IChkZXRhaWxzIGFzIGFueSk/LmJvb2ttYXJrLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnBhZ2UgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5wYWdlKHZhbHVlLCBkaXJlY3Rpb24sIHJlZiwgY3R4KTtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2Uuc3RhdGVtZW50KFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLCB2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZmluZE9uZUJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWToge1xuICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KVxuICAgICAgICAgICAgLmZvcihjdHgudG9PdmVycmlkZXMoKSlcbiAgICAgICAgICAgIC5maW5kQnkoa2V5LCB2YWx1ZSwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgW2ZpZWxkXSA9IGFyZ3M7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnN0YXRlbWVudChzdGF0ZW1lbnRLZXksIGZpZWxkLCBjdHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5rbm93biBzdGF0ZW1lbnQ6ICR7c3RhdGVtZW50S2V5fWApO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSlcbiAgICAgICAgKS5mb3IoY29tcGxleFF1ZXJ5KTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLm5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5xdWVyeSAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucXVlcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5xdWVyeShtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQ3VzdG9tUm91dGVIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjdXN0b21Sb3V0ZShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGN1c3RvbVJvdXRlKTtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgKS5mb3IoY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICBjb25zdCBzcHJlYWRBcmdzID0gRnJvbU1vZGVsQ29udHJvbGxlci5ub3JtYWxpemVRdWVyeUFyZ3MoYXJncyk7XG5cbiAgICAgIC8vIFRyeSB0aGUgcGVyc2lzdGVuY2UgZGlyZWN0bHkgKHdvcmtzIHdoZW4gaXQncyBhIGN1c3RvbSBSZXBvc2l0b3J5KVxuICAgICAgaWYgKHBlcnNpc3RlbmNlPy5yZXBvICYmIHR5cGVvZiBwZXJzaXN0ZW5jZS5yZXBvW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MpO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXRlbWVudCBnYXRld2F5XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX0gb3IgaXRzIHJlcG9gXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBleHRyYWN0UXVlcnlBcmdzKGFyZ3M6IGFueVtdKTogYW55W10ge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFyZ3M7XG4gICAgY29uc3QgbGFzdCA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICBpZiAoXG4gICAgICBsYXN0ICYmXG4gICAgICB0eXBlb2YgbGFzdCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkobGFzdClcbiAgICApIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFtub3JtYWxpemVkLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdCB8fCB0eXBlb2YgbGFzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeU9iaiA9IGxhc3QgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBoYXNRdWVyeUZpZWxkcyA9XG4gICAgICBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWhhc1F1ZXJ5RmllbGRzKSB7XG4gICAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICBpZiAocXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgIGlmIChxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgIGlmIChxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5ib29rbWFyayk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oeyBuYW1lOiBcIm1ldGhvZFwiLCBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIiB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJhcmdzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGxpc3RlZCBmb3VuZC5gIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBiYXNlOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwYXRoKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImJvb2ttYXJrXCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiYm9va21hcmsgZm9yIGN1cnNvciBwYWdpbmF0aW9uXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogTnVtYmVyIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GKSB7XG4gICAgICBiYXNlLnB1c2goQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgRGlzdGluY3QgdmFsdWVzIGZvciAke21vZGVsQ2xhenpOYW1lfS5gLCB0eXBlOiBbU3RyaW5nXSB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHAuc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIiB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGcm9tTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4vRnJvbU1vZGVsQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlRm9yKGZsYXZvdXI6IHN0cmluZykge1xuICBATW9kdWxlKHt9KVxuICBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZNb2RlbE1vZHVsZS5uYW1lKS5mb3IoZmxhdm91cik7XG5cbiAgICBzdGF0aWMgY3JlYXRlTW9kZWxTZXJ2aWNlczxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgICAgbW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPFQ+W11cbiAgICApOiBQcm92aWRlcltdIHtcbiAgICAgIHJldHVybiBtb2RlbHMubWFwKChtb2RlbCkgPT4gKHtcbiAgICAgICAgcHJvdmlkZTogYCR7bW9kZWwubmFtZX1TZXJ2aWNlYCxcbiAgICAgICAgdXNlRmFjdG9yeTogKCkgPT4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRXhwb3NlZChcbiAgICAgIG1vZGVsOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBleHBvc3VyZT86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmdbXT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXhwb3N1cmU/Llttb2RlbC5uYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgdHlwZW9mIG92ZXJyaWRlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyBvdmVycmlkZVxuICAgICAgICAgIDogTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoREVDQUZfRVhQT1NFKSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZsYXZvdXIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JSb290KFxuICAgICAgZmxhdm91cjogc3RyaW5nLFxuICAgICAgb3B0aW9uczogUGFydGlhbDxEZWNhZk1vZHVsZU9wdGlvbnM+ID0ge31cbiAgICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpLmZpbHRlcigobW9kZWwpID0+XG4gICAgICAgIHRoaXMuaXNFeHBvc2VkKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSlcbiAgICAgICk7XG5cbiAgICAgIC8vIENvbnRyb2xsZXJzIGFsd2F5cyByZWx5IG9uIGEgYmFja2luZyBNb2RlbFNlcnZpY2UsIGV2ZW4gd2hlbiBOZXN0IHByb3ZpZGVyc1xuICAgICAgLy8gYXJlIG5vdCBhdXRvLXJlZ2lzdGVyZWQuIFdhcm0gdGhlIHNpbmdsZXRvbiByZWdpc3RyeSBoZXJlIHNvIHNodXRkb3duIGNhblxuICAgICAgLy8gc2VlIHRoZSBsaXZlIHNlcnZpY2VzIGNyZWF0ZWQgZm9yIHRoZSBnZW5lcmF0ZWQgY29udHJvbGxlcnMuXG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRyYWNrZWRNb2RlbHMpIE1vZGVsU2VydmljZS5mb3JNb2RlbChtb2RlbCBhcyBhbnkpO1xuXG4gICAgICBsZXQgbW9kZWxTZXJ2aWNlczogUHJvdmlkZXJbXSA9IFtdO1xuICAgICAgaWYgKG9wdGlvbnMuYXV0b1NlcnZpY2VzKSB7XG4gICAgICAgIGxvZy5pbmZvKFwiQXV0by1zZXJ2aWNlcyBlbmFibGVkLiBJbml0aWFsaXppbmcgc2VydmljZSBnZW5lcmF0aW9uLlwiKTtcbiAgICAgICAgbW9kZWxTZXJ2aWNlcyA9IHRoaXMuY3JlYXRlTW9kZWxTZXJ2aWNlcyh0cmFja2VkTW9kZWxzKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYEF1dG8tc2VydmljZXMgY29tcGxldGVkLiAke21vZGVsU2VydmljZXMubGVuZ3RofSBzZXJ2aWNlcyBpbml0aWFsaXplZC5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdsb2JhbERlZmF1bHRzOiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+ID0ge307XG4gICAgICBpZiAob3B0aW9ucy5hZ2dyZWdhdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgIGdsb2JhbERlZmF1bHRzLmFsbG93R3JvdXBpbmdRdWVyaWVzID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gdHJhY2tlZE1vZGVscy5tYXAoKG1vZGVsKSA9PlxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZShtb2RlbCwgb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLCBnbG9iYWxEZWZhdWx0cylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2FsbEhhbmRsZXIsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgRGVmYXVsdEFkYXB0ZXJGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJGbGFncyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogSW50ZXJjZXB0b3IgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBEZWNhZiByZXF1ZXN0IGhhbmRsZXJzXG4gKiBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGlzIGludm9rZWQuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yfSBpbnRlZ3JhdGVzIHRoZSBEZWNhZiByZXF1ZXN0LWhhbmRsaW5nIHBpcGVsaW5lXG4gKiBpbnRvIE5lc3RKUycgaW50ZXJjZXB0b3IgbWVjaGFuaXNtLiBCZWZvcmUgcGFzc2luZyBleGVjdXRpb24gdG8gdGhlIG5leHQgaGFuZGxlciBpbiB0aGVcbiAqIE5lc3RKUyBjaGFpbiwgaXQgZGVsZWdhdGVzIHJlcXVlc3QgcHJvY2Vzc2luZyB0byB0aGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSwgd2hpY2hcbiAqIHNlcXVlbnRpYWxseSBydW5zIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMuIFRoaXMgYWxsb3dzXG4gKiBiZWhhdmlvcnMgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbG9nZ2luZywgdGVuYW50IHJlc29sdXRpb24sIG9yIG1ldGFkYXRhIGVucmljaG1lbnRcbiAqIHRvIG9jY3VyIHByaW9yIHRvIGNvbnRyb2xsZXIgZXhlY3V0aW9uLlxuICpcbiAqIEBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEFwcGx5IGdsb2JhbGx5OlxuICogYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyhuZXcgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKGV4ZWN1dG9yKSk7XG4gKlxuICogLy8gT3IgaW4gYSBtb2R1bGU6XG4gKiBATW9kdWxlKHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gKiAgICAge1xuICogICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICogICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAqICAgICB9LFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBJbnRlcmNlcHRvclxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgQ29udHJvbGxlclxuICpcbiAqICAgICBDbGllbnQtPj5JbnRlcmNlcHRvcjogSFRUUCBSZXF1ZXN0XG4gKiAgICAgSW50ZXJjZXB0b3ItPj5FeGVjdXRvcjogZXhlYyhyZXF1ZXN0KVxuICogICAgIEV4ZWN1dG9yLS0+PkludGVyY2VwdG9yOiBoYW5kbGVycyBjb21wbGV0ZWRcbiAqICAgICBJbnRlcmNlcHRvci0+PkNvbnRyb2xsZXI6IG5leHQuaGFuZGxlKClcbiAqICAgICBDb250cm9sbGVyLS0+PkNsaWVudDogUmVzcG9uc2VcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXhlY3V0b3I6IERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gICkge31cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29udGV4dHVhbGl6ZShyZXE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgICBjb25zdCBmbGFnczogRGVjYWZTZXJ2ZXJGbGFncyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBvdmVycmlkZXM6IHt9LFxuICAgIH0gYXMgYW55O1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBJbmplY3QgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBpbmplY3RhYmxlU2VydmljZUtleSxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvc2l0b3J5IGFzIENvcmVSZXBvc2l0b3J5LFxuICBTZXJ2aWNlIGFzIENvcmVTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkZhY3RvcnlQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogc3RyaW5nO1xuICB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duO1xufTtcblxuY29uc3QgcGVuZGluZ1Byb3ZpZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEZWNhZkZhY3RvcnlQcm92aWRlcj4oKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRHJhaW5zIHRoZSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBieSB7QGxpbmsgU2VydmljZX0ve0BsaW5rIFJlcG9zaXRvcnl9IHVzYWdlcy5cbiAqIEBzdW1tYXJ5IENvbnN1bWVkIGJ5IHtAbGluayBEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdH0gdG8gd2lyZSB0aGUgdG9rZW5zIHRoYXQgdGhvc2UgcGFyYW1ldGVyXG4gKiBkZWNvcmF0b3JzIHJlZmVyZW5jZSBiYWNrIGludG8gTmVzdCdzIERJIGNvbnRhaW5lciwgc2luY2UgYSBwYXJhbWV0ZXIgZGVjb3JhdG9yIGFsb25lIGNhbm5vdFxuICogc3VwcGx5IGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTogRGVjYWZGYWN0b3J5UHJvdmlkZXJbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHBlbmRpbmdQcm92aWRlcnMudmFsdWVzKCkpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVyKHRva2VuOiBzdHJpbmcsIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKHBlbmRpbmdQcm92aWRlcnMuaGFzKHRva2VuKSkgcmV0dXJuO1xuICBwZW5kaW5nUHJvdmlkZXJzLnNldCh0b2tlbiwgeyBwcm92aWRlOiB0b2tlbiwgdXNlRmFjdG9yeSB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RlbENvbnN0cnVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ29uc3RydWN0b3I8YW55PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWx1ZS5wcm90b3R5cGUgaW5zdGFuY2VvZiBNb2RlbDtcbn1cblxuZnVuY3Rpb24gbW9kZWxTZXJ2aWNlVG9rZW4obW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7bW9kZWwubmFtZX1TZXJ2aWNlYDtcbn1cblxuZnVuY3Rpb24gbW9kZWxSZXBvc2l0b3J5VG9rZW4oXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBzdHJpbmcge1xuICByZXR1cm4gZmxhdm91ciA/IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeUAke2ZsYXZvdXJ9YCA6IGAke21vZGVsLm5hbWV9UmVwb3NpdG9yeWA7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYgc2VydmljZS5cbiAqIEBzdW1tYXJ5IFRyYW5zbGF0ZXMgZGVjYWYncyBzZXJ2aWNlIHJlc29sdXRpb24gQVBJcyBpbnRvIGEgTmVzdCBgQEluamVjdCgpYCBjYWxsOlxuICogLSBgQFNlcnZpY2UoU29tZU1vZGVsKWAgaW5qZWN0cyB0aGUgYE1vZGVsU2VydmljZTxTb21lTW9kZWw+YCBzaW5nbGV0b24gZm9yIHRoYXQgbW9kZWxcbiAqICAgKHZpYSB7QGxpbmsgTW9kZWxTZXJ2aWNlLmZvck1vZGVsfSkuXG4gKiAtIGBAU2VydmljZShTb21lU2VydmljZUNsYXNzKWAgb3IgYEBTZXJ2aWNlKFwiYWxpYXNcIilgIGluamVjdHMgdGhlIG1hdGNoaW5nIGBAc2VydmljZSgpYC1kZWNvcmF0ZWRcbiAqICAgZGVjYWYge0BsaW5rIENvcmVTZXJ2aWNlfSAodmlhIHtAbGluayBDb3JlU2VydmljZS5nZXR9KS5cbiAqIC0gYEBTZXJ2aWNlKClgIGluZmVycyB0aGUgcGFyYW1ldGVyJ3MgdHlwZSBmcm9tIGVtaXR0ZWQgY29uc3RydWN0b3IgbWV0YWRhdGEgYW5kIHJlc29sdmVzIGl0IHRoZVxuICogICBzYW1lIHdheSwgcHJvdmlkZWQgdGhlIHBhcmFtZXRlciBpcyB0eXBlZCBhcyBhIGNvbmNyZXRlIGNsYXNzIChnZW5lcmljcyBsaWtlIGBNb2RlbFNlcnZpY2U8WD5gXG4gKiAgIGFyZSBlcmFzZWQgYXQgcnVudGltZSwgc28gdGhlIG1vZGVsLXNlcnZpY2UgZm9ybSBhbHdheXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgYXJndW1lbnQpLlxuICogQHBhcmFtIGtleSB0aGUgbW9kZWwgY2xhc3MsIHNlcnZpY2UgY2xhc3MsIG9yIGFsaWFzIHRvIHJlc29sdmUuIE9taXQgdG8gaW5mZXIgZnJvbSB0aGUgcGFyYW1ldGVyIHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTZXJ2aWNlKGtleT86IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPSBrZXk7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgcGFyYW1UeXBlczogYW55W10gPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIHJlc29sdmVkID0gcGFyYW1UeXBlc1twYXJhbWV0ZXJJbmRleF07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgQFNlcnZpY2UoKSBjb3VsZCBub3QgZGV0ZXJtaW5lIGFuIGluamVjdGlvbiB0eXBlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH0gb2YgJHsodGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4pLm5hbWV9LiBQcm92aWRlIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCBlLmcuIEBTZXJ2aWNlKFNvbWVTZXJ2aWNlKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFzTW9kZWwgPSB0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgJiYgaXNNb2RlbENvbnN0cnVjdG9yKHJlc29sdmVkKTtcbiAgICBjb25zdCB0b2tlbiA9IGFzTW9kZWxcbiAgICAgID8gbW9kZWxTZXJ2aWNlVG9rZW4ocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55PilcbiAgICAgIDogaW5qZWN0YWJsZVNlcnZpY2VLZXkocmVzb2x2ZWQgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik7XG5cbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiB7XG4gICAgICBpZiAoYXNNb2RlbCkgcmV0dXJuIE1vZGVsU2VydmljZS5mb3JNb2RlbChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQpXG4gICAgICAgIDogQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHtAbGluayBDb3JlUmVwb3NpdG9yeX0gZm9yIGBtb2RlbGAuXG4gKiBAc3VtbWFyeSBVbmxpa2Uge0BsaW5rIFNlcnZpY2V9LCBgbW9kZWxgIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGEgTW9kZWwgY2xhc3M6IHRoZSBzYW1lIGNsYXNzIHBhc3NlZFxuICogdG8gYEBTZXJ2aWNlKG1vZGVsKWAgYW5kIGBAUmVwb3NpdG9yeShtb2RlbClgIHJlc29sdmVzIHRvIHR3byBkaWZmZXJlbnQgaW5qZWN0ZWQgb2JqZWN0cyAoYVxuICogYE1vZGVsU2VydmljZTxNPmAgdnMgYSBgUmVwb3NpdG9yeTxNPmAgcmVzcGVjdGl2ZWx5KSwgdmlhIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGNsYXNzIHRvIHJlc29sdmUgYSByZXBvc2l0b3J5IGZvci5cbiAqIEBwYXJhbSBmbGF2b3VyIG9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcywgZm9yd2FyZGVkIHRvIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXBvc2l0b3J5KFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBtb2RlbFJlcG9zaXRvcnlUb2tlbihtb2RlbCwgZmxhdm91cik7XG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4gQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWwsIGZsYXZvdXIpKTtcbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEeW5hbWljTW9kdWxlLFxuICBHbG9iYWwsXG4gIEluamVjdCxcbiAgTW9kdWxlLFxuICBPbkFwcGxpY2F0aW9uU2h1dGRvd24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SLCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUNBRl9BREFQVEVSX0lELFxuICBERUNBRl9IQU5ETEVSUyxcbiAgREVDQUZfTU9EVUxFX09QVElPTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlU2VydmljZSwgU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG4gIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxDT05GLCBBREFQVEVSIGV4dGVuZHMgQWRhcHRlcjxDT05GLCBhbnksIGFueSwgYW55Pj5cbiAgaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByaXZhdGUgc3RhdGljIF9wZXJzaXN0ZW5jZT86IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IHBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJQZXJzaXN0ZW5jZSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikgdGhpcy5fbG9nZ2VyID0gTG9nZ2luZy5mb3IoRGVjYWZDb3JlTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9NT0RVTEVfT1BUSU9OUylcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uczxDT05GLCBBREFQVEVSPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlZjogTW9kdWxlUmVmXG4gICkge31cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBjb25zdCBkZWNhZlByb3ZpZGVycyA9IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQ29yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX0FEQVBURVJfSUQsIHVzZVZhbHVlOiB0aGlzLnBlcnNpc3RlbmNlPy5jbGllbnQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBvcHRpb25zLmhhbmRsZXJzPy5tYXAoKEgpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oYFJlZ2lzdGVyZWQgcmVxdWVzdCBoYW5kbGVyOiAke0gubmFtZX1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIKCk7XG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMsXG4gICAgICBdLFxuICAgICAgZXhwb3J0czogW1xuICAgICAgICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbiAgICAgICAgREVDQUZfQURBUFRFUl9JRCxcbiAgICAgICAgREVDQUZfSEFORExFUlMsXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycy5tYXAoKHByb3ZpZGVyKSA9PiBwcm92aWRlci5wcm92aWRlKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBib290UGVyc2lzdGVuY2UoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290UGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IG9wdGlvbnMuY29uZi5tYXAoKFtjb250ciwgY2ZnLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghcG9zc2libGUpIHJldHVybiBbY29udHIsIGNmZ107XG4gICAgICAgIHJldHVybiBbY29udHIsIGNmZywgLi4uYXJnc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fcGVyc2lzdGVuY2UuYm9vdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLl9wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IG9wdGlvbnMuY29uZltpXTtcbiAgICAgICAgY29uc3QgcG9zc2libGVUcmFuc2YgPSBjLnNsaWNlKDIsIGMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVyID0gcG9zc2libGVUcmFuc2YucG9wKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdHJhbnNmb3JtZXIgfHxcbiAgICAgICAgICAhKHRyYW5zZm9ybWVyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihjbGllbnRzW2ldLmZsYXZvdXIpO1xuICAgICAgICAgIGlmICghY29udHIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHRyYW5zZm9ybWVyIGZvdW5kIGZvciBmbGF2b3VyICR7Y2xpZW50c1tpXS5mbGF2b3VyfS4geW91IHNob3VsZCBlaXRoZXIgQHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciBvciBwcm92aWRlIGEgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gKGNvbnRyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICAgICAgID8gY29udHJcbiAgICAgICAgICAgICAgOiBuZXcgKGNvbnRyIGFzIENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+PikoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBib290IHRyYW5zZm9ybWVyIGZvciAke2NsaWVudHNbaV0uZmxhdm91cn06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIoY2xpZW50c1tpXS5mbGF2b3VyKSh0cmFuc2Zvcm1lcik7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhcInBlcnNpc3RlbmNlIGxheWVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbGl6YXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIG9uQXBwbGljYXRpb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBEZWNhZkNvcmVNb2R1bGUubG9nLmZvcih0aGlzLm9uQXBwbGljYXRpb25TaHV0ZG93bik7XG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIHRoaXMubW9kdWxlUmVmLmdldDxhbnk+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJnZXRPclVuZGVmaW5lZCIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIlVuc3VwcG9ydGVkRXJyb3IiLCJleHRyYWN0UGF0aFBhcmFtcyIsInJvdXRlUGF0aCIsInNwbGl0Iiwic2xpY2UiLCJhcGlQYXJhbVNwZWMiLCJ0b0RlY2FmRXJyb3IiLCJlcnJvciIsImZhbGxiYWNrTWVzc2FnZSIsIkJhc2VFcnJvciIsIkludGVybmFsRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJnZXRBcGlEZWNvcmF0b3JzIiwibWV0aG9kTmFtZSIsImh0dHBWZXJiIiwiaW5jbHVkZVF1ZXJ5UGFyYW1zIiwiTmVzdEh0dHBSb3V0ZURlYyIsImFwaVBhdGhQYXJhbXMiLCJzd2FnZ2VyUXVlcnlQYXJhbXMiLCJBcGlRdWVyeSIsIk9yZGVyRGlyZWN0aW9uIiwibWV0aG9kIiwiQXBpUGFyYW0iLCJBcGlPcGVyYXRpb24iLCJzdW1tYXJ5IiwiQXBpT2tSZXNwb25zZSIsIkFwaU5vQ29udGVudFJlc3BvbnNlIiwiUXVlcnkiLCJhcHBseUFwaURlY29yYXRvcnMiLCJwcm90byIsImZvckVhY2giLCJkIiwiaW5kZXgiLCJyZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QiLCJwZXJzaXN0ZW5jZSIsImFyZ3MiLCJNb2RlbFNlcnZpY2UiLCJzdGF0ZW1lbnQiLCJjcmVhdGVSb3V0ZUhhbmRsZXIiLCJhc3luYyIsInBhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXJlY3Rpb24iLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJBUFBfSU5URVJDRVBUT1IiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yXzEiLCJoYW5kbGVycyIsImNvbnRleHQiLCJleGVjIiwicmVzIiwidXJsIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJ0b1Jlc3BvbnNlIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsInJlbGF0aW9uVHlwZSIsIm1ldGEiLCJ2YWxpZGF0aW9uRm9yIiwiTElTVCIsImlzQ2lyY3VsYXIiLCJwa1R5cGVOYW1lIiwiZ2V0UGtPcGVuQXBpVHlwZSIsImFkZFJlbGF0aW9uUGtSZWYiLCJyZWxhdGlvbkR0byIsImFkZCIsImFkZFJlbGF0aW9uVXBkYXRlIiwiYWRkUmVsYXRpb24iLCJEdG9DbGFzcyIsImV4dHJhTW9kZWxzIiwiZHRvUmVmIiwib25lT2ZJdGVtcyIsIiRyZWYiLCJvbmVPZiIsInBrVHlwZSIsImN1cnJlbnQiLCJGdW5jdGlvbiIsImdldFByb3RvdHlwZU9mIiwiV2Vha01hcCIsInRvQ29udGV4dEZsYWdzIiwiYWRhcHRlciIsImFsaWFzIiwiYmluZCIsInJlcXVlc3RUcmFuc2Zvcm1lcnMiLCJDb250ZXh0IiwicGVuZGluZyIsImhlYWRlciIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJzZWdtZW50IiwidHJpbSIsImpvaW4iLCJjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyIiwiZGVmaW5lTWV0aG9kIiwiaHR0cERlY29yYXRvciIsImh0dHBNZXRob2QiLCJnZXRRdWVyeURlY29yYXRvcnMiLCJvYmpWYWx1ZXMiLCJmaWVsZHMiLCJmIiwiY3JlYXRlIiwibW9kdWxlQ29uZmlnT3ZlcnJpZGVzIiwiZ2xvYmFsRGVmYXVsdHMiLCJ0YWJsZU5hbWUiLCJ0b0tlYmFiQ2FzZSIsIm1vZGVsQ2xhenpOYW1lIiwiZmFjdG9yeVBlcnNpc3RlbmNlIiwiZGVjb3JhdG9yQ29uZmlnIiwibW9kdWxlT3ZlcnJpZGUiLCJtZXJnZWRDb25maWciLCJGYWN0b3J5Q29udHJvbGxlciIsIk1vZGVsQ29udHJvbGxlckZhY3RvcnkiLCJmYWN0b3J5Um91dGVzIiwiX19yb3V0ZXNfXyIsImdldFBLIiwiYXBpUHJvcGVydGllcyIsInBrUGF0aCIsImdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbCIsImF1dGhDb25maWciLCJhdXRoIiwiYXBwbHlDbGFzc0F1dGgiLCJwdWJsaWMiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyIiwiRHluYW1pY01vZGVsQ29udHJvbGxlcl8xIiwiaW5mbyIsIkNvbnRyb2xsZXIiLCJBcGlUYWdzIiwiQXBpRXh0cmFNb2RlbHMiLCJzb3J0ZWRSb3V0ZXMiLCJzb3J0IiwiYSIsImIiLCJhU2VnbWVudHMiLCJCb29sZWFuIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwiaW1wbGVtZW50YXRpb24iLCJ0b0xvd2VyQ2FzZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJyZWdpc3RlcmVkTWV0aG9kTmFtZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwicm91dGVQYXJhbURlY29yYXRvcnMiLCJwYXJhbUluZGV4IiwiZmxhdE1hcCIsIlBhcmFtIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyIsIlJlc3BvbnNlIiwicGFzc3Rocm91Z2giLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiYnVsa0RlbGV0ZURlY29yYXRvcnMiLCJyZWFkRGVjb3JhdG9ycyIsInJvdXRlUGFyYW1zIiwidXBkYXRlRGVjb3JhdG9ycyIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJzdGF0ZW1lbnREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXRQYXJhbXMiLCJzdGF0ZW1lbnRSb3V0ZXMiLCJzdGF0ZW1lbnRLZXkiLCJzdGF0ZW1lbnRNZXRob2ROYW1lIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwiZmlyc3RTZWdtZW50Iiwic2VnbWVudHMiLCJzZWciLCJpIiwiY3JlYXRlQ3JlYXRlSGFuZGxlciIsInJlc3AiLCJsb2dDdHgiLCJjcmVhdGVkIiwiY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIiLCJjcmVhdGVBbGwiLCJjcmVhdGVCdWxrUmVhZEhhbmRsZXIiLCJyZWFkQWxsIiwiaWRzIiwibm9ybWFsaXplZElkcyIsInJlYWQiLCJjcmVhdGVCdWxrVXBkYXRlSGFuZGxlciIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJjcmVhdGVCdWxrRGVsZXRlSGFuZGxlciIsImRlbGV0ZUFsbCIsImNyZWF0ZVJlYWRIYW5kbGVyIiwiaWQiLCJWYWxpZGF0aW9uRXJyb3IiLCJyZWFkUmVzdWx0IiwiY3JlYXRlVXBkYXRlSGFuZGxlciIsInVwZGF0ZSIsInBheWxvYWQiLCJwYXJzZSIsImNyZWF0ZURlbGV0ZUhhbmRsZXIiLCJyZW1vdmUiLCJkZWwiLCJkZWxldGUiLCJjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyIiwiZGV0YWlscyIsIlNUQVRFTUVOVCIsInBhcnNlSW50IiwicGF0aERpcmVjdGlvbiIsInJlc29sdmVkRGlyZWN0aW9uIiwiY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyIiwic3RhdGVtZW50U2hvcnRjdXQiLCJsaXN0QnkiLCJwYWdlIiwicGFnaW5hdGVCeSIsIkFTQyIsImZpbmQiLCJyZWYiLCJmaW5kT25lQnkiLCJmaW5kQnkiLCJmaWVsZCIsImNvbXBsZXhRdWVyeSIsInNwcmVhZEFyZ3MiLCJub3JtYWxpemVRdWVyeUFyZ3MiLCJjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIiLCJjdXN0b21Sb3V0ZSIsImV4dHJhY3RRdWVyeUFyZ3MiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsImhhc1F1ZXJ5RmllbGRzIiwiQXBpQm9keSIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsInNjaGVtYSIsImdldFNjaGVtYVBhdGgiLCJBcGlCYWRSZXF1ZXN0UmVzcG9uc2UiLCJBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiYmFzZSIsImdldE1vZHVsZUZvciIsIkRlY2FmTW9kZWxNb2R1bGUiLCJEZWNhZk1vZGVsTW9kdWxlXzEiLCJjcmVhdGVNb2RlbFNlcnZpY2VzIiwibW9kZWxzIiwidXNlRmFjdG9yeSIsImlzRXhwb3NlZCIsImV4cG9zdXJlIiwidHJhY2tlZE1vZGVscyIsImNvbnRyb2xsZXJFeHBvc3VyZSIsIm1vZGVsU2VydmljZXMiLCJhdXRvU2VydmljZXMiLCJhZ2dyZWdhdGlvbnMiLCJhbGxvd0dyb3VwaW5nUXVlcmllcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkRlY2FmRXhjZXB0aW9uRmlsdGVyIiwiZXhjZXB0aW9uIiwiaG9zdCIsImlzUHJvZHVjdGlvbiIsIkxvZ2dlZEVudmlyb25tZW50IiwiZW52Iiwic3RhdHVzQ29kZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiTm90QWNjZXB0YWJsZUV4Y2VwdGlvbiIsImdldFN0YXR1cyIsInN0YXR1cyIsImNvZGUiLCJqc29uIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQ2F0Y2giLCJVc2VEZWNhZkZpbHRlciIsIlVzZUZpbHRlcnMiLCJVc2VEZWNhZkhlYWRlcnMiLCJTV0FHR0VSX1VJX0NPTlNUQU5UUyIsInRpdGxlIiwidmVyc2lvbiIsImZhdmljb25GaWxlUGF0aCIsInRvcGJhckljb25GaWxlUGF0aCIsInNjaGVtZSIsImJlYXJlckZvcm1hdCIsImluIiwicGVyc2lzdEF1dGhvcml6YXRpb24iLCJ0b3BiYXJCZ0NvbG9yIiwiU3dhZ2dlckN1c3RvbVVJIiwiY3VzdG9tQ1NTIiwiY3NzIiwidG9wYmFySWNvblBhdGgiLCJpbWciLCJiNjQiLCJnZXRDdXN0b21PcHRpb25zIiwiZmF2aWNvbiIsImZhdmljb25QYXRoIiwiY3VzdG9tU2l0ZVRpdGxlIiwiY3VzdG9tQ3NzIiwic3dhZ2dlck9wdGlvbnMiLCJmaWxlIiwiZmlsZVBhdGgiLCJhc3NldHNQYXRoIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJTd2FnZ2VyQnVpbGRlciIsImFwcCIsImNyZWF0ZURvY3VtZW50Iiwib3BlbkFwaUpzb25QYXRoIiwib3BlbkFwaVlhbWxQYXRoIiwiRG9jdW1lbnRCdWlsZGVyIiwic2V0VGl0bGUiLCJzZXREZXNjcmlwdGlvbiIsInNldFZlcnNpb24iLCJhZGRCZWFyZXJBdXRoIiwiU3dhZ2dlck1vZHVsZSIsInJlZ2lzdGVyT3BlbkFwaVJvdXRlIiwiY29udGVudFR5cGUiLCJib2R5RmFjdG9yeSIsImh0dHBBZGFwdGVyIiwiZ2V0SHR0cEFkYXB0ZXIiLCJfcmVxIiwicmVwbHkiLCJzZXR1cFN3YWdnZXIiLCJkb2N1bWVudCIsInN3YWdnZXJVSSIsInNldHVwIiwianNvbkRvY3VtZW50VXJsIiwieWFtbERvY3VtZW50VXJsIiwiWUFNTCIsIk5lc3RCb290c3RyYXBlciIsIl9sb2dnZXIiLCJMb2dnZXIiLCJpbml0aWFsaXplIiwiZW5hYmxlTG9nZ2VyIiwiY3VzdG9tTG9nZ2VyIiwidXNlTG9nZ2VyIiwiZW5hYmxlQ29ycyIsIm9yaWdpbnMiLCJhbGxvd01ldGhvZHMiLCJhbGxvd2VkT3JpZ2lucyIsIm8iLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsIm9wZXJhdGlvbiIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJwZW5kaW5nUHJvdmlkZXJzIiwiZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIiwicmVnaXN0ZXJQcm92aWRlciIsInRva2VuIiwiaXNNb2RlbENvbnN0cnVjdG9yIiwibW9kZWxTZXJ2aWNlVG9rZW4iLCJtb2RlbFJlcG9zaXRvcnlUb2tlbiIsInBhcmFtZXRlckluZGV4IiwicmVzb2x2ZWQiLCJwYXJhbVR5cGVzIiwiYXNNb2RlbCIsImluamVjdGFibGVTZXJ2aWNlS2V5IiwiQ29yZVNlcnZpY2UiLCJDb3JlUmVwb3NpdG9yeSIsIkRlY2FmQ29yZU1vZHVsZSIsIkRlY2FmQ29yZU1vZHVsZV8xIiwibW9kdWxlUmVmIiwiZGVjYWZQcm92aWRlcnMiLCJ1c2VWYWx1ZSIsImNsaWVudCIsIkgiLCJwcm92aWRlciIsImJvb3RQZXJzaXN0ZW5jZSIsInRyaW1tZWQiLCJjb25mIiwiY29udHIiLCJwb3NzaWJsZSIsIlBlcnNpc3RlbmNlU2VydmljZSIsImJvb3QiLCJjbGllbnRzIiwiYyIsInBvc3NpYmxlVHJhbnNmIiwicmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIiwiaW5pdGlhbGl6YXRpb24iLCJvbkFwcGxpY2F0aW9uU2h1dGRvd24iLCJhZGFwdGVycyIsInNodXRkb3duIiwiR2xvYmFsIiwiTW9kdWxlUmVmIiwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIiwibm9ybWFsaXplRXZlbnRSZXNwb25zZSIsIm1vZGVsQ29uc3RyIiwic2VyaWFsaXplZFBheWxvYWQiLCJzZXJpYWxpemUiLCJjb25zb2xlIiwiZXJyIiwiRXZlbnRzQ29udHJvbGxlciIsIkV2ZW50c0NvbnRyb2xsZXJfMSIsImV2ZW50cyQiLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlcklkIiwiTWF0aCIsInJhbmRvbSIsInRvVXBwZXJDYXNlIiwiY2IiLCJyZWZyZXNoIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhZGFwdGVyTmFtZSIsIm9ic2VydmUiLCJ1bk9ic2VydmUiLCJIRUFSVEJFQVRfSU5URVJWQUxfTVMiLCJoZWFydGJlYXQkIiwiaW50ZXJ2YWwiLCJ0cyIsIm1lcmdlIiwibGlzdGVuRm9yTW9kZWwiLCJTc2UiLCJEZWNhZlN0cmVhbU1vZHVsZSIsIkRlY2FmU3RyZWFtTW9kdWxlXzEiLCJmb3JGbGF2b3VycyIsImltcG9ydHMiLCJSb3V0ZXJNb2R1bGUiLCJyZWdpc3RlciIsIkRlY2FmTW9kdWxlIiwiRGVjYWZNb2R1bGVfMSIsImZvclJvb3RBc3luYyIsImF1dG9Db250cm9sbGVycyIsIm9ic2VydmVyT3B0aW9ucyIsImVuYWJsZU9ic2VydmVyRXZlbnRzIiwib2JzZXJ2ZXJGbGF2b3VycyIsInJ1bk1pZ3JhdGlvbnMiLCJyZXBvRm9yTW9kZWwiLCJtIiwiVkVSU0lPTiIsIkNPTU1JVCIsIkZVTExfVkVSU0lPTiIsIlBBQ0tBR0VfTkFNRSIsImFsbG93UmVyZWdpc3RyYXRpb24iLCJyZWdpc3RlckxpYnJhcnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTyxNQUFNQSxvQkFBb0I7O0FBQzFCLE1BQU1DLGFBQWE7SUFDeEJDLGVBQWUsR0FBR0Y7SUFDbEJHLGNBQWMsR0FBR0g7SUFDakJJLGNBQWMsR0FBR0o7SUFDakJLLGNBQWMsR0FBR0w7SUFDakJNLFVBQVUsR0FBR047SUFDYk8sZUFBZSxHQUFHUDtJQUNsQlEsZ0JBQWdCLEdBQUdSO0lBQ25CUyxhQUFhLEdBQUdUO0lBQ2hCVSxzQkFBc0IsR0FBR1Y7SUFDekJXLDRCQUE0QixHQUFHWDtJQUMvQlksY0FBYyxHQUFHWjtJQUNqQmEsc0JBQXNCLEdBQUdiO0lBQ3pCYyx3QkFBd0IsR0FBR2Q7SUFDM0JlLGtCQUFrQixHQUFHZjtJQUNyQmdCLGVBQWUsR0FBR2hCO0lBQ2xCaUIsWUFBWSxHQUFHakI7SUFDZmtCLG9CQUFvQixHQUFHbEI7SUFDdkJtQixVQUFVLEdBQUduQjs7O0FDaEJSLE1BQU1vQixnQkFBaUJDLE9BQXNCQSxRQUFROztBQUNyRCxNQUFNQyx3QkFBd0I7O0FBRTlCLE1BQU1DLGtCQUFrQjs7QUFFekIsU0FBVUMsc0JBQ2RDLFNBQ0FDLFdBQ0FDLGtCQUFFQSxvQkFBcUI7SUFBRUEsa0JBQWtCOztJQUUzQyxPQUFPLENBQ0xDLFFBQ0FDLEtBQ0FDO1FBRUEsV0FBV0osYUFB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
2523
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aE1vZHVsZS50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmSGFuZGxlckV4ZWN1dG9yLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXNwb25zZUludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2NvbnRyb2xsZXJzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL01vZGVsQnVpbGRlckV4dGVuc2lvbnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRnJvbU1vZGVsQ29udHJvbGxlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9EZWNhZk1vZGVsTW9kdWxlLnRzIiwiLi4vc3JjL2RlY29yYXRpb24udHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvY29ycy50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy90aHJvdHRsaW5nLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9EZWNhZkVycm9yRmlsdGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9jb25zdGFudHMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJDdXN0b21VSS50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckJ1aWxkZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9OZXN0Qm9vdHN0cmFwZXIudHMiLCIuLi9zcmMvaW50ZXJjZXB0b3JzL0RlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaUV4Y2x1ZGVFbmRwb2ludCB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgQ3J1ZE9wZXJhdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlbGV0ZSwgR2V0LCBQYXRjaCwgUG9zdCwgUHV0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5cbmltcG9ydCB7IGlzT3BlcmF0aW9uQmxvY2tlZCBhcyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQcmVwYXJlZFN0YXRlbWVudEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgYSBnaXZlbiBDUlVEIG9wZXJhdGlvbiBpcyBibG9ja2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNvbnN0cnVjdG9yLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBvcGVyYXRpb24tYmxvY2tpbmcgaGFuZGxlciBtZXRhZGF0YSBzdG9yZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9yICh1bmRlciBgT3BlcmF0aW9uS2V5cy5SRUZMRUNUICsgT3BlcmF0aW9uS2V5cy5CTE9DS2ApLCBleGVjdXRlcyBpdCAoaWYgcHJlc2VudCkgd2l0aCBpdHMgcGVyc2lzdGVkIGFyZ3VtZW50cyBwbHVzIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZC4gSWYgbm8gaGFuZGxlciBleGlzdHMsIHRoZSBvcGVyYXRpb24gaXMgY29uc2lkZXJlZCBhbGxvd2VkIChyZXR1cm5zIGBmYWxzZWApLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgdGFyZ2V0IG1vZGVsIGNvbnN0cnVjdG9yIHdob3NlIG1ldGFkYXRhIG1heSBpbmNsdWRlIGEgYmxvY2tpbmcgaGFuZGxlci5cbiAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IG9wIC0gVGhlIENSVUQgb3BlcmF0aW9uIHRvIGV2YWx1YXRlIChlLmcuLCBgT3BlcmF0aW9uS2V5cy5DUkVBVEVgLCBgT3BlcmF0aW9uS2V5cy5SRUFEYCwgYE9wZXJhdGlvbktleXMuVVBEQVRFYCwgYE9wZXJhdGlvbktleXMuREVMRVRFYCkuXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGV4cGxpY2l0bHkgYmxvY2tlZCBieSB0aGUgbW9kZWwncyBoYW5kbGVyOyBvdGhlcndpc2UgYGZhbHNlYC5cbiAqIEBmdW5jdGlvbiBpc09wZXJhdGlvbkJsb2NrZWRcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZGl0aW9uYWxseSBhcHBsaWVzIGFuIEhUVFAgbWV0aG9kIGRlY29yYXRvciBmb3IgYSBnaXZlbiBtb2RlbCBhbmQgdmVyYiwgaGlkaW5nIHRoZSBlbmRwb2ludCBpbiBTd2FnZ2VyIChhbmQgbm90IHJlZ2lzdGVyaW5nIHRoZSByb3V0ZSkgd2hlbiB0aGUgbW9kZWwgYmxvY2tzIHRoYXQgQ1JVRCBvcGVyYXRpb24uXG4gKiBAc3VtbWFyeSBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBgQ3J1ZE9wZXJhdGlvbnNgIGtleSBhbmQgTmVzdCBIVFRQIGRlY29yYXRvciAoYEBHZXRgLCBgQFBvc3RgLCBldGMuKS4gSXQgY2hlY2tzIGBpc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKWAgYW5kLCBpZiBibG9ja2VkLCBhcHBsaWVzIG9ubHkgYEBBcGlFeGNsdWRlRW5kcG9pbnQoKWAgKFN3YWdnZXItaGlkZGVuLCBubyBOZXN0IHJvdXRlKS4gSWYgcGVybWl0dGVkLCBpdCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBIVFRQIGRlY29yYXRvciB3aXRoIHRoZSBvcHRpb25hbCBgcGF0aGAuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIHJlc29sdmUgb3BlcmF0aW9uLWJsb2NraW5nIHJ1bGVzLlxuICogQHBhcmFtIHtIdHRwVmVyYnN9IHZlcmIgLSBUaGUgSFRUUCB2ZXJiIHRvIG1hcCAoZS5nLiwgYFwiR0VUXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcm91dGUgcGF0aCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29ycmVzcG9uZGluZyBOZXN0IEhUVFAgbWV0aG9kIGRlY29yYXRvci5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgZWl0aGVyIGV4Y2x1ZGVzIHRoZSBlbmRwb2ludCBmcm9tIFN3YWdnZXIgKGFuZCByb3V0ZSByZWdpc3RyYXRpb24pIG9yIGFwcGxpZXMgdGhlIGNvcnJlY3QgSFRUUCBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtDcnVkT3BlcmF0aW9ucywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtPcGVyYXRpb25LZXlzLlJFQUQsIEdldF0sXG4gICAgUE9TVDogW09wZXJhdGlvbktleXMuQ1JFQVRFLCBQb3N0XSxcbiAgICBQVVQ6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUHV0XSxcbiAgICBQQVRDSDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbT3BlcmF0aW9uS2V5cy5ERUxFVEUsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlQmxvY2tUYXJnZXQodmVyYiwgcGF0aCk7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgdGFyZ2V0LmtpbmQgYXMgYW55LCB0YXJnZXQudmFsdWUpXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKVxuICAgIDogY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTpcbiAgfCB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmZ1bmN0aW9uIHRvRGVjYWZFcnJvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmNsaWVudENvbnRleHQudG9PdmVycmlkZXMoKTtcblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUob3ZlcnJpZGVzKVxuICAgICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlLmZvcihvdmVycmlkZXMpXG4gICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkdG9DYWNoZSA9IG5ldyBNYXA8XG4gIE9wZXJhdGlvbktleXMsXG4gIFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj5cbj4oKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBOZXN0L1N3YWdnZXIgRFRPIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIENSVUQgb3BlcmF0aW9uLlxuICpcbiAqIFJ1bGVzOlxuICogIC0gT25seSBDUkVBVEUgYW5kIFVQREFURSAoYW5kIHRoZWlyIGJ1bGsgdmFyaWFudHMpIHByb2R1Y2UgYSBEVE87XG4gKiAgICBhbGwgb3RoZXIgb3BlcmF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIG1vZGVsIGNsYXNzIHVuY2hhbmdlZC5cbiAqICAtIEBnZW5lcmF0ZWQoKSBwcm9wZXJ0aWVzIChjcmVhdGVkQXQsIHVwZGF0ZWRBdCwgY3JlYXRlZEJ5LCB1cGRhdGVkQnksXG4gKiAgICB1dWlkLCB2ZXJzaW9uLCBAY29tcG9zZWQgcGtzLCDigKYpIGFyZSAqKm5ldmVyKiogZXhwb3NlZCBpbiBhbnkgRFRPLlxuICogIC0gVGhlIEBwaygpIHByb3BlcnR5OlxuICogICAgICDigKIgVVBEQVRFIOKAkyBhbHdheXMgaW5jbHVkZWQuXG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBpbmNsdWRlZCBvbmx5IHdoZW4gdGhlIHBrIGlzIE5PVCBhdXRvLWdlbmVyYXRlZFxuICogICAgICAgICAgICAgICAgICAoY2hlY2tlZCB2aWEgTW9kZWwucGtQcm9wcygpLmdlbmVyYXRlZCBBTkQgTW9kZWwuZ2VuZXJhdGVkKCkpLlxuICogIC0gUmVsYXRpb24gcHJvcGVydGllcyAoQG9uZVRvT25lLCBAb25lVG9NYW55LCDigKYpOlxuICogICAgICDigKIgQ1JFQVRFICDigJMgbmVzdGVkIGFzIER0b0ZvcihDUkVBVEUsIFJlbGF0ZWRNb2RlbCkuIFdoZW4gdGhlIHJlbGF0aW9uXG4gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgKG1vZGVsIEEg4oaSIG1vZGVsIEIg4oaSIG1vZGVsIEEpLFxuICogICAgICAgICAgICAgICAgICB0aGUgYmFjay1yZWZlcmVuY2UgdXNlcyB0aGUgcmVsYXRlZCBtb2RlbCdzIFBLIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVhayB0aGUgY3ljbGUuXG4gKiAgICAgIOKAoiBVUERBVEUgIOKAkyB1bmlvbiBvZiBEdG9Gb3IoVVBEQVRFLCBSZWxhdGVkTW9kZWwpICoqb3IqKiB0aGVcbiAqICAgICAgICAgICAgICAgICAgcmVsYXRlZCBtb2RlbCdzIHByaW1hcnkta2V5IHR5cGUgKHN0cmluZyAvIGludGVnZXIpLFxuICogICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBTd2FnZ2VyIG9uZU9mLiBDaXJjdWxhciBiYWNrLXJlZmVyZW5jZXNcbiAqICAgICAgICAgICAgICAgICAgb21pdCB0aGUgRFRPICRyZWYgYW5kIG9ubHkgaW5jbHVkZSB0aGUgUEsgdHlwZS5cbiAqXG4gKiBNZXRhZGF0YS5wcm9wZXJ0aWVzKCkgbm93IHJldHVybnMgQUxMIHByb3BlcnRpZXMgYWNyb3NzIHRoZSBwcm90b3R5cGUgY2hhaW4sXG4gKiBzbyBEVE8gaW5oZXJpdGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZXZlcnkgRFRPIGlzIGEgZmxhdCBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIER0b0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBzdGFjazogU2V0PENvbnN0cnVjdG9yPGFueT4+ID0gbmV3IFNldCgpXG4pOiBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgaWYgKCFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMuaW5jbHVkZXMob3ApKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXREdG9DYWNoZShvcCk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtb2RlbCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgaXNVcGRhdGVPcCA9IFtcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgXS5pbmNsdWRlcyhvcCBhcyBhbnkpO1xuXG4gIGNsYXNzIER5bmFtaWNEVE8ge31cbiAgY2FjaGUuc2V0KG1vZGVsLCBEeW5hbWljRFRPKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTywgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYCR7dG9QYXNjYWxDYXNlKG1vZGVsLm5hbWUpfSR7dG9QYXNjYWxDYXNlKG9wKX1EVE9gLFxuICB9KTtcblxuICBjb25zdCBwa1Byb3AgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTW9kZWwucGsobW9kZWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gcGtQcm9wID8gTW9kZWwucGtQcm9wcyhtb2RlbCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa0Rlc2lnblR5cGUgPSBwa1Byb3BcbiAgICA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHBrUHJvcCBhcyBzdHJpbmcpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrVHlwZUlzTnVtZXJpYyA9XG4gICAgcGtEZXNpZ25UeXBlID09PSBOdW1iZXIgfHwgcGtEZXNpZ25UeXBlID09PSBCaWdJbnQ7XG4gIGNvbnN0IHBrSXNHZW5lcmF0ZWQgPVxuICAgICEhcGtQcm9wc01ldGFkYXRhPy5nZW5lcmF0ZWQgfHxcbiAgICAocGtQcm9wXG4gICAgICA/IE1vZGVsLmdlbmVyYXRlZEJ5U2VxdWVuY2UobW9kZWwgYXMgYW55LCBwa1Byb3AgYXMgYW55KSB8fFxuICAgICAgICBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHBrUHJvcCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHBrVHlwZUlzTnVtZXJpY1xuICAgICAgOiBmYWxzZSk7XG5cbiAgY29uc3QgYWxsUHJvcHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoTWV0YWRhdGEucHJvcGVydGllcyhtb2RlbCkgfHwgW10pKTtcbiAgY29uc3QgcmVsYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KChNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gIGNvbnN0IHNjYWxhclByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBhbGxQcm9wcykge1xuICAgIGlmICghcHJvcCkgY29udGludWU7XG4gICAgaWYgKHJlbGF0aW9ucy5oYXMocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByb3AgPT09IHBrUHJvcCAmJiAhaXNVcGRhdGVPcCAmJiBwa0lzR2VuZXJhdGVkKSBjb250aW51ZTtcbiAgICBpZiAocHJvcCAhPT0gcGtQcm9wICYmIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHNjYWxhclByb3BzLnB1c2gocHJvcCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGFyUHJvcHMpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISF2YWxpZGF0aW9uPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuICAgIGNvbnN0IHR5cGVIaW50ID1cbiAgICAgIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkgPz9cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgfTtcbiAgICBpZiAodHlwZUhpbnQpIGFwaU9wdGlvbnMudHlwZSA9IHR5cGVIaW50O1xuXG4gICAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKSA/PyB0eXBlSGludDtcbiAgICBpZiAodHlwZW9mIGRlc2lnblR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgZGVzaWduVHlwZSxcbiAgICAgICAgRHluYW1pY0RUTy5wcm90b3R5cGUsXG4gICAgICAgIHByb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSBNZXRhZGF0YS5yZWxhdGlvbnMobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgaWYgKCFyZWxhdGlvbk1ldGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNZXRhZGF0YSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9XG4gICAgICByZWxhdGlvbk1ldGEuY2xhc3MgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICBpZiAodHlwZW9mIHJlbGF0aW9uVHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICFyZWxhdGlvblR5cGUubmFtZSkge1xuICAgICAgcmVsYXRpb25UeXBlID0gKHJlbGF0aW9uVHlwZSBhcyBhbnkpKCk7XG4gICAgfVxuICAgIGlmICghcmVsYXRpb25UeXBlIHx8IHR5cGVvZiByZWxhdGlvblR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFR5cGUgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoIU1vZGVsLmdldChyZWxhdGlvblR5cGUubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGNvbnN0IGlzQXJyYXkgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5MSVNUXTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuXG4gICAgLy8gRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZTogaWYgdGhlIHJlbGF0ZWQgbW9kZWwgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAvLyByZWN1cnNpb24gc3RhY2ssIHVzZSB0aGUgUEsgdHlwZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVha1xuICAgIC8vIHRoZSBjeWNsZS4gVGhpcyBwcmV2ZW50cyBAbmVzdGpzL3N3YWdnZXIncyBTY2hlbWFPYmplY3RGYWN0b3J5IGZyb21cbiAgICAvLyBpbmZpbml0ZWx5IHJlY3Vyc2luZyB3aGVuIGV4cGxvcmluZyB0aGUgc2NoZW1hcy5cbiAgICBjb25zdCBpc0NpcmN1bGFyID0gc3RhY2suaGFzKHJlbGF0aW9uVHlwZSk7XG5cbiAgICBpZiAoaXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgICAgIGFkZFJlbGF0aW9uUGtSZWYoRHluYW1pY0RUTywgcmVsYXRpb24sIHBrVHlwZU5hbWUsIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25EdG8gPSBEdG9Gb3Iob3AsIHJlbGF0aW9uVHlwZSwgbmV3IFNldChzdGFjaykuYWRkKG1vZGVsKSk7XG5cbiAgICBpZiAoaXNVcGRhdGVPcCkge1xuICAgICAgYWRkUmVsYXRpb25VcGRhdGUoXG4gICAgICAgIER5bmFtaWNEVE8sXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICByZWxhdGlvblR5cGUsXG4gICAgICAgIHJlbGF0aW9uRHRvLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBpc1JlcXVpcmVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRSZWxhdGlvbihEeW5hbWljRFRPLCByZWxhdGlvbiwgcmVsYXRpb25EdG8sIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEeW5hbWljRFRPO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvbihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICB0eXBlOiByZWxhdGlvbkR0byxcbiAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICBpc0FycmF5LFxuICB9O1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogcmVsYXRpb25EdG8sXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHJlbGF0aW9uIHByb3BlcnR5IHRoYXQgdXNlcyB0aGUgUEsgdHlwZSAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2ZcbiAqIGEgZnVsbCBEVE8gY2xhc3MuIFVzZWQgdG8gYnJlYWsgY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBDdXN0b21lciDihpIgT3JkZXIg4oaSIEN1c3RvbWVyKS5cbiAqL1xuZnVuY3Rpb24gYWRkUmVsYXRpb25Qa1JlZihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcGtUeXBlTmFtZTogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBwa1R5cGVOYW1lIH0sIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogcGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcsIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IChwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZyksXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uVXBkYXRlKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4sXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBleHRyYU1vZGVscyA9XG4gICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsIER0b0NsYXNzKSB8fCBbXTtcbiAgaWYgKCFleHRyYU1vZGVscy5pbmNsdWRlcyhyZWxhdGlvbkR0bykpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLFxuICAgICAgWy4uLmV4dHJhTW9kZWxzLCByZWxhdGlvbkR0b10sXG4gICAgICBEdG9DbGFzc1xuICAgICk7XG4gIH1cblxuICBjb25zdCBkdG9SZWYgPSBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHtyZWxhdGlvbkR0by5uYW1lfWA7XG4gIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gIGNvbnN0IG9uZU9mSXRlbXMgPSBbeyAkcmVmOiBkdG9SZWYgfSwgeyB0eXBlOiBwa1R5cGVOYW1lIH1dO1xuXG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpO1xuXG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiBPYmplY3QsXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBNb2RlbC5wa1Byb3BzKHJlbGF0aW9uVHlwZSBhcyBhbnkpO1xuICAgIGNvbnN0IHBrVHlwZSA9IHBrUHJvcHNNZXRhZGF0YT8udHlwZTtcbiAgICBpZiAocGtUeXBlID09PSBOdW1iZXIgfHwgcGtUeXBlID09PSBCaWdJbnQpIHJldHVybiBcImludGVnZXJcIjtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBpZiAoTW9kZWwuZ2VuZXJhdGVkKGN1cnJlbnQsIHByb3AgYXMgYW55KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IoY3VycmVudCwgcHJvcCBhcyBhbnkpO1xuICAgIGlmICh2YWxpZGF0aW9uKSByZXR1cm4gdmFsaWRhdGlvbiBhcyBhbnk7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZyk6IGFueSB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoY3VycmVudCwgcHJvcCk7XG4gICAgaWYgKHR5cGUpIHJldHVybiB0eXBlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RHRvQ2FjaGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzXG4pOiBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+IHtcbiAgaWYgKCFkdG9DYWNoZS5oYXMob3ApKSB7XG4gICAgZHRvQ2FjaGUuc2V0KG9wLCBuZXcgV2Vha01hcCgpKTtcbiAgfVxuICByZXR1cm4gZHRvQ2FjaGUuZ2V0KG9wKSE7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnRyb2xsZXIsXG4gIFBhcmFtLFxuICBRdWVyeSxcbiAgUmVzcG9uc2UsXG4gIFNldE1ldGFkYXRhLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFwaUJhZFJlcXVlc3RSZXNwb25zZSxcbiAgQXBpQm9keSxcbiAgQXBpQ3JlYXRlZFJlc3BvbnNlLFxuICBBcGlFeHRyYU1vZGVscyxcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICB0eXBlIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwsXG4gIEFwaVBhcmFtc0Zyb21Nb2RlbCxcbiAgdHlwZSBEZWNhZkFwaVByb3BlcnR5LFxuICBEZWNhZkJvZHksXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyB0b0RlY2FmRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmdcbiAgKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgOiBmYWxsYmFja01lc3NhZ2VcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldFBlcnNpc3RlbmNlPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxUPj4oTW9kZWxDbGF6eik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKE1vZGVsQ2xhenopIGFzIE1vZGVsU2VydmljZTxUPjtcbiAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKE1vZGVsQ2xhenopIGFzIFJlcG88VD47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgICBwcmVmaXg6IHN0cmluZyA9IFBlcnNpc3RlbmNlS2V5cy5RVUVSWVxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IHJlcG86IFJlcG88VD4gPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG4gICAgY29uc3QgcXVlcnlNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCB7IGZpZWxkcz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH0+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcmVwby5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KFBlcnNpc3RlbmNlS2V5cy5RVUVSWSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjb25zdCByb3V0ZU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICBwZXJzaXN0ZW5jZS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNsYXNzIFF1ZXJ5Q29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBwYXJhbXNdIG9mIE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwYXJhbXMucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudDogc3RyaW5nKSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBoYW5kbGVyKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IocGFyYW1zLmh0dHBNZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgcm91dGVQYXRoIHx8IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBwYXJhbXMuaHR0cE1ldGhvZFxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIGhhbmRsZXIpO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykoXG4gICAgICAgIHJvdXRlUGF0aCB8fCB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qge1xuICAgICAgZ2V0UEssXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgcGF0aDogcGtQYXRoLFxuICAgIH0gPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudCkgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPVxuICAgICAgICAgIHJvdXRlLmltcGxlbWVudGF0aW9uPy5uYW1lIHx8IHJvdXRlLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1ldGhvZE5hbWU6IHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICBwYXJhbURlY29yYXRvcnMsXG4gICAgICAgIH0gPSByZWdpc3RyYXRpb247XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlclxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3Iocm91dGUubWV0aG9kIGFzIEh0dHBWZXJicykoXG4gICAgICAgICAgICByb3V0ZS5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc10sXG4gICAgICAgICAgICBwYXJhbURlY29yYXRvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgYXMgYW55O1xuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdO1xuICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoTW9kZWxDbGF6eikgYXMga2V5b2YgTW9kZWw8YW55PjtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ2xhenosXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLkNPTVBPU0VELCBwaylcbiAgICApO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5cyA9IGNvbXBvc2VkPy5hcmdzID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9XG4gICAgICBBcnJheS5pc0FycmF5KGNvbXBvc2VkS2V5cykgJiYgY29tcG9zZWRLZXlzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmNvbXBvc2VkS2V5c10pKVxuICAgICAgICA6IEFycmF5LmZyb20obmV3IFNldChbcGtdKSk7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenopID8/IFwiXCI7XG4gICAgY29uc3QgcGF0aCA9IGA6JHt1bmlxdWVLZXlzLmpvaW4oXCIvOlwiKX1gO1xuICAgIGNvbnN0IGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSA9IHVuaXF1ZUtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgZGVzY3JpcHRpb246IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenosIGtleSksXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT5cbiAgICAgICAgY29tcG9zZWQ/LnNlcGFyYXRvciA/IHBhcmFtcy5qb2luKGNvbXBvc2VkLnNlcGFyYXRvcikgOiBwYXJhbXMuam9pbihcIlwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcm91dGVQYXJhbURlY29yYXRvcnMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGxldCBwYXJhbUluZGV4ID0gMDtcbiAgICByZXR1cm4gcGF0aFxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZsYXRNYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIipcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWZpbmVNZXRob2QoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgIH0+ID0gW11cbiAgKSB7XG4gICAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG1ldGhvZE5hbWUpO1xuICAgIG1ldGhvZERlY29yYXRvcnMuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICAgIHBhcmFtRGVjb3JhdG9ycy5mb3JFYWNoKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT5cbiAgICAgIGRlY29yYXRvcihwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoUm91dGUoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlOiBTZXJ2ZXJSb3V0ZSxcbiAgICBwa1BhdGg6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6XG4gICAgfCB7XG4gICAgICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAgICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgICAgIGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yO1xuICAgICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbiBhcyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZEFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtSZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXNcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBwa1BhdGhcbiAgICAgICAgKSxcbiAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZWQgUEsgZmFsbGJhY2sgcm91dGVzIChmaWx0ZXJFbXB0eSkg4oCUIHBhdGggZGlmZmVycyBmcm9tIHBrUGF0aFxuICAgIGNvbnN0IGZhbGxiYWNrU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGlzQWxsUGFyYW1zID1cbiAgICAgIGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGByZWFkQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgICBmYWxsYmFja0FwaVByb3BzLFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICAgIGRlY29yYXRvcixcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgZGVsZXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJmaW5kT25lQnlcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgIHN0YXRlbWVudEtleVxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXnF1ZXJ5XFwvLywgXCJcIikuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIixcbiAgICAgIFwiZmluZEJ5XCIsXG4gICAgICBcImZpbmRCeVBhZ2luYXRlXCIsXG4gICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIixcbiAgICAgIFwicGFnZVwiLFxuICAgICAgXCJjb3VudE9mXCIsXG4gICAgICBcIm1heE9mXCIsXG4gICAgICBcIm1pbk9mXCIsXG4gICAgICBcImF2Z09mXCIsXG4gICAgICBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIixcbiAgICAgIFwiZ3JvdXBPZlwiLFxuICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgIFwiYnVsa1wiLFxuICAgICAgXCJxdWVyeVwiLFxuICAgIF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJzdGF0ZW1lbnQvXCIpICYmXG4gICAgICAha25vd25QcmVmaXhlcy5oYXMocGF0aFNlZ21lbnRzWzBdKVxuICAgICkge1xuICAgICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IHBhdGhTZWdtZW50c1xuICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBbXG4gICAgICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSkpLmZvcihcbiAgICAgICAgICBjb21wbGV4UXVlcnlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLm5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBlcnNpc3RlbmNlPy5yZXBvICYmXG4gICAgICAgICAgdHlwZW9mIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5xdWVyeSAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucXVlcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5xdWVyeShtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3QgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFtub3JtYWxpemVkLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdCB8fCB0eXBlb2YgbGFzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeU9iaiA9IGxhc3QgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBoYXNRdWVyeUZpZWxkcyA9XG4gICAgICBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWhhc1F1ZXJ5RmllbGRzKSB7XG4gICAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICBpZiAocXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgIGlmIChxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgIGlmIChxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5ib29rbWFyayk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcIm1ldGhvZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcImFyZ3NcIixcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gbGlzdGVkIGZvdW5kLmAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGJhc2U6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBhdGgpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJib29rbWFya1wiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJib29rbWFyayBmb3IgY3Vyc29yIHBhZ2luYXRpb25cIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBEaXN0aW5jdCB2YWx1ZXMgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICAgICAgdHlwZTogW1N0cmluZ10sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwXG4gICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFByb3ZpZGVyIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBNb2RlbFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZyb21Nb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi9Gcm9tTW9kZWxDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERFQ0FGX0VYUE9TRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVGb3IoZmxhdm91cjogc3RyaW5nKSB7XG4gIEBNb2R1bGUoe30pXG4gIGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICAgIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlLm5hbWUpLmZvcihmbGF2b3VyKTtcblxuICAgIHN0YXRpYyBjcmVhdGVNb2RlbFNlcnZpY2VzPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgICBtb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8VD5bXVxuICAgICk6IFByb3ZpZGVyW10ge1xuICAgICAgcmV0dXJuIG1vZGVscy5tYXAoKG1vZGVsKSA9PiAoe1xuICAgICAgICBwcm92aWRlOiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFeHBvc2VkKFxuICAgICAgbW9kZWw6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgIGV4cG9zdXJlPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZ1tdPlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHBvc3VyZT8uW21vZGVsLm5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IG92ZXJyaWRlXG4gICAgICAgICAgOiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShERUNBRl9FWFBPU0UpKTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmxhdm91cik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgICBvcHRpb25zOiBQYXJ0aWFsPERlY2FmTW9kdWxlT3B0aW9ucz4gPSB7fVxuICAgICk6IER5bmFtaWNNb2R1bGUge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgICBjb25zdCB0cmFja2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHMoZmxhdm91cikuZmlsdGVyKChtb2RlbCkgPT5cbiAgICAgICAgdGhpcy5pc0V4cG9zZWQobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlKVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udHJvbGxlcnMgYWx3YXlzIHJlbHkgb24gYSBiYWNraW5nIE1vZGVsU2VydmljZSwgZXZlbiB3aGVuIE5lc3QgcHJvdmlkZXJzXG4gICAgICAvLyBhcmUgbm90IGF1dG8tcmVnaXN0ZXJlZC4gV2FybSB0aGUgc2luZ2xldG9uIHJlZ2lzdHJ5IGhlcmUgc28gc2h1dGRvd24gY2FuXG4gICAgICAvLyBzZWUgdGhlIGxpdmUgc2VydmljZXMgY3JlYXRlZCBmb3IgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVycy5cbiAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdHJhY2tlZE1vZGVscykgTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSk7XG5cbiAgICAgIGxldCBtb2RlbFNlcnZpY2VzOiBQcm92aWRlcltdID0gW107XG4gICAgICBpZiAob3B0aW9ucy5hdXRvU2VydmljZXMpIHtcbiAgICAgICAgbG9nLmluZm8oXCJBdXRvLXNlcnZpY2VzIGVuYWJsZWQuIEluaXRpYWxpemluZyBzZXJ2aWNlIGdlbmVyYXRpb24uXCIpO1xuICAgICAgICBtb2RlbFNlcnZpY2VzID0gdGhpcy5jcmVhdGVNb2RlbFNlcnZpY2VzKHRyYWNrZWRNb2RlbHMpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgQXV0by1zZXJ2aWNlcyBjb21wbGV0ZWQuICR7bW9kZWxTZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2VzIGluaXRpYWxpemVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2xvYmFsRGVmYXVsdHM6IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4gPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLmFnZ3JlZ2F0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgZ2xvYmFsRGVmYXVsdHMuYWxsb3dHcm91cGluZ1F1ZXJpZXMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udHJvbGxlcnMgPSB0cmFja2VkTW9kZWxzLm1hcCgobW9kZWwpID0+XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsIGdsb2JhbERlZmF1bHRzKVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgICAgY29udHJvbGxlcnMsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgIC4uLm1vZGVsU2VydmljZXMsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBPYmplY3QuYXNzaWduKERlY2FmTW9kZWxNb2R1bGUsIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGBEZWNhZk1vZHVsZSR7Zmxhdm91cn1gLFxuICB9KTtcbiAgcmV0dXJuIERlY2FmTW9kZWxNb2R1bGU7XG59XG4iLCJpbXBvcnQge1xuICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsXG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZz86IEluamVjdGFibGVDb25maWdcbiAgICApIHtcbiAgICAgIGNmZyA9XG4gICAgICAgIGNmZyB8fFxuICAgICAgICAodHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LFxuICAgICAgICAgICAgICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZSh7XG4gICAgICAgIHNjb3BlOiBjZmcuc2luZ2xldG9uID8gU2NvcGUuREVGQVVMVCA6IFNjb3BlLlJFUVVFU1QsXG4gICAgICAgIGR1cmFibGU6IGNmZy5zaW5nbGV0b24gPyB1bmRlZmluZWQgOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdChcbiAgICAgIGNhdGVnb3J5OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNmZzogSW5qZWN0T3B0aW9uc1xuICAgICkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyTmVzdEluamVjdChcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgICBkZXNjcmlwdG9yPzogYW55XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIEluamVjdChjYXRlZ29yeSB8fCAodGFyZ2V0IGFzIENvbnN0cnVjdG9yKSkoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKVxuICAuZXh0ZW5kKFxuICAgIEFwaVByb3BlcnR5KHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gIClcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heGltdW06IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5pbXVtOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluTGVuZ3RoRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5MZW5ndGg6IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHR5cGVEZWMoXG4gICAgICB0eXBlOlxuICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW11cbiAgICAgICAgfCBDb25zdHJ1Y3RvclxuICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3RvcilcbiAgICApIHtcbiAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICB0eXBlID0gQXJyYXkuaXNBcnJheSh0eXBlKSA/IHR5cGVbMF0gOiB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHlwZS5uYW1lKVxuICAgICAgICAgIHR5cGUgPSAodHlwZSBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbiAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIGFueSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIH0pKHRhcmdldCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbGlzdERlYyhcbi8vICAgICAgIGNsYXp6OlxuLy8gICAgICAgICB8IENvbnN0cnVjdG9yXG4vLyAgICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuLy8gICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW10sXG4vLyAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4vLyAgICAgICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiXG4vLyAgICAgKSB7XG4vLyAgICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbi8vICAgICAgICAgY2xhenogPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4vLyAgICAgICAgIGlmICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZSlcbi8vICAgICAgICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbi8vICAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgdHlwZTogW2NsYXp6IGFzIGFueV0gfSkodGFyZ2V0LCBwcm9wKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vLyAvL1xuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuREFURSlcbiAgLmV4dGVuZCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGF0ZURlYyhmb3JtYXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZS10aW1lXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgLy8gZXhhbXBsZTogcGFyc2VEYXRlKGZvcm1hdCwgbmV3IERhdGUoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuRU5VTSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvcHRpb25EZWMob3B0aW9uczogc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICBjb25zdCBvcHRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBPYmplY3QudmFsdWVzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZW51bTogb3B0cyxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbkRlYyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkZXNjcmlwdGlvbkRlYyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQVVUSCkuZXh0ZW5kKHsgZGVjb3JhdG9yOiBBdXRoIH0pLmFwcGx5KCk7XG4iLCJpbXBvcnQgeyBGb3JiaWRkZW5FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgQ29yc0Vycm9yIGV4dGVuZHMgRm9yYmlkZGVuRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBDb3JzRXJyb3IubmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgVG9NYW55UmVxdWVzdHNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgKSB7XG4gICAgc3VwZXIoVG9NYW55UmVxdWVzdHNFcnJvci5uYW1lLCBtc2cgLCA0MjkpO1xuICB9XG59IiwiaW1wb3J0IHtcbiAgQXJndW1lbnRzSG9zdCxcbiAgQ2F0Y2gsXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvdGhyb3R0bGluZ1wiO1xuXG5AQ2F0Y2goKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY2F0Y2goZXhjZXB0aW9uOiBFcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgIGNvbnN0IGN0eCA9IGhvc3Quc3dpdGNoVG9IdHRwKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgbGV0IHN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvclxuICAgICkge1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgc3RhdHVzQ29kZSA9IChleGNlcHRpb24gYXMgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7XG4gICAgfSBlbHNlIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEJhc2VFcnJvcikpIHtcbiAgICAgIGlmKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSl7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUb01hbnlSZXF1ZXN0c0Vycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgSW50ZXJuYWxFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc3RhdHVzKChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgc3RhdHVzOiAoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVXNlRmlsdGVycywgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL0RlY2FmRXJyb3JGaWx0ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L2luZGV4XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VjdXJpdHlTY2hlbWVPYmplY3QgfSBmcm9tIFwiLi4vLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xuICBhdXRoPzogU2VjdXJpdHlTY2hlbWVPYmplY3Q7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIGV4dHJhTW9kZWxzPzogQ29uc3RydWN0b3JbXTtcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1dBR0dFUl9VSV9DT05TVEFOVFM6IFN3YWdnZXJPcHRpb25zID0ge1xuICB0aXRsZTogXCJTd2FnZ2VyIHwgT3BlbkFQSSBTcGVjaWZpY2F0aW9uIChPQVMpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkaXplZCBmb3JtYXQgZm9yIGRlc2NyaWJpbmcgUkVTVGZ1bCBBUElzXCIsXG4gIHZlcnNpb246IFwiMC4wLjFcIixcbiAgcGF0aDogXCJkb2NzXCIsXG4gIGZhdmljb25GaWxlUGF0aDogXCJcIixcbiAgdG9wYmFySWNvbkZpbGVQYXRoOiBcIlwiLFxuICBhdXRoOiB7XG4gICAgdHlwZTogXCJodHRwXCIsXG4gICAgc2NoZW1lOiBcImJlYXJlclwiLFxuICAgIGJlYXJlckZvcm1hdDogXCJKV1RcIixcbiAgICBuYW1lOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbnRlciBKV1QgdG9rZW5cIixcbiAgICBpbjogXCJoZWFkZXJcIixcbiAgfSxcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gIHRvcGJhckJnQ29sb3I6IFwiIzAwMDAwMFwiLFxufTtcbiIsImltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyVUlPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQ3VzdG9tVUkge1xuICByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zO1xuICAvLyBwcml2YXRlIHJlYWRvbmx5IGFzc2V0c1BhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgLy8gICBfX2Rpcm5hbWUsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIndvcmtkb2NzXCIsXG4gIC8vICAgXCJhc3NldHNcIlxuICAvLyApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGN1c3RvbUNTUygpIHtcbiAgICBsZXQgY3NzID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKSB7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpO1xuICAgICAgY3NzICs9IGAudG9wYmFyLXdyYXBwZXIgeyBjb250ZW50OiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke2ltZ30nKTsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IGF1dG87IH1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY3NzICtcbiAgICAgIGBcbiAgICAgICAgLnRvcGJhci13cmFwcGVyIHN2ZyB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuICAgICAgICAuc3dhZ2dlci11aSAudG9wYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvciB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy50b3BiYXJCZ0NvbG9yfTsgfVxuICAgICAgYFxuICAgICk7XG4gIH1cblxuICBnZXRDdXN0b21PcHRpb25zKCkge1xuICAgIGNvbnN0IGZhdmljb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhdmljb25QYXRoKSB7XG4gICAgICBmYXZpY29uW1wiY3VzdG9tZmF2SWNvblwiXSA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgLi4uZmF2aWNvbixcbiAgICAgIGN1c3RvbUNzczogdGhpcy5jdXN0b21DU1MoKSxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB7XG4gICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBiNjQoZmlsZTogc3RyaW5nLCBpbWc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy5hc3NldHNQYXRoIHx8IFwiXCIsIGZpbGUpO1xuICAgIGNvbnN0IGI2NCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogXCJiYXNlNjRcIiB9KTtcbiAgICByZXR1cm4gaW1nID8gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiNjQgOiBiNjQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElOZXN0QXBwbGljYXRpb24gfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERvY3VtZW50QnVpbGRlciwgU3dhZ2dlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IFN3YWdnZXJDdXN0b21VSSB9IGZyb20gXCIuL1N3YWdnZXJDdXN0b21VSVwiO1xuaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMsIFN3YWdnZXJPcHRpb25zIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogSU5lc3RBcHBsaWNhdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJPcHRpb25zXG4gICkge31cblxuICBwcml2YXRlIGNyZWF0ZURvY3VtZW50KCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnBhdGhcbiAgICAgID8gdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uICtcbiAgICAgICAgXCJcIiArXG4gICAgICAgIGA8YnI+PGJyPjxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9XCI+T3BlbkFQSSBKU09OIFNwZWM8L2E+IHwgYCArXG4gICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofVwiPk9wZW5BUEkgWUFNTCBTcGVjPC9hPmBcbiAgICAgIDogdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3QgY29uZmlnID0gbmV3IERvY3VtZW50QnVpbGRlcigpXG4gICAgICAuc2V0VGl0bGUodGhpcy5vcHRpb25zLnRpdGxlKVxuICAgICAgLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnNldFZlcnNpb24odGhpcy5vcHRpb25zLnZlcnNpb24gfHwgXCIwLjAuMVwiKVxuICAgICAgLmFkZEJlYXJlckF1dGgodGhpcy5vcHRpb25zLmF1dGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMuYXV0aClcbiAgICAgIC5idWlsZCgpO1xuXG4gICAgcmV0dXJuIFN3YWdnZXJNb2R1bGUuY3JlYXRlRG9jdW1lbnQodGhpcy5hcHAsIGNvbmZpZywge1xuICAgICAgZXh0cmFNb2RlbHM6IHRoaXMub3B0aW9ucy5leHRyYU1vZGVscyB8fCBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB8IFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgYm9keUZhY3Rvcnk6ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBodHRwQWRhcHRlciA9IHRoaXMuYXBwLmdldEh0dHBBZGFwdGVyKCkgYXMgYW55O1xuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgaHR0cEFkYXB0ZXIuZ2V0KHBhdGgsIChfcmVxOiBhbnksIHJlczogYW55KSA9PiB7XG4gICAgICBodHRwQWRhcHRlci5yZXBseShyZXMsIGJvZHlGYWN0b3J5KCksIDIwMCwge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwU3dhZ2dlcigpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlRG9jdW1lbnQoKTtcbiAgICBjb25zdCBzd2FnZ2VyVUkgPSBuZXcgU3dhZ2dlckN1c3RvbVVJKHtcbiAgICAgIHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogdGhpcy5vcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uUGF0aDogdGhpcy5vcHRpb25zLmZhdmljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckljb25QYXRoOiB0aGlzLm9wdGlvbnMudG9wYmFySWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogdGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgfSk7XG4gICAgU3dhZ2dlck1vZHVsZS5zZXR1cChcbiAgICAgIHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIGRvY3VtZW50LFxuICAgICAge1xuICAgICAgICAuLi5zd2FnZ2VyVUkuZ2V0Q3VzdG9tT3B0aW9ucygpLFxuICAgICAgICBqc29uRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB5YW1sRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgKCkgPT4gZG9jdW1lbnRcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgICAgKCkgPT4gWUFNTC5zdHJpbmdpZnkoZG9jdW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgZ2V0VmVyc2lvbigpIHtcbiAgLy8gICAvLyBjb25zdCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgLy8gICAvLyBjb25zdCB7dmVyc2lvbn0gPSByZXF1aXJlKHBhY2thZ2VKc29uKTtcbiAgLy8gICByZXR1cm4gXCJ2ZXJzaW9uXCI7XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7XG4gIElOZXN0QXBwbGljYXRpb24sXG4gIExvZ2dlcixcbiAgTmVzdEludGVyY2VwdG9yLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmbHVlbnQsIHN0YXRpYyBib290c3RyYXAgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgY29uZmlndXJpbmcgYSBOZXN0SlMgYXBwbGljYXRpb24uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTmVzdEJvb3RzdHJhcGVyYCBjbGFzcyBwcm92aWRlcyBhIGNoYWluYWJsZSBBUEkgZm9yIGNvbmZpZ3VyaW5nXG4gKiBhIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gSXQgaW5jbHVkZXMgYnVpbHQtaW4gbWV0aG9kcyBmb3IgZW5hYmxpbmdcbiAqIENPUlMsIEhlbG1ldCBzZWN1cml0eSwgU3dhZ2dlciBkb2N1bWVudGF0aW9uLCBnbG9iYWwgcGlwZXMsIGZpbHRlcnMsXG4gKiBpbnRlcmNlcHRvcnMsIGFuZCBzdGFydGluZyB0aGUgc2VydmVyLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvbW90ZXMgY29uc2lzdGVuY3kgYW5kIHJlZHVjZXMgcmVwZXRpdGl2ZSBzZXR1cCBjb2RlXG4gKiBhY3Jvc3MgbXVsdGlwbGUgTmVzdEpTIHByb2plY3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmVzdEZhY3RvcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tIFwiLi9hcHAubW9kdWxlXCI7XG4gKiBpbXBvcnQgeyBNeUxvZ2dlciB9IGZyb20gXCIuL015TG9nZ2VyXCI7XG4gKiBpbXBvcnQgeyBOZXN0Qm9vdHN0cmFwZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1uZXN0XCI7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICogICBjb25zdCBhcHAgPSBhd2FpdCBOZXN0RmFjdG9yeS5jcmVhdGUoQXBwTW9kdWxlKTtcbiAqXG4gKiAgIGF3YWl0IE5lc3RCb290c3RyYXBlclxuICogICAgIC5pbml0aWFsaXplKGFwcClcbiAqICAgICAuZW5hYmxlTG9nZ2VyKG5ldyBNeUxvZ2dlcigpKVxuICogICAgIC5lbmFibGVDb3JzKFtcImh0dHA6Ly9sb2NhbGhvc3Q6NDIwMFwiXSlcbiAqICAgICAudXNlSGVsbWV0KClcbiAqICAgICAuc2V0dXBTd2FnZ2VyKHtcbiAqICAgICAgIHRpdGxlOiBcIk9wZW5BUEkgYnkgVHJhZGVNYXJr4oSiXCIsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogXCJUcmFkZU1hcmvihKIgQVBJIGRvY3VtZW50YXRpb25cIixcbiAqICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAqICAgICAgIHBhdGg6IFwiYXBpXCIsXG4gKiAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAqICAgICAgIHRvcGJhckJnQ29sb3I6IFwiIzJDM0U1MFwiLFxuICogICAgICAgdG9wYmFySWNvblBhdGg6IFwiL2Fzc2V0cy9sb2dvLnN2Z1wiLFxuICogICAgICAgZmF2aWNvblBhdGg6IFwiL2Fzc2V0cy9mYXZpY29uLmljb1wiXG4gKiAgICAgfSlcbiAqICAgICAudXNlR2xvYmFsRmlsdGVycygpXG4gKiAgICAgLnVzZUdsb2JhbFBpcGVzKC4uLilcbiAqICAgICAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLilcbiAqICAgICAuc3RhcnQoMzAwMCk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKCk7XG4gKiBgYGBcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTmVzdEJvb3RzdHJhcGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYXBwOiBJTmVzdEFwcGxpY2F0aW9uO1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dlciBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IG9uZSBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbnN1cmVzIHRoYXQgYSB2YWxpZCBgTG9nZ2VyYCBpbnN0YW5jZSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAqIGZvciBsb2dnaW5nIGJvb3RzdHJhcC1yZWxhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBhY3RpdmUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGxvZ2dlcigpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB7XG4gICAgICAvLyBmYWxsYmFja1xuICAgICAgdGhpcy5fbG9nZ2VyID0gbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluaXRpYWxpemVzIHRoZSBib290c3RyYXBwZXIgd2l0aCBhIGdpdmVuIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQmluZHMgdGhlIHByb3ZpZGVkIE5lc3RKUyBhcHAgaW5zdGFuY2UgdG8gdGhlIGJvb3RzdHJhcHBlciwgZW5hYmxpbmdcbiAgICogY2hhaW5lZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7SU5lc3RBcHBsaWNhdGlvbn0gYXBwIC0gVGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlTG9nZ2VyKGN1c3RvbUxvZ2dlcj86IExvZ2dlcikge1xuICAgIHRoaXMuX2xvZ2dlciA9IGN1c3RvbUxvZ2dlciB8fCBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB0aGlzLmFwcC51c2VMb2dnZXIodGhpcy5fbG9nZ2VyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUykgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQWxsb3dzIGRlZmluaW5nIGVpdGhlciBhIHdpbGRjYXJkIG9yaWdpbiAoYFwiKlwiYCkgb3IgYSBsaXN0IG9mIGFsbG93ZWQgb3JpZ2lucy5cbiAgICogQXV0b21hdGljYWxseSBhY2NlcHRzIGxvY2FsIGRldmVsb3BtZW50IHJlcXVlc3RzIGFuZCB0aG9zZSB3aXRob3V0IG9yaWdpbiBoZWFkZXJzLlxuICAgKiBUaHJvd3MgYSBgQ29yc0Vycm9yYCBmb3IgdW5hdXRob3JpemVkIG9yaWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7JyonIHwgc3RyaW5nW119IFtvcmlnaW5zPVtdXSAtIExpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zIG9yIGBcIipcImAgdG8gYWxsb3cgYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxsb3dNZXRob2RzPVsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddXSAtIEFsbG93ZWQgSFRUUCBtZXRob2RzLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUNvcnMoXG4gICAgb3JpZ2luczogXCIqXCIgfCBzdHJpbmdbXSA9IFtdLFxuICAgIGFsbG93TWV0aG9kczogc3RyaW5nW10gPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdXG4gICkge1xuICAgIGNvbnN0IGFsbG93ZWRPcmlnaW5zID1cbiAgICAgIG9yaWdpbnMgPT09IFwiKlwiID8gXCIqXCIgOiBvcmlnaW5zLm1hcCgobykgPT4gby50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBjb25zdCBjb3JzT3B0aW9uczogQ29yc09wdGlvbnMgPSB7XG4gICAgICBvcmlnaW46IChvcmlnaW4sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIEFsbG93IHJlcXVlc3Qgd2l0aG91dCBvcmlnaW4uLi5cbiAgICAgICAgaWYgKCFvcmlnaW4pIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnMgPT09IFwiKlwiIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbnMpICYmXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2lucy5pbmNsdWRlcyhvcmlnaW4udG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG5ldyBDb3JzRXJyb3IoYE9yaWdpbiAke29yaWdpbn0gbm90IGFsbG93ZWRgKSk7XG4gICAgICB9LFxuICAgICAgY3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBtZXRob2RzOiBhbGxvd01ldGhvZHMuam9pbihcIixcIiksXG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmVuYWJsZUNvcnMoY29yc09wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBcHBsaWVzIHRoZSBIZWxtZXQgbWlkZGxld2FyZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIER5bmFtaWNhbGx5IGxvYWRzIHRoZSBgaGVsbWV0YCBwYWNrYWdlIGlmIGF2YWlsYWJsZSBhbmQgcmVnaXN0ZXJzIGl0XG4gICAqIGFzIG1pZGRsZXdhcmUgdG8gaW1wcm92ZSBIVFRQIGhlYWRlciBzZWN1cml0eS4gSWYgbm90IGluc3RhbGxlZCwgbG9ncyBhIHdhcm5pbmdcbiAgICogYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gd2l0aG91dCB0aHJvd2luZyBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXNzZWQgdG8gSGVsbWV0LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBzZXR1cFN3YWdnZXIob3B0aW9uczogU3dhZ2dlclNldHVwT3B0aW9ucykge1xuICAgIGNvbnN0IHN3YWdnZXIgPSBuZXcgU3dhZ2dlckJ1aWxkZXIodGhpcy5hcHAsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICBwYXRoOiBvcHRpb25zLnBhdGggfHwgXCJhcGlcIixcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiBvcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiBvcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uRmlsZVBhdGg6IG9wdGlvbnMuZmF2aWNvblBhdGgsXG4gICAgICB0b3BiYXJJY29uRmlsZVBhdGg6IG9wdGlvbnMudG9wYmFySWNvblBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiBvcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgICBvcGVuQXBpSnNvblBhdGg6IG9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgb3BlbkFwaVlhbWxQYXRoOiBvcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICB9KTtcbiAgICBzd2FnZ2VyLnNldHVwU3dhZ2dlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIHZhbGlkYXRpb24gcGlwZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuYWJsZXMgcmVxdWVzdCBwYXlsb2FkIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIGdsb2JhbGx5IGFjcm9zc1xuICAgKiB0aGUgZW50aXJlIE5lc3RKUyBhcHBsaWNhdGlvbi4gTXVsdGlwbGUgcGlwZXMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXJcbiAgICogZm9yIG1vZHVsYXIgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QaXBlVHJhbnNmb3JtW119IHBpcGVzIC0gUGlwZSBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIgZ2xvYmFsbHkuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uRXhjZXB0aW9uRmlsdGVyW119IGZpbHRlcnMgLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IGdsb2JhbGx5LlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEZpbHRlcnMoLi4uZmlsdGVyczogYW55W10pIHtcbiAgICB0aGlzLmFwcC51c2VHbG9iYWxGaWx0ZXJzKFxuICAgICAgLi4uKGZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnMgOiBbbmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCldKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBnbG9iYWwgaW50ZXJjZXB0b3JzIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSW50ZXJjZXB0b3JzIGFsbG93IGFkdmFuY2VkIHJlcXVlc3QvcmVzcG9uc2UgbWFuaXB1bGF0aW9uIHN1Y2ggYXNcbiAgICogc2VyaWFsaXphdGlvbiwgbG9nZ2luZywgb3IgdHJhbnNmb3JtYXRpb24uIE11bHRpcGxlIGludGVyY2VwdG9yc1xuICAgKiBjYW4gYmUgYWRkZWQgZm9yIG1vZHVsYXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5OZXN0SW50ZXJjZXB0b3JbXX0gaW50ZXJjZXB0b3JzIC0gSW50ZXJjZXB0b3IgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnM6IE5lc3RJbnRlcmNlcHRvcltdKSB7XG4gICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPiAwKVxuICAgICAgdGhpcy5hcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN0YXJ0cyB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uIGFuZCBiaW5kcyBpdCB0byB0aGUgZ2l2ZW4gcG9ydCBhbmQgaG9zdC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogTGlzdGVucyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kIG9wdGlvbmFsbHkgYSBob3N0LiBPbmNlIHN0YXJ0ZWQsXG4gICAqIGxvZ3MgdGhlIGFwcGxpY2F0aW9uIFVSTCBmb3IgZWFzeSBhY2Nlc3MuIFRoZSBzdGFydHVwIHByb2Nlc3MgcmVzb2x2ZXNcbiAgICogb25jZSB0aGUgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9ydD0zMDAwXSAtIFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtob3N0XSAtIE9wdGlvbmFsIGhvc3Qgb3IgSVAgYWRkcmVzcyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9dHJ1ZV0gLSBXaGV0aGVyIHRvIGxvZyB0aGUgYXBwbGljYXRpb24gVVJMIHVwb24gc3RhcnR1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgb25jZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydChcbiAgICBwb3J0OiBudW1iZXIgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCxcbiAgICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgbG9nOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmFwcC5saXN0ZW4ocG9ydCwgaG9zdCBhcyBhbnkpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmFwcC5nZXRVcmwoKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGDwn5qAIEFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgYXQ6ICR7dXJsfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDYWxsSGFuZGxlcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBEZWZhdWx0QWRhcHRlckZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckZsYWdzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnRlcmNlcHRvciByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIGFsbCByZWdpc3RlcmVkIERlY2FmIHJlcXVlc3QgaGFuZGxlcnNcbiAqIGJlZm9yZSB0aGUgY29udHJvbGxlciBtZXRob2QgaXMgaW52b2tlZC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3J9IGludGVncmF0ZXMgdGhlIERlY2FmIHJlcXVlc3QtaGFuZGxpbmcgcGlwZWxpbmVcbiAqIGludG8gTmVzdEpTJyBpbnRlcmNlcHRvciBtZWNoYW5pc20uIEJlZm9yZSBwYXNzaW5nIGV4ZWN1dGlvbiB0byB0aGUgbmV4dCBoYW5kbGVyIGluIHRoZVxuICogTmVzdEpTIGNoYWluLCBpdCBkZWxlZ2F0ZXMgcmVxdWVzdCBwcm9jZXNzaW5nIHRvIHRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9LCB3aGljaFxuICogc2VxdWVudGlhbGx5IHJ1bnMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcy4gVGhpcyBhbGxvd3NcbiAqIGJlaGF2aW9ycyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBsb2dnaW5nLCB0ZW5hbnQgcmVzb2x1dGlvbiwgb3IgbWV0YWRhdGEgZW5yaWNobWVudFxuICogdG8gb2NjdXIgcHJpb3IgdG8gY29udHJvbGxlciBleGVjdXRpb24uXG4gKlxuICogQGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQXBwbHkgZ2xvYmFsbHk6XG4gKiBhcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKG5ldyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IoZXhlY3V0b3IpKTtcbiAqXG4gKiAvLyBPciBpbiBhIG1vZHVsZTpcbiAqIEBNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gKiAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEludGVyY2VwdG9yXG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBDb250cm9sbGVyXG4gKlxuICogICAgIENsaWVudC0+PkludGVyY2VwdG9yOiBIVFRQIFJlcXVlc3RcbiAqICAgICBJbnRlcmNlcHRvci0+PkV4ZWN1dG9yOiBleGVjKHJlcXVlc3QpXG4gKiAgICAgRXhlY3V0b3ItLT4+SW50ZXJjZXB0b3I6IGhhbmRsZXJzIGNvbXBsZXRlZFxuICogICAgIEludGVyY2VwdG9yLT4+Q29udHJvbGxlcjogbmV4dC5oYW5kbGUoKVxuICogICAgIENvbnRyb2xsZXItLT4+Q2xpZW50OiBSZXNwb25zZVxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRvcjogRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb250ZXh0dWFsaXplKHJlcTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICAgIGNvbnN0IGZsYWdzOiBEZWNhZlNlcnZlckZsYWdzID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBpcCA9IGV4dHJhY3RJcChyZXEpO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHsgaXAgfSk7XG5cbiAgICB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgRGVmYXVsdEFkYXB0ZXJGbGFncyxcbiAgICAgICAge1xuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgb3BlcmF0aW9uOiBgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YCxcbiAgICAgICAgfSxcbiAgICAgICAgZmxhZ3NcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKSB7XG4gICAgY29uc3QgcmVxID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVzID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcikuZm9yKHRoaXMuaW50ZXJjZXB0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRleHR1YWxpemUocmVxKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gY29udGV4dHVhbGl6ZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZXhlY3V0b3IuZXhlYyhyZXEsIHJlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGV4ZWN1dG9ycyBmaW5pc2hlZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJcChyZXE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgZnVuY3Rpb24gcGFyc2VJcEhlYWRlcih2YWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilbMF07XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtZm9yd2FyZGVkLWZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtcmVhbC1pcFwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtRm9yd2FyZGVkLUZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtUmVhbC1JUFwiXSkgPz9cbiAgICByZXEuaXBcbiAgKTtcbn1cbiIsImltcG9ydCB7IEluamVjdCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIGluamVjdGFibGVTZXJ2aWNlS2V5LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG9zaXRvcnkgYXMgQ29yZVJlcG9zaXRvcnksXG4gIFNlcnZpY2UgYXMgQ29yZVNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmRmFjdG9yeVByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBzdHJpbmc7XG4gIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd247XG59O1xuXG5jb25zdCBwZW5kaW5nUHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIERlY2FmRmFjdG9yeVByb3ZpZGVyPigpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEcmFpbnMgdGhlIHByb3ZpZGVycyByZWdpc3RlcmVkIGJ5IHtAbGluayBTZXJ2aWNlfS97QGxpbmsgUmVwb3NpdG9yeX0gdXNhZ2VzLlxuICogQHN1bW1hcnkgQ29uc3VtZWQgYnkge0BsaW5rIERlY2FmQ29yZU1vZHVsZS5mb3JSb290fSB0byB3aXJlIHRoZSB0b2tlbnMgdGhhdCB0aG9zZSBwYXJhbWV0ZXJcbiAqIGRlY29yYXRvcnMgcmVmZXJlbmNlIGJhY2sgaW50byBOZXN0J3MgREkgY29udGFpbmVyLCBzaW5jZSBhIHBhcmFtZXRlciBkZWNvcmF0b3IgYWxvbmUgY2Fubm90XG4gKiBzdXBwbHkgYSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpOiBEZWNhZkZhY3RvcnlQcm92aWRlcltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20ocGVuZGluZ1Byb3ZpZGVycy52YWx1ZXMoKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW46IHN0cmluZywgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICBpZiAocGVuZGluZ1Byb3ZpZGVycy5oYXModG9rZW4pKSByZXR1cm47XG4gIHBlbmRpbmdQcm92aWRlcnMuc2V0KHRva2VuLCB7IHByb3ZpZGU6IHRva2VuLCB1c2VGYWN0b3J5IH0pO1xufVxuXG5mdW5jdGlvbiBpc01vZGVsQ29uc3RydWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIE1vZGVsO1xufVxuXG5mdW5jdGlvbiBtb2RlbFNlcnZpY2VUb2tlbihtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHJldHVybiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgO1xufVxuXG5mdW5jdGlvbiBtb2RlbFJlcG9zaXRvcnlUb2tlbihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBmbGF2b3VyID8gYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5QCR7Zmxhdm91cn1gIDogYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5YDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiBzZXJ2aWNlLlxuICogQHN1bW1hcnkgVHJhbnNsYXRlcyBkZWNhZidzIHNlcnZpY2UgcmVzb2x1dGlvbiBBUElzIGludG8gYSBOZXN0IGBASW5qZWN0KClgIGNhbGw6XG4gKiAtIGBAU2VydmljZShTb21lTW9kZWwpYCBpbmplY3RzIHRoZSBgTW9kZWxTZXJ2aWNlPFNvbWVNb2RlbD5gIHNpbmdsZXRvbiBmb3IgdGhhdCBtb2RlbFxuICogICAodmlhIHtAbGluayBNb2RlbFNlcnZpY2UuZm9yTW9kZWx9KS5cbiAqIC0gYEBTZXJ2aWNlKFNvbWVTZXJ2aWNlQ2xhc3MpYCBvciBgQFNlcnZpY2UoXCJhbGlhc1wiKWAgaW5qZWN0cyB0aGUgbWF0Y2hpbmcgYEBzZXJ2aWNlKClgLWRlY29yYXRlZFxuICogICBkZWNhZiB7QGxpbmsgQ29yZVNlcnZpY2V9ICh2aWEge0BsaW5rIENvcmVTZXJ2aWNlLmdldH0pLlxuICogLSBgQFNlcnZpY2UoKWAgaW5mZXJzIHRoZSBwYXJhbWV0ZXIncyB0eXBlIGZyb20gZW1pdHRlZCBjb25zdHJ1Y3RvciBtZXRhZGF0YSBhbmQgcmVzb2x2ZXMgaXQgdGhlXG4gKiAgIHNhbWUgd2F5LCBwcm92aWRlZCB0aGUgcGFyYW1ldGVyIGlzIHR5cGVkIGFzIGEgY29uY3JldGUgY2xhc3MgKGdlbmVyaWNzIGxpa2UgYE1vZGVsU2VydmljZTxYPmBcbiAqICAgYXJlIGVyYXNlZCBhdCBydW50aW1lLCBzbyB0aGUgbW9kZWwtc2VydmljZSBmb3JtIGFsd2F5cyByZXF1aXJlcyBhbiBleHBsaWNpdCBhcmd1bWVudCkuXG4gKiBAcGFyYW0ga2V5IHRoZSBtb2RlbCBjbGFzcywgc2VydmljZSBjbGFzcywgb3IgYWxpYXMgdG8gcmVzb2x2ZS4gT21pdCB0byBpbmZlciBmcm9tIHRoZSBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlcnZpY2Uoa2V5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCByZXNvbHZlZDogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IGtleTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBwYXJhbVR5cGVzOiBhbnlbXSA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgcmVzb2x2ZWQgPSBwYXJhbVR5cGVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBAU2VydmljZSgpIGNvdWxkIG5vdCBkZXRlcm1pbmUgYW4gaW5qZWN0aW9uIHR5cGUgZm9yIHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fSBvZiAkeyh0YXJnZXQgYXMgQ29uc3RydWN0b3I8YW55PikubmFtZX0uIFByb3ZpZGUgYW4gZXhwbGljaXQgYXJndW1lbnQsIGUuZy4gQFNlcnZpY2UoU29tZVNlcnZpY2UpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNNb2RlbCA9IHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIiAmJiBpc01vZGVsQ29uc3RydWN0b3IocmVzb2x2ZWQpO1xuICAgIGNvbnN0IHRva2VuID0gYXNNb2RlbFxuICAgICAgPyBtb2RlbFNlcnZpY2VUb2tlbihyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgICAgOiBpbmplY3RhYmxlU2VydmljZUtleShyZXNvbHZlZCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTtcblxuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IHtcbiAgICAgIGlmIChhc01vZGVsKSByZXR1cm4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZClcbiAgICAgICAgOiBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYge0BsaW5rIENvcmVSZXBvc2l0b3J5fSBmb3IgYG1vZGVsYC5cbiAqIEBzdW1tYXJ5IFVubGlrZSB7QGxpbmsgU2VydmljZX0sIGBtb2RlbGAgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYSBNb2RlbCBjbGFzczogdGhlIHNhbWUgY2xhc3MgcGFzc2VkXG4gKiB0byBgQFNlcnZpY2UobW9kZWwpYCBhbmQgYEBSZXBvc2l0b3J5KG1vZGVsKWAgcmVzb2x2ZXMgdG8gdHdvIGRpZmZlcmVudCBpbmplY3RlZCBvYmplY3RzIChhXG4gKiBgTW9kZWxTZXJ2aWNlPE0+YCB2cyBhIGBSZXBvc2l0b3J5PE0+YCByZXNwZWN0aXZlbHkpLCB2aWEge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgY2xhc3MgdG8gcmVzb2x2ZSBhIHJlcG9zaXRvcnkgZm9yLlxuICogQHBhcmFtIGZsYXZvdXIgb3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLCBmb3J3YXJkZWQgdG8ge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlcG9zaXRvcnkoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IG1vZGVsUmVwb3NpdG9yeVRva2VuKG1vZGVsLCBmbGF2b3VyKTtcbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCwgZmxhdm91cikpO1xuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBUFBfSU5URVJDRVBUT1IsIE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFQ0FGX0FEQVBURVJfSUQsXG4gIERFQ0FGX0hBTkRMRVJTLFxuICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VTZXJ2aWNlLCBTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbiAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5AR2xvYmFsKClcbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZDb3JlTW9kdWxlPENPTkYsIEFEQVBURVIgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnk+PlxuICBpbXBsZW1lbnRzIE9uQXBwbGljYXRpb25TaHV0ZG93blxue1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3BlcnNpc3RlbmNlPzogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgcGVyc2lzdGVuY2UoKTogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlBlcnNpc3RlbmNlIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZkNvcmVNb2R1bGUpO1xuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX01PRFVMRV9PUFRJT05TKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zPENPTkYsIEFEQVBURVI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVmOiBNb2R1bGVSZWZcbiAgKSB7fVxuXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9ucyk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgIGNvbnN0IGRlY2FmUHJvdmlkZXJzID0gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfTU9EVUxFX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCwgdXNlVmFsdWU6IHRoaXMucGVyc2lzdGVuY2U/LmNsaWVudCB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogREVDQUZfSEFORExFUlMsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgIG9wdGlvbnMuaGFuZGxlcnM/Lm1hcCgoSCkgPT4ge1xuICAgICAgICAgICAgICBsb2cuaW5mbyhgUmVnaXN0ZXJlZCByZXF1ZXN0IGhhbmRsZXI6ICR7SC5uYW1lfWApO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IEgoKTtcbiAgICAgICAgICAgIH0pID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycyxcbiAgICAgIF0sXG4gICAgICBleHBvcnRzOiBbXG4gICAgICAgIERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgICBERUNBRl9BREFQVEVSX0lELFxuICAgICAgICBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLm1hcCgocHJvdmlkZXIpID0+IHByb3ZpZGVyLnByb3ZpZGUpLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGJvb3RQZXJzaXN0ZW5jZShcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJvb3RQZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gb3B0aW9ucy5jb25mLm1hcCgoW2NvbnRyLCBjZmcsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCFwb3NzaWJsZSkgcmV0dXJuIFtjb250ciwgY2ZnXTtcbiAgICAgICAgcmV0dXJuIFtjb250ciwgY2ZnLCAuLi5hcmdzXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7XG4gICAgICBhd2FpdCB0aGlzLl9wZXJzaXN0ZW5jZS5ib290KHRyaW1tZWQpO1xuICAgICAgY29uc3QgY2xpZW50cyA9IHRoaXMuX3BlcnNpc3RlbmNlLmNsaWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gb3B0aW9ucy5jb25mW2ldO1xuICAgICAgICBjb25zdCBwb3NzaWJsZVRyYW5zZiA9IGMuc2xpY2UoMiwgYy5sZW5ndGgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtZXIgPSBwb3NzaWJsZVRyYW5zZi5wb3AoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0cmFuc2Zvcm1lciB8fFxuICAgICAgICAgICEodHJhbnNmb3JtZXIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHIgPSBBZGFwdGVyLnRyYW5zZm9ybWVyRm9yKGNsaWVudHNbaV0uZmxhdm91cik7XG4gICAgICAgICAgaWYgKCFjb250cilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gdHJhbnNmb3JtZXIgZm91bmQgZm9yIGZsYXZvdXIgJHtjbGllbnRzW2ldLmZsYXZvdXJ9LiB5b3Ugc2hvdWxkIGVpdGhlciBAcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIG9yIHByb3ZpZGUgYSB0cmFuc2Zvcm1lciBpbiB0aGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSAoY29udHIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgICAgICAgPyBjb250clxuICAgICAgICAgICAgICA6IG5ldyAoY29udHIgYXMgQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4+KSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGJvb3QgdHJhbnNmb3JtZXIgZm9yICR7Y2xpZW50c1tpXS5mbGF2b3VyfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcihjbGllbnRzW2ldLmZsYXZvdXIpKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKFwicGVyc2lzdGVuY2UgbGF5ZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsaXphdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbjogJHtlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgdGhpcy5tb2R1bGVSZWYuZ2V0PGFueT4oREVDQUZfQURBUFRFUl9JRCk7XG4gICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIGFkYXB0ZXJzKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2h1dHRpbmcgZG93biAke2FkYXB0ZXIudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICBhd2FpdCBhZGFwdGVyLnNodXRkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gYXBwbGljYXRpb25gLCBlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgU2VydmljZS5zaHV0ZG93bigpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2VzYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTID0gU3ltYm9sKFxuICBcIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSU1wiXG4pO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJnczogYW55W10pOiB1bmtub3duW10ge1xuICBjb25zdCBbbW9kZWxDb25zdHIsIG9wZXJhdGlvbiwgaWQsIHBheWxvYWRdID0gYXJncztcblxuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENvbnN0cj8ubmFtZSA/PyBtb2RlbENvbnN0cjtcblxuICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZClcbiAgICA/IHBheWxvYWQubWFwKChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZS5zZXJpYWxpemUoKTtcblxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBQYXlsb2FkIGl0ZW0gZm9yICR7bW9kZWxOYW1lfSBkb2VzIG5vdCBoYXZlIHNlcmlhbGl6ZSBtZXRob2QgYW5kIGlzIGFuICR7dHlwZW9mIGV9LCBhdHRlbXB0aW5nIHRvIHN0cmluZ2lmeSBkaXJlY3RseS4gSXRlbTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gXCJzdHJpbmdcIiA/IGUgOiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2VyaWFsaXplIHBheWxvYWQgZm9yICR7bW9kZWxOYW1lfTogJHtlcnJ9YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICA6IHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGF5bG9hZC5zZXJpYWxpemUoKVxuICAgICAgOiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHBheWxvYWRcbiAgICAgICAgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICBjb25zb2xlLmRlYnVnKFxuICAgIGBOb3JtYWxpemVkIGV2ZW50IHJlc3BvbnNlIGZvciBtb2RlbCAke21vZGVsTmFtZX0sIG9wZXJhdGlvbiAke29wZXJhdGlvbn0sIGlkICR7aWR9OmAsXG4gICAgc2VyaWFsaXplZFBheWxvYWRcbiAgKTtcblxuICByZXR1cm4gW21vZGVsTmFtZSwgb3BlcmF0aW9uLCBpZCwgc2VyaWFsaXplZFBheWxvYWRdO1xufVxuIiwiaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE9ic2VydmVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBJbmplY3QsIE1lc3NhZ2VFdmVudCwgUXVlcnksIFNzZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuQENvbnRyb2xsZXIoKVxuZXhwb3J0IGNsYXNzIEV2ZW50c0NvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8RGVjYWZTZXJ2ZXJDdHg+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBASW5qZWN0KExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUykgZmxhdm91cnM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG4gICAgdGhpcy5hZGFwdGVycyA9IGZsYXZvdXJzLm1hcCgoZmxhdm91cikgPT4gKEFkYXB0ZXIgYXMgYW55KS5nZXQoZmxhdm91cikpOyAvLyBjaGFuZ2UgdG8gQWRhcHRlci5jYWNoZShcIlwiKVxuICB9XG5cbiAgQFNzZSgpXG4gIGxpc3RlbigpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICBjb25zdCBldmVudHMkID0gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmVySWQgPVxuICAgICAgICBgQi0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWAudG9VcHBlckNhc2UoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBDcmVhdGluZyBTU0Ugb2JzZXJ2ZXI6ICR7b2JzZXJ2ZXJJZH0gZm9yIGNsaWVudCAke3RoaXMuY2xpZW50Q29udGV4dC51dWlkfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIG9ic2VydmVySWQgPSBvYnNlcnZlcklkO1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gcmVjZWl2ZWQgcmVmcmVzaCBldmVudGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3MpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHR5cGU6IFwibWVzc2FnZVwiLCBkYXRhIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSBldmVudCBwdXNoZWQgdG8gY2xpZW50YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGFjcm9zcyAke3RoaXMuYWRhcHRlcnMubGVuZ3RofSBhZGFwdGVyKHMpYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlZ2lzdGVyIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5pbmcgdXAgU1NFIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH1gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBVbnJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gZnJvbSBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCBkdXJpbmcgY2xlYW51cCBvZiBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMTUwMDA7XG4gICAgY29uc3QgaGVhcnRiZWF0JCA9IGludGVydmFsKEhFQVJUQkVBVF9JTlRFUlZBTF9NUykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNlbmRpbmcgaGVhcnRiZWF0XCIpO1xuICAgICAgfSksXG4gICAgICBtYXAoXG4gICAgICAgICgpOiBNZXNzYWdlRXZlbnQgPT4gKHtcbiAgICAgICAgICB0eXBlOiBcImhlYXJ0YmVhdFwiLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlKGV2ZW50cyQsIGhlYXJ0YmVhdCQpO1xuICB9XG5cbiAgQFNzZShcIi86bW9kZWxcIilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBsaXN0ZW5Gb3JNb2RlbChAUXVlcnkoXCJtb2RlbFwiKSBtb2RlbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYXJncyB9IGFzIGFueSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGBGYWlsZWQgdG8gb2JzZXJ2ZSBldmVudDogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEV2ZW50c0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9FdmVudHNDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZTdHJlYW1Nb2R1bGUge1xuICBzdGF0aWMgZm9yRmxhdm91cnMoXG4gICAgZmxhdm91cnM6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZyA9IFwiZXZlbnRzXCJcbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICBjb250cm9sbGVyczogW0V2ZW50c0NvbnRyb2xsZXJdLFxuICAgICAgaW1wb3J0czogW1xuICAgICAgICBSb3V0ZXJNb2R1bGUucmVnaXN0ZXIoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuICAgICAgICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyxcbiAgICAgICAgICB1c2VWYWx1ZTogZmxhdm91cnMgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRNb2R1bGVGb3IgfSBmcm9tIFwiLi9kZWNhZi1tb2RlbC9pbmRleFwiO1xuaW1wb3J0IHsgRGVjYWZTdHJlYW1Nb2R1bGUgfSBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMsIGF1dG9TZXJ2aWNlcyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuYm9vdFBlcnNpc3RlbmNlKG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYXZvdXJzID0gYWRhcHRlcnMubWFwKChhZGFwdGVyKSA9PiBhZGFwdGVyLmZsYXZvdXIpO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICAgIGZsYXZvdXJzLmZvckVhY2goKGZsYXZvdXIpID0+IHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgICAgICBnZXRNb2R1bGVGb3IoZmxhdm91cikuZm9yUm9vdChmbGF2b3VyLCB7XG4gICAgICAgICAgICAgIGF1dG9TZXJ2aWNlcyxcbiAgICAgICAgICAgICAgY29udHJvbGxlckV4cG9zdXJlOiBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSxcbiAgICAgICAgICAgICAgY29udHJvbGxlckNvbmZpZzogb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLFxuICAgICAgICAgICAgICBhZ2dyZWdhdGlvbnM6IG9wdGlvbnMuYWdncmVnYXRpb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9ic2VydmVyT3B0aW9ucz8uZW5hYmxlT2JzZXJ2ZXJFdmVudHMpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgRGVjYWZTdHJlYW1Nb2R1bGUuZm9yRmxhdm91cnMoXG4gICAgICAgICAgb3B0aW9ucy5vYnNlcnZlck9wdGlvbnMub2JzZXJ2ZXJGbGF2b3VycyB8fCBmbGF2b3Vyc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmTW9kdWxlLFxuICAgICAgaW1wb3J0czogaW1wb3J0cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5NaWdyYXRpb25zKCk6IFByb21pc2U8dm9pZD4ge31cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiOyAvLyBvbiB0b3Agb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3ZlcnJpZGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRyb2xsZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3dlYmhvb2tzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cy13b3Jrc3BhY2UgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbih0cnVlKTtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbihmYWxzZSk7XG4iXSwibmFtZXMiOlsiREVDT1JBVE9SU19QUkVGSVgiLCJERUNPUkFUT1JTIiwiQVBJX09QRVJBVElPTiIsIkFQSV9SRVNQT05TRSIsIkFQSV9QUk9EVUNFUyIsIkFQSV9DT05TVU1FUyIsIkFQSV9UQUdTIiwiQVBJX0NBTExCQUNLUyIsIkFQSV9QQVJBTUVURVJTIiwiQVBJX0hFQURFUlMiLCJBUElfTU9ERUxfUFJPUEVSVElFUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZIiwiQVBJX1NFQ1VSSVRZIiwiQVBJX0VYQ0xVREVfRU5EUE9JTlQiLCJBUElfRVhDTFVERV9DT05UUk9MTEVSIiwiQVBJX0VYVFJBX01PREVMUyIsIkFQSV9FWFRFTlNJT04iLCJBUElfU0NIRU1BIiwiQVBJX0RFRkFVTFRfR0VUVEVSIiwiQVBJX0xJTksiLCJpc0NvbnN0cnVjdG9yIiwidmFsIiwiTUVUQURBVEFfRkFDVE9SWV9OQU1FIiwiTUVUSE9EX01FVEFEQVRBIiwiY3JlYXRlTWV0aG9kRGVjb3JhdG9yIiwibWV0YWtleSIsIm1ldGFkYXRhIiwib3ZlcnJpZGVFeGlzdGluZyIsInRhcmdldCIsImtleSIsImRlc2NyaXB0b3IiLCJwcmV2VmFsdWUiLCJSZWZsZWN0IiwiZ2V0TWV0YWRhdGEiLCJ2YWx1ZSIsImRlZmluZU1ldGFkYXRhIiwiY3JlYXRlQ2xhc3NEZWNvcmF0b3IiLCJjcmVhdGVQcm9wZXJ0eURlY29yYXRvciIsInByb3BlcnR5S2V5IiwicHJvcGVydGllcyIsImluY2x1ZGVzIiwiZXhpc3RpbmdNZXRhZGF0YSIsIm5ld01ldGFkYXRhIiwicGlja0J5IiwibmVnYXRlIiwiaXNVbmRlZmluZWQiLCJtZXRhZGF0YVRvU2F2ZSIsInR5cGUiLCJjb25zdHJ1Y3RvciIsImNyZWF0ZU1peGVkRGVjb3JhdG9yIiwibWV0YWRhdGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJldmlvdXNNZXRhZGF0YSIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwiaW5pdGlhbCIsInBhcmFtT3B0aW9ucyIsInBhcmFtZXRlcnMiLCJwcm9wZXJ0eUtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvdG90eXBlIiwibWV0aG9kRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImlzQXBpTWV0aG9kIiwiaGFzTWV0YWRhdGEiLCJnZXRUeXBlSXNBcnJheVR1cGxlIiwiaW5wdXQiLCJpc0FycmF5RmxhZyIsImlzSW5wdXRBcnJheSIsIm9iaiIsImdldEVudW1WYWx1ZXMiLCJlbnVtVHlwZSIsIm51bWVyaWNWYWx1ZXMiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJtYXAiLCJ0b1N0cmluZyIsImtleXMiLCJnZXRFbnVtVHlwZSIsImhhc1N0cmluZyIsImlzU3RyaW5nIiwibGVuZ3RoIiwicmVxdWlyZWQiLCJpc0VudW1BcnJheSIsIm9wdHMiLCJlbnVtIiwidW5kZWZpbmVkIiwiQXBpUHJvcGVydHkiLCJvcHRpb25zIiwiY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IiLCJlbnVtVmFsdWVzIiwiaXRlbXMiLCJBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJNb2RlbENvbnN0cnVjdG9yIiwidmVyYiIsInBhdGgiLCJodHRwVG9DcnVkIiwiR0VUIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJHZXQiLCJQT1NUIiwiQ1JFQVRFIiwiUG9zdCIsIlBVVCIsIlVQREFURSIsIlB1dCIsIlBBVENIIiwiUGF0Y2giLCJERUxFVEUiLCJEZWxldGUiLCJjcnVkT3AiLCJIdHRwTWV0aG9kRGVjb3JhdG9yIiwicmVzb2x2ZUJsb2NrVGFyZ2V0IiwiY29yZUlzT3BlcmF0aW9uQmxvY2tlZCIsImtpbmQiLCJhcHBseSIsIkFwaUV4Y2x1ZGVFbmRwb2ludCIsIkJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJSRUFEX0FMTCIsIkNSRUFURV9BTEwiLCJVUERBVEVfQUxMIiwiREVMRVRFX0FMTCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwic3RhdGVtZW50VGFyZ2V0cyIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIkxJU1RfQlkiLCJQQUdFX0JZIiwiRklORCIsIlBBR0UiLCJGSU5EX09ORV9CWSIsIkZJTkRfQlkiLCJDT1VOVF9PRiIsIk1BWF9PRiIsIk1JTl9PRiIsIkFWR19PRiIsIlNVTV9PRiIsIkRJU1RJTkNUX09GIiwiR1JPVVBfT0YiLCJzdGFydHNXaXRoIiwic3RhdGVtZW50VmFsdWUiLCJBcGlQYXJhbXNGcm9tTW9kZWwiLCJwcm9wcyIsImRlY29yYXRvcnMiLCJwIiwiQXBpUGFyYW1EZWMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJTdHJpbmciLCJhcHBseURlY29yYXRvcnMiLCJEZWNhZkJvZHkiLCJkYXRhIiwiY3R4IiwicmVxdWVzdCIsInN3aXRjaFRvSHR0cCIsImdldFJlcXVlc3QiLCJib2R5IiwiY29udHJvbGxlciIsImdldENsYXNzIiwiTW9kZWxDb25zdHIiLCJjbGFzcyIsIkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24iLCJpdGVtIiwiT3JkZXJlZFBhcmFtcyIsIm9yZGVyIiwicmVxIiwib3JpZ2luYWwiLCJwYXJhbXMiLCJvcmRlckxpc3QiLCJvcmRlcmVkIiwiayIsInJhdyIsInZhbHVlc0luT3JkZXIiLCJrZXlzSW5PcmRlciIsIkRlY2FmUGFyYW1zIiwiRGVjYWZRdWVyeSIsIl8iLCJxdWVyeSIsInBhcnNlZCIsImxpbWl0IiwibiIsIk51bWJlciIsImlzTmFOIiwib2Zmc2V0IiwiYm9va21hcmsiLCJERUNBRl9NT0RVTEVfT1BUSU9OUyIsIkRFQ0FGX0FEQVBURVJfSUQiLCJERUNBRl9UQVNLX1NFUlZJQ0VfSUQiLCJERUNBRl9ST1VURSIsIkRFQ0FGX0hBTkRMRVJTIiwiU3ltYm9sIiwiREVDQUZfRVhQT1NFIiwiREVDQUZfQ09OVFJPTExFUl9DT05GSUciLCJERUNBRl9DT05URVhUX0tFWSIsImV4cG9zZSIsImZsYXZvdXJzIiwiTWV0YWRhdGEiLCJzZXQiLCJjb250cm9sbGVyQ29uZmlnIiwiY29uZmlnIiwiY29udHJvbGxlckNvbmZpZ0RlY29yYXRvciIsIkFVVEhfSEFORExFUiIsIkFVVEhfTUVUQV9LRVkiLCJJU19QVUJMSUNfS0VZIiwiUkVRVUlSRURfUk9MRVNfS0VZIiwiU0tJUF9NT0RFTF9ST0xFU19LRVkiLCJEZWNhZlJlcXVlc3RDb250ZXh0IiwiUmVxdWVzdENvbnRleHQiLCJzdXBlciIsImhlYWRlcnNPZiIsImhlYWRlcnMiLCJ0aGlzIiwidXVpZCIsIlVVSUQiLCJpbnN0YW5jZSIsImdlbmVyYXRlIiwiZ2V0T3JVbmRlZmluZWQiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwic2tpcE1vZGVsUm9sZXMiLCJlZmZlY3RpdmVNb2RlbCIsInZlcmJvc2UiLCJkZWJ1ZyIsImF1dGhvcml6ZSIsImFwcGx5VHJhbnNmb3JtZXJzIiwidXNlciIsIm9yZ2FuaXphdGlvbiIsImN1cnJlbnRMb2ciLCJjaGlsZExvZyIsImxvZ2dlciIsImhhbmRsZSIsIkFkYXB0ZXIiLCJmbGF2b3Vyc1RvVHJhbnNmb3JtIiwiZmxhdm91ciIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJGb3IiLCJmcm9tIiwiT3B0aW9uYWwiLCJSZWZsZWN0b3IiLCJBdXRoIiwibW9kZWwiLCJyZXNvdXJjZSIsImRlY3MiLCJBcGlCZWFyZXJBdXRoIiwiVXNlSW50ZXJjZXB0b3JzIiwicHVzaCIsIlNldE1ldGFkYXRhIiwiUHVibGljIiwiUmVxdWlyZVJvbGVzIiwicm9sZXMiLCJBcGlTZWN1cml0eSIsIkh0dHBWZXJiVG9EZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJVbnN1cHBvcnRlZEVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzcGxpdCIsInNsaWNlIiwiYXBpUGFyYW1TcGVjIiwidG9EZWNhZkVycm9yIiwiZXJyb3IiLCJmYWxsYmFja01lc3NhZ2UiLCJCYXNlRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiZ2V0QXBpRGVjb3JhdG9ycyIsIm1ldGhvZE5hbWUiLCJodHRwVmVyYiIsImluY2x1ZGVRdWVyeVBhcmFtcyIsIk5lc3RIdHRwUm91dGVEZWMiLCJhcGlQYXRoUGFyYW1zIiwic3dhZ2dlclF1ZXJ5UGFyYW1zIiwiQXBpUXVlcnkiLCJPcmRlckRpcmVjdGlvbiIsIm1ldGhvZCIsIkFwaVBhcmFtIiwiQXBpT3BlcmF0aW9uIiwic3VtbWFyeSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb0NvbnRlbnRSZXNwb25zZSIsIlF1ZXJ5IiwiYXBwbHlBcGlEZWNvcmF0b3JzIiwicHJvdG8iLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kIiwicGVyc2lzdGVuY2UiLCJhcmdzIiwiTW9kZWxTZXJ2aWNlIiwic3RhdGVtZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyIiwiYXN5bmMiLCJwYXRoUGFyYW1zIiwicXVlcnlQYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlyZWN0aW9uIiwiZGVmaW5lUm91dGVNZXRob2QiLCJDb250cm9sbGVyQ2xhc3MiLCJoYW5kbGVyIiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsIkRlY2FmQXV0aEhhbmRsZXIiLCJBdXRoSGFuZGxlciIsInBhcnNlUmVxdWVzdCIsInVzZXJSb2xlIiwiYXV0aG9yaXphdGlvbiIsImV4dHJhY3RGcm9tQXV0aCIsIkF1dGhvcml6YXRpb25FcnJvciIsIkRlY2FmUm9sZUF1dGhIYW5kbGVyIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsInVzZUNsYXNzIiwiZ2xvYmFsIiwiQVBQX0lOVEVSQ0VQVE9SIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJjb250ZXh0IiwiZXhlYyIsInJlcyIsInVybCIsIkRlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciIsInJlc3BvbnNlIiwiZ2V0UmVzcG9uc2UiLCJwaXBlIiwidGFwIiwidG9SZXNwb25zZSIsIkRlY2FmQ29udHJvbGxlciIsIkh0dHBEZWNhZkNvbnRyb2xsZXIiLCJjbGllbnRDb250ZXh0IiwiX25hbWUiLCJEZWNhZk1vZGVsQ29udHJvbGxlciIsIl9wZXJzaXN0ZW5jZSIsIlNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiUmVwb3NpdG9yeSIsImZvck1vZGVsIiwidG9PdmVycmlkZXMiLCJvdmVycmlkZSIsImR0b0NhY2hlIiwiTWFwIiwiRHRvRm9yIiwib3AiLCJzdGFjayIsIlNldCIsIlRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyIsImNhY2hlIiwiZ2V0RHRvQ2FjaGUiLCJjYWNoZWQiLCJpc1VwZGF0ZU9wIiwiRHluYW1pY0RUTyIsInRvUGFzY2FsQ2FzZSIsInBrUHJvcCIsIk1vZGVsIiwicGsiLCJwa1Byb3BzTWV0YWRhdGEiLCJwa1Byb3BzIiwicGtEZXNpZ25UeXBlIiwicGtUeXBlSXNOdW1lcmljIiwiQmlnSW50IiwicGtJc0dlbmVyYXRlZCIsImdlbmVyYXRlZCIsImdlbmVyYXRlZEJ5U2VxdWVuY2UiLCJpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UiLCJhbGxQcm9wcyIsInJlbGF0aW9ucyIsInNjYWxhclByb3BzIiwicHJvcCIsImhhcyIsInZhbGlkYXRpb24iLCJnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UiLCJpc1JlcXVpcmVkIiwiVmFsaWRhdGlvbktleXMiLCJSRVFVSVJFRCIsInR5cGVIaW50IiwiZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlIiwiYXBpT3B0aW9ucyIsImRlc2lnblR5cGUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwicmVsYXRpb24iLCJyZWxhdGlvbk1ldGEiLCJyZWxhdGlvblR5cGUiLCJtZXRhIiwidmFsaWRhdGlvbkZvciIsIkxJU1QiLCJpc0NpcmN1bGFyIiwicGtUeXBlTmFtZSIsImdldFBrT3BlbkFwaVR5cGUiLCJhZGRSZWxhdGlvblBrUmVmIiwicmVsYXRpb25EdG8iLCJhZGQiLCJhZGRSZWxhdGlvblVwZGF0ZSIsImFkZFJlbGF0aW9uIiwiRHRvQ2xhc3MiLCJleHRyYU1vZGVscyIsImR0b1JlZiIsIm9uZU9mSXRlbXMiLCIkcmVmIiwib25lT2YiLCJwa1R5cGUiLCJjdXJyZW50IiwiRnVuY3Rpb24iLCJnZXRQcm90b3R5cGVPZiIsIldlYWtNYXAiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwiQ29udGV4dCIsInBlbmRpbmciLCJoZWFkZXIiLCJNb2RlbEJ1aWxkZXIiLCJkZWNvcmF0ZUNsYXNzIiwiX2NsYXNzRGVjb3JhdG9ycyIsIl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0Iiwib3JpZ2luYWxCdWlsZCIsImJ1aWxkIiwicmVzdWx0IiwiY2FsbCIsImRlY29yYXRlZCIsIkZyb21Nb2RlbENvbnRyb2xsZXIiLCJnZXRQZXJzaXN0ZW5jZSIsIk1vZGVsQ2xhenoiLCJlMiIsImNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnkiLCJwcmVmaXgiLCJQZXJzaXN0ZW5jZUtleXMiLCJRVUVSWSIsInJlcG8iLCJxdWVyeU1ldGhvZHMiLCJyb3V0ZU1ldGhvZHMiLCJRdWVyeUNvbnRyb2xsZXIiLCJlbnRyaWVzIiwic2VnbWVudCIsInRyaW0iLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsImdsb2JhbERlZmF1bHRzIiwidGFibGVOYW1lIiwidG9LZWJhYkNhc2UiLCJtb2RlbENsYXp6TmFtZSIsImZhY3RvcnlQZXJzaXN0ZW5jZSIsImRlY29yYXRvckNvbmZpZyIsIm1vZHVsZU92ZXJyaWRlIiwibWVyZ2VkQ29uZmlnIiwiRmFjdG9yeUNvbnRyb2xsZXIiLCJNb2RlbENvbnRyb2xsZXJGYWN0b3J5IiwiZmFjdG9yeVJvdXRlcyIsIl9fcm91dGVzX18iLCJnZXRQSyIsImFwaVByb3BlcnRpZXMiLCJwa1BhdGgiLCJnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwiLCJhdXRoQ29uZmlnIiwiYXV0aCIsImFwcGx5Q2xhc3NBdXRoIiwicHVibGljIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiQm9vbGVhbiIsImJTZWdtZW50cyIsImFQYXJhbUNvdW50IiwicyIsImJQYXJhbUNvdW50IiwiYUxpdGVyYWxDb3VudCIsImJMaXRlcmFsQ291bnQiLCJyb3V0ZSIsImltcGxlbWVudGF0aW9uIiwidG9Mb3dlckNhc2UiLCJyZWdpc3RyYXRpb24iLCJtYXRjaFJvdXRlIiwicmVnaXN0ZXJlZE1ldGhvZE5hbWUiLCJwYXJhbURlY29yYXRvcnMiLCJjb21wb3NlZCIsIkRCS2V5cyIsIkNPTVBPU0VEIiwiY29tcG9zZWRLZXlzIiwidW5pcXVlS2V5cyIsInNlcGFyYXRvciIsInJvdXRlUGFyYW1EZWNvcmF0b3JzIiwicGFyYW1JbmRleCIsImZsYXRNYXAiLCJQYXJhbSIsIm1ldGhvZERlY29yYXRvcnMiLCJub3JtYWxpemVkUGF0aCIsImNyZWF0ZVJlZ2lzdHJhdGlvbiIsImNyZWF0ZUNyZWF0ZURlY29yYXRvcnMiLCJSZXNwb25zZSIsInBhc3N0aHJvdWdoIiwiYnVsa0NyZWF0ZURlY29yYXRvcnMiLCJidWxrUmVhZERlY29yYXRvcnMiLCJidWxrVXBkYXRlRGVjb3JhdG9ycyIsImJ1bGtEZWxldGVEZWNvcmF0b3JzIiwicmVhZERlY29yYXRvcnMiLCJyb3V0ZVBhcmFtcyIsInVwZGF0ZURlY29yYXRvcnMiLCJkZWxldGVEZWNvcmF0b3JzIiwiZmFsbGJhY2tTZWdtZW50cyIsImlzQWxsUGFyYW1zIiwiZXZlcnkiLCJmYWxsYmFja0FwaVByb3BzIiwic3VmZml4Iiwic3RhdGVtZW50RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0UGFyYW1zIiwic3RhdGVtZW50Um91dGVzIiwic3RhdGVtZW50S2V5Iiwic3RhdGVtZW50TWV0aG9kTmFtZSIsInF1ZXJ5TWV0aG9kIiwiY29tcGxleFF1ZXJ5UGFyYW1zIiwicGF0aFNlZ21lbnRzIiwia25vd25QcmVmaXhlcyIsImZpcnN0U2VnbWVudCIsInNlZ21lbnRzIiwic2VnIiwiaSIsImNvbXBsZXhRdWVyeSIsImxvZ0N0eCIsInNwcmVhZEFyZ3MiLCJub3JtYWxpemVRdWVyeUFyZ3MiLCJleHRyYWN0UXVlcnlBcmdzIiwibGFzdCIsInF1ZXJ5T2JqIiwicG9wIiwiaGFzRGlyZWN0aW9uIiwiaGFzTGltaXQiLCJoYXNPZmZzZXQiLCJleHRyYXMiLCJoYXNRdWVyeUZpZWxkcyIsIkFwaUJvZHkiLCJBcGlDcmVhdGVkUmVzcG9uc2UiLCJzY2hlbWEiLCJnZXRTY2hlbWFQYXRoIiwiQXBpQmFkUmVxdWVzdFJlc3BvbnNlIiwiQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlIiwiQXBpTm90Rm91bmRSZXNwb25zZSIsImJhc2UiLCJnZXRNb2R1bGVGb3IiLCJEZWNhZk1vZGVsTW9kdWxlIiwiRGVjYWZNb2RlbE1vZHVsZV8xIiwiY3JlYXRlTW9kZWxTZXJ2aWNlcyIsIm1vZGVscyIsInVzZUZhY3RvcnkiLCJpc0V4cG9zZWQiLCJleHBvc3VyZSIsInRyYWNrZWRNb2RlbHMiLCJjb250cm9sbGVyRXhwb3N1cmUiLCJtb2RlbFNlcnZpY2VzIiwiYXV0b1NlcnZpY2VzIiwiYWdncmVnYXRpb25zIiwiYWxsb3dHcm91cGluZ1F1ZXJpZXMiLCJjb250cm9sbGVycyIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJTkpFQ1RBQkxFIiwiZXh0ZW5kIiwibmVzdEluamVjdGFibGUiLCJjYXRlZ29yeSIsImNmZyIsIkRlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyIsInNpbmdsZXRvbiIsIkRFRkFVTFQiLCJkdXJhYmxlIiwiSU5KRUNUIiwibmVzdEluamVjdCIsImlubmVyTmVzdEluamVjdCIsIk1BWCIsIm1heERlYyIsIm1heCIsIm1heGltdW0iLCJNSU4iLCJtaW5EZWMiLCJtaW4iLCJtaW5pbXVtIiwiTUFYX0xFTkdUSCIsIm1heExlbmd0aERlYyIsIm1heExlbmd0aCIsIk1JTl9MRU5HVEgiLCJtaW5MZW5ndGhEZWMiLCJtaW5MZW5ndGgiLCJUWVBFIiwidHlwZURlYyIsIkRBVEUiLCJkYXRlRGVjIiwiZm9ybWF0IiwiRU5VTSIsIm9wdGlvbkRlYyIsIlBBVFRFUk4iLCJwYXR0ZXJuRGVjIiwicGF0IiwicGF0dGVybiIsInNvdXJjZSIsIkNPTFVNTiIsImNvbHVtbkRlYyIsIkRlY29yYXRpb25LZXlzIiwiREVTQ1JJUFRJT04iLCJkZXNjcmlwdGlvbkRlYyIsIkFVVEgiLCJDb3JzRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIm1zZyIsIlRvTWFueVJlcXVlc3RzRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJnZXRTdGF0dXMiLCJzdGF0dXMiLCJjb2RlIiwianNvbiIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJzY2hlbWUiLCJiZWFyZXJGb3JtYXQiLCJpbiIsInBlcnNpc3RBdXRob3JpemF0aW9uIiwidG9wYmFyQmdDb2xvciIsIlN3YWdnZXJDdXN0b21VSSIsImN1c3RvbUNTUyIsImNzcyIsInRvcGJhckljb25QYXRoIiwiaW1nIiwiYjY0IiwiZ2V0Q3VzdG9tT3B0aW9ucyIsImZhdmljb24iLCJmYXZpY29uUGF0aCIsImN1c3RvbVNpdGVUaXRsZSIsImN1c3RvbUNzcyIsInN3YWdnZXJPcHRpb25zIiwiZmlsZSIsImZpbGVQYXRoIiwiYXNzZXRzUGF0aCIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiU3dhZ2dlckJ1aWxkZXIiLCJhcHAiLCJjcmVhdGVEb2N1bWVudCIsIm9wZW5BcGlKc29uUGF0aCIsIm9wZW5BcGlZYW1sUGF0aCIsIkRvY3VtZW50QnVpbGRlciIsInNldFRpdGxlIiwic2V0RGVzY3JpcHRpb24iLCJzZXRWZXJzaW9uIiwiYWRkQmVhcmVyQXV0aCIsIlN3YWdnZXJNb2R1bGUiLCJyZWdpc3Rlck9wZW5BcGlSb3V0ZSIsImNvbnRlbnRUeXBlIiwiYm9keUZhY3RvcnkiLCJodHRwQWRhcHRlciIsImdldEh0dHBBZGFwdGVyIiwiX3JlcSIsInJlcGx5Iiwic2V0dXBTd2FnZ2VyIiwiZG9jdW1lbnQiLCJzd2FnZ2VyVUkiLCJzZXR1cCIsImpzb25Eb2N1bWVudFVybCIsInlhbWxEb2N1bWVudFVybCIsIllBTUwiLCJOZXN0Qm9vdHN0cmFwZXIiLCJfbG9nZ2VyIiwiTG9nZ2VyIiwiaW5pdGlhbGl6ZSIsImVuYWJsZUxvZ2dlciIsImN1c3RvbUxvZ2dlciIsInVzZUxvZ2dlciIsImVuYWJsZUNvcnMiLCJvcmlnaW5zIiwiYWxsb3dNZXRob2RzIiwiYWxsb3dlZE9yaWdpbnMiLCJvIiwiY29yc09wdGlvbnMiLCJvcmlnaW4iLCJjYWxsYmFjayIsImNyZWRlbnRpYWxzIiwibWV0aG9kcyIsInVzZUhlbG1ldCIsImhlbG1ldCIsInJlcXVpcmUiLCJ1c2UiLCJ3YXJuIiwic3dhZ2dlciIsInVzZUdsb2JhbFBpcGVzIiwicGlwZXMiLCJ1c2VHbG9iYWxGaWx0ZXJzIiwiZmlsdGVycyIsInVzZUdsb2JhbEludGVyY2VwdG9ycyIsImludGVyY2VwdG9ycyIsInN0YXJ0IiwicG9ydCIsInByb2Nlc3MiLCJQT1JUIiwibGlzdGVuIiwidGhlbiIsImdldFVybCIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcl8xIiwiZXhlY3V0b3IiLCJjb250ZXh0dWFsaXplIiwiZmxhZ3MiLCJpcCIsImV4dHJhY3RJcCIsIkRlZmF1bHRBZGFwdGVyRmxhZ3MiLCJvcGVyYXRpb24iLCJwYXJzZUlwSGVhZGVyIiwiY2FuZGlkYXRlIiwicGVuZGluZ1Byb3ZpZGVycyIsImdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyIsInJlZ2lzdGVyUHJvdmlkZXIiLCJ0b2tlbiIsImlzTW9kZWxDb25zdHJ1Y3RvciIsIm1vZGVsU2VydmljZVRva2VuIiwibW9kZWxSZXBvc2l0b3J5VG9rZW4iLCJwYXJhbWV0ZXJJbmRleCIsInJlc29sdmVkIiwicGFyYW1UeXBlcyIsImFzTW9kZWwiLCJpbmplY3RhYmxlU2VydmljZUtleSIsIkNvcmVTZXJ2aWNlIiwiQ29yZVJlcG9zaXRvcnkiLCJEZWNhZkNvcmVNb2R1bGUiLCJEZWNhZkNvcmVNb2R1bGVfMSIsIm1vZHVsZVJlZiIsImRlY2FmUHJvdmlkZXJzIiwidXNlVmFsdWUiLCJjbGllbnQiLCJIIiwicHJvdmlkZXIiLCJib290UGVyc2lzdGVuY2UiLCJ0cmltbWVkIiwiY29uZiIsImNvbnRyIiwicG9zc2libGUiLCJQZXJzaXN0ZW5jZVNlcnZpY2UiLCJib290IiwiY2xpZW50cyIsImMiLCJwb3NzaWJsZVRyYW5zZiIsInJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciIsImluaXRpYWxpemF0aW9uIiwib25BcHBsaWNhdGlvblNodXRkb3duIiwiYWRhcHRlcnMiLCJzaHV0ZG93biIsIkdsb2JhbCIsIk1vZHVsZVJlZiIsIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyIsIm5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UiLCJtb2RlbENvbnN0ciIsImlkIiwicGF5bG9hZCIsInNlcmlhbGl6ZWRQYXlsb2FkIiwic2VyaWFsaXplIiwiY29uc29sZSIsImVyciIsIkV2ZW50c0NvbnRyb2xsZXIiLCJFdmVudHNDb250cm9sbGVyXzEiLCJldmVudHMkIiwiT2JzZXJ2YWJsZSIsIm9ic2VydmVyIiwib2JzZXJ2ZXJJZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1VwcGVyQ2FzZSIsImNiIiwicmVmcmVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWRhcHRlck5hbWUiLCJvYnNlcnZlIiwidW5PYnNlcnZlIiwiSEVBUlRCRUFUX0lOVEVSVkFMX01TIiwiaGVhcnRiZWF0JCIsImludGVydmFsIiwidHMiLCJtZXJnZSIsImxpc3RlbkZvck1vZGVsIiwiU3NlIiwiRGVjYWZTdHJlYW1Nb2R1bGUiLCJEZWNhZlN0cmVhbU1vZHVsZV8xIiwiZm9yRmxhdm91cnMiLCJpbXBvcnRzIiwiUm91dGVyTW9kdWxlIiwicmVnaXN0ZXIiLCJEZWNhZk1vZHVsZSIsIkRlY2FmTW9kdWxlXzEiLCJmb3JSb290QXN5bmMiLCJhdXRvQ29udHJvbGxlcnMiLCJvYnNlcnZlck9wdGlvbnMiLCJlbmFibGVPYnNlcnZlckV2ZW50cyIsIm9ic2VydmVyRmxhdm91cnMiLCJydW5NaWdyYXRpb25zIiwicmVwb0Zvck1vZGVsIiwibSIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJhbGxvd1JlcmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sTUFBTUEsb0JBQW9COztBQUMxQixNQUFNQyxhQUFhO0lBQ3hCQyxlQUFlLEdBQUdGO0lBQ2xCRyxjQUFjLEdBQUdIO0lBQ2pCSSxjQUFjLEdBQUdKO0lBQ2pCSyxjQUFjLEdBQUdMO0lBQ2pCTSxVQUFVLEdBQUdOO0lBQ2JPLGVBQWUsR0FBR1A7SUFDbEJRLGdCQUFnQixHQUFHUjtJQUNuQlMsYUFBYSxHQUFHVDtJQUNoQlUsc0JBQXNCLEdBQUdWO0lBQ3pCVyw0QkFBNEIsR0FBR1g7SUFDL0JZLGNBQWMsR0FBR1o7SUFDakJhLHNCQUFzQixHQUFHYjtJQUN6QmMsd0JBQXdCLEdBQUdkO0lBQzNCZSxrQkFBa0IsR0FBR2Y7SUFDckJnQixlQUFlLEdBQUdoQjtJQUNsQmlCLFlBQVksR0FBR2pCO0lBQ2ZrQixvQkFBb0IsR0FBR2xCO0lBQ3ZCbUIsVUFBVSxHQUFHbkI7OztBQ2hCUixNQUFNb0IsZ0JBQWlCQyxPQUFzQkEsUUFBUTs7QUFDckQsTUFBTUMsd0JBQXdCOztBQUU5QixNQUFNQyxrQkFBa0I7O0FBRXpCLFNBQVVDLHNCQUNkQyxTQUNBQyxXQUNBQyxrQkFBRUEsb0JBQXFCO0lBQUVBLGtCQUFrQjs7SUFFM0MsT0FBTyxDQUNMQyxRQUNBQyxLQUNBQztRQUVBLFdBQVdKLGFBQWEsVUFBVTtZQUNoQyxNQUFNSyxZQUFZQyxRQUFRQyxZQUFZUixTQUFTSyxXQUFXSTtZQUMxRCxJQUFJSCxjQUFjSixrQkFBa0I7Z0JBQ2xDLE9BQU9HO0FBQ1Q7WUFDQUUsUUFBUUcsZUFDTlYsU0FDQTttQkFBS007bUJBQWNMO2VBQ25CSSxXQUFXSTtZQUViLE9BQU9KO0FBQ1Q7UUFDQUUsUUFBUUcsZUFBZVYsU0FBU0MsVUFBVUksV0FBV0k7UUFDckQsT0FBT0o7O0FBRVg7O1NBRWdCTSxxQkFDZFgsU0FDQUMsV0FBYztJQUVkLE9BQVFFO1FBQ04sTUFBTUcsWUFBWUMsUUFBUUMsWUFBWVIsU0FBU0csV0FBVztRQUMxREksUUFBUUcsZUFBZVYsU0FBUyxLQUFJTSxjQUFjTCxZQUFXRTtRQUM3RCxPQUFPQTs7QUFFWDs7QUFFTSxTQUFVUywwQkFDZFosU0FDQUMsVUFDQUMsbUJBQW1CO0lBRW5CLE9BQUEsQ0FBU0MsUUFBZ0JVO1FBQ3ZCLE1BQU1DLGFBQ0pQLFFBQVFDLFlBQVloQyxXQUFXVSw0QkFBNEJpQixXQUFXO1FBRXhFLE1BQU1DLE1BQU0sSUFBSVM7UUFDaEIsS0FBS0MsV0FBV0MsU0FBU1gsTUFBTTtZQUM3QkcsUUFBUUcsZUFDTmxDLFdBQVdVLDRCQUNYLEtBQUk0QixZQUFZLElBQUlELGlCQUNwQlY7QUFFSjtRQUNBLE1BQU1hLG1CQUFtQlQsUUFBUUMsWUFBWVIsU0FBU0csUUFBUVU7UUFDOUQsSUFBSUcsa0JBQWtCO1lBQ3BCLE1BQU1DLGNBQWNDLE9BQU9qQixVQUFVa0IsT0FBT0M7WUFDNUMsTUFBTUMsaUJBQWlCbkIsbUJBQ25CO21CQUNLYzttQkFDQUM7Z0JBRUw7bUJBQ0tBO21CQUNBRDs7WUFHVFQsUUFBUUcsZUFBZVYsU0FBU3FCLGdCQUFnQmxCLFFBQVFVO0FBQzFELGVBQU87WUFDTCxNQUFNUyxPQUNIbkIsUUFBUW9CLGNBQXNCMUIsMkJBQzdCZ0IsY0FDQ1MsUUFBUWYsUUFBUUMsWUFBWSxlQUFlTCxRQUFRVTtZQUV4RE4sUUFBUUcsZUFDTlYsU0FDQTtnQkFDRXNCO21CQUNHSixPQUFPakIsVUFBVWtCLE9BQU9DO2VBRTdCakIsUUFDQVU7QUFFSjtBQUNEO0FBQ0g7O0FBRU0sU0FBVVcscUJBQ2R4QixTQUNBQztJQUVBLE9BQU8sQ0FDTEUsUUFDQUMsS0FDQUM7UUFFQSxJQUFJQSxZQUFZO1lBQ2QsSUFBSW9CO1lBQ0osSUFBSUMsTUFBTUMsUUFBUTFCLFdBQVc7Z0JBQzNCLE1BQU0yQixtQkFDSnJCLFFBQVFDLFlBQVlSLFNBQVNLLFdBQVdJLFVBQVU7Z0JBQ3BEZ0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2QyxtQkFBTztnQkFDTCxNQUFNMkIsbUJBQ0pyQixRQUFRQyxZQUFZUixTQUFTSyxXQUFXSSxVQUFVLENBQUE7Z0JBQ3BEZ0IsWUFBWTt1QkFBS0c7dUJBQXFCM0I7O0FBQ3hDO1lBQ0FNLFFBQVFHLGVBQWVWLFNBQVN5QixXQUFXcEIsV0FBV0k7WUFDdEQsT0FBT0o7QUFDVDtRQUVBLElBQUlvQjtRQUNKLElBQUlDLE1BQU1DLFFBQVExQixXQUFXO1lBQzNCLE1BQU0yQixtQkFBbUJyQixRQUFRQyxZQUFZUixTQUFTRyxXQUFXO1lBQ2pFc0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2QyxlQUFPO1lBQ0wsTUFBTTJCLG1CQUFtQnJCLFFBQVFDLFlBQVlSLFNBQVNHLFdBQVcsQ0FBQTtZQUNqRXNCLFlBQVlJLE9BQU9DLE9BQU9ELE9BQU9DLE9BQU8sSUFBSUYsbUJBQW1CM0I7QUFDakU7UUFDQU0sUUFBUUcsZUFBZVYsU0FBU3lCLFdBQVd0QjtRQUMzQyxPQUFPQTs7QUFFWDs7QUFFTSxTQUFVNEIscUJBQ2Q5QixVQUNBK0I7SUFFQSxPQUFPLENBRUw3QixRQUNBQyxLQUNBQztRQUVBLE1BQU00QixlQUFlO2VBQ2hCRDtlQUNBZCxPQUFPakIsVUFBVWtCLE9BQU9DOztRQUc3QixJQUFJZixZQUFZO1lBQ2QsTUFBTTZCLGFBQ0ozQixRQUFRQyxZQUFZaEMsV0FBV08sZ0JBQWdCc0IsV0FBV0ksVUFBVTtZQUN0RUYsUUFBUUcsZUFDTmxDLFdBQVdPLGdCQUNYLEtBQUltRCxZQUFZRCxnQkFDaEI1QixXQUFXSTtZQUViLE9BQU9KO0FBQ1Q7UUFFQSxXQUFXRixXQUFXLFVBQVU7WUFDOUIsT0FBT0E7QUFDVDtRQUVBLE1BQU1nQyxlQUFlTixPQUFPTyxvQkFBb0JqQyxPQUFPa0M7UUFFdkQsS0FBSyxNQUFNeEIsZUFBZXNCLGNBQWM7WUFDdEMsSUFBSXhDLGNBQWNrQixjQUFjO2dCQUM5QjtBQUNGO1lBRUEsTUFBTXlCLG1CQUFtQlQsT0FBT1UseUJBQzlCcEMsT0FBT2tDLFdBQ1B4QjtZQUdGLEtBQUt5QixrQkFBa0I7Z0JBQ3JCO0FBQ0Y7WUFFQSxNQUFNRSxjQUFjakMsUUFBUWtDLFlBQzFCM0MsaUJBQ0F3QyxpQkFBaUI3QjtZQUduQixLQUFLK0IsYUFBYTtnQkFDaEI7QUFDRjtZQUVBLE1BQU1OLGFBQ0ozQixRQUFRQyxZQUNOaEMsV0FBV08sZ0JBQ1h1RCxpQkFBaUI3QixVQUNkO1lBQ1BGLFFBQVFHLGVBQ05sQyxXQUFXTyxnQkFDWCxLQUFJbUQsWUFBWUQsZ0JBQ2hCSyxpQkFBaUI3QjtBQUVyQjs7QUFFSjs7U0FFZ0JpQyxvQkFFZEMsT0FDQUM7SUFHQSxLQUFLRCxPQUFPO1FBQ1YsT0FBTyxFQUFDQSxPQUFvQkM7QUFDOUI7SUFDQSxJQUFJQSxhQUFhO1FBRWYsT0FBTyxFQUFDRCxPQUFtQkM7QUFDN0I7SUFDQSxNQUFNQyxlQUFlbEIsUUFBUWdCO0lBQzdCLE1BQU1yQixPQUFPdUIsZUFBZUYsTUFBTSxLQUFLQTtJQUV2QyxPQUFPLEVBQUNyQixNQUFrQnVCO0FBQzVCOztBQ2hOTyxNQUFNekIsY0FBZTBCLGNBQ25CQSxRQUFROztBQUVYLFNBQVVDLGNBQ2RDO0lBRUEsV0FBV0EsYUFBYSxZQUFZO1FBQ2xDLE9BQU9ELGNBQWNDO0FBQ3ZCO0lBRUEsSUFBSXRCLE1BQU1DLFFBQVFxQixXQUFXO1FBQzNCLE9BQU9BO0FBQ1Q7SUFDQSxXQUFXQSxhQUFhLFVBQVU7UUFDaEMsT0FBTztBQUNUO0lBYUEsTUFBTUMsZ0JBQWdCcEIsT0FBT3FCLE9BQU9GLFVBQ2pDRyxPQUFRMUMsZ0JBQWlCQSxVQUFVLFVBQ25DMkMsSUFBSzNDLFNBQWVBLE1BQU00QztJQUU3QixPQUFPeEIsT0FBT3lCLEtBQUtOLFVBQ2hCRyxPQUFRL0MsUUFBUzZDLGNBQWNsQyxTQUFTWCxNQUN4Q2dELElBQUtoRCxPQUFRNEMsU0FBUzVDO0FBQzNCOztBQUVNLFNBQVVtRCxZQUFZTDtJQUMxQixNQUFNTSxZQUFZTixPQUFPQyxPQUFPTSxVQUFVQyxTQUFTO0lBQ25ELE9BQU9GLFlBQVksV0FBVztBQUNoQzs7QUFFTSxTQUFVNUMsd0JBQ2RaLFNBQ0FDLFVBQ0FDLG1CQUFtQjtJQUVuQixPQUFBLENBQVNDLFFBQWdCVTtRQUN2QixNQUFNQyxhQUNKUCxRQUFRQyxZQUFZaEMsV0FBV1UsNEJBQTRCaUIsV0FBVztRQUV4RSxNQUFNQyxNQUFNLElBQUlTO1FBQ2hCLEtBQUtDLFdBQVdDLFNBQVNYLE1BQU07WUFDN0JHLFFBQVFHLGVBQ05sQyxXQUFXVSw0QkFDWCxLQUFJNEIsWUFBWSxJQUFJRCxpQkFDcEJWO0FBRUo7UUFDQSxNQUFNYSxtQkFBbUJULFFBQVFDLFlBQVlSLFNBQVNHLFFBQVFVO1FBQzlELElBQUlHLGtCQUFrQjtZQUNwQixNQUFNQyxjQUFjQyxPQUFPakIsVUFBVWtCLE9BQU9DO1lBQzVDLE1BQU1DLGlCQUFpQm5CLG1CQUNuQjttQkFDS2M7bUJBQ0FDO2dCQUVMO21CQUNLQTttQkFDQUQ7O1lBR1RULFFBQVFHLGVBQWVWLFNBQVNxQixnQkFBZ0JsQixRQUFRVTtBQUMxRCxlQUFPO1lBQ0wsTUFBTVMsT0FFSm5CLFFBQVFvQixjQUFjMUIsMkJBQTJCZ0IsY0FBY1MsUUFDL0RmLFFBQVFDLFlBQVksZUFBZUwsUUFBUVU7WUFFN0NOLFFBQVFHLGVBQ05WLFNBQ0E7Z0JBQ0VzQjtnQkFDQXFDLFVBQVU7bUJBQ1B6QyxPQUFPakIsVUFBVWtCLE9BQU9DO2VBRTdCakIsUUFDQVU7QUFFSjtBQUNEO0FBQ0g7O0FBd0JBLE1BQU0rQyxjQUNKQyxRQU1JQSxLQUFLbEMsV0FBVyxVQUFVa0MsUUFBUUEsS0FBS0MsU0FBU0M7O0FBS2hELFNBQVVDLFlBQ2RDLFVBQThCO0lBRTlCLE9BQU9DLDJCQUEyQkQ7QUFDcEM7O0FBRU0sU0FBVUMsMkJBQ2RELFVBQThCLElBQzlCL0QsbUJBQW1CO0lBRW5CLE9BQU9vQixNQUFNSyxXQUFXZSxvQkFDdEJ1QixRQUFRM0MsTUFDUjJDLFFBQVF0QztJQUVWc0MsVUFBVTtXQUNMQTtRQUNIM0M7UUFDQUs7O0lBR0YsSUFBSWlDLFlBQVlLLFVBQVU7UUFDeEJBLFFBQVEzQyxPQUFPO1FBRWYsTUFBTTZDLGFBQWFwQixjQUFja0IsUUFBUUg7UUFDekNHLFFBQVFHLFFBQVE7WUFDZDlDLE1BQU1pQyxZQUFZWTtZQUNsQkwsTUFBTUs7O2VBR0RGLFFBQVFIO0FBQ2pCLFdBQU8sSUFBSSxVQUFVRyxXQUFXQSxRQUFRSCxTQUFTQyxXQUFXO1FBQzFELE1BQU1JLGFBQWFwQixjQUFja0IsUUFBUUg7UUFFekNHLFFBQVFILE9BQU9LO1FBQ2ZGLFFBQVEzQyxPQUFPaUMsWUFBWVk7QUFDN0I7SUFFQSxJQUFJekMsTUFBTUMsUUFBUXNDLFFBQVEzQyxPQUFPO1FBQy9CMkMsUUFBUTNDLE9BQU87UUFDZjJDLFFBQVFHLFFBQVE7WUFDZDlDLE1BQU07WUFDTjhDLE9BQU87Z0JBQ0w5QyxNQUFNMkMsUUFBUTNDLEtBQUs7OztBQUd6QjtJQUVBLE9BQU9WLHdCQUNMcEMsV0FBV1Msc0JBQ1hnRixTQUNBL0Q7QUFFSjs7U0NoS2dCbUUsc0JBQ2RDLGtCQUNBQyxNQUNBQztJQUVBLE1BQU1DLGFBR0Y7UUFDRkMsS0FBSyxFQUFDQyxjQUFjQyxNQUFNQztRQUMxQkMsTUFBTSxFQUFDSCxjQUFjSSxRQUFRQztRQUM3QkMsS0FBSyxFQUFDTixjQUFjTyxRQUFRQztRQUM1QkMsT0FBTyxFQUFDVCxjQUFjTyxRQUFRRztRQUM5QkMsUUFBUSxFQUFDWCxjQUFjVyxRQUFRQzs7SUFHakMsT0FBT0MsUUFBUUMsdUJBQXVCaEIsV0FBV0Y7SUFDakQsTUFBTXBFLFNBQVN1RixtQkFBbUJuQixNQUFNQztJQUN4QyxPQUFPckUsU0FDSHdGLG1CQUF1QnJCLGtCQUFrQm5FLE9BQU95RixNQUFhekYsT0FBT00sU0FDbEVvRixNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakIsU0FDNUJtQixtQkFBdUJyQixrQkFBa0JrQixVQUN2Q0ssTUFBTUMsd0JBQ05ELE1BQU1KLG9CQUFvQmpCO0FBQ2xDOztTQVNnQnVCLDBCQUNkekIsa0JBQ0FDLE1BQ0FDO0lBRUEsTUFBTUMsYUFHRjtRQUNGQyxLQUFLLEVBQUNzQixzQkFBc0JDLFVBQVVwQjtRQUN0Q0MsTUFBTSxFQUFDa0Isc0JBQXNCRSxZQUFZbEI7UUFDekNDLEtBQUssRUFBQ2Usc0JBQXNCRyxZQUFZaEI7UUFDeENDLE9BQU8sRUFBQ1ksc0JBQXNCRyxZQUFZZDtRQUMxQ0MsUUFBUSxFQUFDVSxzQkFBc0JJLFlBQVliOztJQUc3QyxPQUFPQyxRQUFRQyx1QkFBdUJoQixXQUFXRjtJQUNqRCxNQUFNcEUsU0FBU3FFLE9BQU9rQixtQkFBbUJuQixNQUFNQyxRQUFRVDtJQUN2RCxPQUFPNUQsU0FDSHdGLG1CQUF1QnJCLGtCQUFrQm5FLE9BQU95RixNQUFhekYsT0FBT00sU0FDbEVvRixNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakIsU0FDNUJtQixtQkFBdUJyQixrQkFBa0IsUUFBZWtCLFVBQ3RESyxNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakI7QUFDbEM7O0FBQ0EsU0FBU2tCLG1CQUNQbkIsTUFDQUM7SUFJQSxLQUFLQSxNQUFNLE9BQU9UO0lBRWxCLE1BQU1zQyxhQUFhN0IsS0FBSzhCLFFBQVEsY0FBYztJQUM5QyxNQUFNQyxtQkFBMkM7UUFDL0MsZUFBZUMsc0JBQXNCQztRQUNyQyx5QkFBeUJELHNCQUFzQkU7UUFDL0MsZUFBZUYsc0JBQXNCRztRQUNyQyxlQUFlSCxzQkFBc0JJO1FBQ3JDLHlCQUF5Qkosc0JBQXNCSztRQUMvQyxzQkFBc0JMLHNCQUFzQk07UUFDNUMsMkJBQTJCO1FBQzNCLGtCQUFrQk4sc0JBQXNCTztRQUN4QyxnQkFBZ0JQLHNCQUFzQlE7UUFDdEMsZ0JBQWdCUixzQkFBc0JTO1FBQ3RDLGdCQUFnQlQsc0JBQXNCVTtRQUN0QyxnQkFBZ0JWLHNCQUFzQlc7UUFDdEMscUJBQXFCWCxzQkFBc0JZO1FBQzNDLGtCQUFrQlosc0JBQXNCYTs7SUFHMUMsSUFBSWhCLFdBQVdpQixXQUFXLFdBQVc7UUFDbkMsT0FBTztZQUFFMUIsTUFBTTtZQUFTbkYsT0FBTzRGLFdBQVdDLFFBQVEsWUFBWTs7QUFDaEU7SUFFQSxNQUFNaUIsaUJBQWlCaEIsaUJBQWlCRjtJQUN4QyxJQUFJa0IsZ0JBQWdCO1FBQ2xCLE9BQU87WUFBRTNCLE1BQU07WUFBYW5GLE9BQU84Rzs7QUFDckM7SUFFQSxJQUFJaEQsU0FBUyxTQUFTOEIsZUFBZSxJQUFJO1FBQ3ZDLE9BQU87WUFBRVQsTUFBTTtZQUFRbkYsT0FBT2tFLGNBQWNDOztBQUM5QztJQUVBLE9BQU9iO0FBQ1Q7O0FDbkhNLFNBQVV5RCxtQkFDZEMsUUFBNEI7SUFFNUIsTUFBTUMsYUFBYUQsTUFBTXJFLElBQUt1RSxLQUM1QkMsU0FBWTtRQUNWQyxNQUFNRixFQUFFRTtRQUNSQyxhQUFhSCxFQUFFRyxlQUFlLG1CQUFtQkgsRUFBRUU7UUFDbkRsRSxVQUFVZ0UsRUFBRWhFLFlBQVk7UUFFeEJyQyxNQUFNcUcsRUFBRXJHLFFBQVF5Rzs7SUFHcEIsT0FBT0MsbUJBQW1CTjtBQUM1Qjs7QUNsQk8sTUFBTU8sWUFBWWxHLHVCQUN2QixDQUFDbUcsTUFBZUM7SUFDZCxNQUFNQyxVQUFVRCxJQUFJRSxlQUFlQztJQUNuQyxNQUFNQyxPQUFPSCxRQUFRRztJQUdyQixNQUFNQyxhQUFhTCxJQUFJTTtJQUV2QixNQUFNQyxjQUFlRixXQUFtQkc7SUFFeEMsS0FBS0QsYUFBYTtRQUNoQixNQUFNLElBQUlFLDZCQUNSLDRDQUE0Q0osV0FBV1g7QUFFM0Q7SUFFQSxLQUFLVSxNQUFNLE9BQU9BO0lBRWxCLElBQUk3RyxNQUFNQyxRQUFRNEcsT0FBTztRQUN2QixPQUFPQSxLQUFLbkYsSUFBS3lGLFFBQVMsSUFBSUgsWUFBWUc7QUFDNUM7SUFFQSxPQUFPLElBQUlILFlBQVlIOzs7QUNsQjNCLE1BQU1PLGdCQUFnQi9HLHVCQUNwQixDQUFDZ0gsT0FBNkJaO0lBQzVCLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO0lBQy9CLE1BQU1XLFdBQVlELEtBQUtFLFVBQVU7SUFDakMsTUFBTUMsWUFBWUosU0FBU2xILE9BQU95QixLQUFLMkY7SUFDdkMsTUFBTUcsVUFBVUQsVUFBVS9GLElBQUtpRyxLQUFNSixTQUFTSTtJQUM5QyxPQUFPO1FBQUVDLEtBQUtMO1FBQVVNLGVBQWVIO1FBQVNJLGFBQWFMOzs7O0FBVTNELFNBQVVNLFlBQ2RoQyxRQUE0QjtJQUU1QixNQUFNc0IsUUFBUXRCLE1BQU1yRSxJQUFLdUUsS0FBTUEsRUFBRUU7SUFDakMsT0FBT2lCLGNBQWNDO0FBQ3ZCOztBQUVPLE1BQU1XLGFBQWEzSCx1QkFDeEIsQ0FBQzRILEdBQVl4QjtJQUNYLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO0lBQy9CLE1BQU1zQixRQUFRWixJQUFJWSxTQUFTLENBQUE7SUFFM0IsTUFBTUMsU0FBYztXQUFLRDs7SUFHekIsSUFBSUMsT0FBT0MsVUFBVS9GLFdBQVc7UUFDOUIsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9DO1FBQ3hCLEtBQUtFLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9DLFFBQVFDO0FBQ3ZDO0lBRUEsSUFBSUYsT0FBT0ssV0FBV25HLFdBQVc7UUFDL0IsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9LO1FBQ3hCLEtBQUtGLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9LLFNBQVNIO0FBQ3hDO0lBR0EsSUFBSUYsT0FBT00sYUFBYXBHLFdBQVc7UUFDakMsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9NO1FBQ3hCTixPQUFPTSxXQUFXSCxPQUFPQyxNQUFNRixLQUFLRixPQUFPTSxXQUFXSjtBQUN4RDtJQUVBLE9BQU9GOzs7QUMxREosTUFBTU8sdUJBQXVCOztBQUM3QixNQUFNQyxtQkFBbUI7O0FBQ3pCLE1BQU1DLHdCQUF3Qjs7QUFFOUIsTUFBTUMsY0FBYzs7TUFDZEMsaUJBQWlCQyxPQUFPOztBQUM5QixNQUFNQyxlQUFlOztBQUNyQixNQUFNQywwQkFBMEI7O01BRTFCQyxvQkFBb0JILE9BQU87O0FDUmxDLFNBQVVJLFVBQVVDO0lBQ3hCLE9BQU8sU0FBU0QsT0FBTzFLO1FBQ3JCNEssU0FBU0MsSUFDUDdLLFFBQ0F1SyxjQUNDSSxTQUFTcEgsU0FBU29ILFdBQVc7UUFFaEMsT0FBTzNLO0FBQ1Q7QUFDRjs7QUNRTSxTQUFVOEssaUJBQWlCQztJQUMvQixPQUFPLFNBQVNDLDBCQUEwQmhMO1FBQ3hDNEssU0FBU0MsSUFBSTdLLFFBQVF3Syx5QkFBeUJPO1FBQzlDLE9BQU8vSztBQUNUO0FBQ0Y7O01DMUJhaUwsZUFBZVgsT0FBTzs7QUFDNUIsTUFBTVksZ0JBQWdCOztBQUN0QixNQUFNQyxnQkFBZ0I7O0FBQ3RCLE1BQU1DLHFCQUFxQjs7QUFDM0IsTUFBTUMsdUJBQXVCOztBQ0s3QixJQUFNQyxzQkFBTixNQUFNQSw0QkFHSEM7SUFJUixXQUFBbkssQ0FBNkJ5SDtRQUMzQjJDLE1BQ0U7WUFDRUMsV0FBWXhELFdBQXNCQSxTQUFpQnlELFdBQVc5SDtXQUVoRWlGO1FBTDBDOEMsS0FBQTlDLE1BQUFBO1FBSDlDOEMsS0FBQUMsT0FBT0MsS0FBS0MsU0FBU0M7UUFVbkJKLEtBQUsxRCxVQUFVWTtBQUNqQjtJQUVBLFdBQUk2QztRQUNGLE9BQU9DLEtBQUtLLGVBQWU7QUFDN0I7SUFFQSxHQUFBQyxDQUFJQztRQUNGLElBQUlDO1FBQ0o7WUFDRUEsWUFBWVIsS0FBS1MsSUFBSTtBQUN2QixVQUFFLE9BQU9DO1lBQ1BGLFlBQVksQ0FBQTtBQUNkO1FBRUFSLEtBQUtXLFdBQVc7WUFDZEgsV0FBV3pLLE9BQU9DLE9BQU93SyxXQUFXRDs7QUFFeEM7OztBQWhDV1osc0JBQW1CaUIsV0FBQSxFQUQvQkMsV0FBVztJQUFFQyxPQUFPQyxNQUFNQztJQVFaQyxRQUFBLEdBQUFDLE9BQU9GLDBEQVBUckI7O0FDbUJOLElBQU13QixrQkFBTixNQUFNQTtJQUNYLFdBQUExTCxDQUNtQjJMLFdBQ0VDLGdCQUNnQ0M7UUFGbEN0QixLQUFBb0IsWUFBQUE7UUFDRXBCLEtBQUFxQixpQkFBQUE7UUFDZ0NyQixLQUFBc0IsY0FBQUE7QUFDbEQ7SUFFSCxlQUFNQyxDQUNKbEYsS0FDQW1GO1FBRUEsTUFBTUMsTUFBTUMsUUFBUUMsSUFBSTNCLE1BQWEyQixJQUFJM0IsS0FBS3VCO1FBRTlDLE1BQU1LLFdBQVc1QixLQUFLb0IsVUFBVVMsa0JBQTJCckMsZUFBZSxFQUN4RW5ELElBQUl5RixjQUNKekYsSUFBSU07UUFHTixNQUFNb0YsWUFDSi9CLEtBQUtvQixVQUFVWCxJQUNibEIsZUFDQWxELElBQUl5RixpQkFFTjlCLEtBQUtvQixVQUFVWCxJQUEwQmxCLGVBQWVsRCxJQUFJTTtRQUU5RCxNQUFNcUYsZ0JBQWdCaEMsS0FBS29CLFVBQVVTLGtCQUNuQ3BDLG9CQUNBLEVBQUNwRCxJQUFJeUYsY0FBY3pGLElBQUlNO1FBR3pCLE1BQU1zRixpQkFBaUJqQyxLQUFLb0IsVUFBVVMsa0JBQ3BDbkMsc0JBQ0EsRUFBQ3JELElBQUl5RixjQUFjekYsSUFBSU07UUFHekIsTUFBTXVGLGlCQUFpQkQsaUJBQWlCaEssWUFBWThKO1FBRXBETixJQUFJVSxRQUFRLHNCQUFzQkosWUFBWSxRQUFRQSxjQUFjO1FBRXBFLElBQUlILFVBQVU7WUFDWkgsSUFBSVcsTUFBTTtBQUNaLGVBQU8sSUFBSXBDLEtBQUtzQixhQUFhO2tCQUNyQnRCLEtBQUtzQixZQUFZZSxVQUNyQmhHLEtBQ0E2RixnQkFDQUYsZUFDQWhDLEtBQUtxQjtBQUVULGVBQU87WUFDTEksSUFBSVcsTUFBTTtBQUNaO2NBS01wQyxLQUFLc0M7UUFFWCxNQUFNQyxPQUFPdkMsS0FBS3FCLGVBQWVoQixlQUFlO1FBQ2hELE1BQU1tQyxlQUFleEMsS0FBS3FCLGVBQWVoQixlQUN2QztRQUVGLElBQUlrQyxRQUFRQyxjQUFjO1lBQ3hCLE1BQU1DLGFBQWF6QyxLQUFLcUIsZUFBZVosSUFBSTtZQUMzQyxNQUFNaUMsV0FBV0QsV0FBV2QsSUFBSTtnQkFBRVk7Z0JBQU1DOztZQUN4Q3hDLEtBQUtxQixlQUFlVixXQUFXO2dCQUFFZ0MsUUFBUUQ7O0FBQzNDO1FBRUEsT0FBT2xCLEtBQUtvQjtBQUNkO0lBRVUsdUJBQU1OO1FBQ2QsTUFBTXRELFdBQVc2RCxRQUFRQztRQUN6QixLQUFLOUQsVUFBVTtRQUVmLEtBQUssTUFBTStELFdBQVcvRCxVQUFVO1lBQzlCLE1BQU1nRSxjQUFjSCxRQUFRSSxlQUMxQkY7WUFFRixLQUFLQyxhQUFhO1lBQ2xCLE1BQU03QyxXQUFZNkMsWUFBb0JFLE9BQ2xDRixjQUNBLElBQUtBO1lBQ1QsTUFBTUUsYUFBYS9DLFNBQVMrQyxLQUFLbEQsS0FBS3FCO1lBQ3RDLElBQUk2QixNQUFNbEQsS0FBS3FCLGVBQWVWLFdBQVd1QztBQUMzQztBQUNGOzs7QUFyRlcvQixrQkFBZVAsV0FBQSxFQUQzQkMsV0FBVztJQUFFQyxPQUFPQyxNQUFNQztJQUt0QkMsUUFBQSxHQUFBa0MsYUFBWWxDLFFBQUEsR0FBQUMsT0FBTzVCLGtEQUZROEQsV0FDT3pELHFCQUFtQjVKLGFBSDdDb0w7O0FDckJQLFNBQVVrQyxLQUFLQztJQUNuQixNQUFNQyxXQUFXRCxlQUNOQSxVQUFVLFdBQ2ZBLFFBQ0FBLE1BQU12SCxPQUNSOUQ7SUFDSixNQUFNdUwsT0FBTyxFQUFDQyxpQkFBaUJDLGdCQUFnQnZDO0lBQy9DLElBQUlvQyxVQUFVQyxLQUFLRyxLQUFLQyxZQUFZckUsZUFBZWdFO0lBQ25ELE9BQU9ySCxtQkFBbUJzSDtBQUM1Qjs7U0FFZ0JLO0lBQ2QsT0FBTzNILGdCQUFnQjBILFlBQVlwRSxlQUFlO0FBQ3BEOztBQUVNLFNBQVVzRSxnQkFBZ0JDO0lBQzlCLE9BQU83SCxnQkFDTDhILFlBQVksV0FDWkosWUFBWW5FLG9CQUFvQnNFLFFBQ2hDTCxnQkFBZ0J2QztBQUVwQjs7QUNmTSxTQUFVOEMsb0JBQ2R4TDtJQUVBLE1BQU1FLGFBQW9FO1FBQ3hFQyxLQUFLRztRQUNMQyxNQUFNRTtRQUNOQyxLQUFLRTtRQUNMQyxPQUFPQztRQUNQQyxRQUFRQzs7SUFHVixNQUFNeUssWUFBWXZMLFdBQVdGO0lBRTdCLEtBQUt5TCxXQUFXO1FBQ2QsTUFBTSxJQUFJQyxpQkFDUiwwQkFBMEIxTDtBQUU5QjtJQUVBLE9BQU95TDtBQUNUOztBQ05BLE1BQU1FLG9CQUFxQkMsYUFDbEJBLFVBQ0pDLE1BQU0sS0FDTmpOLE9BQVF3RSxLQUFNQSxFQUFFTCxXQUFXLE1BQzNCbEUsSUFBS3VFLEtBQU1BLEVBQUUwSSxNQUFNOztBQUd4QixNQUFNQyxlQUFnQnpJLFNBQVk7SUFDaENBO0lBQ0FDLGFBQWEsR0FBR0Q7SUFDaEJsRSxVQUFVO0lBQ1ZyQyxNQUFNeUc7OztBQUdSLFNBQVN3SSxhQUFhQyxPQUFnQkM7SUFDcEMsSUFBSUQsaUJBQWlCRSxXQUFXLE9BQU9GO0lBQ3ZDLE9BQU8sSUFBSUcsY0FDVEgsaUJBQWlCSSxRQUFRLEdBQUdILG9CQUFvQkQsTUFBTUssWUFBWUo7QUFFdEU7O0FBRU0sU0FBVUssaUJBQ2RDLFlBQ0FaLFdBQ0FhLFVBQ0FDLHFCQUE4QjtJQUU5QixNQUFNQyxtQkFBbUJuQixvQkFBb0JpQjtJQUM3QyxNQUFNRyxnQkFBZ0JqQixrQkFBa0JDLFdBQVcvTSxJQUFJa047SUFFdkQsTUFBTWMscUJBQXFCO0lBQzNCLElBQUlKLGFBQWEsU0FBU0Msb0JBQW9CO1FBQzVDRyxtQkFBbUIzQixLQUNqQjRCLFNBQVM7WUFDUHhKLE1BQU07WUFDTmxFLFVBQVU7WUFDVkcsTUFBTXdOO1lBQ054SixhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhOztBQUduQjtJQUVBLE9BQU87UUFDTHlKLFFBQVEsRUFDTkwsaUJBQWlCZixlQUNkZ0IsY0FBYy9OLElBQUlvTyxjQUNsQkosb0JBQ0hLLGFBQWE7WUFDWEMsU0FBUyx3Q0FBd0NYO1lBRW5EWSxjQUFjO1lBQ1o3SixhQUFhO1lBRWY4SixxQkFBcUI7WUFDbkI5SixhQUFhOztRQUdqQm9CLFFBQVEsRUFBQ08sWUFBWTBILGdCQUFnQlU7O0FBRXpDOztBQUVNLFNBQVVDLG1CQUNkM1IsUUFDQTRRLFlBQ0ExUSxZQUNBcUg7SUFFQSxNQUFNcUssUUFBUTVSLFFBQVFrQyxhQUFhbEM7SUFDbkN1SCxXQUFXNkosT0FBT1MsUUFBU0MsS0FBTUEsRUFBRUYsT0FBT2hCLFlBQVkxUTtJQUN0RHFILFdBQVd3QixRQUFROEksUUFBUSxDQUFDQyxHQUFHQyxVQUFVRCxFQUFFRixPQUFPaEIsWUFBWW1CO0FBQ2hFOztBQUVNLFNBQVVDLHlCQUNkQyxhQUNBckIsZUFDR3NCO0lBRUgsSUFBSUQsdUJBQXVCRSxjQUFjO1FBQ3ZDLGNBQWVGLFlBQW9CckIsZ0JBQWdCLGFBQzlDcUIsWUFBb0JyQixlQUFlc0IsUUFDcENELFlBQVlHLFVBQVV4QixlQUFlc0I7QUFDM0M7SUFFQSxXQUFZRCxZQUFvQnJCLGdCQUFnQixZQUM5QyxPQUFRcUIsWUFBb0JyQixlQUFlc0I7SUFFN0MsTUFBTSxJQUFJMUIsY0FDUix1QkFBdUJJLDRCQUE0QnFCLGFBQWE3USxhQUFhc0c7QUFFakY7O0FBRU0sU0FBVTJLLG1CQUFzQnpCO0lBQ3BDLE9BQU8wQixlQUVMQyxZQUNBQztRQUVBLE1BQU1wRixNQUFjekIsS0FBS3lCLElBQUlFLElBQUlzRDtRQUVqQztZQUNFeEQsSUFBSVcsTUFDRixnQ0FBZ0M2QyxpQ0FBaUM2QixLQUFLQyxVQUFVSCxXQUFXbko7WUFFN0YsT0FBTXVKLFdBQUVBLFdBQVNoSixPQUFFQSxPQUFLSSxRQUFFQSxVQUFXeUk7WUFDckMsYUFBYVIseUJBQ1hyRyxLQUFLc0csZUFDTHJCLGVBQ0cyQixXQUFXbkosZUFDZHVKLFdBQ0FoSixPQUNBSTtBQUVKLFVBQUUsT0FBT3NDO1lBQ1BlLElBQUlpRCxNQUFNLGlCQUFpQk8sc0JBQXNCdkU7WUFDakQsTUFBTStELGFBQWEvRCxHQUFHLGlCQUFpQnVFO0FBQ3pDO0FBQ0Y7QUFDRjs7U0FFZ0JnQyxrQkFDZEMsaUJBQ0FqQyxZQUNBa0M7SUFFQXBSLE9BQU9xUixlQUNMRixnQkFBZ0IzUSxhQUFhMlEsaUJBQzdCakMsWUFDQTtRQUNFdFEsT0FBT3dTO1FBQ1BFLFVBQVU7O0lBSWQsT0FBT3RSLE9BQU9VLHlCQUNaeVEsZ0JBQWdCM1EsYUFBYTJRLGlCQUM3QmpDO0FBRUo7O0FDaktNLE1BQU9xQyx5QkFBeUJDO0lBSzFCLFlBQUFDLENBQWF0SztRQUNyQixNQUFNdUssV0FBV3ZLLElBQUk2QyxRQUFRMkgsZUFBZXBELE1BQU0sS0FBSztRQUN2RCxPQUFPbUQ7QUFDVDtJQUVVLGVBQUFFLENBQWdCdEw7UUFDeEIsTUFBTWEsTUFBTWIsSUFBSUUsZUFBZUM7UUFDL0IsTUFBTWlMLFdBQVd6SCxLQUFLd0gsYUFBYXRLO1FBQ25DLEtBQUt1SyxVQUFVLE1BQU0sSUFBSUcsbUJBQW1CO1FBQzVDLE9BQU87WUFBRXJGLE1BQU1rRjtZQUFVMUQsT0FBTyxFQUFDMEQ7O0FBQ25DOzs7QUFRSSxNQUFPSSw2QkFBNkJQOzs7O0FDdkJuQyxJQUFNUSxrQkFBZUMsb0JBQXJCLE1BQU1EO0lBQ1gsY0FBT0UsQ0FDTDdQLFVBQWtDO1FBRWxDLE1BQU04UCxZQUF3QyxFQUM1QzlHO1FBR0YsSUFBSWhKLFFBQVFnUCxTQUFTO1lBQ25CYyxVQUFVdEUsS0FBS3hMLFFBQVFnUDtZQUN2QmMsVUFBVXRFLEtBQUs7Z0JBQ2J1RSxTQUFTNUk7Z0JBQ1Q2SSxVQUFVaFEsUUFBUWdQOztBQUV0QjtRQUVBLElBQUloUCxRQUFRaVEsUUFBUTtZQUNqQkgsVUFBb0J0RSxLQUFLO2dCQUN4QnVFLFNBQVNHO2dCQUNUQyxhQUFhbkg7O0FBRWpCO1FBRUEsT0FBTztZQUNMb0gsUUFBUVI7WUFDUkssUUFBUWpRLFFBQVFpUSxVQUFVO1lBQzFCSDtZQUNBTyxTQUFTLEVBQUNySCxpQkFBaUI3Qjs7QUFFL0I7OztBQTdCV3dJLGtCQUFlQyxvQkFBQW5ILFdBQUEsRUFEM0I2SCxPQUFPLENBQUEsTUFDS1g7Ozs7QUNzQ04sSUFBTVksdUJBQW9CQyx5QkFBMUIsTUFBTUQ7SUFDWCxXQUFBalQsQ0FDMkNtVCxVQUN4QkM7UUFEd0I3SSxLQUFBNEksV0FBQUE7UUFDeEI1SSxLQUFBNkksVUFBQUE7QUFDaEI7SUFFSCxVQUFNQyxDQUFLNUwsS0FBYzZMO1FBQ3ZCLE1BQU10SCxNQUFNQyxRQUFRQyxJQUFJZ0gsdUJBQXFCNU0sTUFBTTRGLElBQUkzQixLQUFLOEk7UUFDNURySCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLNkksUUFBUTVJLGdCQUFnQkQsS0FBSzRJLFNBQVNoUiwrQkFBK0JzRixJQUFJdUksVUFBVXZJLElBQUk4TDtRQUV6RyxLQUFLLE1BQU03QixXQUFXbkgsS0FBSzRJLFVBQVU7a0JBQzdCekIsUUFBUXZFLE9BQU81QyxLQUFLNkksU0FBUzNMLEtBQUs2TDtBQUMxQztBQUNGOzs7QUFkV0wsdUJBQW9CQyx5QkFBQS9ILFdBQUEsRUFEaENDLFdBQVc7SUFBRUMsT0FBT0MsTUFBTUM7SUFHdEJDLFFBQUEsR0FBQUMsT0FBT3hDLDJEQUNrQmlCLDBCQUhqQitJOztBQ3pDTixJQUFNTywyQkFBTixNQUFNQTtJQUNYLFdBQUF4VCxDQUFzQjRHO1FBQUEyRCxLQUFBM0QsTUFBQUE7QUFBMkI7SUFFakQsU0FBQWtGLENBQVVzSCxTQUEyQnJIO1FBQ25DLElBQUkwSCxXQUFXTCxRQUFRdE0sZUFBZTRNO1FBRXRDLE9BQU8zSCxLQUFLb0IsU0FBU3dHLEtBRW5CQyxJQUFLak47WUFDSDhNLFdBQVdsSixLQUFLM0QsSUFBSWlOLFdBQVdKOztBQUdyQzs7O0FBWldELDJCQUF3QnJJLFdBQUEsRUFEcENDLGdEQUU0QmxCLDBCQURoQnNKOztBQ0lQLE1BQWdCTSx3QkFHWkM7SUFDUixXQUFBL1QsQ0FDcUJnVSxlQUNuQkM7UUFFQTdKLE1BQU00SjtRQUhhekosS0FBQXlKLGdCQUFBQTtBQUlyQjs7O0FBR0ksTUFBZ0JFLDZCQUdaSjtJQUdSLFdBQUE5VCxDQUM4QmdVLGVBQzVCQztRQUVBN0osTUFBTTRKLGVBQWVDO1FBSE8xSixLQUFBeUosZ0JBQUFBO0FBSTlCO0lBSUEsV0FBQW5ELENBQVlqSztRQUNWLEtBQUsyRCxLQUFLNEosY0FDUjtZQUNFNUosS0FBSzRKLGVBQWVDLFVBQVFwSixJQUFxQlQsS0FBS25EO0FBQ3hELFVBQUU7WUFDQTtnQkFDRW1ELEtBQUs0SixlQUFlcEQsYUFBYXNELFdBQy9COUosS0FBS25EO0FBRVQsY0FBRTtnQkFDQW1ELEtBQUs0SixlQUFlRyxhQUFXQyxTQUFTaEssS0FBS25EO0FBQy9DO0FBQ0Y7UUFFRixNQUFNMkQsWUFBWVIsS0FBS3lKLGNBQWNRO1FBRXJDLE9BQU81TixNQUNIMkQsS0FBSzRKLHdCQUF3QkcsZUFDM0IvSixLQUFLNEosYUFBYU0sU0FBUzFKLGFBQzNCUixLQUFLNEosYUFBYWpJLElBQUluQixhQUN4QlIsS0FBSzRKO0FBQ1g7OztBQ2xERixNQUFNTyxXQUFXLElBQUlDOztBQThCZixTQUFVQyxPQUNkQyxJQUNBaEgsT0FDQWlILFFBQStCLElBQUlDO0lBRW5DLEtBQUtDLHlCQUF5QnhWLFNBQVNxVixLQUFLO1FBQzFDLE9BQU9oSDtBQUNUO0lBRUEsTUFBTW9ILFFBQVFDLFlBQVlMO0lBQzFCLE1BQU1NLFNBQVNGLE1BQU1qSyxJQUFJNkM7SUFDekIsSUFBSXNILFFBQVEsT0FBT0E7SUFFbkIsTUFBTUMsYUFBYSxFQUNqQmhTLGNBQWNPLFFBQ2RjLHNCQUFzQkcsYUFDdEJwRixTQUFTcVY7SUFFWCxNQUFNUTtJQUNOSixNQUFNeEwsSUFBSW9FLE9BQU93SDtJQUVqQi9VLE9BQU9xUixlQUFlMEQsWUFBWSxRQUFRO1FBQ3hDblcsT0FBTyxHQUFHb1csYUFBYXpILE1BQU12SCxRQUFRZ1AsYUFBYVQ7O0lBR3BELE1BQU1VLFNBQVM7UUFDYjtZQUNFLE9BQU9DLE1BQU1DLEdBQUc1SDtBQUNsQixVQUFFO1lBQ0EsT0FBT3JMO0FBQ1Q7QUFDRCxNQU5jO0lBUWYsTUFBTWtULGtCQUFrQkgsU0FBU0MsTUFBTUcsUUFBUTlILFNBQWdCckw7SUFDL0QsTUFBTW9ULGVBQWVMLFNBQ2pCdlcsUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVd5VSxVQUNwRC9TO0lBQ0osTUFBTXFULGtCQUNKRCxpQkFBaUJuTixVQUFVbU4saUJBQWlCRTtJQUM5QyxNQUFNQyxrQkFDRkwsaUJBQWlCTSxjQUNsQlQsU0FDR0MsTUFBTVMsb0JBQW9CcEksT0FBYzBILFdBQ3hDVyxxQ0FBcUNySSxPQUFPMEgsV0FDNUNNLGtCQUNBO0lBRU4sTUFBTU0sV0FBV2hXLE1BQU1zTixLQUFLLElBQUlzSCxJQUFJdkwsU0FBU2pLLFdBQVdzTyxVQUFVO0lBQ2xFLE1BQU11SSxZQUFZLElBQUlyQixJQUFhUyxNQUFNWSxVQUFVdkksVUFBdUI7SUFDMUUsTUFBTXdJLGNBQXdCO0lBRTlCLEtBQUssTUFBTUMsUUFBUUgsVUFBVTtRQUMzQixLQUFLRyxNQUFNO1FBQ1gsSUFBSUYsVUFBVUcsSUFBSUQsT0FBTztRQUV6QixJQUFJQSxTQUFTZixXQUFXSCxjQUFjVyxlQUFlO1FBQ3JELElBQUlPLFNBQVNmLFVBQVVXLHFDQUFxQ3JJLE9BQU95SSxPQUNqRTtRQUVGRCxZQUFZbkksS0FBS29JO0FBQ25CO0lBRUEsS0FBSyxNQUFNQSxRQUFRRCxhQUFhO1FBQzlCLE1BQU1HLGFBQWFDLCtCQUErQjVJLE9BQU95STtRQUN6RCxNQUFNSSxlQUFlRixhQUFhRyxlQUFlQztRQUNqRCxNQUFNQyxXQUNKQyx5QkFBeUJqSixPQUFPeUksU0FDaEN0WCxRQUFRQyxZQUFZLGVBQWU0TyxNQUFNL00sV0FBV3dWO1FBRXRELE1BQU1TLGFBQWdEO1lBQ3BEM1UsVUFBVXNVOztRQUVaLElBQUlHLFVBQVVFLFdBQVdoWCxPQUFPOFc7UUFFaENwVSxZQUFZc1UsV0FBWnRVLENBQXdCNFMsV0FBV3ZVLFdBQVd3VjtRQUU5QyxNQUFNVSxhQUNKaFksUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVd3VixTQUFTTztRQUMvRCxXQUFXRyxlQUFlLGFBQWE7WUFDckNoWSxRQUFRRyxlQUNOLGVBQ0E2WCxZQUNBM0IsV0FBV3ZVLFdBQ1h3VjtBQUVKO1FBRUFoVyxPQUFPcVIsZUFBZTBELFdBQVd2VSxXQUFXd1YsTUFBTTtZQUNoRHBYLE9BQU9zRDtZQUNQb1AsVUFBVTtZQUNWcUYsWUFBWTtZQUNaQyxjQUFjOztBQUVsQjtJQUVBLEtBQUssTUFBTUMsWUFBWWYsV0FBVztRQUNoQyxNQUFNZ0IsZUFBZTVOLFNBQVM0TSxVQUFVdkksT0FBT3NKO1FBQy9DLEtBQUtDLGNBQWM7WUFDakIsTUFBTSxJQUFJaEksY0FBYyx5QkFBeUIrSDtBQUNuRDtRQUVBLElBQUlFLGVBQ0ZELGFBQWFoUTtRQUNmLFdBQVdpUSxpQkFBaUIsZUFBZUEsYUFBYS9RLE1BQU07WUFDNUQrUSxlQUFnQkE7QUFDbEI7UUFDQSxLQUFLQSx1QkFBdUJBLGlCQUFpQixZQUFZO1lBQ3ZELE1BQU0sSUFBSWpJLGNBQWMscUJBQXFCK0g7QUFDL0M7UUFDQSxLQUFLM0IsTUFBTXhLLElBQUlxTSxhQUFhL1EsT0FBTztZQUNqQztBQUNGO1FBRUEsTUFBTWdSLE9BQU85TixTQUFTK04sY0FBYzFKLE9BQU9zSjtRQUMzQyxNQUFNL1csWUFBYWtYLE9BQWVYLGVBQWVhO1FBQ2pELE1BQU1kLGVBQWdCWSxPQUFlWCxlQUFlQztRQU1wRCxNQUFNYSxhQUFhM0MsTUFBTXlCLElBQUljO1FBRTdCLElBQUlJLFlBQVk7WUFDZCxNQUFNQyxhQUFhQyxpQkFBaUJOO1lBQ3BDTyxpQkFBaUJ2QyxZQUFZOEIsVUFBVU8sWUFBWXRYLFNBQVNzVztZQUM1RDtBQUNGO1FBRUEsTUFBTW1CLGNBQWNqRCxPQUFPQyxJQUFJd0MsY0FBYyxJQUFJdEMsSUFBSUQsT0FBT2dELElBQUlqSztRQUVoRSxJQUFJdUgsWUFBWTtZQUNkMkMsa0JBQ0UxQyxZQUNBOEIsVUFDQUUsY0FDQVEsYUFDQXpYLFNBQ0FzVztBQUVKLGVBQU87WUFDTHNCLFlBQVkzQyxZQUFZOEIsVUFBVVUsYUFBYXpYLFNBQVNzVztBQUMxRDtBQUNGO0lBRUEsT0FBT3JCO0FBQ1Q7O0FBRUEsU0FBUzJDLFlBQ1BDLFVBQ0FkLFVBQ0FVLGFBQ0F6WCxTQUNBc1c7SUFFQSxNQUFNSyxhQUFnRDtRQUNwRGhYLE1BQU04WDtRQUNOelYsVUFBVXNVO1FBQ1Z0Vzs7SUFFRnFDLFlBQVlzVSxXQUFadFUsQ0FBd0J3VixTQUFTblgsV0FBV3FXO0lBQzVDblksUUFBUUcsZUFDTixlQUNBaUIsVUFBVUQsUUFBUTBYLGFBQ2xCSSxTQUFTblgsV0FDVHFXO0lBRUY3VyxPQUFPcVIsZUFBZXNHLFNBQVNuWCxXQUFXcVcsVUFBVTtRQUNsRGpZLE9BQU9zRDtRQUNQb1AsVUFBVTtRQUNWcUYsWUFBWTtRQUNaQyxjQUFjOztBQUVsQjs7QUFNQSxTQUFTVSxpQkFDUEssVUFDQWQsVUFDQU8sWUFDQXRYLFNBQ0FzVztJQUVBLE1BQU1LLGFBQWdEM1csVUFDakQ7UUFBRUwsTUFBTTtRQUFTOEMsT0FBTztZQUFFOUMsTUFBTTJYOztRQUFjdFYsVUFBVXNVO1FBQ3hEO1FBQUUzVyxNQUFNMlgsZUFBZSxZQUFZalAsU0FBU2pDO1FBQVFwRSxVQUFVc1U7O0lBQ25FalUsWUFBWXNVLFdBQVp0VSxDQUF3QndWLFNBQVNuWCxXQUFXcVc7SUFDNUNuWSxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFTdVgsZUFBZSxZQUFZalAsU0FBU2pDLFFBQ3ZEeVIsU0FBU25YLFdBQ1RxVztJQUVGN1csT0FBT3FSLGVBQWVzRyxTQUFTblgsV0FBV3FXLFVBQVU7UUFDbERqWSxPQUFPc0Q7UUFDUG9QLFVBQVU7UUFDVnFGLFlBQVk7UUFDWkMsY0FBYzs7QUFFbEI7O0FBRUEsU0FBU2Esa0JBQ1BFLFVBQ0FkLFVBQ0FFLGNBQ0FRLGFBQ0F6WCxTQUNBc1c7SUFFQSxNQUFNd0IsY0FDSmxaLFFBQVFDLFlBQVloQyxXQUFXYyxrQkFBa0JrYSxhQUFhO0lBQ2hFLEtBQUtDLFlBQVkxWSxTQUFTcVksY0FBYztRQUN0QzdZLFFBQVFHLGVBQ05sQyxXQUFXYyxrQkFDWCxLQUFJbWEsYUFBYUwsZUFDakJJO0FBRUo7SUFFQSxNQUFNRSxTQUFTLHdCQUF3Qk4sWUFBWXZSO0lBQ25ELE1BQU1vUixhQUFhQyxpQkFBaUJOO0lBQ3BDLE1BQU1lLGFBQWEsRUFBQztRQUFFQyxNQUFNRjtPQUFVO1FBQUVwWSxNQUFNMlg7O0lBRTlDLE1BQU1YLGFBQWdEM1csVUFDakQ7UUFBRUwsTUFBTTtRQUFTcUMsVUFBVXNVO1FBQVk0QixPQUFPRjtRQUM5QztRQUFFclksTUFBTU87UUFBUThCLFVBQVVzVTtRQUFZNEIsT0FBT0Y7O0lBRWxEM1YsWUFBWXNVLFdBQVp0VSxDQUF3QndWLFNBQVNuWCxXQUFXcVc7SUFDNUNuWSxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFRRyxRQUNsQjJYLFNBQVNuWCxXQUNUcVc7SUFFRjdXLE9BQU9xUixlQUFlc0csU0FBU25YLFdBQVdxVyxVQUFVO1FBQ2xEalksT0FBT3NEO1FBQ1BvUCxVQUFVO1FBQ1ZxRixZQUFZO1FBQ1pDLGNBQWM7O0FBRWxCOztBQUVBLFNBQVNTLGlCQUFpQk47SUFDeEI7UUFDRSxNQUFNM0Isa0JBQWtCRixNQUFNRyxRQUFRMEI7UUFDdEMsTUFBTWtCLFNBQVM3QyxpQkFBaUIzVjtRQUNoQyxJQUFJd1ksV0FBVzlQLFVBQVU4UCxXQUFXekMsUUFBUSxPQUFPO1FBQ25ELE9BQU87QUFDVCxNQUFFO1FBQ0EsT0FBTztBQUNUO0FBQ0Y7O0FBRUEsU0FBU0kscUNBQ1BySSxPQUNBeUk7SUFFQSxJQUFJa0MsVUFBZTNLO0lBQ25CLE9BQU8ySyxXQUFXQSxZQUFZbFksVUFBVWtZLFlBQVlDLFVBQVU7UUFDNUQsSUFBSWpELE1BQU1RLFVBQVV3QyxTQUFTbEMsT0FBYyxPQUFPO1FBQ2xEa0MsVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU87QUFDVDs7QUFFQSxTQUFTL0IsK0JBQ1A1SSxPQUNBeUk7SUFFQSxJQUFJa0MsVUFBZTNLO0lBQ25CLE9BQU8ySyxXQUFXQSxZQUFZbFksVUFBVWtZLFlBQVlDLFVBQVU7UUFDNUQsTUFBTWpDLGFBQWFoTixTQUFTK04sY0FBY2lCLFNBQVNsQztRQUNuRCxJQUFJRSxZQUFZLE9BQU9BO1FBQ3ZCZ0MsVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU9oVztBQUNUOztBQUVBLFNBQVNzVSx5QkFBeUJqSixPQUF5QnlJO0lBQ3pELElBQUlrQyxVQUFlM0s7SUFDbkIsT0FBTzJLLFdBQVdBLFlBQVlsWSxVQUFVa1ksWUFBWUMsVUFBVTtRQUM1RCxNQUFNMVksT0FBT3lKLFNBQVN6SixLQUFLeVksU0FBU2xDO1FBQ3BDLElBQUl2VyxNQUFNLE9BQU9BO1FBQ2pCeVksVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU9oVztBQUNUOztBQUVBLFNBQVMwUyxZQUNQTDtJQUVBLEtBQUtILFNBQVM2QixJQUFJMUIsS0FBSztRQUNyQkgsU0FBU2pMLElBQUlvTCxJQUFJLElBQUk4RDtBQUN2QjtJQUNBLE9BQU9qRSxTQUFTMUosSUFBSTZKO0FBQ3RCOztBQ2hWQ3pILFFBQWdCSSxpQkFBaUIsU0FBU29MLGVBRXpDQztJQUNBLE1BQU1DLGVBQ0dELFlBQVksV0FBV0EsVUFBV0EsUUFBUUM7SUFDbkQsT0FBT3RQLFNBQVMsWUFBWU4sT0FBT2dELElBQUksaUJBQWlCNE07QUFDMUQsRUFBRUMsS0FBSzNMOztBQUVOQSxRQUFnQkMsc0JBQXNCLFNBQVMyTDtJQUc5QyxNQUFNMUIsT0FBTzlOLFNBQVMsWUFBWU4sT0FBT2dELElBQUk7SUFDN0MsS0FBS29MLE1BQU0sT0FBTzlVO0lBQ2xCLE9BQU9sQyxPQUFPeUIsS0FBS3VWO0FBQ3JCLEVBQUV5QixLQUFLM0w7O0FBRU42TCxRQUFnQm5ZLFVBQVUrUyxhQUFhLFNBQVNBLFdBRWhDUDtJQUNmLE1BQU00RixVQUFVM08sS0FBSzJPO0lBQ3JCLElBQUlBLFNBQVM1RixJQUFJNkYsT0FBTyxrQkFBa0I5SCxLQUFLQyxVQUFVNEg7SUFDekQsT0FBTzVGO0FBQ1Q7O0FDZEEsTUFBTXhTLFlBQVlzWSxhQUFhdFk7O0FBSS9CLEtBQUtBLFVBQVV1WSxlQUFlO0lBQzVCdlksVUFBVXVZLGdCQUFnQixTQUFVNUs7UUFDbEMsS0FBTWxFLEtBQWErTyxrQkFBa0I7WUFDbEMvTyxLQUFhK08sbUJBQW1CO0FBQ25DO1FBQ0MvTyxLQUFhK08saUJBQWlCcEwsS0FBS087UUFDcEMsT0FBT2xFO0FBQ1Q7QUFDRjs7QUFFQXpKLFVBQVU4TSxPQUFPLFNBQVVDO0lBQ3pCLE9BQU90RCxLQUFLOE8sY0FBY3pMLEtBQUtDO0FBQ2pDOztBQUVBLEtBQU0vTSxVQUFrQnlZLDRCQUE0QjtJQUNsRCxNQUFNQyxnQkFBZ0IxWSxVQUFVMlk7SUFDaEMzWSxVQUFVMlksUUFBUTtRQUNoQixJQUFJQyxTQUFTRixjQUFjRyxLQUFLcFA7UUFDaEMsTUFBTXBFLGFBQWNvRSxLQUFhK087UUFDakMsSUFBSW5ULFlBQVloRSxRQUFRO1lBQ3RCLEtBQUssTUFBTXNNLGFBQWF0SSxZQUFZO2dCQUNsQyxNQUFNeVQsWUFBWW5MLFVBQVVpTDtnQkFDNUIsSUFBSUUsV0FBVztvQkFDYkYsU0FBU0U7QUFDWDtBQUNGO0FBQ0Y7UUFDQSxPQUFPRjtBQUNUO0lBQ0M1WSxVQUFrQnlZLDZCQUE2QjtBQUNsRDs7OztNQ2tCYU07O1FBQ2F0UCxLQUFBeUIsTUFBTUMsUUFBUUMsSUFBSTJOLG9CQUFvQnZUO0FBQU07SUFFNUQsbUJBQU8wSSxDQUNiQyxPQUNBQztRQUVBLElBQUlELGlCQUFpQkUsV0FBVyxPQUFPRjtRQUN2QyxPQUFPLElBQUlHLGNBQ1RILGlCQUFpQkksUUFDYixHQUFHSCxvQkFBb0JELE1BQU1LLFlBQzdCSjtBQUVSO0lBRUEscUJBQU80SyxDQUNMQztRQUVBO1lBQ0UsT0FBTzNGLFVBQVFwSixJQUFxQitPO0FBQ3RDLFVBQUUsT0FBTzlPO1lBQ1A7Z0JBQ0UsT0FBTzhGLGFBQWFzRCxXQUFXMEY7QUFDakMsY0FBRSxPQUFPQztnQkFDUCxPQUFPMUYsYUFBV0MsU0FBU3dGO0FBQzdCO0FBQ0Y7QUFDRjtJQUVBLHNDQUFPRSxDQUNMcEosYUFDQXFKLFNBQWlCQyxnQkFBZ0JDO1FBRWpDLE1BQU1DLE9BQ0p4Six1QkFBdUJFLGVBQWVGLFlBQVl3SixPQUFPeEo7UUFDM0QsTUFBTXlKLGVBQ0o5USxTQUFTd0IsSUFDUHFQLEtBQUtyYSxhQUNMd0osU0FBUzNLLElBQUlzYixnQkFBZ0JDLFdBQzFCLENBQUE7UUFFUCxNQUFNRyxlQUNKL1EsU0FBU3dCLElBQ1A2RixZQUFZN1EsYUFDWndKLFNBQVMzSyxJQUFJbUssaUJBQ1YsQ0FBQTtRQUVQLE1BQU13Uix3QkFBd0J0RztZQUM1QixTQUFhO2dCQUNYLE1BQU0sSUFBSTlFLGNBQWM7QUFDMUI7WUFDQSxXQUFBcFAsQ0FBWWdVLGVBQW9DMU47Z0JBQzlDOEQsTUFBTTRKLGVBQWUxTjtBQUN2Qjs7UUFHRixLQUFLLE9BQU9rSixZQUFZN0gsV0FBV3JILE9BQU9tYSxRQUFRRixlQUFlO1lBQy9ELE1BQU0zTCxZQUFZLEVBQUNqSCxPQUFPMUUsS0FBSzhCLFFBQVEsY0FBYyxNQUNsRG5ELE9BQVE4WSxXQUFvQkEsV0FBV0EsUUFBUUMsUUFDL0NDLEtBQUs7WUFFUixNQUFNbEosVUFBVW1JLG9CQUFvQmdCLDBCQUNsQ3JMO1lBRUZxSyxvQkFBb0JpQixhQUFhTixpQkFBaUJoTCxZQUFZa0M7WUFFOUQsTUFBTXFKLGdCQUFnQnZNLG9CQUFvQjdHLE9BQU9xVCxXQUEzQnhNLENBQ3BCSSxhQUFhcE07WUFFZixNQUFNMkQsYUFBYTBULG9CQUFvQm9CLG1CQUNyQ3pMLFlBQ0FaLFdBQ0FqSCxPQUFPcVQ7WUFFVG5CLG9CQUFvQnBULGdCQUFnQitULGlCQUFpQmhMLFlBQVksRUFDL0R1TCxrQkFDRzVVO0FBRVA7UUFFQSxLQUFLLE9BQU9xSixZQUFZMEwsY0FBYzVhLE9BQU9tYSxRQUFRSCxlQUFlO1lBQ2xFLE1BQU1hLFNBQVNELFVBQVVDLFVBQVU7WUFDbkMsTUFBTXZNLFlBQVksRUFBQ3NMLFFBQVExSyxlQUFlMkwsT0FBT3RaLElBQUt1WixLQUFNLElBQUlBLE9BQzdEeFosT0FBUThZLFdBQVlBLFdBQVdBLFFBQVFDLFFBQ3ZDQyxLQUFLO1lBRVIsTUFBTWxKLFVBQVVtSSxvQkFBb0JnQiwwQkFDbENyTDtZQUVGcUssb0JBQW9CaUIsYUFBYU4saUJBQWlCaEwsWUFBWWtDO1lBRTlELE1BQU1xSixnQkFBZ0J2TSxvQkFBb0IsTUFBcEJBLENBQ3BCSSxhQUFhcE07WUFFZixNQUFNMkQsYUFBYTBULG9CQUFvQm9CLG1CQUNyQ3pMLFlBQ0FaLFdBQ0EsT0FDQTtZQUVGaUwsb0JBQW9CcFQsZ0JBQWdCK1QsaUJBQWlCaEwsWUFBWSxFQUMvRHVMLGtCQUNHNVU7QUFFUDtRQUVBLE9BQU9xVTtBQUNUO0lBRU8sYUFBQWEsQ0FDTGxVLGFBQ0FtVSx1QkFDQUM7UUFFQSxNQUFNdlAsTUFBTTZOLG9CQUFvQjdOLElBQUlFLElBQUkyTixvQkFBb0J3QjtRQUM1RCxNQUFNRyxZQUFZaEcsTUFBTWdHLFVBQVVyVTtRQUNsQyxNQUFNeUgsWUFBWTZNLFlBQVlEO1FBQzlCLE1BQU1FLGlCQUFpQnZVLFlBQVliO1FBQ25DLE1BQU11SyxjQUFjZ0osb0JBQW9CQyxlQUFlM1M7UUFLdkQsTUFBTXdVLHFCQUNKOUssdUJBQXVCRSxlQUFlRixZQUFZd0osT0FBT3hKO1FBRTNELE1BQU0rSyxrQkFBa0JwUyxTQUFTd0IsSUFDL0I3RCxhQUNBcUMsU0FBUzNLLElBQUl1SztRQUVmLE1BQU15UyxpQkFBaUJQLHdCQUF3Qm5VLFlBQVliO1FBQzNELE1BQU13VixlQUE2QztlQUM3Q1Asa0JBQWtCLENBQUE7ZUFDbEJLLG1CQUFtQixDQUFBO2VBQ25CQyxrQkFBa0IsQ0FBQTs7UUFHeEIsTUFBTUUsb0JBQW9CQyx1QkFBdUJYLE9BQy9DbFUsYUFDQXdVLG9CQUNBRztRQUVGLE1BQU1HLGdCQUFpQkYsa0JBQTBCRztRQUlqRCxPQUFNQyxPQUNKQSxPQUFLQyxlQUNMQSxlQUNBblosTUFBTW9aLFVBQ0p4QyxvQkFBb0J5Qyw0QkFBNEJuVjtRQUVwRDZFLElBQUlXLE1BQ0Ysa0NBQWtDK08sdUJBQXVCTyxlQUFlOVosVUFBVTtRQUdwRixNQUFNb2EsYUFBcUNULGFBQWFVO1FBRXhELFNBQVNDLGVBQWU3ZDtZQUN0QixJQUFJMmQsWUFBWUcsUUFBUTtnQkFDdEJ0TyxTQUFTeFA7QUFDWCxtQkFBTyxJQUFJMmQsWUFBWWpPLE9BQU9uTSxRQUFRO2dCQUNwQ2tNLGdCQUFnQmtPLFdBQVdqTyxNQUEzQkQsQ0FBa0N6UDtBQUNwQyxtQkFBTztnQkFDTGdQLEtBQUt6RyxZQUFMeUcsQ0FBa0JoUDtBQUNwQjtZQUNBLElBQUkyZCxZQUFZL1AsZ0JBQWdCO2dCQUM5QjJCLFlBQVlsRSxzQkFBc0IsS0FBbENrRSxDQUF3Q3ZQO0FBQzFDO0FBQ0Y7UUFFQSxJQUdNK2QseUJBQXNCQywyQkFINUIsTUFHTUQsK0JBQStCekk7WUFHekIsZ0JBQVc7Z0JBQ25CLE9BQU8vTTtBQUNUO1lBRUEsU0FBYTtnQkFDWCxPQUFPQTtBQUNUO1lBRUEsV0FBQW5ILENBQVlnVTtnQkFDVjVKLE1BQU00SixlQUFlNEkseUJBQXVCdFc7Z0JBWDdCaUUsS0FBQWtMLEtBQWFELE1BQU1DLEdBQUd0TztnQkFZckM2RSxJQUFJNlEsS0FDRiw2Q0FBNkN0UyxLQUFLbkQsTUFBTWQsZ0JBQWdCc0k7QUFFNUU7O1FBaEJJK04seUJBQXNCQywyQkFBQXpSLFdBQUEsRUFIM0IyUixXQUFXbE8sWUFDWG1PLFFBQVFyQixpQkFDUnNCLGVBQWU3VixnREFZYStDLDBCQVh2QnlTO1FBbUJORixlQUFlRTtRQUVmLElBQUlWLGVBQWU7WUFDakIsTUFBTWdCLGVBQWUsS0FBSWhCLGdCQUFlaUIsS0FBSyxDQUFDQyxHQUFHQztnQkFDL0MsTUFBTUMsWUFBWUYsRUFBRWxhLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFPMGI7Z0JBQzNDLE1BQU1DLFlBQVlILEVBQUVuYSxLQUFLNEwsTUFBTSxLQUFLak4sT0FBTzBiO2dCQUMzQyxNQUFNRSxjQUFjSCxVQUFVemIsT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQU01RDtnQkFDL0QsTUFBTXViLGNBQWNILFVBQVUzYixPQUFRNmIsS0FBTUEsRUFBRTFYLFdBQVcsTUFBTTVEO2dCQUMvRCxNQUFNd2IsZ0JBQWdCTixVQUFVbGIsU0FBU3FiO2dCQUN6QyxNQUFNSSxnQkFBZ0JMLFVBQVVwYixTQUFTdWI7Z0JBQ3pDLElBQUlDLGtCQUFrQkMsZUFDcEIsT0FBT0EsZ0JBQWdCRDtnQkFDekIsSUFBSUgsZ0JBQWdCRSxhQUFhLE9BQU9GLGNBQWNFO2dCQUN0RCxPQUFPOztZQUdULEtBQUssTUFBTUcsU0FBU1osY0FBYztnQkFDaEMsTUFBTXpOLGFBQ0pxTyxNQUFNQyxnQkFBZ0J4WCxRQUFRdVgsTUFBTTdOLE9BQU8rTjtnQkFDN0MsTUFBTUMsZUFBZW5FLG9CQUFvQm9FLFdBQ3ZDek8sWUFDQXFPLE9BQ0F4QixRQUNBRCxlQUNBRCxPQUNBaFYsYUFDQXVVO2dCQUVGLEtBQUtzQyxjQUFjO2dCQUVuQixPQUNFeE8sWUFBWTBPLHNCQUFvQnhNLFNBQ2hDQSxTQUFPdkwsWUFDUEEsWUFBVWdZLGlCQUNWQSxtQkFDRUg7Z0JBRUosTUFBTWxmLGFBQWErYSxvQkFBb0JpQixhQUNyQzZCLHdCQUNBdUIsc0JBQ0F4TTtnQkFHRixJQUFJNVMsWUFBWTtvQkFDZCxNQUFNaWMsZ0JBQWdCdk0sb0JBQW9CcVAsTUFBTTdOLE9BQTFCeEIsQ0FDcEJxUCxNQUFNNWEsS0FBSzhCLFFBQVEsY0FBYyxPQUFPdkM7b0JBRTFDcVgsb0JBQW9CcFQsZ0JBQ2xCa1csd0JBQ0F1QixzQkFDQSxFQUFDbkQsa0JBQWtCNVUsY0FDbkJnWTtBQUVKO0FBQ0Y7QUFDRjtRQUVBLE9BQU94QjtBQUNUO0lBRUEsa0NBQU9MLENBQ0x2QztRQU9BLE1BQU10RSxLQUFLRCxNQUFNQyxHQUFHc0U7UUFDcEIsTUFBTXFFLFdBQVc1VSxTQUFTd0IsSUFDeEIrTyxZQUNBdlEsU0FBUzNLLElBQUl3ZixPQUFPQyxVQUFVN0k7UUFFaEMsTUFBTThJLGVBQWVILFVBQVV0TixRQUFRO1FBRXZDLE1BQU0wTixhQUNKcmUsTUFBTUMsUUFBUW1lLGlCQUFpQkEsYUFBYXBjLFNBQVMsSUFDakRoQyxNQUFNc04sS0FBSyxJQUFJc0gsSUFBSSxLQUFJd0osbUJBQ3ZCcGUsTUFBTXNOLEtBQUssSUFBSXNILElBQUksRUFBQ1U7UUFFMUIsTUFBTWxQLGNBQWNpRCxTQUFTakQsWUFBWXdULGVBQWU7UUFDeEQsTUFBTTlXLE9BQU8sSUFBSXViLFdBQVc1RCxLQUFLO1FBQ2pDLE1BQU13QixnQkFBb0NvQyxXQUFXM2MsSUFBS2hELFFBQ2pEO1lBQ0x5SCxNQUFNekg7WUFDTjBILGFBQWFpRCxTQUFTakQsWUFBWXdULFlBQVlsYjtZQUM5Q3VELFVBQVU7WUFDVnJDLE1BQU15Rzs7UUFJVixPQUFPO1lBQ0x2RDtZQUNBc0Q7WUFDQTZWO1lBQ0FELE9BQU8sSUFBSXhVLFdBQ1R5VyxVQUFVSyxZQUFZOVcsT0FBT2lULEtBQUt3RCxTQUFTSyxhQUFhOVcsT0FBT2lULEtBQUs7O0FBRTFFO0lBRVEsMkJBQU84RCxDQUNiemI7UUFFQSxJQUFJMGIsYUFBYTtRQUNqQixPQUFPMWIsS0FDSjRMLE1BQU0sS0FDTmpOLE9BQU8wYixTQUNQc0IsUUFBU2xFO1lBQ1IsSUFBSUEsUUFBUTNVLFdBQVcsTUFBTTtnQkFDM0IsT0FBTyxFQUNMO29CQUFFMEksV0FBV29RLE1BQU1uRSxRQUFRNUwsTUFBTTtvQkFBWTZCLE9BQU9nTzs7QUFFeEQ7WUFDQSxJQUFJakUsUUFBUTNVLFdBQVcsTUFBTTtnQkFDM0IsT0FBTyxFQUNMO29CQUFFMEksV0FBV29RLE1BQU1uRSxRQUFRNUwsTUFBTTtvQkFBWTZCLE9BQU9nTzs7QUFFeEQ7WUFDQSxPQUFPOztBQUViO0lBRVEsbUJBQU83RCxDQUNibGMsUUFDQTRRLFlBQ0FrQztRQUVBcFIsT0FBT3FSLGVBQWUvUyxPQUFPa0MsYUFBYWxDLFFBQVE0USxZQUFZO1lBQzVEdFEsT0FBT3dTO1lBQ1BFLFVBQVU7WUFDVnNGLGNBQWM7WUFDZEQsWUFBWTs7UUFHZCxPQUFPM1csT0FBT1UseUJBQ1pwQyxPQUFPa0MsYUFBYWxDLFFBQ3BCNFE7QUFFSjtJQUVRLHNCQUFPL0ksQ0FDYjdILFFBQ0E0USxZQUNBc1Asa0JBQ0FYLGtCQUdLO1FBRUwsTUFBTTNOLFFBQVE1UixRQUFRa0MsYUFBYWxDO1FBQ25DLE1BQU1FLGFBQWF3QixPQUFPVSx5QkFBeUJ3UCxPQUFPaEI7UUFDMURzUCxpQkFBaUJyTyxRQUFTQyxLQUFNQSxFQUFFRixPQUFPaEIsWUFBWTFRO1FBQ3JEcWYsZ0JBQWdCMU4sUUFBUSxFQUFHaEMsc0JBQVdrQyxrQkFDcENsQyxVQUFVK0IsT0FBT2hCLFlBQVltQjtBQUVqQztJQUVRLGlCQUFPc04sQ0FDYnpPLFlBQ0FxTyxPQUNBeEIsUUFDQUQsZUFDQUQsT0FDQWhWLGFBQ0F1VTtRQVlBLE9BQU0xTCxRQUFFQSxRQUFNL00sTUFBRUEsUUFBUzRhO1FBQ3pCLE1BQU1rQixpQkFBaUI5YixLQUFLOEIsUUFBUSxjQUFjO1FBQ2xELE1BQU0yTSxVQUFVbU0sTUFBTUM7UUFFdEIsSUFBSTlOLFdBQVcsVUFBVStPLG1CQUFtQixJQUFJO1lBQzlDLE9BQU9sRixvQkFBb0JtRixtQkFDekIsVUFDQXROLFNBQ0FtSSxvQkFBb0JvRix1QkFBdUI5WCxhQUFhdVUsaUJBQ3hELEVBQ0U7Z0JBQUVqTixXQUFXL0g7Z0JBQW9CaUssT0FBTztlQUN4QztnQkFBRWxDLFdBQVd5USxTQUFTO29CQUFFQyxhQUFhOztnQkFBZ0J4TyxPQUFPOztBQUdsRTtRQUVBLElBQUlYLFdBQVcsVUFBVStPLG1CQUFtQixRQUFRO1lBQ2xELE9BQU9sRixvQkFBb0JtRixtQkFDekIsYUFDQXROLFNBQ0FtSSxvQkFBb0J1RixxQkFBcUJqWSxhQUFhdVUsaUJBQ3RELEVBQ0U7Z0JBQUVqTixXQUFXL0g7Z0JBQW9CaUssT0FBTztlQUN4QztnQkFBRWxDLFdBQVd5USxTQUFTO29CQUFFQyxhQUFhOztnQkFBZ0J4TyxPQUFPOztBQUdsRTtRQUVBLElBQUlYLFdBQVcsU0FBUytPLG1CQUFtQixRQUFRO1lBQ2pELE9BQU9sRixvQkFBb0JtRixtQkFDekIsV0FDQXROLFNBQ0FtSSxvQkFBb0J3RixtQkFBbUJsWSxhQUFhdVUsaUJBQ3BELEVBQUM7Z0JBQUVqTixXQUFXNkIsTUFBTTtnQkFBZUssT0FBTzs7QUFFOUM7UUFFQSxJQUFJWCxXQUFXLFNBQVMrTyxtQkFBbUIsUUFBUTtZQUNqRCxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CeUYscUJBQ2xCblksYUFDQXVVLGdCQUNBVSxnQkFFRixFQUNFO2dCQUFFM04sV0FBVy9IO2dCQUFvQmlLLE9BQU87ZUFDeEM7Z0JBQUVsQyxXQUFXeVEsU0FBUztvQkFBRUMsYUFBYTs7Z0JBQWdCeE8sT0FBTzs7QUFHbEU7UUFFQSxJQUFJWCxXQUFXLFlBQVkrTyxtQkFBbUIsUUFBUTtZQUNwRCxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CMEYscUJBQ2xCcFksYUFDQXVVLGdCQUNBVSxnQkFFRixFQUNFO2dCQUFFM04sV0FBVzZCLE1BQU07Z0JBQWVLLE9BQU87ZUFDekM7Z0JBQUVsQyxXQUFXeVEsU0FBUztvQkFBRUMsYUFBYTs7Z0JBQWdCeE8sT0FBTzs7QUFHbEU7UUFFQSxJQUFJWCxXQUFXLFNBQVMrTyxtQkFBbUIxQyxRQUFRO1lBQ2pELE9BQU94QyxvQkFBb0JtRixtQkFDekIsUUFDQXROLFNBQ0FtSSxvQkFBb0IyRixlQUNsQnJZLGFBQ0F1VSxnQkFDQVUsZUFDQUMsU0FFRnhDLG9CQUFvQjZFLHFCQUFxQks7QUFFN0M7UUFFQSxJQUFJL08sV0FBVyxTQUFTK08sbUJBQW1CMUMsUUFBUTtZQUNqRCxNQUFNb0QsY0FDSjVGLG9CQUFvQjZFLHFCQUFxQks7WUFDM0MsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixVQUNBdE4sU0FDQW1JLG9CQUFvQjZGLGlCQUNsQnZZLGFBQ0F1VSxnQkFDQVUsZUFDQUMsU0FFRixFQUNFO2dCQUFFNU4sV0FBVy9IO2dCQUFvQmlLLE9BQU87a0JBQ3JDOE8sWUFBWTVkLElBQUksRUFBRzRNLHNCQUFXa0MsbUJBQU87Z0JBQ3RDbEM7Z0JBQ0FrQyxPQUFPQSxRQUFROztBQUl2QjtRQUVBLElBQUlYLFdBQVcsWUFBWStPLG1CQUFtQjFDLFFBQVE7WUFDcEQsTUFBTW9ELGNBQ0o1RixvQkFBb0I2RSxxQkFBcUJLO1lBQzNDLE9BQU9sRixvQkFBb0JtRixtQkFDekIsVUFDQXROLFNBQ0FtSSxvQkFBb0I4RixpQkFDbEJ4WSxhQUNBdVUsZ0JBQ0FVLGVBQ0FDLFNBRUZvRDtBQUVKO1FBR0EsTUFBTUcsbUJBQW1CYixlQUFlbFEsTUFBTSxLQUFLak4sT0FBTzBiO1FBQzFELE1BQU11QyxjQUNKRCxpQkFBaUJ6ZCxTQUFTLEtBQzFCeWQsaUJBQWlCRSxNQUFPckMsS0FBTUEsRUFBRTFYLFdBQVc7UUFDN0MsSUFBSThaLGVBQWVkLG1CQUFtQjFDLFFBQVE7WUFDNUMsTUFBTTBELG1CQUFtQkgsaUJBQ3RCL2QsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNLElBQ25Cak4sSUFBS3lFLFNBQUk7Z0JBQ1JBO2dCQUNBQyxhQUFhLEdBQUdEO2dCQUNoQmxFLFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBRVYsTUFBTXdaLFNBQVNKLGlCQUFpQi9kLElBQUs0YixLQUFNQSxFQUFFM08sTUFBTSxJQUFJOEwsS0FBSztZQUM1RCxNQUFNNkUsY0FDSjVGLG9CQUFvQjZFLHFCQUFxQks7WUFDM0MsSUFBSS9PLFdBQVcsT0FBTztnQkFDcEIsT0FBTzZKLG9CQUFvQm1GLG1CQUN6QixTQUFTZ0IsVUFDVHRPLFNBQ0FtSSxvQkFBb0IyRixlQUNsQnJZLGFBQ0F1VSxnQkFDQXFFLGtCQUNBaEIsaUJBRUZVO0FBRUo7WUFDQSxJQUFJelAsV0FBVyxPQUFPO2dCQUNwQixPQUFPNkosb0JBQW9CbUYsbUJBQ3pCLFdBQVdnQixVQUNYdE8sU0FDQW1JLG9CQUFvQjZGLGlCQUNsQnZZLGFBQ0F1VSxnQkFDQXFFLGtCQUNBaEIsaUJBRUYsRUFDRTtvQkFBRXRRLFdBQVcvSDtvQkFBb0JpSyxPQUFPO3NCQUNyQzhPLFlBQVk1ZCxJQUFJLEVBQUc0TSxzQkFBV2tDLG1CQUFPO29CQUN0Q2xDO29CQUNBa0MsT0FBT0EsUUFBUTs7QUFJdkI7WUFDQSxJQUFJWCxXQUFXLFVBQVU7Z0JBQ3ZCLE9BQU82SixvQkFBb0JtRixtQkFDekIsV0FBV2dCLFVBQ1h0TyxTQUNBbUksb0JBQW9COEYsaUJBQ2xCeFksYUFDQXVVLGdCQUNBcUUsa0JBQ0FoQixpQkFFRlU7QUFFSjtBQUNGO1FBRUEsSUFBSXpQLFdBQVcsU0FBUytPLG1CQUFtQiwyQkFBMkI7WUFDcEUsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixhQUNBdE4sU0FDQW1JLG9CQUFvQm9HLG9CQUFvQjlZLGFBQWF1VSxpQkFDckQsRUFDRTtnQkFBRWpOLFdBQVdvUSxNQUFNO2dCQUFrQmxPLE9BQU87ZUFDNUM7Z0JBQUVsQyxXQUFXb1EsTUFBTTtnQkFBZ0JsTyxPQUFPO2VBQzFDO2dCQUFFbEMsV0FBV3RHO2dCQUFxQndJLE9BQU87O0FBRy9DO1FBRUEsSUFBSVgsV0FBVyxTQUFTK08sbUJBQW1CLHlCQUF5QjtZQUNsRSxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CcUcsNEJBQ2xCL1ksYUFDQXVVLGdCQUNBcUQsZ0JBQ0E5WixzQkFBc0JLLGNBRXhCdVUsb0JBQW9Cc0csd0JBQXdCcEI7QUFFaEQ7UUFFQSxNQUFNcUIsa0JBQTBDO1lBQzlDLGVBQWVuYixzQkFBc0JDO1lBQ3JDLHlCQUF5QkQsc0JBQXNCRTtZQUMvQyxlQUFlRixzQkFBc0JHO1lBQ3JDLGVBQWVILHNCQUFzQkk7WUFDckMseUJBQXlCSixzQkFBc0JLO1lBQy9DLHNCQUFzQkwsc0JBQXNCTTtZQUM1QyxrQkFBa0JOLHNCQUFzQk87WUFDeEMsZ0JBQWdCUCxzQkFBc0JRO1lBQ3RDLGdCQUFnQlIsc0JBQXNCUztZQUN0QyxnQkFBZ0JULHNCQUFzQlU7WUFDdEMsZ0JBQWdCVixzQkFBc0JXO1lBQ3RDLHFCQUFxQlgsc0JBQXNCWTtZQUMzQyxrQkFBa0JaLHNCQUFzQmE7O1FBRzFDLE1BQU11YSxlQUFlRCxnQkFBZ0JyQjtRQUNyQyxJQUFJc0IsZ0JBQWdCclEsV0FBVyxPQUFPO1lBQ3BDLE9BQU82SixvQkFBb0JtRixtQkFDekJuRixvQkFBb0J5RyxvQkFBb0J2QixpQkFDeENyTixTQUNBbUksb0JBQW9CcUcsNEJBQ2xCL1ksYUFDQXVVLGdCQUNBcUQsZ0JBQ0FzQixlQUVGeEcsb0JBQW9Cc0csd0JBQXdCcEI7QUFFaEQ7UUFFQSxJQUFJL08sV0FBVyxTQUFTK08sZUFBZWhaLFdBQVcsV0FBVztZQUMzRCxNQUFNd2EsY0FBY3hCLGVBQWVoYSxRQUFRLFlBQVksSUFBSThKLE1BQU0sS0FBSztZQUN0RSxPQUFPZ0wsb0JBQW9CbUYsbUJBQ3pCdUIsYUFDQTdPLFNBQ0FtSSxvQkFBb0JvQixtQkFDbEJzRixhQUNBeEIsZ0JBQ0EsT0FDQSxPQUVGbEYsb0JBQW9CMkcsbUJBQW1CekI7QUFFM0M7UUFFQSxNQUFNMEIsZUFBZTFCLGVBQWVsUSxNQUFNLEtBQUtqTixPQUFPMGI7UUFDdEQsTUFBTW9ELGdCQUFnQixJQUFJM0wsSUFBWSxFQUNwQyxVQUNBLFVBQ0Esa0JBQ0EsYUFDQSxjQUNBLFFBQ0EsUUFDQSxXQUNBLFNBQ0EsU0FDQSxTQUNBLFNBQ0EsY0FDQSxXQUNBLGFBQ0EsUUFDQTtRQUVGLElBQ0UwTCxhQUFhdGUsU0FBUyxNQUNyQjRjLGVBQWVoWixXQUFXLGNBQzFCZ1osZUFBZWhaLFdBQVcsa0JBQzFCMmEsY0FBY25LLElBQUlrSyxhQUFhLEtBQ2hDO1lBQ0EsTUFBTTdRLGdCQUFnQjZRLGFBQ25CN2UsT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQzNCbEUsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNLElBQ25Cak4sSUFBS3lFLFNBQUk7Z0JBQ1JBO2dCQUNBQyxhQUFhLEdBQUdEO2dCQUNoQmxFLFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBR1YsT0FBT3FULG9CQUFvQm1GLG1CQUN6QnhQLFlBQ0FrQyxTQUNBLEtBQ0s5QixjQUFjL04sSUFBS3VFLEtBQU02SixTQUFTN0osS0FDckM4SixhQUFhO2dCQUFFQyxTQUFTLDJCQUEyQlg7Z0JBQ25EWSxjQUFjO2dCQUFFN0osYUFBYTtnQkFDN0I4SixxQkFBcUI7Z0JBQ25COUosYUFBYTtrQkFHakJzVCxvQkFBb0I2RSxxQkFBcUJLO0FBRTdDO1FBRUEsT0FBT3ZjO0FBQ1Q7SUFFUSx5QkFBT3djLENBQ2J4UCxZQUNBa0MsU0FDQXZMLFlBQ0FnWTtRQUVBLE9BQU87WUFBRTNPO1lBQVlrQztZQUFTdkw7WUFBWWdZOztBQUM1QztJQUVRLDBCQUFPbUMsQ0FBb0JyZDtRQUNqQyxNQUFNMGQsZUFBZTFkLEtBQUs0TCxNQUFNLEtBQUs7UUFDckMsT0FBTzhSO0FBQ1Q7SUFFUSw4QkFBT1IsQ0FDYmxkO1FBRUEsTUFBTTJkLFdBQVczZCxLQUFLNEwsTUFBTSxLQUFLak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXO1FBQzVELE1BQU00QixTQUFrRTtRQUN4RWlaLFNBQVNuUSxRQUFRLENBQUNvUSxLQUFLQztZQUNyQixNQUFNeGEsT0FBT3VhLElBQUk5YixRQUFRLEtBQUs7WUFDOUI0QyxPQUFPdUcsS0FBSztnQkFBRU8sV0FBV29RLE1BQU12WTtnQkFBY3FLLE9BQU9tUTs7O1FBRXRELElBQ0U3ZCxLQUFLOEMsV0FBVyxjQUNoQjlDLEtBQUs4QyxXQUFXLGtCQUNoQjlDLEtBQUs4QyxXQUFXLFlBQ2hCOUMsS0FBSzhDLFdBQVcsVUFDaEI7WUFDQTRCLE9BQU91RyxLQUFLO2dCQUFFTyxXQUFXdEc7Z0JBQXFCd0ksT0FBT2lRLFNBQVN6ZTs7QUFDaEU7UUFDQSxPQUFPd0Y7QUFDVDtJQUVRLHlCQUFPNlksQ0FDYnZkO1FBRUEsTUFBTTJkLFdBQVczZCxLQUFLNEwsTUFBTSxLQUFLak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXO1FBQzVELE1BQU00QixTQUFrRTtRQUN4RWlaLFNBQVNuUSxRQUFRLENBQUNvUSxLQUFLQztZQUNyQixNQUFNeGEsT0FBT3VhLElBQUk5YixRQUFRLEtBQUs7WUFDOUI0QyxPQUFPdUcsS0FBSztnQkFBRU8sV0FBV29RLE1BQU12WTtnQkFBY3FLLE9BQU9tUTs7O1FBRXRELElBQUk3ZCxLQUFLOEMsV0FBVyxXQUFXO1lBQzdCNEIsT0FBT3VHLEtBQUs7Z0JBQUVPLFdBQVd0RztnQkFBcUJ3SSxPQUFPaVEsU0FBU3plOztBQUNoRTtRQUNBLE9BQU93RjtBQUNUO0lBRVEsZ0NBQU9rVCxDQUEwQnJMO1FBQ3ZDLE9BQU8wQixlQUFlNlAsZ0JBRWpCalE7WUFFSCxNQUFNOUUsTUFBV3pCLEtBQUt5QixLQUFLRSxNQUFNNlU7WUFDakM7Z0JBQ0UsSUFBSS9VLEtBQUtBLElBQUlXLE1BQU0sMEJBQTBCNkM7Z0JBQzdDLE9BQU01SSxLQUFFQSxjQUFlMkQsS0FBS3lXLE9BQU8sSUFBSXhSLFlBQVksT0FBT3RELElBQ3hENlU7Z0JBRUYsTUFBTWxRLGNBQWN0RyxLQUFLc0csWUFBWWpLO2dCQUNyQyxNQUFNcWEsYUFBYXBILG9CQUFvQnFILG1CQUFtQnBRO2dCQUMxRCxJQUNFRCxhQUFhd0osZUFDTnhKLFlBQVl3SixLQUFLN0ssZ0JBQWdCLFlBQ3hDO29CQUNBLE9BQU9xQixZQUFZd0osS0FBSzdLLGVBQWV5UjtBQUN6QztnQkFDQSxXQUFXcFEsWUFBWXJCLGdCQUFnQixZQUFZO29CQUNqRCxPQUFPcUIsWUFBWXJCLGVBQWV5UjtBQUNwQztnQkFDQSxJQUFJcFEsYUFBYXhJLGdCQUFnQndJLFlBQVl4SSxVQUFVLFlBQVk7b0JBQ2pFLE9BQU93SSxZQUFZeEksTUFBTW1ILGVBQWV5UjtBQUMxQztnQkFDQSxXQUFXcFEsWUFBWUcsY0FBYyxZQUFZO29CQUMvQyxPQUFPSCxZQUFZRyxVQUFVeEIsZUFBZXlSLFlBQVlyYTtBQUMxRDtnQkFDQSxNQUFNLElBQUl3SSxjQUNSLHVCQUF1QkksNEJBQTRCcUIsYUFBYTdRLGFBQWFzRztBQUVqRixjQUFFLE9BQU8yRTtnQkFDUCxJQUFJZSxLQUFLQSxJQUFJaUQsTUFBTSxpQkFBaUJPLHNCQUFzQnZFO2dCQUMxRCxNQUFNNE8sb0JBQW9CN0ssYUFDeEIvRCxHQUNBLGlCQUFpQnVFO0FBRXJCO0FBQ0Y7QUFDRjtJQUVRLHVCQUFPMlIsQ0FBaUJyUTtRQUM5QixJQUFJQSxLQUFLM08sV0FBVyxHQUFHLE9BQU8yTztRQUM5QixNQUFNc1EsT0FBT3RRLEtBQUtBLEtBQUszTyxTQUFTO1FBQ2hDLElBQUlpZixlQUFlQSxTQUFTLGFBQWFqaEIsTUFBTUMsUUFBUWdoQixPQUFPO1lBQzVELE1BQU1DLFdBQVd2USxLQUFLd1E7WUFDdEIsTUFBTUMsZUFBZUYsU0FBUzlQLGNBQWMvTztZQUM1QyxNQUFNZ2YsV0FBV0gsU0FBUzlZLFVBQVUvRjtZQUNwQyxNQUFNaWYsWUFBWUosU0FBUzFZLFdBQVduRztZQUN0QyxLQUFLK2UsaUJBQWlCQyxhQUFhQyxXQUFXLE9BQU8zUTtZQUNyRCxNQUFNNFEsU0FBZ0I7WUFDdEIsSUFBSUgsY0FBY0csT0FBT3hULEtBQUttVCxTQUFTOVAsaUJBQ2xDLElBQUlpUSxZQUFZQyxXQUFXQyxPQUFPeFQsS0FBSzFMO1lBQzVDLElBQUlnZixVQUFVRSxPQUFPeFQsS0FBS21ULFNBQVM5WTtZQUNuQyxJQUFJa1osV0FBV0MsT0FBT3hULEtBQUttVCxTQUFTMVk7WUFDcEMsT0FBTyxLQUFJbUksU0FBUzRRO0FBQ3RCO1FBQ0EsT0FBTzVRO0FBQ1Q7SUFFUSx5QkFBT29RLENBQW1CcFE7UUFDaEMsTUFBTWhNLGFBQWErVSxvQkFBb0JzSCxpQkFBaUJyUTtRQUN4RCxJQUFJaE0sV0FBVzNDLFdBQVcsR0FBRyxPQUFPMkM7UUFFcEMsTUFBTXNjLE9BQU90YyxXQUFXQSxXQUFXM0MsU0FBUztRQUM1QyxLQUFLaWYsZUFBZUEsU0FBUyxZQUFZamhCLE1BQU1DLFFBQVFnaEIsT0FBTztZQUM1RCxPQUFPdGM7QUFDVDtRQUVBLE1BQU11YyxXQUFXRDtRQUNqQixNQUFNTyxpQkFDSk4sU0FBUzlQLGNBQWMvTyxhQUN2QjZlLFNBQVM5WSxVQUFVL0YsYUFDbkI2ZSxTQUFTMVksV0FBV25HLGFBQ3BCNmUsU0FBU3pZLGFBQWFwRztRQUV4QixLQUFLbWYsZ0JBQWdCO1lBQ25CN2MsV0FBV3djO1lBQ1gsT0FBT3hjO0FBQ1Q7UUFFQUEsV0FBV3djO1FBQ1gsSUFBSUQsU0FBUzlQLGNBQWMvTyxXQUFXc0MsV0FBV29KLEtBQUttVCxTQUFTOVA7UUFDL0QsSUFBSThQLFNBQVM5WSxVQUFVL0YsV0FBV3NDLFdBQVdvSixLQUFLbVQsU0FBUzlZO1FBQzNELElBQUk4WSxTQUFTMVksV0FBV25HLFdBQVdzQyxXQUFXb0osS0FBS21ULFNBQVMxWTtRQUM1RCxJQUFJMFksU0FBU3pZLGFBQWFwRyxXQUFXc0MsV0FBV29KLEtBQUttVCxTQUFTelk7UUFDOUQsT0FBTzlEO0FBQ1Q7SUFFUSw2QkFBT21hLENBQ2I5WCxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLFNBQ25DK0ksYUFBYTtZQUFFQyxTQUFTLGdCQUFnQnVMO1lBQ3hDa0csUUFBUTtZQUNOcmIsYUFBYSxlQUFlbVY7WUFDNUIzYixNQUFNNlUsT0FBT3hSLGNBQWNJLFFBQVEyRDtZQUVyQzBhLG1CQUFtQjtZQUNqQnRiLGFBQWEsR0FBR21WO1lBQ2hCb0csUUFBUTtnQkFBRXpKLE1BQU0wSixjQUFjNWE7O1lBRWhDNmEsc0JBQXNCO1lBQUV6YixhQUFhO1lBQ3JDMGIsK0JBQStCO1lBQzdCMWIsYUFBYTs7QUFHbkI7SUFFUSwyQkFBTzZZLENBQ2JqWSxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLFFBQVEsU0FDM0MrSSxhQUFhO1lBQUVDLFNBQVMsZ0JBQWdCdUw7WUFDeENrRyxRQUFRO1lBQ05yYixhQUFhLGVBQWVtVjtZQUM1Qm9HLFFBQVE7Z0JBQ04vaEIsTUFBTTtnQkFDTjhDLE9BQU87b0JBQUV3VixNQUFNMEosY0FBYzVhOzs7WUFHakMwYSxtQkFBbUI7WUFDakJ0YixhQUFhLEdBQUdtVjtZQUNoQm9HLFFBQVE7Z0JBQ04vaEIsTUFBTTtnQkFDTjhDLE9BQU87b0JBQUV3VixNQUFNMEosY0FBYzVhOzs7WUFHakM2YSxzQkFBc0I7WUFBRXpiLGFBQWE7WUFDckMwYiwrQkFBK0I7WUFDN0IxYixhQUFhOztBQUduQjtJQUVRLHlCQUFPOFksQ0FDYmxZLGFBQ0F1VTtRQUVBLE9BQU8sRUFDTDVZLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQytJLGFBQWE7WUFBRUMsU0FBUyxZQUFZdUw7WUFDcEM1TCxTQUFTO1lBQUV4SixNQUFNO1lBQU9sRSxVQUFVO1lBQU1yQyxNQUFNO1lBQzlDcVEsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEsMkJBQU80RCxDQUNiblksYUFDQXVVLGdCQUNBVTtRQUVBLE9BQU8sRUFDTHRaLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQ2xCLG1CQUFtQm1XLGdCQUNuQmxNLGFBQWE7WUFDWEMsU0FBUyxvQkFBb0J1TDtZQUUvQmtHLFFBQVE7WUFDTnJiLGFBQWEsNkNBQTZDbVY7WUFDMURvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ05zWSxNQUFNMEosY0FBY25OLE9BQU94UixjQUFjTyxRQUFRd0Q7O1lBR3JEaUosY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7WUFFckJzRyxzQkFBc0I7WUFBRXpiLGFBQWE7O0FBRXpDO0lBRVEsMkJBQU9nWixDQUNicFksYUFDQXVVLGdCQUNBVTtRQUVBLE9BQU8sRUFDTHRaLHNCQUFzQnFFLGFBQWEsVUFBVSxTQUM3Q2xCLG1CQUFtQm1XLGdCQUNuQmxNLGFBQWE7WUFBRUMsU0FBUyxVQUFVdUw7WUFDbEM1TCxTQUFTO1lBQUV4SixNQUFNO1lBQU9sRSxVQUFVO1lBQU1yQyxNQUFNO1lBQzlDcVEsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEscUJBQU84RCxDQUNiclksYUFDQXVVLGdCQUNBVSxlQUNBQztRQUVBLE9BQU8sRUFDTHZaLHNCQUFzQnFFLGFBQWEsT0FBT2tWLFNBQzFDcFcsbUJBQW1CbVcsZ0JBQ25CbE0sYUFBYTtZQUFFQyxTQUFTLGNBQWN1TDtZQUN0Q3RMLGNBQWM7WUFDWjdKLGFBQWEsR0FBR21WO1lBQ2hCb0csUUFBUTtnQkFBRXpKLE1BQU0wSixjQUFjNWE7O1lBRWhDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEsdUJBQU9nRSxDQUNidlksYUFDQXVVLGdCQUNBVSxlQUNBQztRQUVBLE9BQU8sRUFDTHZaLHNCQUFzQnFFLGFBQWEsT0FBT2tWLFNBQzFDcFcsbUJBQW1CbVcsZ0JBQ25CbE0sYUFBYTtZQUNYQyxTQUFTLHVCQUF1QnVMO1lBRWxDa0csUUFBUTtZQUNOcmIsYUFBYSwrQ0FBK0NtVjtZQUM1RDNiLE1BQU02VSxPQUFPeFIsY0FBY08sUUFBUXdEO1lBRXJDaUosY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUFFekosTUFBTTBKLGNBQWM1YTs7WUFFaEMrYSxvQkFBb0I7WUFDbEIzYixhQUFhLE1BQU1tVjtZQUVyQnNHLHNCQUFzQjtZQUFFemIsYUFBYTs7QUFFekM7SUFFUSx1QkFBT29aLENBQ2J4WSxhQUNBdVUsZ0JBQ0FVLGVBQ0FDO1FBRUEsT0FBTyxFQUNMdlosc0JBQXNCcUUsYUFBYSxVQUFVa1YsU0FDN0NwVyxtQkFBbUJtVyxnQkFDbkJsTSxhQUFhO1lBQUVDLFNBQVMsWUFBWXVMO1lBQ3BDdEwsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUFFekosTUFBTTBKLGNBQWM1YTs7WUFFaEMrYSxvQkFBb0I7WUFDbEIzYixhQUFhLE1BQU1tVjs7QUFHekI7SUFFUSwwQkFBT3VFLENBQ2I5WSxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLE9BQU8sNEJBQzFDK0ksYUFBYTtZQUNYQyxTQUFTLG9DQUFvQ3VMO1lBRS9DekwsU0FBUztZQUNQM0osTUFBTTtZQUNOQyxhQUFhO1lBRWYwSixTQUFTO1lBQ1AzSixNQUFNO1lBQ05DLGFBQ0U7WUFFSnVKLFNBQVM7WUFDUHhKLE1BQU07WUFDTmxFLFVBQVU7WUFDVkcsTUFBTXdOO1lBQ054SixhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWY2SixjQUFjO1lBQUU3SixhQUFhLEdBQUdtVjtZQUNoQ3dHLG9CQUFvQjtZQUNsQjNiLGFBQWEsTUFBTW1WOztBQUd6QjtJQUVRLGtDQUFPd0UsQ0FDYi9ZLGFBQ0F1VSxnQkFDQXpZLE1BQ0FvZDtRQUVBLE1BQU04QixPQUE2RCxFQUNqRXJmLHNCQUFzQnFFLGFBQWEsT0FBT2xFLE9BQzFDaU4sYUFBYTtZQUFFQyxTQUFTLFlBQVl1TDtZQUNwQ3RMLGNBQWM7WUFDWjdKLGFBQWEsR0FBR21WOztRQUlwQixNQUFNa0YsV0FBVzNkLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFRNmIsS0FBTUEsRUFBRTFYLFdBQVc7UUFDNUQ2YSxTQUFTblEsUUFBU29RO1lBQ2hCLE1BQU12YSxPQUFPdWEsSUFBSTliLFFBQVEsS0FBSztZQUM5Qm9kLEtBQUtqVSxLQUFLK0IsU0FBUztnQkFBRTNKO2dCQUFNQyxhQUFhLE9BQU9EOzs7UUFHakQsSUFDRXJELEtBQUs4QyxXQUFXLGNBQ2hCOUMsS0FBSzhDLFdBQVcsa0JBQ2hCOUMsS0FBSzhDLFdBQVcsWUFDaEI5QyxLQUFLOEMsV0FBVyxVQUNoQjtZQUNBb2MsS0FBS2pVLEtBQ0g0QixTQUFTO2dCQUNQeEosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZHLE1BQU13TjtnQkFDTnhKLGFBQWE7O0FBR25CO1FBQ0EsSUFBSXRELEtBQUs4QyxXQUFXLGtCQUFrQjlDLEtBQUs4QyxXQUFXLFVBQVU7WUFDOURvYyxLQUFLalUsS0FDSDRCLFNBQVM7Z0JBQUV4SixNQUFNO2dCQUFTbEUsVUFBVTtnQkFBT21FLGFBQWE7Z0JBQ3hEdUosU0FBUztnQkFDUHhKLE1BQU07Z0JBQ05sRSxVQUFVO2dCQUNWbUUsYUFBYTtnQkFFZnVKLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7O0FBR25CO1FBRUEsSUFBSXRELEtBQUs4QyxXQUFXLGlCQUFpQjlDLEtBQUs4QyxXQUFXLFlBQVk7WUFDL0RvYyxLQUFLalUsS0FDSGdVLG9CQUFvQjtnQkFDbEIzYixhQUFhLE1BQU1tVjs7QUFHekI7UUFFQSxJQUNFMkUsaUJBQWlCcGIsc0JBQXNCTyxZQUN2QzZhLGlCQUFpQnBiLHNCQUFzQlUsVUFDdkMwYSxpQkFBaUJwYixzQkFBc0JXLFFBQ3ZDO1lBQ0F1YyxLQUFLalUsS0FDSGtDLGNBQWM7Z0JBQ1o3SixhQUFhLGNBQWNtVjtnQkFDM0IzYixNQUFNMEk7O0FBR1o7UUFDQSxJQUFJNFgsaUJBQWlCcGIsc0JBQXNCWSxhQUFhO1lBQ3REc2MsS0FBS2pVLEtBQ0hrQyxjQUFjO2dCQUNaN0osYUFBYSx1QkFBdUJtVjtnQkFDcEMzYixNQUFNLEVBQUN5Rzs7QUFHYjtRQUVBLE9BQU8yYjtBQUNUO0lBRVEseUJBQU9sSCxDQUNiekwsWUFDQVosV0FDQWEsVUFDQUMscUJBQThCO1FBRTlCLE1BQU1mLG9CQUFxQnZJLEtBQ3pCQSxFQUNHeUksTUFBTSxLQUNOak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQzNCbEUsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNO1FBRXhCLE1BQU1jLGdCQUFnQmpCLGtCQUFrQkMsV0FBVy9NLElBQUt5RSxTQUFJO1lBQzFEQTtZQUNBQyxhQUFhLEdBQUdEO1lBQ2hCbEUsVUFBVTtZQUNWckMsTUFBTXlHOztRQUdSLE1BQU1MLGFBQW1FLEtBQ3BFeUosY0FBYy9OLElBQUt1RSxLQUFNNkosU0FBUzdKLEtBQ3JDOEosYUFBYTtZQUFFQyxTQUFTLDJCQUEyQlg7WUFDbkRZLGNBQWM7WUFBRTdKLGFBQWE7WUFDN0I4SixxQkFBcUI7WUFDbkI5SixhQUFhOztRQUlqQixJQUFJa0osYUFBYSxTQUFTQyxvQkFBb0I7WUFDNUN2SixXQUFXK0gsS0FDVDRCLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVkcsTUFBTXdOO2dCQUNOeEosYUFBYTtnQkFFZnVKLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7Z0JBRWZ1SixTQUFTO2dCQUNQeEosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZtRSxhQUFhOztBQUduQjtRQUVBLE9BQU9KO0FBQ1Q7OztBQ3h0Q0ksU0FBVWljLGFBQWE5VTs7SUFFM0IsSUFBTStVLG1CQUFOLE1BQU1BOzs7OztZQUNZOVgsS0FBQXlCLE1BQU1DLFFBQVFDLElBQUlvVyxtQkFBaUJoYyxNQUFNNEYsSUFBSW9CO0FBQVM7UUFFdEUsMEJBQU9pVixDQUNMQztZQUVBLE9BQU9BLE9BQU8zZ0IsSUFBS2dNLFVBQUs7Z0JBQ3RCNEUsU0FBUyxHQUFHNUUsTUFBTXZIO2dCQUNsQm1jLFlBQVksTUFBTTFSLGFBQWF3RCxTQUFTMUc7O0FBRTVDO1FBRUEsZ0JBQU82VSxDQUNMN1UsT0FDQThVO1lBRUEsTUFBTWxPLFdBQVdrTyxXQUFXOVUsTUFBTXZIO1lBQ2xDLE1BQU1wSCxlQUNHdVYsYUFBYSxjQUNoQkEsV0FDQWpMLFNBQVN3QixJQUFJNkMsT0FBT3JFLFNBQVMzSyxJQUFJc0s7WUFFdkMsV0FBV2pLLFVBQVUsYUFBYSxPQUFPO1lBQ3pDLElBQUlBLFVBQVUsTUFBTSxPQUFPO1lBQzNCLElBQUlpQixNQUFNQyxRQUFRbEIsUUFBUSxPQUFPQSxNQUFNTSxTQUFTOE47WUFDaEQsT0FBTztBQUNUO1FBRUEsY0FBT2lGLENBQ0xqRixTQUNBNUssVUFBdUM7WUFFdkMsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtnSTtZQUM5QnZHLElBQUk2USxLQUFLO1lBRVQsTUFBTStGLGdCQUFnQnhWLFFBQVFvVixPQUFPbFYsU0FBUzFMLE9BQVFpTSxTQUNwRHRELEtBQUttWSxVQUFVN1UsT0FBT25MLFFBQVFtZ0I7WUFNaEMsS0FBSyxNQUFNaFYsU0FBUytVLGVBQWU3UixhQUFhd0QsU0FBUzFHO1lBRXpELElBQUlpVixnQkFBNEI7WUFDaEMsSUFBSXBnQixRQUFRcWdCLGNBQWM7Z0JBQ3hCL1csSUFBSTZRLEtBQUs7Z0JBQ1RpRyxnQkFBZ0J2WSxLQUFLZ1ksb0JBQW9CSztnQkFDekM1VyxJQUFJNlEsS0FDRiw0QkFBNEJpRyxjQUFjM2dCO0FBRTlDO1lBRUEsTUFBTW9aLGlCQUF3RCxDQUFBO1lBQzlELElBQUk3WSxRQUFRc2dCLGlCQUFpQixPQUFPO2dCQUNsQ3pILGVBQWUwSCx1QkFBdUI7QUFDeEM7WUFFQSxNQUFNQyxjQUFjTixjQUFjL2dCLElBQUtnTSxTQUNyQ2dNLG9CQUFvQndCLE9BQU94TixPQUFPbkwsUUFBUWdILGtCQUFrQjZSO1lBRTlEdlAsSUFBSTZRLEtBQUssYUFBYXFHLFlBQVkvZ0I7WUFFbEMsT0FBTztnQkFDTDJRLFFBQVF3UDtnQkFDUlk7Z0JBQ0ExUSxXQUFXLEtBQ05zUTs7QUFHVDs7SUF0RUlULG1CQUFnQkMscUJBQUFuWCxXQUFBLEVBRHJCNkgsT0FBTyxDQUFBLE1BQ0ZxUDtJQXdFTi9oQixPQUFPQyxPQUFPOGhCLGtCQUFrQixRQUFRO1FBQ3RDbmpCLE9BQU8sY0FBY29POztJQUV2QixPQUFPK1U7QUFDVDs7QUMzRUFjLFdBQVdqWCxJQUFJa1gsZ0JBQWdCQyxZQUM1QkMsT0FBTztJQUNON1UsV0FBVyxTQUFTOFUsZUFDbEJDLFVBQ0FDO1FBRUFBLE1BQ0VBLGVBQ1FELGFBQWEsV0FDakJsakIsT0FBT0MsT0FDTGlqQixVQUNBRSw0QkFFRkE7UUFDTixPQUFPdFksV0FBVztZQUNoQkMsT0FBT29ZLElBQUlFLFlBQVlyWSxNQUFNc1ksVUFBVXRZLE1BQU1DO1lBQzdDc1ksU0FBU0osSUFBSUUsWUFBWW5oQixZQUFZOztBQUV6QztHQUVEOEI7O0FBRUg2ZSxXQUFXalgsSUFBSWtYLGdCQUFnQlUsUUFDNUJSLE9BQU87SUFDTjdVLFdBQVcsU0FBU3NWLFdBQ2xCUCxVQUVBQztRQUVBLE9BQU8sU0FBU08sZ0JBQ2RwbEIsUUFDQVUsYUFDQVI7WUFFQSxPQUFPMk0sT0FBTytYLFlBQWE1a0IsT0FBcEI2TSxDQUNMN00sUUFDQVUsYUFDQVI7QUFFSjtBQUNGO0dBRUR3Rjs7QUFFSDZlLFdBQVdqWCxJQUFJeUssZUFBZUMsVUFDM0IwTSxPQUNDN2dCLFlBQVk7SUFDVkwsVUFBVTtJQUdia0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWVzTixLQUMzQlgsT0FBTztJQUNON1UsV0FBVyxTQUFTeVYsT0FBT0M7UUFDekIsT0FBTzFoQixZQUFZO1lBQUUyaEIsU0FBU0Q7WUFBSy9oQixVQUFVOztBQUMvQztHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWUwTixLQUMzQmYsT0FBTztJQUNON1UsV0FBVyxTQUFTNlYsT0FBT0M7UUFDekIsT0FBTzloQixZQUFZO1lBQUUraEIsU0FBU0Q7WUFBS25pQixVQUFVOztBQUMvQztHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWU4TixZQUMzQm5CLE9BQU87SUFDTjdVLFdBQVcsU0FBU2lXLGFBQWFQO1FBQy9CLE9BQU8xaEIsWUFBWTtZQUFFa2lCLFdBQVdSO1lBQUsvaEIsVUFBVTs7QUFDakQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUl5SyxlQUFlaU8sWUFDM0J0QixPQUFPO0lBQ043VSxXQUFXLFNBQVNvVyxhQUFhTjtRQUMvQixPQUFPOWhCLFlBQVk7WUFBRXFpQixXQUFXUDtZQUFLbmlCLFVBQVU7O0FBQ2pEO0dBRURrQzs7QUFFSDZlLFdBQVdqWCxJQUFJeUssZUFBZW9PLE1BQzNCekIsT0FBTztJQUNON1UsV0FBVyxTQUFTdVcsUUFDbEJqbEI7UUFLQSxPQUFPLENBQUNuQixRQUFnQjBYO1lBQ3RCdlcsT0FBT0ksTUFBTUMsUUFBUUwsUUFBUUEsS0FBSyxLQUFLQTtZQUN2QyxXQUFXQSxTQUFTLGVBQWVBLEtBQUt1RyxNQUN0Q3ZHLE9BQVFBO1lBQ1YsT0FBTzBDLFlBQVk7Z0JBQ2pCMUMsTUFBTUE7Z0JBQ05xQyxVQUFVO2NBRkxLLENBR0o3RCxRQUFRMFg7O0FBRWY7R0FFRGhTOztBQXNCSDZlLFdBQVdqWCxJQUFJeUssZUFBZXNPLE1BQzNCM0IsT0FBTztJQUVON1UsV0FBVyxTQUFTeVcsUUFBUUM7UUFDMUIsT0FBTzFpQixZQUFZO1lBQ2pCMUMsTUFBTXlHO1lBQ04yZSxRQUFRO1lBQ1IvaUIsVUFBVTs7QUFHZDtHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWV5TyxNQUMzQjlCLE9BQU87SUFDTjdVLFdBQVcsU0FBUzRXLFVBQVUzaUI7UUFDNUIsTUFBTUosT0FBT25DLE1BQU1DLFFBQVFzQyxXQUFXQSxVQUFVcEMsT0FBT3FCLE9BQU9lO1FBQzlELE9BQU9ELFlBQVk7WUFDakJGLE1BQU1EO1lBQ05GLFVBQVU7O0FBRWQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUl5SyxlQUFlMk8sU0FDM0JoQyxPQUFPO0lBQ043VSxXQUFXLFNBQVM4VyxXQUFXQztRQUM3QixPQUFPL2lCLFlBQVk7WUFDakJnakIsZ0JBQWdCRCxRQUFRLFdBQVdBLE1BQU1BLElBQUlFO1lBQzdDdGpCLFVBQVU7O0FBRWQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUlpTyxnQkFBZ0J3TCxRQUM1QnJDLE9BQU87SUFDTjdVLFdBQVcsU0FBU21YLFVBQVV0ZjtRQUM1QixPQUFPN0QsWUFBWTtZQUNqQjZELE1BQU1BO1lBQ05sRSxVQUFVOztBQUVkO0dBRURrQzs7QUFFSDZlLFdBQVdqWCxJQUFJMlosZUFBZUMsYUFDM0J4QyxPQUFPO0lBQ043VSxXQUFXLFNBQVNzWCxlQUFleGY7UUFDakMsT0FBTzlELFlBQVk7WUFDakI4RCxhQUFhQTtZQUNibkUsVUFBVTs7QUFFZDtHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSWlPLGdCQUFnQjZMLE1BQU0xQyxPQUFPO0lBQUU3VSxXQUFXYjtHQUFRdEo7O0FDbk0zRCxNQUFPMmhCLGtCQUFrQkM7SUFDN0IsV0FBQWxtQixDQUFZbW1CO1FBQ1YvYixNQUFNK2IsS0FBS0YsVUFBVTNmO0FBQ3ZCOzs7QUNISSxNQUFPOGYsNEJBQTRCalg7SUFDdkMsV0FBQW5QLENBQVltbUI7UUFDVi9iLE1BQU1nYyxvQkFBb0I5ZixNQUFNNmYsS0FBTTtBQUN4Qzs7O0FDUUssSUFBTUUsdUJBQU4sTUFBTUE7SUFDWCxNQUFNQyxXQUFrQkM7UUFDdEIsTUFBTTNmLE1BQU0yZixLQUFLemY7UUFDakIsTUFBTTJNLFdBQVc3TSxJQUFJOE07UUFDckIsTUFBTTdNLFVBQVVELElBQUlHO1FBRXBCLE1BQU15ZixlQUFlQyxrQkFBa0JDLFFBQVE7UUFDL0MsSUFBSUM7UUFFSixJQUNFTCxxQkFBcUJNLHFCQUNyQk4scUJBQXFCNVgsa0JBQ3JCO1lBQ0E0WCxZQUFZLElBQUlPLHVCQUF1QlAsVUFBVWhYO1lBQ2pEcVgsYUFBY0wsVUFBcUNRO0FBQ3JELGVBQU8sTUFBTVIscUJBQXFCblgsWUFBWTtZQUM1QyxJQUFJbVgsVUFBa0JTLFdBQVcsS0FBSTtnQkFDbkNULFlBQVksSUFBSUYsb0JBQW9CRSxVQUFVaFg7QUFDaEQsbUJBQUs7Z0JBQ0hnWCxZQUFZLElBQUlsWCxjQUFja1gsVUFBVWhYO0FBQzFDO0FBQ0Y7UUFFQW1FLFNBQVNzVCxPQUFRVCxVQUF3QlUsUUFBUUwsWUFBWU0sS0FBSztZQUNoRUYsUUFBU1QsVUFBd0JVLFFBQVFMO1lBQ3pDMVgsT0FBT3VYLGVBQWVGLFVBQVVoZ0IsT0FBT2dnQixVQUFVaFg7WUFDakQ0WCxZQUFXLElBQUlDLE1BQU9DO1lBQ3RCbmtCLE1BQU00RCxRQUFRME07WUFDZHZELFFBQVFuSixRQUFRbUo7O0FBRXBCOzs7QUE5QldxVyx1QkFBb0JsYixXQUFBLEVBRGhDa2MsV0FDWWhCOztTQ1RHaUI7SUFDZCxPQUFPQyxXQUFXLElBQUlsQjtBQUN4Qjs7U0FFZ0JtQjtJQUNkLE9BQU92WixnQkFBZ0J1RjtBQUN6Qjs7QUNvQk8sTUFBTWlVLHVCQUF1QztJQUNsREMsT0FBTztJQUNQbmhCLGFBQWE7SUFDYm9oQixTQUFTO0lBQ1Qxa0IsTUFBTTtJQUNOMmtCLGlCQUFpQjtJQUNqQkMsb0JBQW9CO0lBQ3BCckwsTUFBTTtRQUNKemMsTUFBTTtRQUNOK25CLFFBQVE7UUFDUkMsY0FBYztRQUNkemhCLE1BQU07UUFDTkMsYUFBYTtRQUNieWhCLElBQUk7O0lBRU5DLHNCQUFzQjtJQUN0QkMsZUFBZTs7O01DaENKQztJQVVYLFdBQUFub0IsQ0FBWTBDO1FBQ1Y2SCxLQUFLN0gsVUFBVTtlQUNWQTs7QUFFUDtJQUVRLFNBQUEwbEI7UUFDTixJQUFJQyxNQUFNO1FBQ1YsSUFBSTlkLEtBQUs3SCxRQUFRNGxCLGdCQUFnQjtZQUMvQixNQUFNQyxNQUFNaGUsS0FBS2llLElBQUlqZSxLQUFLN0gsUUFBUTRsQjtZQUNsQ0QsT0FBTyx5REFBeURFO0FBQ2xFO1FBQ0EsT0FDRUYsTUFDQSwwR0FFNEM5ZCxLQUFLN0gsUUFBUXdsQixpQkFBaUJULHFCQUFxQlM7QUFHbkc7SUFFQSxnQkFBQU87UUFDRSxNQUFNQyxVQUErQixDQUFBO1FBQ3JDLElBQUluZSxLQUFLN0gsUUFBUWltQixhQUFhO1lBQzVCRCxRQUFRLG1CQUFtQm5lLEtBQUtpZSxJQUFJamUsS0FBSzdILFFBQVFpbUIsYUFBYTtBQUNoRTtRQUVBLE9BQU87WUFDTEMsaUJBQWlCcmUsS0FBSzdILFFBQVFnbEI7ZUFDM0JnQjtZQUNIRyxXQUFXdGUsS0FBSzZkO1lBQ2hCVSxnQkFBZ0I7Z0JBQ2RiLHNCQUFzQjFkLEtBQUs3SCxRQUFRdWxCOzs7QUFHekM7SUFFQSxHQUFBTyxDQUFJTyxNQUFjUixNQUFlO1FBQy9CLE1BQU1TLFdBQVcvbEIsS0FBSzJYLEtBQUtyUSxLQUFLN0gsUUFBUXVtQixjQUFjLElBQUlGO1FBQzFELE1BQU1QLE1BQU1VLGFBQWFGLFVBQVU7WUFBRUcsVUFBVTs7UUFDL0MsT0FBT1osTUFBTSwyQkFBMkJDLE1BQU1BO0FBQ2hEOzs7TUMzRFdZO0lBQ1gsV0FBQXBwQixDQUNtQnFwQixLQUNBM21CO1FBREE2SCxLQUFBOGUsTUFBQUE7UUFDQTllLEtBQUE3SCxVQUFBQTtBQUNoQjtJQUVLLGNBQUE0bUI7UUFDTixNQUFNL2lCLGNBQWNnRSxLQUFLN0gsUUFBUU8sT0FDN0JzSCxLQUFLN0gsUUFBUTZELGNBQ2IsS0FDQSxvQkFBb0JnRSxLQUFLN0gsUUFBUTZtQiw4Q0FDakMsWUFBWWhmLEtBQUs3SCxRQUFROG1CLDJDQUN6QmpmLEtBQUs3SCxRQUFRNkQ7UUFFakIsTUFBTW9ELFVBQVMsSUFBSThmLGlCQUNoQkMsU0FBU25mLEtBQUs3SCxRQUFRZ2xCLE9BQ3RCaUMsZUFBZXBqQixhQUNmcWpCLFdBQVdyZixLQUFLN0gsUUFBUWlsQixXQUFXLFNBQ25Da0MsY0FBY3RmLEtBQUs3SCxRQUFROFosUUFBUWlMLHFCQUFxQmpMLE1BQ3hEL0M7UUFFSCxPQUFPcVEsY0FBY1IsZUFBZS9lLEtBQUs4ZSxLQUFLMWYsUUFBUTtZQUNwRHVPLGFBQWEzTixLQUFLN0gsUUFBUXdWLGVBQWU7O0FBRTdDO0lBRVEsb0JBQUE2UixDQUNOOW1CLE1BQ0ErbUIsYUFDQUM7UUFFQSxLQUFLaG5CLE1BQU07UUFFWCxNQUFNaW5CLGNBQWMzZixLQUFLOGUsSUFBSWM7UUFDN0JsbkIsT0FBT0EsS0FBSzhDLFdBQVcsT0FBTzlDLE9BQU8sSUFBSUE7UUFDekNpbkIsWUFBWWxmLElBQUkvSCxNQUFNLENBQUNtbkIsTUFBVzlXO1lBQ2hDNFcsWUFBWUcsTUFBTS9XLEtBQUsyVyxlQUFlLEtBQUs7Z0JBQ3pDLGdCQUFnQkQ7OztBQUd0QjtJQUVPLFlBQUFNO1FBQ0wsTUFBTUMsV0FBV2hnQixLQUFLK2U7UUFDdEIsTUFBTWtCLFlBQVksSUFBSXJDLGdCQUFnQjtZQUNwQ1QsT0FBT25kLEtBQUs3SCxRQUFRZ2xCO1lBQ3BCemtCLE1BQU1zSCxLQUFLN0gsUUFBUU8sUUFBUXdrQixxQkFBcUJ4a0I7WUFDaERnbEIsc0JBQXNCMWQsS0FBSzdILFFBQVF1bEIsd0JBQXdCO1lBQzNEZ0IsWUFBWTFlLEtBQUs3SCxRQUFRdW1CO1lBQ3pCTixhQUFhcGUsS0FBSzdILFFBQVFrbEI7WUFDMUJVLGdCQUFnQi9kLEtBQUs3SCxRQUFRbWxCO1lBQzdCSyxlQUFlM2QsS0FBSzdILFFBQVF3bEI7O1FBRTlCNEIsY0FBY1csTUFDWmxnQixLQUFLN0gsUUFBUU8sUUFBUXdrQixxQkFBcUJ4a0IsTUFDMUNzSCxLQUFLOGUsS0FDTGtCLFVBQ0E7ZUFDS0MsVUFBVS9CO1lBQ2JpQyxpQkFBaUJuZ0IsS0FBSzdILFFBQVE2bUIsa0JBQzFCLEdBQUdoZixLQUFLN0gsUUFBUTZtQixvQkFDaEIvbUI7WUFDSm1vQixpQkFBaUJwZ0IsS0FBSzdILFFBQVE4bUIsa0JBQzFCLEdBQUdqZixLQUFLN0gsUUFBUThtQixvQkFDaEJobkI7O1FBSVIrSCxLQUFLd2YscUJBQ0h4ZixLQUFLN0gsUUFBUTZtQixpQkFDYixvQkFDQSxNQUFNZ0I7UUFHUmhnQixLQUFLd2YscUJBQ0h4ZixLQUFLN0gsUUFBUThtQixpQkFDYixzQkFDQSxNQUFNb0IsS0FBS3RaLFVBQVVpWjtBQUV6Qjs7O01DZ0JXTTtJQWNILGlCQUFXM2Q7UUFDakIsS0FBSzNDLEtBQUt1Z0IsU0FBUztZQUVqQnZnQixLQUFLdWdCLFVBQVUsSUFBSUMsT0FBTztBQUM1QjtRQUNBLE9BQU94Z0IsS0FBS3VnQjtBQUNkO0lBYUEsaUJBQU9FLENBQVczQjtRQUNoQjllLEtBQUs4ZSxNQUFNQTtRQUNYLE9BQU85ZTtBQUNUO0lBY0EsbUJBQU8wZ0IsQ0FBYUM7UUFDbEIzZ0IsS0FBS3VnQixVQUFVSSxnQkFBZ0IsSUFBSUgsT0FBTztRQUMxQ3hnQixLQUFLOGUsSUFBSThCLFVBQVU1Z0IsS0FBS3VnQjtRQUN4QixPQUFPdmdCO0FBQ1Q7SUFnQkEsaUJBQU82Z0IsQ0FDTEMsVUFBMEIsSUFDMUJDLGVBQXlCLEVBQUMsT0FBTyxRQUFRLE9BQU87UUFFaEQsTUFBTUMsaUJBQ0pGLFlBQVksTUFBTSxNQUFNQSxRQUFReHBCLElBQUsycEIsS0FBTUEsRUFBRTdRLE9BQU9vRDtRQUV0RCxNQUFNME4sY0FBMkI7WUFDL0JDLFFBQVEsQ0FBQ0EsUUFBUUM7Z0JBRWYsS0FBS0QsUUFBUSxPQUFPQyxTQUFTLE1BQU07Z0JBRW5DLElBQ0VKLG1CQUFtQixPQUNsQnByQixNQUFNQyxRQUFRbXJCLG1CQUNiQSxlQUFlL3JCLFNBQVNrc0IsT0FBTzNOLGdCQUNqQztvQkFDQSxPQUFPNE4sU0FBUyxNQUFNO0FBQ3hCO2dCQUVBQSxTQUFTLElBQUkxRixVQUFVLFVBQVV5Rjs7WUFFbkNFLGFBQWE7WUFDYkMsU0FBU1AsYUFBYTFRLEtBQUs7O1FBRzdCclEsS0FBSzhlLElBQUkrQixXQUFXSztRQUNwQixPQUFPbGhCO0FBQ1Q7SUFjQSxnQkFBT3VoQixDQUFVcHBCO1FBQ2Y7WUFFRSxNQUFNcXBCLFNBQVNDLFFBQVE7WUFDdkJ6aEIsS0FBSzhlLElBQUk0QyxJQUFJRixPQUFPcnBCO1lBQ3BCNkgsS0FBSzJDLE9BQU9sQixJQUFJO0FBQ2xCLFVBQUU7WUFDQXpCLEtBQUsyQyxPQUFPZ2YsS0FBSztBQUNuQjtRQUVBLE9BQU8zaEI7QUFDVDtJQWNBLG1CQUFPK2YsQ0FBYTVuQjtRQUNsQixNQUFNeXBCLFVBQVUsSUFBSS9DLGVBQWU3ZSxLQUFLOGUsS0FBSztZQUMzQzNCLE9BQU9obEIsUUFBUWdsQjtZQUNmbmhCLGFBQWE3RCxRQUFRNkQ7WUFDckJvaEIsU0FBU2psQixRQUFRaWxCO1lBQ2pCMWtCLE1BQU1QLFFBQVFPLFFBQVE7WUFDdEJnbEIsc0JBQXNCdmxCLFFBQVF1bEIsd0JBQXdCO1lBQ3REZ0IsWUFBWXZtQixRQUFRdW1CO1lBQ3BCckIsaUJBQWlCbGxCLFFBQVFpbUI7WUFDekJkLG9CQUFvQm5sQixRQUFRNGxCO1lBQzVCSixlQUFleGxCLFFBQVF3bEI7WUFDdkJxQixpQkFBaUI3bUIsUUFBUTZtQjtZQUN6QkMsaUJBQWlCOW1CLFFBQVE4bUI7O1FBRTNCMkMsUUFBUTdCO1FBQ1IsT0FBTy9mO0FBQ1Q7SUFjQSxxQkFBTzZoQixJQUFrQkM7UUFDdkIsSUFBSUEsTUFBTWxxQixTQUFTLEdBQUdvSSxLQUFLOGUsSUFBSStDLGtCQUFrQkM7UUFDakQsT0FBTzloQjtBQUNUO0lBYUEsdUJBQU8raEIsSUFBb0JDO1FBQ3pCaGlCLEtBQUs4ZSxJQUFJaUQsb0JBQ0hDLFFBQVFwcUIsU0FBUyxJQUFJb3FCLFVBQVUsRUFBQyxJQUFJbEc7UUFFMUMsT0FBTzliO0FBQ1Q7SUFjQSw0QkFBT2lpQixJQUF5QkM7UUFDOUIsSUFBSUEsYUFBYXRxQixTQUFTLEdBQ3hCb0ksS0FBSzhlLElBQUltRCx5QkFBeUJDO1FBQ3BDLE9BQU9saUI7QUFDVDtJQWdCQSxrQkFBYW1pQixDQUNYQyxPQUFlbGtCLE9BQU9ta0IsUUFBUWxHLElBQUltRyxTQUFTLEtBQzNDdEcsT0FBMkIvakIsV0FDM0J3SixNQUFlO1FBRWZ6QixLQUFLOGUsSUFBSXlELE9BQU9ILE1BQU1wRyxNQUFhd0csS0FBSzdiO1lBQ3RDLElBQUlsRixLQUFLO2dCQUNQLE1BQU11SCxZQUFZaEosS0FBSzhlLElBQUkyRDtnQkFDM0J6aUIsS0FBSzJDLE9BQU9sQixJQUFJLGlDQUFpQ3VIO0FBQ25EOztBQUVKOzs7OztBQ2xSSyxJQUFNMFosaUNBQThCQyxtQ0FBcEMsTUFBTUQ7SUFDWCxXQUFBanRCLENBQ3FCNEwsZ0JBQ0F1aEI7UUFEQTVpQixLQUFBcUIsaUJBQUFBO1FBQ0FyQixLQUFBNGlCLFdBQUFBO0FBQ2xCO0lBRU8sbUJBQU1DLENBQWMzbEI7UUFDNUIsTUFBTTZDLFVBQVU3QyxJQUFJNkM7UUFDcEIsTUFBTStpQixRQUEwQjtZQUM5Qi9pQixTQUFTQTtZQUNUUyxXQUFXLENBQUE7O1FBR2IsTUFBTXVpQixLQUFLQyxVQUFVOWxCO1FBQ3JCLE1BQU15RixTQUFTakIsUUFBUWpCLE1BQU1rQixJQUFJO1lBQUVvaEI7O1FBRW5DL2lCLEtBQUtxQixlQUFlVixXQUNsQjVLLE9BQU9DLE9BQ0wsQ0FBQSxHQUNBaXRCLHFCQUNBO1lBQ0V0Z0I7WUFDQWdhLFdBQVcsSUFBSUM7WUFDZnNHLFdBQVcsR0FBR2htQixJQUFJdUksVUFBVXZJLElBQUk4TDtXQUVsQzhaO0FBR047SUFFQSxlQUFNdmhCLENBQVVzSCxTQUEyQnJIO1FBQ3pDLE1BQU10RSxNQUFNMkwsUUFBUXRNLGVBQWVDO1FBQ25DLE1BQU11TSxNQUFNRixRQUFRdE0sZUFBZTRNO1FBQ25DLE1BQU0xSCxNQUFNQyxRQUFRQyxJQUFJZ2hCLGtDQUFnQ2hoQixJQUFJM0IsS0FBS3VCO1FBQ2pFRSxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLG1CQUFtQi9DLElBQUl1SSxVQUFVdkksSUFBSThMO2NBRWhFaEosS0FBSzZpQixjQUFjM2xCO1FBQ3pCdUUsSUFBSVcsTUFDRixXQUFXcEMsS0FBS3FCLGVBQWVwQixrQ0FBa0MvQyxJQUFJdUksVUFBVXZJLElBQUk4TDtjQUcvRWhKLEtBQUs0aUIsU0FBUzlaLEtBQUs1TCxLQUFLNkw7UUFDOUJ0SCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLHNDQUFzQy9DLElBQUl1SSxVQUFVdkksSUFBSThMO1FBRXpGLE9BQU94SCxLQUFLb0I7QUFDZDs7O0FBL0NXOGYsaUNBQThCQyxtQ0FBQS9oQixXQUFBLEVBRDFDQyxXQUFXO0lBQUVDLE9BQU9DLE1BQU1DO3NDQUdZckIscUJBQ04rSSwyQkFIcEJnYTs7QUFrRGIsU0FBU00sVUFBVTlsQjtJQUNqQixNQUFNNkMsVUFBVTdDLElBQUk2QztJQUNwQixTQUFTb2pCLGNBQWN4dUI7UUFDckIsS0FBS0EsT0FBTyxPQUFPc0Q7UUFDbkIsTUFBTW1yQixZQUFZeHRCLE1BQU1DLFFBQVFsQixTQUFTQSxNQUFNLEtBQUtBO1FBQ3BELE9BQU95dUIsVUFDSjllLE1BQU0sS0FDTmhOLElBQUs2WSxXQUFZQSxRQUFRQyxRQUN6Qi9ZLE9BQU8wYixTQUFTO0FBQ3JCO0lBQ0EsT0FDRW9RLGNBQWNwakIsVUFBVSx1QkFDeEJvakIsY0FBY3BqQixVQUFVLGlCQUN4Qm9qQixjQUFjcGpCLFVBQVUsdUJBQ3hCb2pCLGNBQWNwakIsVUFBVSxpQkFDeEI3QyxJQUFJNmxCO0FBRVI7O0FDL0dBLE1BQU1NLG1CQUFtQixJQUFJalo7O1NBUWJrWjtJQUNkLE9BQU8xdEIsTUFBTXNOLEtBQUttZ0IsaUJBQWlCanNCO0FBQ3JDOztBQUVBLFNBQVNtc0IsaUJBQWlCQyxPQUFldEw7SUFDdkMsSUFBSW1MLGlCQUFpQnJYLElBQUl3WCxRQUFRO0lBQ2pDSCxpQkFBaUJua0IsSUFBSXNrQixPQUFPO1FBQUV0YixTQUFTc2I7UUFBT3RMOztBQUNoRDs7QUFFQSxTQUFTdUwsbUJBQW1COXVCO0lBQzFCLGNBQWNBLFVBQVUsY0FBY0EsTUFBTTRCLHFCQUFxQjBVO0FBQ25FOztBQUVBLFNBQVN5WSxrQkFBa0JwZ0I7SUFDekIsT0FBTyxHQUFHQSxNQUFNdkg7QUFDbEI7O0FBRUEsU0FBUzRuQixxQkFDUHJnQixPQUNBUDtJQUVBLE9BQU9BLFVBQVUsR0FBR08sTUFBTXZILGtCQUFrQmdILFlBQVksR0FBR08sTUFBTXZIO0FBQ25FOztBQWNNLFNBQVU4TixRQUFRdlY7SUFDdEIsT0FBTyxDQUNMRCxRQUNBVSxhQUNBNnVCO1FBRUEsSUFBSUMsV0FBa0R2dkI7UUFDdEQsV0FBV3V2QixhQUFhLGFBQWE7WUFDbkMsTUFBTUMsYUFDSnJ2QixRQUFRQyxZQUFZLHFCQUFxQkwsV0FBVztZQUN0RHd2QixXQUFXQyxXQUFXRjtBQUN4QjtRQUNBLFdBQVdDLGFBQWEsYUFBYTtZQUNuQyxNQUFNLElBQUloZixjQUNSLGtFQUFrRStlLHFCQUFzQnZ2QixPQUE0QjBIO0FBRXhIO1FBRUEsTUFBTWdvQixpQkFBaUJGLGFBQWEsWUFBWUosbUJBQW1CSTtRQUNuRSxNQUFNTCxRQUFRTyxVQUNWTCxrQkFBa0JHLFlBQ2xCRyxxQkFBcUJIO1FBRXpCTixpQkFBaUJDLE9BQU87WUFDdEIsSUFBSU8sU0FBUyxPQUFPdmQsYUFBYXdELFNBQVM2WjtZQUMxQyxjQUFjQSxhQUFhLFdBQ3ZCSSxVQUFZeGpCLElBQUlvakIsWUFDaEJJLFVBQVl4akIsSUFBSW9qQjs7UUFHdEIsT0FBTzNpQixPQUFPc2lCLE1BQVB0aUIsQ0FBYzdNLFFBQVFVLGFBQWE2dUI7O0FBRTlDOztBQVVNLFNBQVU3WixXQUNkekcsT0FDQVA7SUFFQSxPQUFPLENBQ0wxTyxRQUNBVSxhQUNBNnVCO1FBRUEsTUFBTUosUUFBUUcscUJBQXFCcmdCLE9BQU9QO1FBQzFDd2dCLGlCQUFpQkMsT0FBTyxNQUFNVSxhQUFlbGEsU0FBUzFHLE9BQU9QO1FBQzdELE9BQU83QixPQUFPc2lCLE1BQVB0aUIsQ0FBYzdNLFFBQVFVLGFBQWE2dUI7O0FBRTlDOzs7O0FDckZPLElBQU1PLGtCQUFOLE1BQU1BOzs7O0lBT0Qsc0JBQVc3ZDtRQUNuQixLQUFLdEcsS0FBSzRKLGNBQ1IsTUFBTSxJQUFJL0UsY0FBYztRQUMxQixPQUFPN0UsS0FBSzRKO0FBQ2Q7SUFFVSxjQUFXbkk7UUFDbkIsS0FBS3pCLEtBQUt1Z0IsU0FBU3ZnQixLQUFLdWdCLFVBQVU3ZSxRQUFRQyxJQUFJeWlCO1FBQzlDLE9BQU9wa0IsS0FBS3VnQjtBQUNkO0lBRUEsV0FBQTlxQixDQUVtQjBDLFNBQ0Frc0I7UUFEQXJrQixLQUFBN0gsVUFBQUE7UUFDQTZILEtBQUFxa0IsWUFBQUE7QUFDaEI7SUFFSCxjQUFPcmMsQ0FBUTdQO1FBQ2IsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtnSTtRQUM5QixNQUFNc2MsaUJBQWlCaEI7UUFDdkIsT0FBTztZQUNML2EsUUFBUTZiO1lBQ1JuYyxXQUFXLEVBQ1Q7Z0JBQUVDLFNBQVM1SjtnQkFBc0JpbUIsVUFBVXBzQjtlQUMzQztnQkFBRStQLFNBQVMzSjtnQkFBa0JnbUIsVUFBVXZrQixLQUFLc0csYUFBYWtlO2VBQ3pEO2dCQUNFdGMsU0FBU3hKO2dCQUNUd1osWUFBWSxNQUNWL2YsUUFBUXlRLFVBQVV0UixJQUFLbXRCO29CQUNyQmhqQixJQUFJNlEsS0FBSywrQkFBK0JtUyxFQUFFMW9CO29CQUMxQyxPQUFPLElBQUkwb0I7c0JBQ1A7ZUFFVjlrQixxQkFDQStJLHNCQUNBO2dCQUNFUixTQUFTRztnQkFDVEYsVUFBVXVhO2tCQUVUNEI7WUFFTDliLFNBQVMsRUFDUGxLLHNCQUNBQyxrQkFDQUcsZ0JBQ0FpQixxQkFDQStJLHlCQUNHNGIsZUFBZWh0QixJQUFLb3RCLFlBQWFBLFNBQVN4Yzs7QUFHbkQ7SUFFQSw0QkFBYXljLENBQ1h4c0I7UUFFQSxNQUFNc0osTUFBTXpCLEtBQUt5QixJQUFJRSxJQUFJM0IsS0FBSzJrQjtRQUU5QixLQUFLM2tCLEtBQUs0SixjQUFjO1lBQ3RCLE1BQU1nYixVQUFVenNCLFFBQVEwc0IsS0FBS3Z0QixJQUFJLEVBQUV3dEIsT0FBTzVMLFFBQVEzUztnQkFDaEQsTUFBTXdlLFdBQVd4ZSxLQUFLd1E7Z0JBQ3RCLEtBQUtnTyxVQUFVLE9BQU8sRUFBQ0QsT0FBTzVMO2dCQUM5QixPQUFPLEVBQUM0TCxPQUFPNUwsUUFBUTNTOztZQUV6QnZHLEtBQUs0SixlQUFlLElBQUlvYjtrQkFDbEJobEIsS0FBSzRKLGFBQWFxYixLQUFLTDtZQUM3QixNQUFNTSxVQUFVbGxCLEtBQUs0SixhQUFhNGE7WUFDbEMsS0FBSyxJQUFJak8sSUFBSSxHQUFHQSxJQUFJMk8sUUFBUXR0QixRQUFRMmUsS0FBSztnQkFDdkMsTUFBTTRPLElBQUlodEIsUUFBUTBzQixLQUFLdE87Z0JBQ3ZCLE1BQU02TyxpQkFBaUJELEVBQUU1Z0IsTUFBTSxHQUFHNGdCLEVBQUV2dEI7Z0JBQ3BDLElBQUlvTCxjQUFjb2lCLGVBQWVyTztnQkFDakMsS0FDRy9ULGdCQUNDQSxZQUFpREUsTUFDbkQ7b0JBQ0EsTUFBTTRoQixRQUFRamlCLFFBQVFJLGVBQWVpaUIsUUFBUTNPLEdBQUd4VDtvQkFDaEQsS0FBSytoQixPQUNILE1BQU0sSUFBSWpnQixjQUNSLG9DQUFvQ3FnQixRQUFRM08sR0FBR3hUO29CQUVuRDt3QkFDRUMsY0FBZThoQixNQUEyQzVoQixPQUN0RDRoQixRQUNBLElBQUtBO0FBQ1gsc0JBQUUsT0FBT3BrQjt3QkFDUCxNQUFNLElBQUltRSxjQUNSLGtDQUFrQ3FnQixRQUFRM08sR0FBR3hULFlBQVlyQztBQUU3RDtBQUNGO2dCQUNBMmtCLDRCQUE0QkgsUUFBUTNPLEdBQUd4VCxRQUF2Q3NpQixDQUFnRHJpQjtBQUNsRDtZQUNBdkIsSUFBSTZRLEtBQUs7WUFFVCxJQUFJbmEsUUFBUW10QixnQkFBZ0I7Z0JBQzFCOzBCQUNRbnRCLFFBQVFtdEI7QUFDaEIsa0JBQUUsT0FBTzVrQjtvQkFDUCxNQUFNLElBQUltRSxjQUFjLHFDQUFxQ25FO0FBQy9EO0FBQ0Y7QUFDRjtRQUVBLE9BQU9WLEtBQUtzRyxZQUFZa2U7QUFDMUI7SUFFQSwyQkFBTWU7UUFDSixNQUFNOWpCLE1BQU0yaUIsa0JBQWdCM2lCLElBQUlFLElBQUkzQixLQUFLdWxCO1FBQ3pDLE1BQU1DLFdBQ0p4bEIsS0FBS3FrQixVQUFVNWpCLElBQVNsQztRQUMxQixLQUFLLE1BQU0rUCxXQUFXa1gsVUFDcEI7WUFDRSxJQUFJbFgsU0FBUztnQkFDWDdNLElBQUk2USxLQUFLLGlCQUFpQmhFLFFBQVEvVztzQkFDNUIrVyxRQUFRbVg7QUFDaEI7QUFDRixVQUFFLE9BQU8va0I7WUFDUGUsSUFBSWlELE1BQU0sa0NBQWtDaEU7QUFDOUM7UUFDRjtrQkFDUW1KLFVBQVE0YjtBQUNoQixVQUFFLE9BQU8va0I7WUFDUGUsSUFBSWlELE1BQU0sK0JBQStCaEU7QUFDM0M7QUFDRjs7O0FBbElXeWpCLGtCQUFlQyxvQkFBQXhqQixXQUFBLEVBRjNCOGtCLFVBQ0FqZCxPQUFPLENBQUEsSUFvQkh4SCxRQUFBLEdBQUFDLE9BQU81QyxrRUFFb0JxbkIsZ0JBckJuQnhCOztBQzlCTixNQUFNeUIsOEJBQThCam5CLE9BQ3pDOztBQ0RJLFNBQVVrbkIsdUJBQXVCdGY7SUFDckMsT0FBT3VmLGFBQWE1QyxXQUFXNkMsSUFBSUMsV0FBV3pmO0lBRTlDLE1BQU14RSxZQUFZK2pCLGFBQWEvcEIsUUFBUStwQjtJQUV2QyxNQUFNRyxvQkFBb0Jyd0IsTUFBTUMsUUFBUW13QixXQUNwQ0EsUUFBUTF1QixJQUFLb0o7UUFDWDtZQUNFLFdBQVdBLEVBQUV3bEIsY0FBYyxZQUFZLE9BQU94bEIsRUFBRXdsQjtZQUVoREMsUUFBUXhFLEtBQ04sb0JBQW9CNWYsNkRBQTZEckIsOENBQThDQTtZQUVqSSxjQUFjQSxNQUFNLFdBQVdBLElBQUlvRyxLQUFLQyxVQUFVckc7QUFDcEQsVUFBRSxPQUFPMGxCO1lBQ1BELFFBQVF4RSxLQUFLLG1DQUFtQzVmLGNBQWNxa0I7WUFDOUQsT0FBT251QjtBQUNUO1NBRUYrdEIsa0JBQWtCQSxRQUFRRSxjQUFjLGFBQ3RDRixRQUFRRSxxQkFDREYsWUFBWSxXQUNqQkEsVUFDQWxmLEtBQUtDLFVBQVVpZjtJQUV2QkcsUUFBUS9qQixNQUNOLHVDQUF1Q0wsd0JBQXdCbWhCLGlCQUFpQjZDLE9BQ2hGRTtJQUdGLE9BQU8sRUFBQ2xrQixXQUFXbWhCLFdBQVc2QyxJQUFJRTtBQUNwQzs7OztBQ25CTyxJQUFNSSxtQkFBZ0JDLHFCQUF0QixNQUFNRCx5QkFBeUI5YztJQUdwQyxXQUFBOVQsQ0FDRWdVLGVBQ3FDeks7UUFFckNhLE1BQU00SixlQUFlNmMsbUJBQWlCdnFCO1FBQ3RDaUUsS0FBS3dsQixXQUFXeG1CLFNBQVMxSCxJQUFLeUwsV0FBYUYsUUFBZ0JwQyxJQUFJc0M7QUFDakU7SUFHQSxNQUFBd2Y7UUFDRSxNQUFNNWYsU0FBU2pCLFFBQVFDLElBQUkya0IsbUJBQWlCdnFCO1FBRTVDLE1BQU13cUIsVUFBVSxJQUFJQyxXQUEwQkM7WUFDNUMsTUFBTUMsYUFDSixLQUFLQyxLQUFLQyxTQUFTcnZCLFNBQVMsSUFBSWdOLE1BQU0sR0FBRyxLQUFLc2lCO1lBRWhEbGtCLE9BQU8yUCxLQUNMLDBCQUEwQm9VLHlCQUF5QjFtQixLQUFLeUosY0FBY3hKO1lBRXhFLE1BQU02bUIsS0FBSyxJQUFBO2dCQUFLLFdBQUFyeEI7b0JBQ2R1SyxLQUFBMG1CLGFBQWFBO0FBYWY7Z0JBWkUsT0FBQUssSUFBV3hnQjtvQkFDVDVELE9BQU9QLE1BQ0wsZ0JBQWdCcEMsS0FBSzBtQjtvQkFFdkIsT0FBT00sUUFBUUMsVUFBVXpFLEtBQUs7d0JBQzVCLE1BQU1wbUIsT0FBT3lwQix1QkFBdUJ0Zjt3QkFDcENrZ0IsU0FBU2psQixLQUFLOzRCQUFFaE0sTUFBTTs0QkFBVzRHOzt3QkFDakN1RyxPQUFPUCxNQUNMLGdCQUFnQnBDLEtBQUswbUI7O0FBRzNCOztZQUdGL2pCLE9BQU9SLFFBQ0wsd0JBQXdCdWtCLHFCQUFxQjFtQixLQUFLd2xCLFNBQVM1dEI7WUFFN0QsS0FBSyxNQUFNMFcsV0FBV3RPLEtBQUt3bEIsVUFBVTtnQkFDbkMsTUFBTTBCLGNBQWM1WSxTQUFTN1ksYUFBYXNHLFFBQVE7Z0JBQ2xEO29CQUNFNEcsT0FBT1AsTUFDTCx3QkFBd0Jza0IseUJBQXlCUTtvQkFFbkQ1WSxRQUFRNlksUUFBUUw7QUFDbEIsa0JBQUUsT0FBT3BtQjtvQkFDUGlDLE9BQU9QLE1BQ0wsK0JBQStCc2tCLHlCQUF5QlEsZ0JBQWdCeG1CLEdBQUdxRSxXQUFXckU7b0JBRXhGaUMsT0FBTytCLE1BQU1oRTtBQUNmO0FBQ0Y7WUFFQSxPQUFPO2dCQUNMaUMsT0FBT1AsTUFBTSw0QkFBNEJza0I7Z0JBRXpDLEtBQUssTUFBTXBZLFdBQVd0TyxLQUFLd2xCLFVBQVU7b0JBQ25DLE1BQU0wQixjQUFjNVksU0FBUzdZLGFBQWFzRyxRQUFRO29CQUNsRDt3QkFDRTRHLE9BQU9QLE1BQ0wsMEJBQTBCc2tCLDJCQUEyQlE7d0JBRXZENVksUUFBUThZLFVBQVVOO0FBQ3BCLHNCQUFFLE9BQU9wbUI7d0JBQ1BpQyxPQUFPUCxNQUNMLHFDQUFxQ3NrQix5QkFBeUJRLGdCQUFnQnhtQixHQUFHcUUsV0FBV3JFO3dCQUU5RmlDLE9BQU8rQixNQUFNaEU7QUFDZjtBQUNGOzs7UUFJSixNQUFNMm1CLHdCQUF3QjtRQUM5QixNQUFNQyxhQUFhQyxTQUFTRix1QkFBdUJqZSxLQUNqREMsTUFBSTtZQUNGMUcsT0FBT1AsTUFBTTtZQUVmOUssSUFDRSxPQUFBO1lBQ0U5QixNQUFNO1lBQ040RyxNQUFNO2dCQUNKb3JCLEtBQUksSUFBSTVLLE1BQU9DOzs7UUFNdkIsT0FBTzRLLE1BQU1sQixTQUFTZTtBQUN4QjtJQUlBLGNBQUFJLENBQStCcGtCO1FBQzdCLE1BQU1YLFNBQVNqQixRQUFRQyxJQUFJMmtCLG1CQUFpQnZxQjtRQUU1QyxPQUFPLElBQUl5cUIsV0FBMEJDO1lBQ25DLE1BQU1LLEtBQUssSUFBQTtnQkFDVCxPQUFBQyxJQUFXeGdCO29CQUNULE9BQU95Z0IsUUFBUUMsVUFBVXpFLEtBQUs7d0JBQzVCaUUsU0FBU2psQixLQUFLOzRCQUFFcEYsTUFBTW1LOzs7QUFFMUI7O1lBR0Y7Z0JBQ0UsS0FBSyxNQUFNK0gsV0FBV3RPLEtBQUt3bEIsVUFBVTtvQkFDbkNsWCxRQUFRNlksUUFBUUw7QUFDbEI7QUFDRixjQUFFLE9BQU9wbUI7Z0JBQ1ArbEIsU0FBUy9oQixNQUFNLDRCQUE0QmhFLEVBQUVxRSxXQUFXckU7QUFDMUQ7WUFFQSxPQUFPO2dCQUNMO29CQUNFLEtBQUssTUFBTTROLFdBQVd0TyxLQUFLd2xCLFVBQVU7d0JBQ25DbFgsUUFBUThZLFVBQVVOO0FBQ3BCO0FBQ0Ysa0JBQUUsT0FBT3BtQjtvQkFDUGlDLE9BQU8rQixNQUFNaEU7QUFDZjs7O0FBR047OztBQWxIQUUsV0FBQSxFQURDK21CLGlIQUNTbkIsZUFnRlRILGlCQUFBOXZCLFdBQUEsVUFBQTs7QUFJRHFLLFdBQUEsRUFGQyttQixJQUFJLFlBRVcxbUIsUUFBQSxHQUFBOEUsTUFBTSw2SEFBeUJ5Z0IsZUE4QjlDSCxpQkFBQTl2QixXQUFBLGtCQUFBOztBQTlIVTh2QixtQkFBZ0JDLHFCQUFBMWxCLFdBQUEsRUFENUIyUixjQU1JdFIsUUFBQSxHQUFBQyxPQUFPMGtCLGlFQURPam1CLHFCQUFtQi9KLFlBSnpCeXdCOzs7O0FDTE4sSUFBTXVCLG9CQUFpQkMsc0JBQXZCLE1BQU1EO0lBQ1gsa0JBQU9FLENBQ0w5b0IsVUFDQXRHLE9BQWU7UUFFZixPQUFPO1lBQ0w2UCxRQUFRc2Y7WUFDUmxQLGFBQWEsRUFBQzBOO1lBQ2QwQixTQUFTLEVBQ1BDLGFBQWFDLFNBQVMsRUFDcEI7Z0JBQ0V2dkIsTUFBTUEsS0FBSzhCLFFBQVEsT0FBTztnQkFDMUIrTixRQUFRc2Y7O1lBSWQ1ZixXQUFXLEVBQ1R0SSxxQkFDQTtnQkFDRXVJLFNBQVMwZDtnQkFDVHJCLFVBQVV2bEIsWUFBWTs7O0FBSTlCOzs7QUF4Qlc0b0Isb0JBQWlCQyxzQkFBQWpuQixXQUFBLEVBRDdCNkgsT0FBTyxDQUFBLE1BQ0ttZjs7OztBQ0lOLElBQU1NLGNBQVdDLGdCQUFqQixNQUFNRDtJQUNYLHlCQUFhRSxDQUNYandCO1FBRUEsT0FBTWt3QixpQkFBRUEsaUJBQWU3UCxjQUFFQSxnQkFBaUJyZ0I7UUFFMUMsTUFBTXF0QixpQkFDRXJCLGdCQUFnQlEsZ0JBQWdCeHNCO1FBQ3hDLE1BQU02RyxXQUFXd21CLFNBQVNsdUIsSUFBS2dYLFdBQVlBLFFBQVF2TDtRQUVuRCxNQUFNZ2xCLFVBT1UsRUFBQzVELGdCQUFnQm5jLFFBQVE3UDtRQUV6QyxJQUFJa3dCLGlCQUFpQjtZQUNqQnJwQixTQUFTa0gsUUFBU25EO2dCQUNoQmdsQixRQUFRcGtCLEtBQ05rVSxhQUFhOVUsU0FBU2lGLFFBQVFqRixTQUFTO29CQUNyQ3lWO29CQUNBRixvQkFBb0JuZ0IsUUFBUW1nQjtvQkFDNUJuWixrQkFBa0JoSCxRQUFRZ0g7b0JBQzFCc1osY0FBY3RnQixRQUFRc2dCOzs7QUFJOUI7UUFFRixJQUFJdGdCLFFBQVFtd0IsaUJBQWlCQyxzQkFBc0I7WUFDakRSLFFBQVFwa0IsS0FDTmlrQixrQkFBa0JFLFlBQ2hCM3ZCLFFBQVFtd0IsZ0JBQWdCRSxvQkFBb0J4cEI7QUFHbEQ7UUFFQSxPQUFPO1lBQ0x1SixRQUFRNGY7WUFDUkosU0FBU0E7O0FBRWI7OztBQTVDV0csY0FBV0MsZ0JBQUF2bkIsV0FBQSxFQUR2QjZILE9BQU8sQ0FBQSxNQUNLeWY7O0FBK0NOdmhCLGVBQWU4aEIsaUJBQWdDOztBQ3REaEQsU0FBVUMsYUFBYXBsQjtJQUM1QixNQUFNcWxCLElBQUkxZCxNQUFNeEssSUFBSTZDO0lBQ3BCLEtBQUtxbEIsR0FDSixNQUFNLElBQUk5akIsY0FBYyxpQ0FBaUN2QjtJQUMxRCxNQUFNd00sT0FBTy9GLGFBQVdDLFNBQVMyZTtJQUNqQyxPQUFPN1k7QUFDUjs7QUNzQ08sTUFBTThZLFVBQVU7O0FBUWhCLE1BQU1DLFNBQVM7O0FBUWYsTUFBTUMsZUFBZTs7QUFFckIsTUFBTUMsZUFBZTs7QUFFNUI5cEIsU0FBUytwQixvQkFBb0I7O0FBQzdCL3BCLFNBQVNncUIsZ0JBQWdCRixjQUFjSDs7QUFDdkMzcEIsU0FBUytwQixvQkFBb0I7OyJ9