@sapui5/sap.fe.core 1.124.2 → 1.124.3

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.
@@ -375,7 +375,8 @@ function prepareMessageViewForDialog(
375
375
  },
376
376
  items: {
377
377
  path: "/",
378
- template: oMessageTemplate
378
+ template: oMessageTemplate,
379
+ length: 9999
379
380
  }
380
381
  });
381
382
  oMessageView.setGroupItems(true);
@@ -10,12 +10,14 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
10
10
  var getContextRelativeTargetObjectPath = DataModelPathHelper.getContextRelativeTargetObjectPath;
11
11
  var enhanceDataModelPath = DataModelPathHelper.enhanceDataModelPath;
12
12
  var hasStaticPercentUnit = PropertyHelper.hasStaticPercentUnit;
13
+ var getAssociatedUnitPropertyPath = PropertyHelper.getAssociatedUnitPropertyPath;
13
14
  var getAssociatedUnitProperty = PropertyHelper.getAssociatedUnitProperty;
14
15
  var getAssociatedTimezoneProperty = PropertyHelper.getAssociatedTimezoneProperty;
15
16
  var getAssociatedTextPropertyPath = PropertyHelper.getAssociatedTextPropertyPath;
16
17
  var getAssociatedTextProperty = PropertyHelper.getAssociatedTextProperty;
17
18
  var getAssociatedExternalIdPropertyPath = PropertyHelper.getAssociatedExternalIdPropertyPath;
18
19
  var getAssociatedExternalIdProperty = PropertyHelper.getAssociatedExternalIdProperty;
20
+ var getAssociatedCurrencyPropertyPath = PropertyHelper.getAssociatedCurrencyPropertyPath;
19
21
  var getAssociatedCurrencyProperty = PropertyHelper.getAssociatedCurrencyProperty;
20
22
  var getDisplayMode = DisplayModeFormatter.getDisplayMode;
21
23
  var isProperty = TypeGuards.isProperty;
@@ -322,7 +324,6 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
322
324
  if (path && property) {
323
325
  var _relatedProperties$ex2;
324
326
  let valueIndex;
325
- let currencyOrUoMIndex;
326
327
  /* EXTERNALID */
327
328
  const externalIdPath = getAssociatedExternalIdPropertyPath(property);
328
329
  const externalIdProperty = getAssociatedExternalIdProperty(property);
@@ -343,6 +344,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
343
344
  const propertyDataModelObjectPath = enhanceDataModelPath(dataModelObjectPath, externalIdPath || path);
344
345
  const textPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, textPropertyPath);
345
346
  const textRelativePath = getContextRelativeTargetObjectPath(textPropertyDataModelObjectPath);
347
+ const relativePath = getContextRelativeTargetObjectPath(propertyDataModelObjectPath);
346
348
  if ((_relatedProperties$ex2 = relatedProperties.exportSettings) !== null && _relatedProperties$ex2 !== void 0 && _relatedProperties$ex2.template) {
347
349
  // FieldGroup use-case. Need to add each Field in new line.
348
350
  _appendTemplate(relatedProperties, "\n");
@@ -384,16 +386,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
384
386
  const timezoneProperty = getAssociatedTimezoneProperty(property);
385
387
  const timezoneAnnotation = property === null || property === void 0 ? void 0 : (_property$annotations18 = property.annotations) === null || _property$annotations18 === void 0 ? void 0 : (_property$annotations19 = _property$annotations18.Common) === null || _property$annotations19 === void 0 ? void 0 : _property$annotations19.Timezone;
386
388
  if (currencyOrUoMProperty) {
387
- valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
388
- currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, navigationPathPrefix + currencyOrUnitAnnotation.path, currencyOrUnitAnnotation.$target);
389
- if (addUnitInTemplate) {
390
- _appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
391
- } else {
392
- relatedProperties.exportSettings.unitProperty = navigationPathPrefix + currencyOrUnitAnnotation.path;
393
- }
394
- if (currencyProperty) {
395
- relatedProperties.exportSettings.isCurrency = true;
396
- }
389
+ collectCurrencyOrUnitProperties(relatedProperties, relativePath ?? path, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty);
397
390
  } else if (timezoneProperty && timezoneAnnotation !== null && timezoneAnnotation !== void 0 && timezoneAnnotation.$target) {
398
391
  collectTimezoneProperties(property, relatedProperties, path, addUnitInTemplate);
399
392
  } else if (((_property$Target = property.Target) === null || _property$Target === void 0 ? void 0 : (_property$Target$$tar = _property$Target.$target) === null || _property$Target$$tar === void 0 ? void 0 : _property$Target$$tar.$Type) === "com.sap.vocabularies.UI.v1.DataPointType" && !((_property$Target2 = property.Target) !== null && _property$Target2 !== void 0 && (_property$Target2$$ta = _property$Target2.$target) !== null && _property$Target2$$ta !== void 0 && _property$Target2$$ta.ValueFormat) || ((_property$annotations20 = property.annotations) === null || _property$annotations20 === void 0 ? void 0 : (_property$annotations21 = _property$annotations20.UI) === null || _property$annotations21 === void 0 ? void 0 : (_property$annotations22 = _property$annotations21.DataFieldDefault) === null || _property$annotations22 === void 0 ? void 0 : (_property$annotations23 = _property$annotations22.Target) === null || _property$annotations23 === void 0 ? void 0 : (_property$annotations24 = _property$annotations23.$target) === null || _property$annotations24 === void 0 ? void 0 : _property$annotations24.$Type) === "com.sap.vocabularies.UI.v1.DataPointType") {
@@ -506,6 +499,36 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
506
499
  }
507
500
  }
508
501
 
502
+ /**
503
+ * Collect the related properties from a property with currencies or units.
504
+ *
505
+ * @param relatedProperties The related properties identified so far for the column.
506
+ * @param relativePath The property relative path.
507
+ * @param addUnitInTemplate Specify if the unit should be added in the template.
508
+ * @param propertyDataModelObjectPath The data model object path of the property to be considered.
509
+ * @param currencyOrUoMProperty The currency or unit of measure property linked to the column.
510
+ * @param currencyProperty The currency property linked to the column.
511
+ */
512
+ function collectCurrencyOrUnitProperties(relatedProperties, relativePath, addUnitInTemplate, propertyDataModelObjectPath, currencyOrUoMProperty, currencyProperty) {
513
+ const property = propertyDataModelObjectPath.targetObject;
514
+ if (property) {
515
+ const currencyOrUnitPropertyPath = getAssociatedCurrencyPropertyPath(property) || getAssociatedUnitPropertyPath(property);
516
+ const unitOrCurrencyPropertyDataModelObjectPath = enhanceDataModelPath(propertyDataModelObjectPath, currencyOrUnitPropertyPath);
517
+ const unitOrCurrencyRelativePath = getContextRelativeTargetObjectPath(unitOrCurrencyPropertyDataModelObjectPath);
518
+ const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, relativePath, property);
519
+ const currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, unitOrCurrencyRelativePath, currencyOrUoMProperty);
520
+ if (addUnitInTemplate) {
521
+ _appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
522
+ } else {
523
+ relatedProperties.exportSettings.unitProperty = unitOrCurrencyRelativePath;
524
+ }
525
+ if (currencyProperty) {
526
+ relatedProperties.exportSettings.isCurrency = true;
527
+ }
528
+ relatedProperties.exportSettings.scale = property.scale;
529
+ }
530
+ }
531
+
509
532
  /**
510
533
  * Collect properties consumed by a DataField.
511
534
  * This is for populating the ComplexPropertyInfos of the table delegate.
@@ -514,7 +537,7 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
514
537
  * @param converterContext The converter context.
515
538
  * @param tableType The table type.
516
539
  * @param relatedProperties The properties identified so far.
517
- * @param isEmbedded True if the DataField is embedded in another annotation (e.g. FieldGroup).
540
+ * @param isEmbedded True if the DataField is embedded in another annotation (such as FieldGroup).
518
541
  * @returns The properties related to the DataField.
519
542
  */
520
543
  function collectRelatedPropertiesRecursively(dataField, converterContext, tableType) {
@@ -614,4 +637,4 @@ sap.ui.define(["sap/fe/core/helpers/TypeGuards", "sap/fe/core/templating/Display
614
637
  _exports.getDataFieldDataType = getDataFieldDataType;
615
638
  return _exports;
616
639
  }, false);
617
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsInVuZGVmaW5lZCIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNBY3Rpb25Dcml0aWNhbCIsInBhcmFtZXRlcnMiLCJsZW5ndGgiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50Iiwic291cmNlIiwidGFyZ2V0VmFsdWUiLCJpc1Byb3BlcnR5IiwiZGF0YVBvaW50IiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0VmFsdWUiLCJNYXhpbXVtVmFsdWUiLCJ0b1N0cmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsInByb3BlcnR5IiwiaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQiLCJWaXN1YWxpemF0aW9uIiwiaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJWYWx1ZSIsIlNlbWFudGljT2JqZWN0IiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIl9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeCIsInBhdGgiLCJpbmNsdWRlcyIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JpdGljYWxpdHkiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHlQYXRoIiwiX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgiLCJrZXkiLCJ2YWx1ZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwicHJvcGVydGllcyIsImFubm90YXRpb25Qcm9wZXJ0eSIsIk9iamVjdCIsImtleXMiLCJpbmRleE9mIiwiX2FwcGVuZFRlbXBsYXRlIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsImlnbm9yZVNlbGYiLCJhZGRVbml0SW5UZW1wbGF0ZSIsImlzQW5ub3RhdGVkQXNIaWRkZW4iLCJ2YWx1ZUluZGV4IiwiY3VycmVuY3lPclVvTUluZGV4IiwiZXh0ZXJuYWxJZFBhdGgiLCJnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aCIsImV4dGVybmFsSWRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHkiLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldENvbnRleHRQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwid3JhcCIsInBhdGhGb3JUZXh0IiwicHJvcGVydHlGb3JUZXh0IiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uSW5kZXgiLCJjdXJyZW5jeVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJ1bml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsImlzQ3VycmVuY3kiLCJjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzIiwiVmFsdWVGb3JtYXQiLCJjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyIsImNvbnRhY3RQcm9wZXJ0eSIsImZuIiwiY29udGFjdFByb3BlcnR5UGF0aCIsInVuaXQiLCJ0aW1lem9uZSIsImdldERhdGFQb2ludFZpc3VhbGl6YXRpb24iLCJkYXRhUG9pbnRQcm9wZXJ0eSIsImRhdGFwb2ludFRhcmdldCIsImRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSIsImRhdGFQb2ludEluZGV4IiwibmFtZSIsImRhdGFQb2ludFRhcmdldFZhbHVlIiwiaGFzU3RhdGljUGVyY2VudFVuaXQiLCJ0aW1lem9uZU9yVW9NSW5kZXgiLCJjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXNSZWN1cnNpdmVseSIsImlzRW1iZWRkZWQiLCJpc1N0YXRpY2FsbHlIaWRkZW4iLCJpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiIsIkRhdGEiLCJmb3JFYWNoIiwiaW5uZXJEYXRhRmllbGQiLCJkYXRhRmllbGRDb250YWN0IiwiZ2V0RGF0YUZpZWxkRGF0YVR5cGUiLCJvRGF0YUZpZWxkIiwidHlwZSIsInNEYXRhVHlwZSIsIiRQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJEYXRhRmllbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbm5vdGF0aW9uVGVybSwgRGVjaW1hbCwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uLCBQcmltaXRpdmVUeXBlLCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb250YWN0IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgeyBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzIH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzL3ZvY2FidWxhcmllcy9Db21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgdHlwZSB7XG5cdERhdGFGaWVsZCxcblx0RGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0RGF0YUZpZWxkRm9yQWN0aW9uLFxuXHREYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBbm5vdGF0aW9uLFxuXHREYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24sXG5cdERhdGFGaWVsZFR5cGVzLFxuXHREYXRhUG9pbnQsXG5cdERhdGFQb2ludFR5cGUsXG5cdERhdGFQb2ludFR5cGVUeXBlcyxcblx0RmllbGRHcm91cFxufSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgeyBVSUFubm90YXRpb25UeXBlcywgVmlzdWFsaXphdGlvblR5cGUgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL1VJXCI7XG5pbXBvcnQgdHlwZSB7IFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbkV4cG9ydFNldHRpbmdzLCBUYWJsZVR5cGUgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9jb250cm9scy9Db21tb24vVGFibGVcIjtcbmltcG9ydCB7IGlzQW5ub3RhdGlvbk9mVHlwZSwgaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIGlzUHJvcGVydHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9UeXBlR3VhcmRzXCI7XG5pbXBvcnQgeyBnZXREaXNwbGF5TW9kZSB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0Rpc3BsYXlNb2RlRm9ybWF0dGVyXCI7XG5pbXBvcnQge1xuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eSxcblx0Z2V0QXNzb2NpYXRlZFVuaXRQcm9wZXJ0eSxcblx0aGFzU3RhdGljUGVyY2VudFVuaXRcbn0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvUHJvcGVydHlIZWxwZXJcIjtcbmltcG9ydCB7IGVuaGFuY2VEYXRhTW9kZWxQYXRoLCBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoLCB0eXBlIERhdGFNb2RlbE9iamVjdFBhdGggfSBmcm9tIFwiLi4vLi4vdGVtcGxhdGluZy9EYXRhTW9kZWxQYXRoSGVscGVyXCI7XG5pbXBvcnQgdHlwZSB7IERpc3BsYXlNb2RlIH0gZnJvbSBcIi4uLy4uL3RlbXBsYXRpbmcvVUlGb3JtYXR0ZXJzXCI7XG5pbXBvcnQgdHlwZSBDb252ZXJ0ZXJDb250ZXh0IGZyb20gXCIuLi9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgeyBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbiB9IGZyb20gXCIuLi9oZWxwZXJzL0RhdGFGaWVsZEhlbHBlclwiO1xuXG5leHBvcnQgdHlwZSBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB7IGFubm90YXRpb25Qcm9wZXJ0eTogUHJvcGVydHk7IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uPzogRGlzcGxheU1vZGUgfT47XG5cdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eT47XG5cdGV4cG9ydFNldHRpbmdzOiBDb2x1bW5FeHBvcnRTZXR0aW5ncztcbn07XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0XCIuXG4gKiBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdCBoYXMgYW4gaW5saW5lIGFjdGlvbiBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0KGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyk6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RUeXBlcykuaGFzT3duUHJvcGVydHkoXCJBY3Rpb25cIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcImlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvblwiLlxuICogaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckFubm90YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQW5ub3RhdGlvbihcblx0ZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgRGF0YVBvaW50VHlwZVR5cGVzIHwgdW5kZWZpbmVkXG4pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBbm5vdGF0aW9uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBY3Rpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgdW5kZWZpbmVkKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb247XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblwiLlxuICogRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIGhhcyBhbiBpbmxpbmUgJFR5cGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlcyB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24oZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbiB7XG5cdHJldHVybiBkYXRhRmllbGQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkVHlwZXNcIi5cbiAqIERhdGFGaWVsZCBoYXMgYSB2YWx1ZSBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGUgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRUeXBlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRUeXBlcyhkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZFR5cGVzIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkVHlwZXMpLmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBpZiB0aGUgZ2l2ZW4gZGF0YUZpZWxkQWJzdHJhY3QgdGhhdCBpcyBwYXNzZWQgaXMgYSBcIkRhdGFGaWVsZFwiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGQoZGF0YUZpZWxkOiBEYXRhRmllbGQgfCB1bmtub3duKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZCB7XG5cdHJldHVybiAoZGF0YUZpZWxkIGFzIERhdGFGaWVsZCk/Lmhhc093blByb3BlcnR5KFwiVmFsdWVcIik7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIFRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGJlaW5nIHByb2Nlc3NlZFxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGZpZWxkIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRmllbGRHcm91cFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RmllbGRHcm91cD4oZGF0YUZpZWxkVGFyZ2V0LCBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBpcyBhIGRhdGEgcG9pbnQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZGF0YSBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0RhdGFQb2ludFRhcmdldChkYXRhRmllbGRGb3JBbm5vdGF0aW9uOiBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGNvbnN0IGRhdGFGaWVsZFRhcmdldCA9IGRhdGFGaWVsZEZvckFubm90YXRpb24uVGFyZ2V0LiR0YXJnZXQ7XG5cdHJldHVybiBpc0Fubm90YXRpb25PZlR5cGU8RGF0YVBvaW50PihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YSBtb2RlbCBvYmplY3QgcGF0aCB0YXJnZXRpbmcgYSBkYXRhRmllbGQgZm9yIGFjdGlvbiBvcGVucyB1cCBhIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gZGF0YU1vZGVsT2JqZWN0UGF0aCBEYXRhTW9kZWxPYmplY3RQYXRoXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YU1vZGVsT2JqZWN0UGF0aEZvckFjdGlvbldpdGhEaWFsb2coXG5cdGRhdGFNb2RlbE9iamVjdFBhdGg6IERhdGFNb2RlbE9iamVjdFBhdGg8RGF0YUZpZWxkQWJzdHJhY3RUeXBlcz5cbik6IFwiRGlhbG9nXCIgfCBcIk5vbmVcIiB7XG5cdGNvbnN0IHRhcmdldCA9IGRhdGFNb2RlbE9iamVjdFBhdGgudGFyZ2V0T2JqZWN0O1xuXHRyZXR1cm4gaXNBY3Rpb25XaXRoRGlhbG9nKGlzRGF0YUZpZWxkRm9yQWN0aW9uKHRhcmdldCkgPyB0YXJnZXQgOiB1bmRlZmluZWQpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgZGF0YUZpZWxkIGZvciBhY3Rpb24gb3BlbnMgdXAgYSBkaWFsb2cuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgZm9yIGFjdGlvblxuICogQHJldHVybnMgYERpYWxvZ2AgfCBgTm9uZWAgaWYgYSBkaWFsb2cgaXMgbmVlZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FjdGlvbldpdGhEaWFsb2coZGF0YUZpZWxkPzogRGF0YUZpZWxkRm9yQWN0aW9uKTogXCJEaWFsb2dcIiB8IFwiTm9uZVwiIHtcblx0Y29uc3QgYWN0aW9uID0gZGF0YUZpZWxkPy5BY3Rpb25UYXJnZXQ7XG5cdGlmIChhY3Rpb24pIHtcblx0XHRjb25zdCBiQ3JpdGljYWwgPSBhY3Rpb24uYW5ub3RhdGlvbnM/LkNvbW1vbj8uSXNBY3Rpb25Dcml0aWNhbDtcblx0XHRpZiAoYWN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMSB8fCBiQ3JpdGljYWwpIHtcblx0XHRcdHJldHVybiBcIkRpYWxvZ1wiO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gXCJOb25lXCI7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBcIk5vbmVcIjtcblx0fVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgVGFyZ2V0VmFsdWUgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFRoZSB0YXJnZXQgcHJvcGVydHkgb3IgRGF0YVBvaW50XG4gKiBAcmV0dXJucyBUaGUgVGFyZ2V0VmFsdWUgYXMgYSBkZWNpbWFsIG9yIGEgcHJvcGVydHkgcGF0aFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nIHtcblx0bGV0IHRhcmdldFZhbHVlOiBEZWNpbWFsIHwgdW5kZWZpbmVkIHwgUGF0aEFubm90YXRpb25FeHByZXNzaW9uPHVua25vd24+IHwgc3RyaW5nO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0Y29uc3QgZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHRcdHRhcmdldFZhbHVlID0gZGF0YVBvaW50Py5UYXJnZXRWYWx1ZSA/PyBkYXRhUG9pbnQ/Lk1heGltdW1WYWx1ZTtcblx0fSBlbHNlIHtcblx0XHR0YXJnZXRWYWx1ZSA9IHNvdXJjZS5UYXJnZXRWYWx1ZSA/PyBzb3VyY2UuTWF4aW11bVZhbHVlO1xuXHR9XG5cdGlmICh0eXBlb2YgdGFyZ2V0VmFsdWUgPT09IFwibnVtYmVyXCIpIHtcblx0XHRyZXR1cm4gdGFyZ2V0VmFsdWUudG9TdHJpbmcoKTtcblx0fVxuXHRyZXR1cm4gaXNQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24odGFyZ2V0VmFsdWUpID8gdGFyZ2V0VmFsdWUgOiBcIjEwMFwiO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIERhdGFQb2ludCB3aXRoaW4gYSBEYXRhRmllbGREZWZhdWx0LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSByZWZlcmVuY2VkIHByb3BlcnR5IGhhcyBhIERhdGFQb2ludCB3aXRoaW4gdGhlIERhdGFGaWVsZERlZmF1bHQsIGZhbHNlIGVsc2VcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHQocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdCk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgcHJvcGVydHkgdXNlcyBhIGRlZmF1bHQgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc3VhbGl6YXRpb24gdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgaXMgYSBSYXRpbmdcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQgPSBmdW5jdGlvbiAocHJvcGVydHk6IFByb3BlcnR5KTogYm9vbGVhbiB7XG5cdHJldHVybiAoXG5cdFx0aXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdChwcm9wZXJ0eSkgJiZcblx0XHQoKHByb3BlcnR5LmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIEFubm90YXRpb25UZXJtPERhdGFQb2ludD4pXG5cdFx0XHQ/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUmF0aW5nXCJcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgUHJvZ3Jlc3MgdmlzdWFsaXphdGlvbiBSYXRpbmcgdGhyb3VnaCBhIERhdGFGaWVsZERlZmF1bHQgb3IgYSBkaXJlY3QgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY2hlY2tlZFxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2aXN1YWxpemF0aW9uIGlzIGEgUHJvZ3Jlc3NcbiAqL1xuXG5leHBvcnQgY29uc3QgaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkgfCBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG5cdGlmIChpc1Byb3BlcnR5KHByb3BlcnR5KSAmJiBpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSkge1xuXHRcdHByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnMuVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjtcblx0fVxuXHRyZXR1cm4gKChwcm9wZXJ0eSBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKS5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZSk/LlZpc3VhbGl6YXRpb24gPT09IFwiVUkuVmlzdWFsaXphdGlvblR5cGUvUHJvZ3Jlc3NcIjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW1hbnRpY09iamVjdFBhdGgoXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pixcblx0b2JqZWN0OiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzIHwgUHJvcGVydHlcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmICh0eXBlb2Ygb2JqZWN0ID09PSBcIm9iamVjdFwiKSB7XG5cdFx0aWYgKGlzRGF0YUZpZWxkVHlwZXMob2JqZWN0KSAmJiBvYmplY3QuVmFsdWU/LiR0YXJnZXQpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5ID0gb2JqZWN0LlZhbHVlPy4kdGFyZ2V0O1xuXHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uQ29tbW9uPy5TZW1hbnRpY09iamVjdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb252ZXJ0ZXJDb250ZXh0LmdldEVudGl0eVNldEJhc2VkQW5ub3RhdGlvblBhdGgocHJvcGVydHk/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc1Byb3BlcnR5KG9iamVjdCkpIHtcblx0XHRcdGlmIChvYmplY3Q/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChvYmplY3Q/LmZ1bGx5UXVhbGlmaWVkTmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmF2aWdhdGlvbiBwYXRoIHByZWZpeCBmb3IgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoIEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IEZvciBlLmcuIC9FbnRpdHlUeXBlL05hdmlnYXRpb24vXG4gKi9cbmZ1bmN0aW9uIF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuXHRpZiAocGF0aCkge1xuXHRcdHJldHVybiBwYXRoLmluY2x1ZGVzKFwiL1wiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoXCIvXCIpICsgMSkgOiBcIlwiO1xuXHR9XG5cdHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIENvbGxlY3QgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgQUxQIHRhYmxlIHVzZS1jYXNlLlxuICpcbiAqIEZvciBlLmcuIElmIFVJLkhpZGRlbiBwb2ludHMgdG8gYSBwcm9wZXJ0eSwgaW5jbHVkZSB0aGlzIHByb3BlcnR5IGluIHRoZSBhZGRpdGlvbmFsUHJvcGVydGllcyBvZiBDb21wbGV4UHJvcGVydHlJbmZvIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFByb3BlcnR5IG9yIERhdGFGaWVsZCBiZWluZyBwcm9jZXNzZWRcbiAqIEBwYXJhbSBuYXZpZ2F0aW9uUGF0aFByZWZpeCBOYXZpZ2F0aW9uIHBhdGggcHJlZml4LCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzLlxuICogQHBhcmFtIHRhYmxlVHlwZSBUYWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmZ1bmN0aW9uIF9jb2xsZWN0QWRkaXRpb25hbFByb3BlcnRpZXNGb3JBbmFseXRpY2FsVGFibGUoXG5cdHRhcmdldDogUHJpbWl0aXZlVHlwZSxcblx0bmF2aWdhdGlvblBhdGhQcmVmaXg6IHN0cmluZyxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0aWYgKHRhYmxlVHlwZSA9PT0gXCJBbmFseXRpY2FsVGFibGVcIikge1xuXHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb24gPSB0YXJnZXQuYW5ub3RhdGlvbnM/LlVJPy5IaWRkZW47XG5cdFx0aWYgKGhpZGRlbkFubm90YXRpb24/LnBhdGggJiYgaXNQcm9wZXJ0eShoaWRkZW5Bbm5vdGF0aW9uLiR0YXJnZXQpKSB7XG5cdFx0XHRjb25zdCBoaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBoaWRkZW5Bbm5vdGF0aW9uLnBhdGg7XG5cdFx0XHQvLyBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSBhZGRlZCB0byBhZGRpdGlvbmFsUHJvcGVydGllcyBtYXAgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1toaWRkZW5Bbm5vdGF0aW9uUHJvcGVydHlQYXRoXSA9IGhpZGRlbkFubm90YXRpb24uJHRhcmdldDtcblx0XHR9XG5cblx0XHRjb25zdCBjcml0aWNhbGl0eSA9IHRhcmdldC5Dcml0aWNhbGl0eTtcblx0XHRpZiAoY3JpdGljYWxpdHk/LnBhdGggJiYgaXNQcm9wZXJ0eShjcml0aWNhbGl0eT8uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGNyaXRpY2FsaXR5UHJvcGVydHlQYXRoID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjcml0aWNhbGl0eS5wYXRoO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuYWRkaXRpb25hbFByb3BlcnRpZXNbY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGhdID0gY3JpdGljYWxpdHk/LiR0YXJnZXQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyB0byBwdXNoIHVuaXF1ZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzXG4gKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnRpZXMgb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWUgcHJvcGVydHksIGRlc2NyaXB0aW9uIHByb3BlcnR5Li4uXG4gKiBAcGFyYW0gZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24gVGhlIGRpc3BsYXkgbW9kZSBpZiB0aGUgcHJvcGVydHkgaXMgcmVmZXJlbmNlZCBhcyBkZXNjcmlwdGlvbiBvbiB0ZXh0IGFycmFuZ2VtZW50XG4gKiBAcmV0dXJucyBJbmRleCBhdCB3aGljaCB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlXG4gKi9cbmZ1bmN0aW9uIF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0a2V5OiBzdHJpbmcsXG5cdHZhbHVlOiBQcm9wZXJ0eSxcblx0ZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24/OiBEaXNwbGF5TW9kZVxuKTogbnVtYmVyIHtcblx0aWYgKCFyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzW2tleV0gPSB7IGFubm90YXRpb25Qcm9wZXJ0eTogdmFsdWUgfTtcblx0XHRpZiAoZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24pIHtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XS5kaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiA9IGRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllcykuaW5kZXhPZihrZXkpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIGFwcGVuZCB0aGUgZXhwb3J0IHNldHRpbmdzIHRlbXBsYXRlIHdpdGggYSBmb3JtYXR0ZWQgdGV4dC5cbiAqXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSB2YWx1ZSBGb3JtYXR0ZWQgdGV4dFxuICovXG5mdW5jdGlvbiBfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGUgPSByZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGVcblx0XHQ/IGAke3JlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRlbXBsYXRlfSR7dmFsdWV9YFxuXHRcdDogYCR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHJlbGF0ZWQgcHJvcGVydGllcyBmcm9tIGEgcHJvcGVydHkncyBhbm5vdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkXG4gKiBAcGFyYW0gY29udmVydGVyQ29udGV4dCBUaGUgY29udmVydGVyIGNvbnRleHRcbiAqIEBwYXJhbSBpZ25vcmVTZWxmIFdoZXRoZXIgdG8gZXhjbHVkZSB0aGUgc2FtZSBwcm9wZXJ0eSBmcm9tIHRoZSByZWxhdGVkIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRoZSB0YWJsZSB0eXBlLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgVHJ1ZSBpZiB0aGUgdW5pdC9jdXJyZW5jeSBwcm9wZXJ0eSBuZWVkcyB0byBiZSBhZGRlZCBpbiB0aGUgZXhwb3J0IHRlbXBsYXRlXG4gKiBAcGFyYW0gaXNBbm5vdGF0ZWRBc0hpZGRlbiBUcnVlIGlmIHRoZSBEYXRhRmllbGQgb3IgdGhlIHByb3BlcnR5IGFyZSBzdGF0aWNhbGx5IGhpZGRlblxuICogQHJldHVybnMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRwYXRoOiBzdHJpbmcsXG5cdHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLFxuXHRjb252ZXJ0ZXJDb250ZXh0OiBDb252ZXJ0ZXJDb250ZXh0LFxuXHRpZ25vcmVTZWxmOiBib29sZWFuLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdFx0cHJvcGVydGllczoge30sXG5cdFx0YWRkaXRpb25hbFByb3BlcnRpZXM6IHt9LFxuXHRcdGV4cG9ydFNldHRpbmdzOiB7fVxuXHR9LFxuXHRhZGRVbml0SW5UZW1wbGF0ZSA9IGZhbHNlLFxuXHRpc0Fubm90YXRlZEFzSGlkZGVuID0gZmFsc2Vcbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAocGF0aCAmJiBwcm9wZXJ0eSkge1xuXHRcdGxldCB2YWx1ZUluZGV4OiBudW1iZXI7XG5cdFx0bGV0IGN1cnJlbmN5T3JVb01JbmRleDogbnVtYmVyO1xuXHRcdC8qIEVYVEVSTkFMSUQgKi9cblx0XHRjb25zdCBleHRlcm5hbElkUGF0aCA9IGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCBleHRlcm5hbElkUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5KHByb3BlcnR5KTtcblxuXHRcdGlmIChpc0Fubm90YXRlZEFzSGlkZGVuKSB7XG5cdFx0XHQvLyBDb2xsZWN0IHVuZGVybHlpbmcgcHJvcGVydHlcblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG5cdFx0fVxuXHRcdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIFRleHQgYW5ub3RhdGlvbi5cblx0XHRjb25zdCB0ZXh0UHJvcGVydHlQYXRoID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgoZXh0ZXJuYWxJZFByb3BlcnR5IHx8IHByb3BlcnR5KTtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5KGV4dGVybmFsSWRQcm9wZXJ0eSB8fCBwcm9wZXJ0eSk7XG5cblx0XHQvLyBnZXQgdGhlIERhdGFNb2RlbE9iamVjdFBhdGggZm9yIHRoZSBjb2x1bW5cblx0XHRjb25zdCBkYXRhTW9kZWxPYmplY3RQYXRoID0gY29udmVydGVyQ29udGV4dC5nZXRDb252ZXJ0ZXJDb250ZXh0Rm9yKGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCgpO1xuXHRcdGNvbnN0IHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5PihkYXRhTW9kZWxPYmplY3RQYXRoLCBleHRlcm5hbElkUGF0aCB8fCBwYXRoKTtcblx0XHRjb25zdCB0ZXh0UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoID0gZW5oYW5jZURhdGFNb2RlbFBhdGg8UHJvcGVydHk+KHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCwgdGV4dFByb3BlcnR5UGF0aCk7XG5cdFx0Y29uc3QgdGV4dFJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCk7XG5cblx0XHRpZiAocmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3M/LnRlbXBsYXRlKSB7XG5cdFx0XHQvLyBGaWVsZEdyb3VwIHVzZS1jYXNlLiBOZWVkIHRvIGFkZCBlYWNoIEZpZWxkIGluIG5ldyBsaW5lLlxuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBcIlxcblwiKTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLndyYXAgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0ZXh0UHJvcGVydHkgJiYgdGV4dFJlbGF0aXZlUGF0aCkge1xuXHRcdFx0Y29uc3QgcGF0aEZvclRleHQgPSBleHRlcm5hbElkUGF0aCA/IGV4dGVybmFsSWRQYXRoIDogcGF0aDtcblx0XHRcdGNvbnN0IHByb3BlcnR5Rm9yVGV4dCA9IGV4dGVybmFsSWRQcm9wZXJ0eSA/IGV4dGVybmFsSWRQcm9wZXJ0eSA6IHByb3BlcnR5O1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIFRleHQgQXJyYW5nZW1lbnQuXG5cdFx0XHRjb25zdCBkaXNwbGF5TW9kZSA9IGdldERpc3BsYXlNb2RlKHByb3BlcnR5Rm9yVGV4dCwgcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblx0XHRcdGxldCBkZXNjcmlwdGlvbkluZGV4OiBudW1iZXI7XG5cdFx0XHRzd2l0Y2ggKGRpc3BsYXlNb2RlKSB7XG5cdFx0XHRcdGNhc2UgXCJEZXNjcmlwdGlvblwiOlxuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgdGV4dFJlbGF0aXZlUGF0aCwgdGV4dFByb3BlcnR5LCBcIkRlc2NyaXB0aW9uXCIpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJWYWx1ZURlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoRm9yVGV4dCwgcHJvcGVydHlGb3JUZXh0KTtcblx0XHRcdFx0XHRkZXNjcmlwdGlvbkluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdHRleHRSZWxhdGl2ZVBhdGgsXG5cdFx0XHRcdFx0XHR0ZXh0UHJvcGVydHksXG5cdFx0XHRcdFx0XHRcIlZhbHVlRGVzY3JpcHRpb25cIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICh7JHtkZXNjcmlwdGlvbkluZGV4fX0pYCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uVmFsdWVcIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiRGVzY3JpcHRpb25WYWx1ZVwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHtkZXNjcmlwdGlvbkluZGV4fX0gKHske3ZhbHVlSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBDaGVjayBmb3IgZmllbGQgY29udGFpbmluZyBDdXJyZW5jeSBPciBVbml0IFByb3BlcnRpZXMgb3IgVGltZXpvbmVcblx0XHRcdGNvbnN0IGN1cnJlbmN5UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB1bml0UHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IGN1cnJlbmN5T3JVb01Qcm9wZXJ0eSA9IGN1cnJlbmN5UHJvcGVydHkgPz8gdW5pdFByb3BlcnR5O1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248c3RyaW5nPiA9XG5cdFx0XHRcdHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5IHx8IHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LlVuaXQ7XG5cdFx0XHRjb25zdCB0aW1lem9uZVByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgdGltZXpvbmVBbm5vdGF0aW9uID0gcHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlRpbWV6b25lO1xuXG5cdFx0XHRpZiAoY3VycmVuY3lPclVvTVByb3BlcnR5KSB7XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRjdXJyZW5jeU9yVW9NSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi5wYXRoLFxuXHRcdFx0XHRcdGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbi4kdGFyZ2V0IVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gIHske2N1cnJlbmN5T3JVb01JbmRleH19YCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjdXJyZW5jeU9yVW5pdEFubm90YXRpb24ucGF0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoY3VycmVuY3lQcm9wZXJ0eSkge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmlzQ3VycmVuY3kgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lUHJvcGVydHkgJiYgdGltZXpvbmVBbm5vdGF0aW9uPy4kdGFyZ2V0KSB7XG5cdFx0XHRcdGNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoLCBhZGRVbml0SW5UZW1wbGF0ZSk7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHQocHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSAmJiAhcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZUZvcm1hdCkgfHxcblx0XHRcdFx0cHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0Py5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHksIHJlbGF0ZWRQcm9wZXJ0aWVzLCBwYXRoKTtcblx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHkuJFR5cGUgPT09IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMuQ29udGFjdFR5cGUpIHtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5ID0gcHJvcGVydHkuZm4/LiR0YXJnZXQ7XG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RQcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eS5mbj8ucGF0aDtcblx0XHRcdFx0dmFsdWVJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ID8gbmF2aWdhdGlvblBhdGhQcmVmaXggKyBjb250YWN0UHJvcGVydHlQYXRoIDogY29udGFjdFByb3BlcnR5UGF0aCxcblx0XHRcdFx0XHRjb250YWN0UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHR9IGVsc2UgaWYgKCFpZ25vcmVTZWxmKSB7XG5cdFx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eVxuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdGlmIChjdXJyZW5jeU9yVW5pdEFubm90YXRpb24pIHtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy51bml0ID0gYCR7Y3VycmVuY3lPclVuaXRBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgY3VycmVuY3kvdW5pdFxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/Lk1lYXN1cmVzPy5JU09DdXJyZW5jeSkge1xuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuaXNDdXJyZW5jeSA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHRpbWV6b25lQW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRpbWV6b25lID0gYCR7dGltZXpvbmVBbm5vdGF0aW9ufWA7IC8vIEhhcmQtY29kZWQgdGltZXpvbmVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShwcm9wZXJ0eSwgbmF2aWdhdGlvblBhdGhQcmVmaXgsIHRhYmxlVHlwZSwgcmVsYXRlZFByb3BlcnRpZXMpO1xuXHRcdGlmIChPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllcykubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5sZW5ndGggPT09IDApIHtcblx0XHRcdC8vIENvbGxlY3QgdW5kZXJseWluZyBwcm9wZXJ0eSBpZiBub3QgY29sbGVjdGVkIGFscmVhZHkuXG5cdFx0XHQvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFyZSBtYWRlIGF2YWlsYWJsZSBvbmx5IHRvIGNvbXBsZXggcHJvcGVydHkgaW5mb3MuXG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVsYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgdHlwZSBvZiBWaXN1YWxpemF0aW9uIG9mIHRoZSBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBTb3VyY2Ugb2YgdGhlIERhdGFQb2ludC5cbiAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm9uZS5cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YVBvaW50VmlzdWFsaXphdGlvbihzb3VyY2U6IFByb3BlcnR5IHwgRGF0YVBvaW50VHlwZSk6IFZpc3VhbGl6YXRpb25UeXBlIHtcblx0bGV0IGRhdGFQb2ludDogRGF0YVBvaW50VHlwZTtcblx0aWYgKGlzUHJvcGVydHkoc291cmNlKSkge1xuXHRcdGRhdGFQb2ludCA9IChzb3VyY2UuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgRGF0YVBvaW50VHlwZTtcblx0fSBlbHNlIHtcblx0XHRkYXRhUG9pbnQgPSBzb3VyY2U7XG5cdH1cblx0cmV0dXJuIGRhdGFQb2ludC5WaXN1YWxpemF0aW9uID8/IFZpc3VhbGl6YXRpb25UeXBlLk51bWJlcjtcbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3REYXRhUG9pbnRQcm9wZXJ0aWVzKHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLCByZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbywgcGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdGNvbnN0IGRhdGFQb2ludFByb3BlcnR5ID0gcHJvcGVydHkuVGFyZ2V0Py4kdGFyZ2V0Py5WYWx1ZS4kdGFyZ2V0IGFzIFByb3BlcnR5O1xuXHRjb25zdCBkYXRhcG9pbnRUYXJnZXQgPSBwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ7XG5cdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXHQvLyBEYXRhUG9pbnQgdXNlLWNhc2UgdXNpbmcgRGF0YUZpZWxkRGVmYXVsdC5cblx0Y29uc3QgZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID0gcHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0O1xuXHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHBhdGggOiBwYXRoLFxuXHRcdGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHlcblx0KTtcblx0Ly8gSWYgd2UgaGF2ZSBhIERhdGFQb2ludCB3aXRob3V0IHZpc3VhbGl6YXRpb24sIG9yIGEgTnVtYmVyLCB3ZSBkb24ndCBoYXZlIGEgVGFyZ2V0VmFsdWUvTWF4aW11bVZhbHVlXG5cdGlmIChnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KSA9PT0gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IHRhcmdldFZhbHVlID0gZ2V0VGFyZ2V0VmFsdWVPbkRhdGFQb2ludChkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPyBwcm9wZXJ0eSA6IGRhdGFwb2ludFRhcmdldCk7XG5cdGlmIChpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkpIHtcblx0XHRpZiAodGFyZ2V0VmFsdWUuJHRhcmdldCkge1xuXHRcdFx0Ly9pbiBjYXNlIGl0J3MgYSBkeW5hbWljIHRhcmdldFZhbHVlXG5cdFx0XHRjb25zdCBkYXRhUG9pbnRJbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSA6IHRhcmdldFZhbHVlLiR0YXJnZXQubmFtZSxcblx0XHRcdFx0dGFyZ2V0VmFsdWUuJHRhcmdldFxuXHRcdFx0KTtcblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWUucGF0aDtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fS97JHtkYXRhUG9pbnRJbmRleH19YCk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGhhc1N0YXRpY1BlcmNlbnRVbml0KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YVBvaW50UHJvcGVydHkpICYmIGlzQVByb2dyZXNzVHlwZUZyb21EYXRhUG9pbnQocHJvcGVydHkpKSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdCA9IFwiJVwiO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLmRhdGFQb2ludFRhcmdldFZhbHVlID0gdGFyZ2V0VmFsdWU7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19LyR7dGFyZ2V0VmFsdWV9YCk7XG5cdH1cbn1cblxuLyoqXG4gKlx0Q29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIFRpbWV6b25lLlxuICpcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZC5cbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllcyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQgc28gZmFyLlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGguXG4gKiBAcGFyYW0gYWRkVW5pdEluVGVtcGxhdGUgU2hvdWxkIHdlIGFkZCB0aGUgdW5pdCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICovXG5mdW5jdGlvbiBjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzKFxuXHRwcm9wZXJ0eTogUHJpbWl0aXZlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm8sXG5cdHBhdGg6IHN0cmluZyxcblx0YWRkVW5pdEluVGVtcGxhdGU6IGJvb2xlYW5cbik6IHZvaWQge1xuXHRjb25zdCB0aW1lem9uZUFubm90YXRpb24gPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5Db21tb24uVGltZXpvbmU7XG5cdGNvbnN0IG5hdmlnYXRpb25QYXRoUHJlZml4ID0gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGgpO1xuXHRjb25zdCB2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblxuXHRjb25zdCB0aW1lem9uZU9yVW9NSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRpbWV6b25lQW5ub3RhdGlvbi5wYXRoLFxuXHRcdHRpbWV6b25lQW5ub3RhdGlvbi4kdGFyZ2V0XG5cdCk7XG5cdGlmIChhZGRVbml0SW5UZW1wbGF0ZSkge1xuXHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7dGltZXpvbmVPclVvTUluZGV4fX1gKTtcblx0fSBlbHNlIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50aW1lem9uZVByb3BlcnR5ID0gbmF2aWdhdGlvblBhdGhQcmVmaXggKyB0aW1lem9uZUFubm90YXRpb24ucGF0aDtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgcHJvcGVydGllcyBjb25zdW1lZCBieSBhIERhdGFGaWVsZC5cbiAqIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm9zIG9mIHRoZSB0YWJsZSBkZWxlZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChlLmcuIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0aXNFbWJlZGRlZCA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0bGV0IGlzU3RhdGljYWxseUhpZGRlbiA9IGZhbHNlO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZD8uJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGlmIChkYXRhRmllbGQuVmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBkYXRhRmllbGQuVmFsdWU7XG5cdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdHByb3BlcnR5LnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkuJHRhcmdldCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZTpcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRcdGlubmVyRGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQudmFsdWUsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGRDb250YWN0LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbixcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc1Byb3BlcnR5KG9EYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGQudHlwZTtcblx0fVxuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN3aXRjaCAob0RhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZFRhcmdldC5mbikpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuZm4uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiRQYXRoPy4kVHlwZSB8fCBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHRvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGVcIiA/IHVuZGVmaW5lZCA6IFwiRWRtLkJvb2xlYW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDTyxTQUFTQSw0QkFBNEIsQ0FBQ0MsU0FBaUMsRUFBZ0Q7SUFDN0gsT0FBUUEsU0FBUyxDQUFxQ0MsY0FBYyxDQUFDLFFBQVEsQ0FBQztFQUMvRTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BO0VBT08sU0FBU0Msd0JBQXdCLENBQ3ZDRixTQUFrRSxFQUM1QjtJQUN0QyxPQUFPLENBQUFBLFNBQVMsYUFBVEEsU0FBUyx1QkFBVEEsU0FBUyxDQUFFRyxLQUFLLHlEQUE2QztFQUNyRTtFQUFDO0VBRU0sU0FBU0Msb0JBQW9CLENBQUNKLFNBQTZDLEVBQW1DO0lBQ3BILE9BQU8sQ0FBQUEsU0FBUyxhQUFU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
640
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc0RhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IiwiZGF0YUZpZWxkIiwiaGFzT3duUHJvcGVydHkiLCJpc0RhdGFGaWVsZEZvckFubm90YXRpb24iLCIkVHlwZSIsImlzRGF0YUZpZWxkRm9yQWN0aW9uIiwiaXNEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24iLCJpc0RhdGFGaWVsZFR5cGVzIiwiaXNEYXRhRmllbGQiLCJoYXNGaWVsZEdyb3VwVGFyZ2V0IiwiZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiIsImRhdGFGaWVsZFRhcmdldCIsIlRhcmdldCIsIiR0YXJnZXQiLCJpc0Fubm90YXRpb25PZlR5cGUiLCJoYXNEYXRhUG9pbnRUYXJnZXQiLCJpc0RhdGFNb2RlbE9iamVjdFBhdGhGb3JBY3Rpb25XaXRoRGlhbG9nIiwiZGF0YU1vZGVsT2JqZWN0UGF0aCIsInRhcmdldCIsInRhcmdldE9iamVjdCIsImlzQWN0aW9uV2l0aERpYWxvZyIsInVuZGVmaW5lZCIsImFjdGlvbiIsIkFjdGlvblRhcmdldCIsImJDcml0aWNhbCIsImFubm90YXRpb25zIiwiQ29tbW9uIiwiSXNBY3Rpb25Dcml0aWNhbCIsInBhcmFtZXRlcnMiLCJsZW5ndGgiLCJnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50Iiwic291cmNlIiwidGFyZ2V0VmFsdWUiLCJpc1Byb3BlcnR5IiwiZGF0YVBvaW50IiwiVUkiLCJEYXRhRmllbGREZWZhdWx0IiwiVGFyZ2V0VmFsdWUiLCJNYXhpbXVtVmFsdWUiLCJ0b1N0cmluZyIsImlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uIiwiaXNEYXRhUG9pbnRGcm9tRGF0YUZpZWxkRGVmYXVsdCIsInByb3BlcnR5IiwiaXNSYXRpbmdWaXN1YWxpemF0aW9uRnJvbURhdGFGaWVsZERlZmF1bHQiLCJWaXN1YWxpemF0aW9uIiwiaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludCIsImdldFNlbWFudGljT2JqZWN0UGF0aCIsImNvbnZlcnRlckNvbnRleHQiLCJvYmplY3QiLCJWYWx1ZSIsIlNlbWFudGljT2JqZWN0IiwiZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aCIsImZ1bGx5UXVhbGlmaWVkTmFtZSIsIl9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeCIsInBhdGgiLCJpbmNsdWRlcyIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZSIsIm5hdmlnYXRpb25QYXRoUHJlZml4IiwidGFibGVUeXBlIiwicmVsYXRlZFByb3BlcnRpZXMiLCJoaWRkZW5Bbm5vdGF0aW9uIiwiSGlkZGVuIiwiaGlkZGVuQW5ub3RhdGlvblByb3BlcnR5UGF0aCIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiY3JpdGljYWxpdHkiLCJDcml0aWNhbGl0eSIsImNyaXRpY2FsaXR5UHJvcGVydHlQYXRoIiwiX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgiLCJrZXkiLCJ2YWx1ZSIsImRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uIiwicHJvcGVydGllcyIsImFubm90YXRpb25Qcm9wZXJ0eSIsIk9iamVjdCIsImtleXMiLCJpbmRleE9mIiwiX2FwcGVuZFRlbXBsYXRlIiwiZXhwb3J0U2V0dGluZ3MiLCJ0ZW1wbGF0ZSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyIsImlnbm9yZVNlbGYiLCJhZGRVbml0SW5UZW1wbGF0ZSIsImlzQW5ub3RhdGVkQXNIaWRkZW4iLCJ2YWx1ZUluZGV4IiwiZXh0ZXJuYWxJZFBhdGgiLCJnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aCIsImV4dGVybmFsSWRQcm9wZXJ0eSIsImdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHkiLCJ0ZXh0UHJvcGVydHlQYXRoIiwiZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eVBhdGgiLCJ0ZXh0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5IiwiZ2V0Q29udmVydGVyQ29udGV4dEZvciIsImdldENvbnRleHRQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aCIsInByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsImVuaGFuY2VEYXRhTW9kZWxQYXRoIiwidGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCIsInRleHRSZWxhdGl2ZVBhdGgiLCJnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoIiwicmVsYXRpdmVQYXRoIiwid3JhcCIsInBhdGhGb3JUZXh0IiwicHJvcGVydHlGb3JUZXh0IiwiZGlzcGxheU1vZGUiLCJnZXREaXNwbGF5TW9kZSIsImRlc2NyaXB0aW9uSW5kZXgiLCJjdXJyZW5jeVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZEN1cnJlbmN5UHJvcGVydHkiLCJ1bml0UHJvcGVydHkiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5IiwiY3VycmVuY3lPclVvTVByb3BlcnR5IiwiY3VycmVuY3lPclVuaXRBbm5vdGF0aW9uIiwiTWVhc3VyZXMiLCJJU09DdXJyZW5jeSIsIlVuaXQiLCJ0aW1lem9uZVByb3BlcnR5IiwiZ2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHkiLCJ0aW1lem9uZUFubm90YXRpb24iLCJUaW1lem9uZSIsImNvbGxlY3RDdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMiLCJjb2xsZWN0VGltZXpvbmVQcm9wZXJ0aWVzIiwiVmFsdWVGb3JtYXQiLCJjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyIsImNvbnRhY3RQcm9wZXJ0eSIsImZuIiwiY29udGFjdFByb3BlcnR5UGF0aCIsInVuaXQiLCJpc0N1cnJlbmN5IiwidGltZXpvbmUiLCJnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uIiwiZGF0YVBvaW50UHJvcGVydHkiLCJkYXRhcG9pbnRUYXJnZXQiLCJkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkiLCJkYXRhUG9pbnRJbmRleCIsIm5hbWUiLCJkYXRhUG9pbnRUYXJnZXRWYWx1ZSIsImhhc1N0YXRpY1BlcmNlbnRVbml0IiwidGltZXpvbmVPclVvTUluZGV4IiwiY3VycmVuY3lPclVuaXRQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgiLCJnZXRBc3NvY2lhdGVkVW5pdFByb3BlcnR5UGF0aCIsInVuaXRPckN1cnJlbmN5UHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoIiwidW5pdE9yQ3VycmVuY3lSZWxhdGl2ZVBhdGgiLCJjdXJyZW5jeU9yVW9NSW5kZXgiLCJzY2FsZSIsImNvbGxlY3RSZWxhdGVkUHJvcGVydGllc1JlY3Vyc2l2ZWx5IiwiaXNFbWJlZGRlZCIsImlzU3RhdGljYWxseUhpZGRlbiIsImlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIiwiRGF0YSIsImZvckVhY2giLCJpbm5lckRhdGFGaWVsZCIsImRhdGFGaWVsZENvbnRhY3QiLCJnZXREYXRhRmllbGREYXRhVHlwZSIsIm9EYXRhRmllbGQiLCJ0eXBlIiwic0RhdGFUeXBlIiwiJFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkRhdGFGaWVsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFubm90YXRpb25UZXJtLCBEZWNpbWFsLCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb24sIFByaW1pdGl2ZVR5cGUsIFByb3BlcnR5IH0gZnJvbSBcIkBzYXAtdXgvdm9jYWJ1bGFyaWVzLXR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhY3QgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB7IENvbW11bmljYXRpb25Bbm5vdGF0aW9uVHlwZXMgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXMvdm9jYWJ1bGFyaWVzL0NvbW11bmljYXRpb25cIjtcbmltcG9ydCB0eXBlIHtcblx0RGF0YUZpZWxkLFxuXHREYXRhRmllbGRBYnN0cmFjdFR5cGVzLFxuXHREYXRhRmllbGRGb3JBY3Rpb24sXG5cdERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMsXG5cdERhdGFGaWVsZEZvckFubm90YXRpb24sXG5cdERhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbixcblx0RGF0YUZpZWxkVHlwZXMsXG5cdERhdGFQb2ludCxcblx0RGF0YVBvaW50VHlwZSxcblx0RGF0YVBvaW50VHlwZVR5cGVzLFxuXHRGaWVsZEdyb3VwXG59IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB7IFVJQW5ub3RhdGlvblR5cGVzLCBWaXN1YWxpemF0aW9uVHlwZSB9IGZyb20gXCJAc2FwLXV4L3ZvY2FidWxhcmllcy10eXBlcy92b2NhYnVsYXJpZXMvVUlcIjtcbmltcG9ydCB0eXBlIHsgUGFnZUNvbnRleHRQYXRoVGFyZ2V0IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvVGVtcGxhdGVDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRXhwb3J0U2V0dGluZ3MsIFRhYmxlVHlwZSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2NvbnRyb2xzL0NvbW1vbi9UYWJsZVwiO1xuaW1wb3J0IHsgaXNBbm5vdGF0aW9uT2ZUeXBlLCBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbiwgaXNQcm9wZXJ0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9oZWxwZXJzL1R5cGVHdWFyZHNcIjtcbmltcG9ydCB7IGdldERpc3BsYXlNb2RlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGlzcGxheU1vZGVGb3JtYXR0ZXJcIjtcbmltcG9ydCB7XG5cdGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgsXG5cdGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRFeHRlcm5hbElkUHJvcGVydHlQYXRoLFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5LFxuXHRnZXRBc3NvY2lhdGVkVGV4dFByb3BlcnR5UGF0aCxcblx0Z2V0QXNzb2NpYXRlZFRpbWV6b25lUHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHksXG5cdGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoLFxuXHRoYXNTdGF0aWNQZXJjZW50VW5pdFxufSBmcm9tIFwic2FwL2ZlL2NvcmUvdGVtcGxhdGluZy9Qcm9wZXJ0eUhlbHBlclwiO1xuaW1wb3J0IHsgZW5oYW5jZURhdGFNb2RlbFBhdGgsIGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgsIHR5cGUgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCIuLi8uLi90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgRGlzcGxheU1vZGUgfSBmcm9tIFwiLi4vLi4vdGVtcGxhdGluZy9VSUZvcm1hdHRlcnNcIjtcbmltcG9ydCB0eXBlIENvbnZlcnRlckNvbnRleHQgZnJvbSBcIi4uL0NvbnZlcnRlckNvbnRleHRcIjtcbmltcG9ydCB7IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuIH0gZnJvbSBcIi4uL2hlbHBlcnMvRGF0YUZpZWxkSGVscGVyXCI7XG5cbmV4cG9ydCB0eXBlIENvbXBsZXhQcm9wZXJ0eUluZm8gPSB7XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHsgYW5ub3RhdGlvblByb3BlcnR5OiBQcm9wZXJ0eTsgZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb24/OiBEaXNwbGF5TW9kZSB9Pjtcblx0YWRkaXRpb25hbFByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb3BlcnR5Pjtcblx0ZXhwb3J0U2V0dGluZ3M6IENvbHVtbkV4cG9ydFNldHRpbmdzO1xufTtcblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3RcIi5cbiAqIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0IGhhcyBhbiBpbmxpbmUgYWN0aW9uIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZXMgdGhhdCBkYXRhRmllbGQgaXMgYSBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0YUZpZWxkRm9yQWN0aW9uQWJzdHJhY3QoZGF0YUZpZWxkOiBEYXRhRmllbGRBYnN0cmFjdFR5cGVzKTogZGF0YUZpZWxkIGlzIERhdGFGaWVsZEZvckFjdGlvbkFic3RyYWN0VHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRGb3JBY3Rpb25BYnN0cmFjdFR5cGVzKS5oYXNPd25Qcm9wZXJ0eShcIkFjdGlvblwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uXCIuXG4gKiBpc0RhdGFGaWVsZEZvckFubm90YXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9yQW5ub3RhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRmllbGRGb3JBbm5vdGF0aW9uKFxuXHRkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBEYXRhUG9pbnRUeXBlVHlwZXMgfCB1bmRlZmluZWRcbik6IGRhdGFGaWVsZCBpcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFubm90YXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckFjdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCB1bmRlZmluZWQpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9yQWN0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZEZvckFjdGlvbjtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXCIuXG4gKiBEYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb24gaGFzIGFuIGlubGluZSAkVHlwZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSB1c2VkLlxuICpcbiAqIEBwYXJhbSBkYXRhRmllbGQgRGF0YUZpZWxkIHRvIGJlIGV2YWx1YXRlZFxuICogQHJldHVybnMgVmFsaWRhdGVzIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZEZvckludGVudEJhc2VkTmF2aWdhdGlvbihkYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uIHtcblx0cmV0dXJuIGRhdGFGaWVsZC4kVHlwZSA9PT0gVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9ySW50ZW50QmFzZWROYXZpZ2F0aW9uO1xufVxuXG4vKipcbiAqIElkZW50aWZpZXMgaWYgdGhlIGdpdmVuIGRhdGFGaWVsZEFic3RyYWN0IHRoYXQgaXMgcGFzc2VkIGlzIGEgXCJEYXRhRmllbGRUeXBlc1wiLlxuICogRGF0YUZpZWxkIGhhcyBhIHZhbHVlIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZCBEYXRhRmllbGQgdG8gYmUgZXZhbHVhdGVkXG4gKiBAcmV0dXJucyBWYWxpZGF0ZSB0aGF0IGRhdGFGaWVsZCBpcyBhIERhdGFGaWVsZFR5cGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZFR5cGVzKGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkVHlwZXMge1xuXHRyZXR1cm4gKGRhdGFGaWVsZCBhcyBEYXRhRmllbGRUeXBlcykuaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGlmIHRoZSBnaXZlbiBkYXRhRmllbGRBYnN0cmFjdCB0aGF0IGlzIHBhc3NlZCBpcyBhIFwiRGF0YUZpZWxkXCIuXG4gKiBEYXRhRmllbGQgaGFzIGEgdmFsdWUgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCB0byBiZSBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFZhbGlkYXRlIHRoYXQgZGF0YUZpZWxkIGlzIGEgRGF0YUZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFGaWVsZChkYXRhRmllbGQ6IERhdGFGaWVsZCB8IHVua25vd24pOiBkYXRhRmllbGQgaXMgRGF0YUZpZWxkIHtcblx0cmV0dXJuIChkYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uaGFzT3duUHJvcGVydHkoXCJWYWx1ZVwiKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKlxuICogQHBhcmFtIGRhdGFGaWVsZEZvckFubm90YXRpb24gVGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gYmVpbmcgcHJvY2Vzc2VkXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZmllbGQgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGaWVsZEdyb3VwVGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxGaWVsZEdyb3VwPihkYXRhRmllbGRUYXJnZXQsIFVJQW5ub3RhdGlvblR5cGVzLkZpZWxkR3JvdXBUeXBlKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBkYXRhRmllbGRGb3JBbm5vdGF0aW9uIGlzIGEgZGF0YSBwb2ludC5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBUaGUgZGF0YUZpZWxkRm9yQW5ub3RhdGlvbiBiZWluZyBwcm9jZXNzZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGRhdGFGaWVsZEZvckFubm90YXRpb24gaXMgYSBkYXRhIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRGF0YVBvaW50VGFyZ2V0KGRhdGFGaWVsZEZvckFubm90YXRpb246IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0Y29uc3QgZGF0YUZpZWxkVGFyZ2V0ID0gZGF0YUZpZWxkRm9yQW5ub3RhdGlvbi5UYXJnZXQuJHRhcmdldDtcblx0cmV0dXJuIGlzQW5ub3RhdGlvbk9mVHlwZTxEYXRhUG9pbnQ+KGRhdGFGaWVsZFRhcmdldCwgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhIG1vZGVsIG9iamVjdCBwYXRoIHRhcmdldGluZyBhIGRhdGFGaWVsZCBmb3IgYWN0aW9uIG9wZW5zIHVwIGEgZGlhbG9nLlxuICpcbiAqIEBwYXJhbSBkYXRhTW9kZWxPYmplY3RQYXRoIERhdGFNb2RlbE9iamVjdFBhdGhcbiAqIEByZXR1cm5zIGBEaWFsb2dgIHwgYE5vbmVgIGlmIGEgZGlhbG9nIGlzIG5lZWRlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhTW9kZWxPYmplY3RQYXRoRm9yQWN0aW9uV2l0aERpYWxvZyhcblx0ZGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxEYXRhRmllbGRBYnN0cmFjdFR5cGVzPlxuKTogXCJEaWFsb2dcIiB8IFwiTm9uZVwiIHtcblx0Y29uc3QgdGFyZ2V0ID0gZGF0YU1vZGVsT2JqZWN0UGF0aC50YXJnZXRPYmplY3Q7XG5cdHJldHVybiBpc0FjdGlvbldpdGhEaWFsb2coaXNEYXRhRmllbGRGb3JBY3Rpb24odGFyZ2V0KSA/IHRhcmdldCA6IHVuZGVmaW5lZCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBkYXRhRmllbGQgZm9yIGFjdGlvbiBvcGVucyB1cCBhIGRpYWxvZy5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIERhdGFGaWVsZCBmb3IgYWN0aW9uXG4gKiBAcmV0dXJucyBgRGlhbG9nYCB8IGBOb25lYCBpZiBhIGRpYWxvZyBpcyBuZWVkZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWN0aW9uV2l0aERpYWxvZyhkYXRhRmllbGQ/OiBEYXRhRmllbGRGb3JBY3Rpb24pOiBcIkRpYWxvZ1wiIHwgXCJOb25lXCIge1xuXHRjb25zdCBhY3Rpb24gPSBkYXRhRmllbGQ/LkFjdGlvblRhcmdldDtcblx0aWYgKGFjdGlvbikge1xuXHRcdGNvbnN0IGJDcml0aWNhbCA9IGFjdGlvbi5hbm5vdGF0aW9ucz8uQ29tbW9uPy5Jc0FjdGlvbkNyaXRpY2FsO1xuXHRcdGlmIChhY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAxIHx8IGJDcml0aWNhbCkge1xuXHRcdFx0cmV0dXJuIFwiRGlhbG9nXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBcIk5vbmVcIjtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmV0dXJuIFwiTm9uZVwiO1xuXHR9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBUYXJnZXRWYWx1ZSBmcm9tIGEgRGF0YVBvaW50LlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgVGhlIHRhcmdldCBwcm9wZXJ0eSBvciBEYXRhUG9pbnRcbiAqIEByZXR1cm5zIFRoZSBUYXJnZXRWYWx1ZSBhcyBhIGRlY2ltYWwgb3IgYSBwcm9wZXJ0eSBwYXRoXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldFZhbHVlT25EYXRhUG9pbnQoc291cmNlOiBQcm9wZXJ0eSB8IERhdGFQb2ludFR5cGUpOiBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248dW5rbm93bj4gfCBzdHJpbmcge1xuXHRsZXQgdGFyZ2V0VmFsdWU6IERlY2ltYWwgfCB1bmRlZmluZWQgfCBQYXRoQW5ub3RhdGlvbkV4cHJlc3Npb248dW5rbm93bj4gfCBzdHJpbmc7XG5cdGlmIChpc1Byb3BlcnR5KHNvdXJjZSkpIHtcblx0XHRjb25zdCBkYXRhUG9pbnQgPSAoc291cmNlLmFubm90YXRpb25zPy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uKT8uVGFyZ2V0Py4kdGFyZ2V0IGFzIERhdGFQb2ludFR5cGU7XG5cdFx0dGFyZ2V0VmFsdWUgPSBkYXRhUG9pbnQ/LlRhcmdldFZhbHVlID8/IGRhdGFQb2ludD8uTWF4aW11bVZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldFZhbHVlID0gc291cmNlLlRhcmdldFZhbHVlID8/IHNvdXJjZS5NYXhpbXVtVmFsdWU7XG5cdH1cblx0aWYgKHR5cGVvZiB0YXJnZXRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuXHRcdHJldHVybiB0YXJnZXRWYWx1ZS50b1N0cmluZygpO1xuXHR9XG5cdHJldHVybiBpc1BhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbih0YXJnZXRWYWx1ZSkgPyB0YXJnZXRWYWx1ZSA6IFwiMTAwXCI7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgRGF0YVBvaW50IHdpdGhpbiBhIERhdGFGaWVsZERlZmF1bHQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgaGFzIGEgRGF0YVBvaW50IHdpdGhpbiB0aGUgRGF0YUZpZWxkRGVmYXVsdCwgZmFsc2UgZWxzZVxuICovXG5cbmV4cG9ydCBjb25zdCBpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0ID0gZnVuY3Rpb24gKHByb3BlcnR5OiBQcm9wZXJ0eSk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdChwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwcm9wZXJ0eSB1c2VzIGEgZGVmYXVsdCB2aXN1YWxpemF0aW9uIFJhdGluZyB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNoZWNrZWRcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmlzdWFsaXphdGlvbiB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBpcyBhIFJhdGluZ1xuICovXG5cbmV4cG9ydCBjb25zdCBpc1JhdGluZ1Zpc3VhbGl6YXRpb25Gcm9tRGF0YUZpZWxkRGVmYXVsdCA9IGZ1bmN0aW9uIChwcm9wZXJ0eTogUHJvcGVydHkpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHRpc0RhdGFQb2ludEZyb21EYXRhRmllbGREZWZhdWx0KHByb3BlcnR5KSAmJlxuXHRcdCgocHJvcGVydHkuYW5ub3RhdGlvbnM/LlVJPy5EYXRhRmllbGREZWZhdWx0IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pPy5UYXJnZXQ/LiR0YXJnZXQgYXMgQW5ub3RhdGlvblRlcm08RGF0YVBvaW50Pilcblx0XHRcdD8uVmlzdWFsaXphdGlvbiA9PT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9SYXRpbmdcIlxuXHQpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IHVzZXMgYSBQcm9ncmVzcyB2aXN1YWxpemF0aW9uIFJhdGluZyB0aHJvdWdoIGEgRGF0YUZpZWxkRGVmYXVsdCBvciBhIGRpcmVjdCBEYXRhUG9pbnQuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZpc3VhbGl6YXRpb24gaXMgYSBQcm9ncmVzc1xuICovXG5cbmV4cG9ydCBjb25zdCBpc0FQcm9ncmVzc1R5cGVGcm9tRGF0YVBvaW50ID0gZnVuY3Rpb24gKHByb3BlcnR5OiBQcm9wZXJ0eSB8IERhdGFGaWVsZEZvckFubm90YXRpb24pOiBib29sZWFuIHtcblx0aWYgKGlzUHJvcGVydHkocHJvcGVydHkpICYmIGlzRGF0YVBvaW50RnJvbURhdGFGaWVsZERlZmF1bHQocHJvcGVydHkpKSB7XG5cdFx0cHJvcGVydHkgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucy5VST8uRGF0YUZpZWxkRGVmYXVsdCBhcyBEYXRhRmllbGRGb3JBbm5vdGF0aW9uO1xuXHR9XG5cdHJldHVybiAoKHByb3BlcnR5IGFzIERhdGFGaWVsZEZvckFubm90YXRpb24pLlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlKT8uVmlzdWFsaXphdGlvbiA9PT0gXCJVSS5WaXN1YWxpemF0aW9uVHlwZS9Qcm9ncmVzc1wiO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlbWFudGljT2JqZWN0UGF0aChcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dDxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+LFxuXHRvYmplY3Q6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0aWYgKHR5cGVvZiBvYmplY3QgPT09IFwib2JqZWN0XCIpIHtcblx0XHRpZiAoaXNEYXRhRmllbGRUeXBlcyhvYmplY3QpICYmIG9iamVjdC5WYWx1ZT8uJHRhcmdldCkge1xuXHRcdFx0Y29uc3QgcHJvcGVydHkgPSBvYmplY3QuVmFsdWU/LiR0YXJnZXQ7XG5cdFx0XHRpZiAocHJvcGVydHk/LmFubm90YXRpb25zPy5Db21tb24/LlNlbWFudGljT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbnZlcnRlckNvbnRleHQuZ2V0RW50aXR5U2V0QmFzZWRBbm5vdGF0aW9uUGF0aChwcm9wZXJ0eT8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzUHJvcGVydHkob2JqZWN0KSkge1xuXHRcdFx0aWYgKG9iamVjdD8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uU2VtYW50aWNPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29udmVydGVyQ29udGV4dC5nZXRFbnRpdHlTZXRCYXNlZEFubm90YXRpb25QYXRoKG9iamVjdD8uZnVsbHlRdWFsaWZpZWROYW1lKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYXZpZ2F0aW9uIHBhdGggcHJlZml4IGZvciBhIHByb3BlcnR5IHBhdGguXG4gKlxuICogQHBhcmFtIHBhdGggVGhlIHByb3BlcnR5IHBhdGggRm9yIGUuZy4gL0VudGl0eVR5cGUvTmF2aWdhdGlvbi9Qcm9wZXJ0eVxuICogQHJldHVybnMgVGhlIG5hdmlnYXRpb24gcGF0aCBwcmVmaXggRm9yIGUuZy4gL0VudGl0eVR5cGUvTmF2aWdhdGlvbi9cbiAqL1xuZnVuY3Rpb24gX2dldE5hdmlnYXRpb25QYXRoUHJlZml4KHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG5cdGlmIChwYXRoKSB7XG5cdFx0cmV0dXJuIHBhdGguaW5jbHVkZXMoXCIvXCIpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSA6IFwiXCI7XG5cdH1cblx0cmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogQ29sbGVjdCBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHRoZSBBTFAgdGFibGUgdXNlLWNhc2UuXG4gKlxuICogRm9yIGUuZy4gSWYgVUkuSGlkZGVuIHBvaW50cyB0byBhIHByb3BlcnR5LCBpbmNsdWRlIHRoaXMgcHJvcGVydHkgaW4gdGhlIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG9mIENvbXBsZXhQcm9wZXJ0eUluZm8gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgUHJvcGVydHkgb3IgRGF0YUZpZWxkIGJlaW5nIHByb2Nlc3NlZFxuICogQHBhcmFtIG5hdmlnYXRpb25QYXRoUHJlZml4IE5hdmlnYXRpb24gcGF0aCBwcmVmaXgsIGFwcGxpY2FibGUgaW4gY2FzZSBvZiBuYXZpZ2F0aW9uIHByb3BlcnRpZXMuXG4gKiBAcGFyYW0gdGFibGVUeXBlIFRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEByZXR1cm5zIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZC5cbiAqL1xuZnVuY3Rpb24gX2NvbGxlY3RBZGRpdGlvbmFsUHJvcGVydGllc0ZvckFuYWx5dGljYWxUYWJsZShcblx0dGFyZ2V0OiBQcmltaXRpdmVUeXBlLFxuXHRuYXZpZ2F0aW9uUGF0aFByZWZpeDogc3RyaW5nLFxuXHR0YWJsZVR5cGU6IFRhYmxlVHlwZSxcblx0cmVsYXRlZFByb3BlcnRpZXM6IENvbXBsZXhQcm9wZXJ0eUluZm9cbik6IENvbXBsZXhQcm9wZXJ0eUluZm8ge1xuXHRpZiAodGFibGVUeXBlID09PSBcIkFuYWx5dGljYWxUYWJsZVwiKSB7XG5cdFx0Y29uc3QgaGlkZGVuQW5ub3RhdGlvbiA9IHRhcmdldC5hbm5vdGF0aW9ucz8uVUk/LkhpZGRlbjtcblx0XHRpZiAoaGlkZGVuQW5ub3RhdGlvbj8ucGF0aCAmJiBpc1Byb3BlcnR5KGhpZGRlbkFubm90YXRpb24uJHRhcmdldCkpIHtcblx0XHRcdGNvbnN0IGhpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGhpZGRlbkFubm90YXRpb24ucGF0aDtcblx0XHRcdC8vIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGFkZGVkIHRvIGFkZGl0aW9uYWxQcm9wZXJ0aWVzIG1hcCBmb3IgdGhlIEFMUCB0YWJsZSB1c2UtY2FzZS5cblx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzW2hpZGRlbkFubm90YXRpb25Qcm9wZXJ0eVBhdGhdID0gaGlkZGVuQW5ub3RhdGlvbi4kdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNyaXRpY2FsaXR5ID0gdGFyZ2V0LkNyaXRpY2FsaXR5O1xuXHRcdGlmIChjcml0aWNhbGl0eT8ucGF0aCAmJiBpc1Byb3BlcnR5KGNyaXRpY2FsaXR5Py4kdGFyZ2V0KSkge1xuXHRcdFx0Y29uc3QgY3JpdGljYWxpdHlQcm9wZXJ0eVBhdGggPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNyaXRpY2FsaXR5LnBhdGg7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5hZGRpdGlvbmFsUHJvcGVydGllc1tjcml0aWNhbGl0eVByb3BlcnR5UGF0aF0gPSBjcml0aWNhbGl0eT8uJHRhcmdldDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzIHRvIHB1c2ggdW5pcXVlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXNcbiAqIEBwYXJhbSBrZXkgVGhlIHByb3BlcnR5IHBhdGhcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgcHJvcGVydGllcyBvYmplY3QgY29udGFpbmluZyB2YWx1ZSBwcm9wZXJ0eSwgZGVzY3JpcHRpb24gcHJvcGVydHkuLi5cbiAqIEBwYXJhbSBkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbiBUaGUgZGlzcGxheSBtb2RlIGlmIHRoZSBwcm9wZXJ0eSBpcyByZWZlcmVuY2VkIGFzIGRlc2NyaXB0aW9uIG9uIHRleHQgYXJyYW5nZW1lbnRcbiAqIEByZXR1cm5zIEluZGV4IGF0IHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhdmFpbGFibGVcbiAqL1xuZnVuY3Rpb24gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRrZXk6IHN0cmluZyxcblx0dmFsdWU6IFByb3BlcnR5LFxuXHRkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbj86IERpc3BsYXlNb2RlXG4pOiBudW1iZXIge1xuXHRpZiAoIXJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXNba2V5XSA9IHsgYW5ub3RhdGlvblByb3BlcnR5OiB2YWx1ZSB9O1xuXHRcdGlmIChkaXNwbGF5TW9kZU9mUHJvcGVydHlVc2VkQXNEZXNjcmlwdGlvbikge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMucHJvcGVydGllc1trZXldLmRpc3BsYXlNb2RlT2ZQcm9wZXJ0eVVzZWRBc0Rlc2NyaXB0aW9uID0gZGlzcGxheU1vZGVPZlByb3BlcnR5VXNlZEFzRGVzY3JpcHRpb247XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3Qua2V5cyhyZWxhdGVkUHJvcGVydGllcy5wcm9wZXJ0aWVzKS5pbmRleE9mKGtleSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMgdG8gYXBwZW5kIHRoZSBleHBvcnQgc2V0dGluZ3MgdGVtcGxhdGUgd2l0aCBhIGZvcm1hdHRlZCB0ZXh0LlxuICpcbiAqIEBwYXJhbSByZWxhdGVkUHJvcGVydGllc1xuICogQHBhcmFtIHZhbHVlIEZvcm1hdHRlZCB0ZXh0XG4gKi9cbmZ1bmN0aW9uIF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuXHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy50ZW1wbGF0ZSA9IHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzPy50ZW1wbGF0ZVxuXHRcdD8gYCR7cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGVtcGxhdGV9JHt2YWx1ZX1gXG5cdFx0OiBgJHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIENvbGxlY3QgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSdzIGFubm90YXRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWRcbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dFxuICogQHBhcmFtIGlnbm9yZVNlbGYgV2hldGhlciB0byBleGNsdWRlIHRoZSBzYW1lIHByb3BlcnR5IGZyb20gdGhlIHJlbGF0ZWQgcHJvcGVydGllcy5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBUcnVlIGlmIHRoZSB1bml0L2N1cnJlbmN5IHByb3BlcnR5IG5lZWRzIHRvIGJlIGFkZGVkIGluIHRoZSBleHBvcnQgdGVtcGxhdGVcbiAqIEBwYXJhbSBpc0Fubm90YXRlZEFzSGlkZGVuIFRydWUgaWYgdGhlIERhdGFGaWVsZCBvciB0aGUgcHJvcGVydHkgYXJlIHN0YXRpY2FsbHkgaGlkZGVuXG4gKiBAcmV0dXJucyBUaGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGlkZW50aWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0UmVsYXRlZFByb3BlcnRpZXMoXG5cdHBhdGg6IHN0cmluZyxcblx0cHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsXG5cdGNvbnZlcnRlckNvbnRleHQ6IENvbnZlcnRlckNvbnRleHQsXG5cdGlnbm9yZVNlbGY6IGJvb2xlYW4sXG5cdHRhYmxlVHlwZTogVGFibGVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyA9IHtcblx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRhZGRpdGlvbmFsUHJvcGVydGllczoge30sXG5cdFx0ZXhwb3J0U2V0dGluZ3M6IHt9XG5cdH0sXG5cdGFkZFVuaXRJblRlbXBsYXRlID0gZmFsc2UsXG5cdGlzQW5ub3RhdGVkQXNIaWRkZW4gPSBmYWxzZVxuKTogQ29tcGxleFByb3BlcnR5SW5mbyB7XG5cdGlmIChwYXRoICYmIHByb3BlcnR5KSB7XG5cdFx0bGV0IHZhbHVlSW5kZXg6IG51bWJlcjtcblx0XHQvKiBFWFRFUk5BTElEICovXG5cdFx0Y29uc3QgZXh0ZXJuYWxJZFBhdGggPSBnZXRBc3NvY2lhdGVkRXh0ZXJuYWxJZFByb3BlcnR5UGF0aChwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgZXh0ZXJuYWxJZFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZEV4dGVybmFsSWRQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cblx0XHRpZiAoaXNBbm5vdGF0ZWRBc0hpZGRlbikge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIHByb3BlcnR5KTtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fWApO1xuXHRcdFx0cmV0dXJuIHJlbGF0ZWRQcm9wZXJ0aWVzO1xuXHRcdH1cblx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwYXRoKTtcblxuXHRcdC8vIENoZWNrIGZvciBUZXh0IGFubm90YXRpb24uXG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5UGF0aCA9IGdldEFzc29jaWF0ZWRUZXh0UHJvcGVydHlQYXRoKGV4dGVybmFsSWRQcm9wZXJ0eSB8fCBwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5ID0gZ2V0QXNzb2NpYXRlZFRleHRQcm9wZXJ0eShleHRlcm5hbElkUHJvcGVydHkgfHwgcHJvcGVydHkpO1xuXG5cdFx0Ly8gZ2V0IHRoZSBEYXRhTW9kZWxPYmplY3RQYXRoIGZvciB0aGUgY29sdW1uXG5cdFx0Y29uc3QgZGF0YU1vZGVsT2JqZWN0UGF0aCA9IGNvbnZlcnRlckNvbnRleHQuZ2V0Q29udmVydGVyQ29udGV4dEZvcihjb252ZXJ0ZXJDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmdldERhdGFNb2RlbE9iamVjdFBhdGgoKTtcblx0XHRjb25zdCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggPSBlbmhhbmNlRGF0YU1vZGVsUGF0aDxQcm9wZXJ0eT4oZGF0YU1vZGVsT2JqZWN0UGF0aCwgZXh0ZXJuYWxJZFBhdGggfHwgcGF0aCk7XG5cdFx0Y29uc3QgdGV4dFByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsIHRleHRQcm9wZXJ0eVBhdGgpO1xuXHRcdGNvbnN0IHRleHRSZWxhdGl2ZVBhdGggPSBnZXRDb250ZXh0UmVsYXRpdmVUYXJnZXRPYmplY3RQYXRoKHRleHRQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGNvbnN0IHJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgocHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoKTtcblxuXHRcdGlmIChyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncz8udGVtcGxhdGUpIHtcblx0XHRcdC8vIEZpZWxkR3JvdXAgdXNlLWNhc2UuIE5lZWQgdG8gYWRkIGVhY2ggRmllbGQgaW4gbmV3IGxpbmUuXG5cdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIFwiXFxuXCIpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3Mud3JhcCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRleHRQcm9wZXJ0eSAmJiB0ZXh0UmVsYXRpdmVQYXRoKSB7XG5cdFx0XHRjb25zdCBwYXRoRm9yVGV4dCA9IGV4dGVybmFsSWRQYXRoID8gZXh0ZXJuYWxJZFBhdGggOiBwYXRoO1xuXHRcdFx0Y29uc3QgcHJvcGVydHlGb3JUZXh0ID0gZXh0ZXJuYWxJZFByb3BlcnR5ID8gZXh0ZXJuYWxJZFByb3BlcnR5IDogcHJvcGVydHk7XG5cdFx0XHQvLyBDaGVjayBmb3IgVGV4dCBBcnJhbmdlbWVudC5cblx0XHRcdGNvbnN0IGRpc3BsYXlNb2RlID0gZ2V0RGlzcGxheU1vZGUocHJvcGVydHlGb3JUZXh0LCBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdFx0bGV0IGRlc2NyaXB0aW9uSW5kZXg6IG51bWJlcjtcblx0XHRcdHN3aXRjaCAoZGlzcGxheU1vZGUpIHtcblx0XHRcdFx0Y2FzZSBcIkRlc2NyaXB0aW9uXCI6XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KHJlbGF0ZWRQcm9wZXJ0aWVzLCB0ZXh0UmVsYXRpdmVQYXRoLCB0ZXh0UHJvcGVydHksIFwiRGVzY3JpcHRpb25cIik7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7ZGVzY3JpcHRpb25JbmRleH19YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIlZhbHVlRGVzY3JpcHRpb25cIjpcblx0XHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHBhdGhGb3JUZXh0LCBwcm9wZXJ0eUZvclRleHQpO1xuXHRcdFx0XHRcdGRlc2NyaXB0aW9uSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0dGV4dFJlbGF0aXZlUGF0aCxcblx0XHRcdFx0XHRcdHRleHRQcm9wZXJ0eSxcblx0XHRcdFx0XHRcdFwiVmFsdWVEZXNjcmlwdGlvblwiXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0gKHske2Rlc2NyaXB0aW9uSW5kZXh9fSlgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiRGVzY3JpcHRpb25WYWx1ZVwiOlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0ZGVzY3JpcHRpb25JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0XHR0ZXh0UmVsYXRpdmVQYXRoLFxuXHRcdFx0XHRcdFx0dGV4dFByb3BlcnR5LFxuXHRcdFx0XHRcdFx0XCJEZXNjcmlwdGlvblZhbHVlXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske2Rlc2NyaXB0aW9uSW5kZXh9fSAoeyR7dmFsdWVJbmRleH19KWApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aEZvclRleHQsIHByb3BlcnR5Rm9yVGV4dCk7XG5cdFx0XHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIENoZWNrIGZvciBmaWVsZCBjb250YWluaW5nIEN1cnJlbmN5IE9yIFVuaXQgUHJvcGVydGllcyBvciBUaW1lem9uZVxuXHRcdFx0Y29uc3QgY3VycmVuY3lQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRDdXJyZW5jeVByb3BlcnR5KHByb3BlcnR5KTtcblx0XHRcdGNvbnN0IHVuaXRQcm9wZXJ0eSA9IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHkocHJvcGVydHkpO1xuXHRcdFx0Y29uc3QgY3VycmVuY3lPclVvTVByb3BlcnR5ID0gY3VycmVuY3lQcm9wZXJ0eSA/PyB1bml0UHJvcGVydHk7XG5cdFx0XHRjb25zdCBjdXJyZW5jeU9yVW5pdEFubm90YXRpb246IFBhdGhBbm5vdGF0aW9uRXhwcmVzc2lvbjxzdHJpbmc+ID1cblx0XHRcdFx0cHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uSVNPQ3VycmVuY3kgfHwgcHJvcGVydHk/LmFubm90YXRpb25zPy5NZWFzdXJlcz8uVW5pdDtcblx0XHRcdGNvbnN0IHRpbWV6b25lUHJvcGVydHkgPSBnZXRBc3NvY2lhdGVkVGltZXpvbmVQcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRjb25zdCB0aW1lem9uZUFubm90YXRpb24gPSBwcm9wZXJ0eT8uYW5ub3RhdGlvbnM/LkNvbW1vbj8uVGltZXpvbmU7XG5cblx0XHRcdGlmIChjdXJyZW5jeU9yVW9NUHJvcGVydHkpIHtcblx0XHRcdFx0Y29sbGVjdEN1cnJlbmN5T3JVbml0UHJvcGVydGllcyhcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRyZWxhdGl2ZVBhdGggPz8gcGF0aCxcblx0XHRcdFx0XHRhZGRVbml0SW5UZW1wbGF0ZSxcblx0XHRcdFx0XHRwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgsXG5cdFx0XHRcdFx0Y3VycmVuY3lPclVvTVByb3BlcnR5LFxuXHRcdFx0XHRcdGN1cnJlbmN5UHJvcGVydHlcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVQcm9wZXJ0eSAmJiB0aW1lem9uZUFubm90YXRpb24/LiR0YXJnZXQpIHtcblx0XHRcdFx0Y29sbGVjdFRpbWV6b25lUHJvcGVydGllcyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXMsIHBhdGgsIGFkZFVuaXRJblRlbXBsYXRlKTtcblx0XHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRcdChwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LiRUeXBlID09PSBVSUFubm90YXRpb25UeXBlcy5EYXRhUG9pbnRUeXBlICYmICFwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LlZhbHVlRm9ybWF0KSB8fFxuXHRcdFx0XHRwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ/LlRhcmdldD8uJHRhcmdldD8uJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGVcblx0XHRcdCkge1xuXHRcdFx0XHRjb2xsZWN0RGF0YVBvaW50UHJvcGVydGllcyhwcm9wZXJ0eSwgcmVsYXRlZFByb3BlcnRpZXMsIHBhdGgpO1xuXHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0eS4kVHlwZSA9PT0gQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZSkge1xuXHRcdFx0XHRjb25zdCBjb250YWN0UHJvcGVydHkgPSBwcm9wZXJ0eS5mbj8uJHRhcmdldDtcblx0XHRcdFx0Y29uc3QgY29udGFjdFByb3BlcnR5UGF0aCA9IHByb3BlcnR5LmZuPy5wYXRoO1xuXHRcdFx0XHR2YWx1ZUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMsXG5cdFx0XHRcdFx0bmF2aWdhdGlvblBhdGhQcmVmaXggPyBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIGNvbnRhY3RQcm9wZXJ0eVBhdGggOiBjb250YWN0UHJvcGVydHlQYXRoLFxuXHRcdFx0XHRcdGNvbnRhY3RQcm9wZXJ0eVxuXHRcdFx0XHQpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlnbm9yZVNlbGYpIHtcblx0XHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5XG5cdFx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX1gKTtcblx0XHRcdFx0aWYgKGN1cnJlbmN5T3JVbml0QW5ub3RhdGlvbikge1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnVuaXQgPSBgJHtjdXJyZW5jeU9yVW5pdEFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCBjdXJyZW5jeS91bml0XG5cdFx0XHRcdFx0aWYgKHByb3BlcnR5Py5hbm5vdGF0aW9ucz8uTWVhc3VyZXM/LklTT0N1cnJlbmN5KSB7XG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5pc0N1cnJlbmN5ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAodGltZXpvbmVBbm5vdGF0aW9uKSB7XG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudGltZXpvbmUgPSBgJHt0aW1lem9uZUFubm90YXRpb259YDsgLy8gSGFyZC1jb2RlZCB0aW1lem9uZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKHByb3BlcnR5LCBuYXZpZ2F0aW9uUGF0aFByZWZpeCwgdGFibGVUeXBlLCByZWxhdGVkUHJvcGVydGllcyk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKHJlbGF0ZWRQcm9wZXJ0aWVzLnByb3BlcnRpZXMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gQ29sbGVjdCB1bmRlcmx5aW5nIHByb3BlcnR5IGlmIG5vdCBjb2xsZWN0ZWQgYWxyZWFkeS5cblx0XHRcdC8vIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgYWRkaXRpb25hbFByb3BlcnRpZXMgYXJlIG1hZGUgYXZhaWxhYmxlIG9ubHkgdG8gY29tcGxleCBwcm9wZXJ0eSBpbmZvcy5cblx0XHRcdHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19YCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSB0eXBlIG9mIFZpc3VhbGl6YXRpb24gb2YgdGhlIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gc291cmNlIFNvdXJjZSBvZiB0aGUgRGF0YVBvaW50LlxuICogQHJldHVybnMgVGhlIHR5cGUgb2YgVmlzdWFsaXphdGlvbiBvciB1bmRlZmluZWQgaWYgdGhlcmUncyBub25lLlxuICovXG5mdW5jdGlvbiBnZXREYXRhUG9pbnRWaXN1YWxpemF0aW9uKHNvdXJjZTogUHJvcGVydHkgfCBEYXRhUG9pbnRUeXBlKTogVmlzdWFsaXphdGlvblR5cGUge1xuXHRsZXQgZGF0YVBvaW50OiBEYXRhUG9pbnRUeXBlO1xuXHRpZiAoaXNQcm9wZXJ0eShzb3VyY2UpKSB7XG5cdFx0ZGF0YVBvaW50ID0gKHNvdXJjZS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQgYXMgRGF0YUZpZWxkRm9yQW5ub3RhdGlvbik/LlRhcmdldD8uJHRhcmdldCBhcyBEYXRhUG9pbnRUeXBlO1xuXHR9IGVsc2Uge1xuXHRcdGRhdGFQb2ludCA9IHNvdXJjZTtcblx0fVxuXHRyZXR1cm4gZGF0YVBvaW50LlZpc3VhbGl6YXRpb24gPz8gVmlzdWFsaXphdGlvblR5cGUuTnVtYmVyO1xufVxuXG4vKipcbiAqXHRDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIERhdGFQb2ludC5cbiAqXG4gKiBAcGFyYW0gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHJlbGF0ZWQgcHJvcGVydGllcyBpZGVudGlmaWVkIHNvIGZhci5cbiAqIEBwYXJhbSBwYXRoIFRoZSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqL1xuZnVuY3Rpb24gY29sbGVjdERhdGFQb2ludFByb3BlcnRpZXMocHJvcGVydHk6IFByaW1pdGl2ZVR5cGUsIHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0Y29uc3QgZGF0YVBvaW50UHJvcGVydHkgPSBwcm9wZXJ0eS5UYXJnZXQ/LiR0YXJnZXQ/LlZhbHVlLiR0YXJnZXQgYXMgUHJvcGVydHk7XG5cdGNvbnN0IGRhdGFwb2ludFRhcmdldCA9IHByb3BlcnR5LlRhcmdldD8uJHRhcmdldDtcblx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cdC8vIERhdGFQb2ludCB1c2UtY2FzZSB1c2luZyBEYXRhRmllbGREZWZhdWx0LlxuXHRjb25zdCBkYXRhUG9pbnREZWZhdWx0UHJvcGVydHkgPSBwcm9wZXJ0eS5hbm5vdGF0aW9ucz8uVUk/LkRhdGFGaWVsZERlZmF1bHQ7XG5cdGNvbnN0IHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChcblx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCA/IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgcGF0aCA6IHBhdGgsXG5cdFx0ZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID8gcHJvcGVydHkgOiBkYXRhUG9pbnRQcm9wZXJ0eVxuXHQpO1xuXHQvLyBJZiB3ZSBoYXZlIGEgRGF0YVBvaW50IHdpdGhvdXQgdmlzdWFsaXphdGlvbiwgb3IgYSBOdW1iZXIsIHdlIGRvbid0IGhhdmUgYSBUYXJnZXRWYWx1ZS9NYXhpbXVtVmFsdWVcblx0aWYgKGdldERhdGFQb2ludFZpc3VhbGl6YXRpb24oZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID8gcHJvcGVydHkgOiBkYXRhcG9pbnRUYXJnZXQpID09PSBWaXN1YWxpemF0aW9uVHlwZS5OdW1iZXIpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3QgdGFyZ2V0VmFsdWUgPSBnZXRUYXJnZXRWYWx1ZU9uRGF0YVBvaW50KGRhdGFQb2ludERlZmF1bHRQcm9wZXJ0eSA/IHByb3BlcnR5IDogZGF0YXBvaW50VGFyZ2V0KTtcblx0aWYgKGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKHRhcmdldFZhbHVlKSkge1xuXHRcdGlmICh0YXJnZXRWYWx1ZS4kdGFyZ2V0KSB7XG5cdFx0XHQvL2luIGNhc2UgaXQncyBhIGR5bmFtaWMgdGFyZ2V0VmFsdWVcblx0XHRcdGNvbnN0IGRhdGFQb2ludEluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgoXG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCA/IG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGFyZ2V0VmFsdWUuJHRhcmdldC5uYW1lIDogdGFyZ2V0VmFsdWUuJHRhcmdldC5uYW1lLFxuXHRcdFx0XHR0YXJnZXRWYWx1ZS4kdGFyZ2V0XG5cdFx0XHQpO1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUgPSB0YXJnZXRWYWx1ZS5wYXRoO1xuXHRcdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19L3ske2RhdGFQb2ludEluZGV4fX1gKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoaGFzU3RhdGljUGVyY2VudFVuaXQoZGF0YVBvaW50RGVmYXVsdFByb3BlcnR5ID8gcHJvcGVydHkgOiBkYXRhUG9pbnRQcm9wZXJ0eSkgJiYgaXNBUHJvZ3Jlc3NUeXBlRnJvbURhdGFQb2ludChwcm9wZXJ0eSkpIHtcblx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy51bml0ID0gXCIlXCI7XG5cdH0gZWxzZSB7XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MuZGF0YVBvaW50VGFyZ2V0VmFsdWUgPSB0YXJnZXRWYWx1ZTtcblx0XHRfYXBwZW5kVGVtcGxhdGUocmVsYXRlZFByb3BlcnRpZXMsIGB7JHt2YWx1ZUluZGV4fX0vJHt0YXJnZXRWYWx1ZX1gKTtcblx0fVxufVxuXG4vKipcbiAqXHRDb2xsZWN0IHRoZSByZWxhdGVkIHByb3BlcnRpZXMgZnJvbSBhIHByb3BlcnR5IHdpdGggVGltZXpvbmUuXG4gKlxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBwcm9wZXJ0eSB0byBiZSBjb25zaWRlcmVkLlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gcGF0aCBUaGUgcHJvcGVydHkgcGF0aC5cbiAqIEBwYXJhbSBhZGRVbml0SW5UZW1wbGF0ZSBTaG91bGQgd2UgYWRkIHRoZSB1bml0IGluIHRoZSB0ZW1wbGF0ZS5cbiAqXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RUaW1lem9uZVByb3BlcnRpZXMoXG5cdHByb3BlcnR5OiBQcmltaXRpdmVUeXBlLFxuXHRyZWxhdGVkUHJvcGVydGllczogQ29tcGxleFByb3BlcnR5SW5mbyxcblx0cGF0aDogc3RyaW5nLFxuXHRhZGRVbml0SW5UZW1wbGF0ZTogYm9vbGVhblxuKTogdm9pZCB7XG5cdGNvbnN0IHRpbWV6b25lQW5ub3RhdGlvbiA9IHByb3BlcnR5LmFubm90YXRpb25zLkNvbW1vbi5UaW1lem9uZTtcblx0Y29uc3QgbmF2aWdhdGlvblBhdGhQcmVmaXggPSBfZ2V0TmF2aWdhdGlvblBhdGhQcmVmaXgocGF0aCk7XG5cdGNvbnN0IHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcGF0aCwgcHJvcGVydHkpO1xuXG5cdGNvbnN0IHRpbWV6b25lT3JVb01JbmRleCA9IF9zZXRSZWxhdGVkUHJvcGVydGllc0FuZEdldEluZGV4KFxuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdG5hdmlnYXRpb25QYXRoUHJlZml4ICsgdGltZXpvbmVBbm5vdGF0aW9uLnBhdGgsXG5cdFx0dGltZXpvbmVBbm5vdGF0aW9uLiR0YXJnZXRcblx0KTtcblx0aWYgKGFkZFVuaXRJblRlbXBsYXRlKSB7XG5cdFx0X2FwcGVuZFRlbXBsYXRlKHJlbGF0ZWRQcm9wZXJ0aWVzLCBgeyR7dmFsdWVJbmRleH19ICB7JHt0aW1lem9uZU9yVW9NSW5kZXh9fWApO1xuXHR9IGVsc2Uge1xuXHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLmV4cG9ydFNldHRpbmdzLnRpbWV6b25lUHJvcGVydHkgPSBuYXZpZ2F0aW9uUGF0aFByZWZpeCArIHRpbWV6b25lQW5ub3RhdGlvbi5wYXRoO1xuXHR9XG59XG5cbi8qKlxuICogQ29sbGVjdCB0aGUgcmVsYXRlZCBwcm9wZXJ0aWVzIGZyb20gYSBwcm9wZXJ0eSB3aXRoIGN1cnJlbmNpZXMgb3IgdW5pdHMuXG4gKlxuICogQHBhcmFtIHJlbGF0ZWRQcm9wZXJ0aWVzIFRoZSByZWxhdGVkIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIgZm9yIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIFRoZSBwcm9wZXJ0eSByZWxhdGl2ZSBwYXRoLlxuICogQHBhcmFtIGFkZFVuaXRJblRlbXBsYXRlIFNwZWNpZnkgaWYgdGhlIHVuaXQgc2hvdWxkIGJlIGFkZGVkIGluIHRoZSB0ZW1wbGF0ZS5cbiAqIEBwYXJhbSBwcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGggVGhlIGRhdGEgbW9kZWwgb2JqZWN0IHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGJlIGNvbnNpZGVyZWQuXG4gKiBAcGFyYW0gY3VycmVuY3lPclVvTVByb3BlcnR5IFRoZSBjdXJyZW5jeSBvciB1bml0IG9mIG1lYXN1cmUgcHJvcGVydHkgbGlua2VkIHRvIHRoZSBjb2x1bW4uXG4gKiBAcGFyYW0gY3VycmVuY3lQcm9wZXJ0eSBUaGUgY3VycmVuY3kgcHJvcGVydHkgbGlua2VkIHRvIHRoZSBjb2x1bW4uXG4gKi9cbmZ1bmN0aW9uIGNvbGxlY3RDdXJyZW5jeU9yVW5pdFByb3BlcnRpZXMoXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvLFxuXHRyZWxhdGl2ZVBhdGg6IHN0cmluZyxcblx0YWRkVW5pdEluVGVtcGxhdGU6IGJvb2xlYW4sXG5cdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aDxQcm9wZXJ0eT4sXG5cdGN1cnJlbmN5T3JVb01Qcm9wZXJ0eTogUHJvcGVydHksXG5cdGN1cnJlbmN5UHJvcGVydHk/OiBQcm9wZXJ0eVxuKTogdm9pZCB7XG5cdGNvbnN0IHByb3BlcnR5ID0gcHJvcGVydHlEYXRhTW9kZWxPYmplY3RQYXRoLnRhcmdldE9iamVjdDtcblx0aWYgKHByb3BlcnR5KSB7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVuaXRQcm9wZXJ0eVBhdGggPSBnZXRBc3NvY2lhdGVkQ3VycmVuY3lQcm9wZXJ0eVBhdGgocHJvcGVydHkpIHx8IGdldEFzc29jaWF0ZWRVbml0UHJvcGVydHlQYXRoKHByb3BlcnR5KTtcblx0XHRjb25zdCB1bml0T3JDdXJyZW5jeVByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCA9IGVuaGFuY2VEYXRhTW9kZWxQYXRoPFByb3BlcnR5Pihcblx0XHRcdHByb3BlcnR5RGF0YU1vZGVsT2JqZWN0UGF0aCxcblx0XHRcdGN1cnJlbmN5T3JVbml0UHJvcGVydHlQYXRoXG5cdFx0KTtcblx0XHRjb25zdCB1bml0T3JDdXJyZW5jeVJlbGF0aXZlUGF0aCA9IGdldENvbnRleHRSZWxhdGl2ZVRhcmdldE9iamVjdFBhdGgodW5pdE9yQ3VycmVuY3lQcm9wZXJ0eURhdGFNb2RlbE9iamVjdFBhdGgpO1xuXHRcdGNvbnN0IHZhbHVlSW5kZXggPSBfc2V0UmVsYXRlZFByb3BlcnRpZXNBbmRHZXRJbmRleChyZWxhdGVkUHJvcGVydGllcywgcmVsYXRpdmVQYXRoLCBwcm9wZXJ0eSk7XG5cdFx0Y29uc3QgY3VycmVuY3lPclVvTUluZGV4ID0gX3NldFJlbGF0ZWRQcm9wZXJ0aWVzQW5kR2V0SW5kZXgocmVsYXRlZFByb3BlcnRpZXMsIHVuaXRPckN1cnJlbmN5UmVsYXRpdmVQYXRoISwgY3VycmVuY3lPclVvTVByb3BlcnR5KTtcblx0XHRpZiAoYWRkVW5pdEluVGVtcGxhdGUpIHtcblx0XHRcdF9hcHBlbmRUZW1wbGF0ZShyZWxhdGVkUHJvcGVydGllcywgYHske3ZhbHVlSW5kZXh9fSAgeyR7Y3VycmVuY3lPclVvTUluZGV4fX1gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3MudW5pdFByb3BlcnR5ID0gdW5pdE9yQ3VycmVuY3lSZWxhdGl2ZVBhdGg7XG5cdFx0fVxuXHRcdGlmIChjdXJyZW5jeVByb3BlcnR5KSB7XG5cdFx0XHRyZWxhdGVkUHJvcGVydGllcy5leHBvcnRTZXR0aW5ncy5pc0N1cnJlbmN5ID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmVsYXRlZFByb3BlcnRpZXMuZXhwb3J0U2V0dGluZ3Muc2NhbGUgPSBwcm9wZXJ0eS5zY2FsZTtcblx0fVxufVxuXG4vKipcbiAqIENvbGxlY3QgcHJvcGVydGllcyBjb25zdW1lZCBieSBhIERhdGFGaWVsZC5cbiAqIFRoaXMgaXMgZm9yIHBvcHVsYXRpbmcgdGhlIENvbXBsZXhQcm9wZXJ0eUluZm9zIG9mIHRoZSB0YWJsZSBkZWxlZ2F0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0YUZpZWxkIFRoZSBEYXRhRmllbGQgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgaWRlbnRpZmllZC5cbiAqIEBwYXJhbSBjb252ZXJ0ZXJDb250ZXh0IFRoZSBjb252ZXJ0ZXIgY29udGV4dC5cbiAqIEBwYXJhbSB0YWJsZVR5cGUgVGhlIHRhYmxlIHR5cGUuXG4gKiBAcGFyYW0gcmVsYXRlZFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgaWRlbnRpZmllZCBzbyBmYXIuXG4gKiBAcGFyYW0gaXNFbWJlZGRlZCBUcnVlIGlmIHRoZSBEYXRhRmllbGQgaXMgZW1iZWRkZWQgaW4gYW5vdGhlciBhbm5vdGF0aW9uIChzdWNoIGFzIEZpZWxkR3JvdXApLlxuICogQHJldHVybnMgVGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgRGF0YUZpZWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdGRhdGFGaWVsZDogRGF0YUZpZWxkQWJzdHJhY3RUeXBlcyxcblx0Y29udmVydGVyQ29udGV4dDogQ29udmVydGVyQ29udGV4dCxcblx0dGFibGVUeXBlOiBUYWJsZVR5cGUsXG5cdHJlbGF0ZWRQcm9wZXJ0aWVzOiBDb21wbGV4UHJvcGVydHlJbmZvID0ge1xuXHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7fSxcblx0XHRleHBvcnRTZXR0aW5nczoge31cblx0fSxcblx0aXNFbWJlZGRlZCA9IGZhbHNlXG4pOiBDb21wbGV4UHJvcGVydHlJbmZvIHtcblx0bGV0IGlzU3RhdGljYWxseUhpZGRlbiA9IGZhbHNlO1xuXHRzd2l0Y2ggKGRhdGFGaWVsZD8uJFR5cGUpIHtcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhVcmw6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoTmF2aWdhdGlvblBhdGg6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoSW50ZW50QmFzZWROYXZpZ2F0aW9uOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aEFjdGlvbjpcblx0XHRcdGlmIChkYXRhRmllbGQuVmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHkgPSBkYXRhRmllbGQuVmFsdWU7XG5cdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbiA9IGlzUmVmZXJlbmNlUHJvcGVydHlTdGF0aWNhbGx5SGlkZGVuKGRhdGFGaWVsZCk7XG5cdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdHByb3BlcnR5LnBhdGgsXG5cdFx0XHRcdFx0cHJvcGVydHkuJHRhcmdldCxcblx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRpc0VtYmVkZGVkLFxuXHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uUGF0aFByZWZpeCA9IF9nZXROYXZpZ2F0aW9uUGF0aFByZWZpeChwcm9wZXJ0eS5wYXRoKTtcblx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXMgPSBfY29sbGVjdEFkZGl0aW9uYWxQcm9wZXJ0aWVzRm9yQW5hbHl0aWNhbFRhYmxlKFxuXHRcdFx0XHRcdGRhdGFGaWVsZCxcblx0XHRcdFx0XHRuYXZpZ2F0aW9uUGF0aFByZWZpeCxcblx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0cmVsYXRlZFByb3BlcnRpZXNcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRcdHN3aXRjaCAoZGF0YUZpZWxkLlRhcmdldD8uJHRhcmdldD8uJFR5cGUpIHtcblx0XHRcdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5GaWVsZEdyb3VwVHlwZTpcblx0XHRcdFx0XHRkYXRhRmllbGQuVGFyZ2V0LiR0YXJnZXQuRGF0YT8uZm9yRWFjaCgoaW5uZXJEYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMpID0+IHtcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRcdGlubmVyRGF0YUZpZWxkLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YVBvaW50VHlwZTpcblx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW4gPSBpc1JlZmVyZW5jZVByb3BlcnR5U3RhdGljYWxseUhpZGRlbihkYXRhRmllbGQpO1xuXHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzID0gY29sbGVjdFJlbGF0ZWRQcm9wZXJ0aWVzKFxuXHRcdFx0XHRcdFx0ZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LlZhbHVlLnBhdGgsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGQsXG5cdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0LFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0YWJsZVR5cGUsXG5cdFx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyxcblx0XHRcdFx0XHRcdGlzRW1iZWRkZWQsXG5cdFx0XHRcdFx0XHRpc1N0YXRpY2FsbHlIaWRkZW5cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ29tbXVuaWNhdGlvbkFubm90YXRpb25UeXBlcy5Db250YWN0VHlwZTpcblx0XHRcdFx0XHRjb25zdCBkYXRhRmllbGRDb250YWN0ID0gZGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0IGFzIENvbnRhY3Q7XG5cdFx0XHRcdFx0aXNTdGF0aWNhbGx5SGlkZGVuID0gaXNSZWZlcmVuY2VQcm9wZXJ0eVN0YXRpY2FsbHlIaWRkZW4oZGF0YUZpZWxkKTtcblx0XHRcdFx0XHRyZWxhdGVkUHJvcGVydGllcyA9IGNvbGxlY3RSZWxhdGVkUHJvcGVydGllcyhcblx0XHRcdFx0XHRcdGRhdGFGaWVsZC5UYXJnZXQudmFsdWUsXG5cdFx0XHRcdFx0XHRkYXRhRmllbGRDb250YWN0LFxuXHRcdFx0XHRcdFx0Y29udmVydGVyQ29udGV4dCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlbixcblx0XHRcdFx0XHRcdHRhYmxlVHlwZSxcblx0XHRcdFx0XHRcdHJlbGF0ZWRQcm9wZXJ0aWVzLFxuXHRcdFx0XHRcdFx0aXNFbWJlZGRlZCxcblx0XHRcdFx0XHRcdGlzU3RhdGljYWxseUhpZGRlblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRicmVhaztcblx0fVxuXG5cdHJldHVybiByZWxhdGVkUHJvcGVydGllcztcbn1cblxuZXhwb3J0IGNvbnN0IGdldERhdGFGaWVsZERhdGFUeXBlID0gZnVuY3Rpb24gKG9EYXRhRmllbGQ6IERhdGFGaWVsZEFic3RyYWN0VHlwZXMgfCBQcm9wZXJ0eSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGlmIChpc1Byb3BlcnR5KG9EYXRhRmllbGQpKSB7XG5cdFx0cmV0dXJuIG9EYXRhRmllbGQudHlwZTtcblx0fVxuXHRsZXQgc0RhdGFUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHN3aXRjaCAob0RhdGFGaWVsZC4kVHlwZSkge1xuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uR3JvdXA6XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JBY3Rpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRGb3JJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0XHRzRGF0YVR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aE5hdmlnYXRpb25QYXRoOlxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkV2l0aFVybDpcblx0XHRjYXNlIFVJQW5ub3RhdGlvblR5cGVzLkRhdGFGaWVsZFdpdGhJbnRlbnRCYXNlZE5hdmlnYXRpb246XG5cdFx0Y2FzZSBVSUFubm90YXRpb25UeXBlcy5EYXRhRmllbGRXaXRoQWN0aW9uOlxuXHRcdFx0c0RhdGFUeXBlID0gKG9EYXRhRmllbGQgYXMgRGF0YUZpZWxkKT8uVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgVUlBbm5vdGF0aW9uVHlwZXMuRGF0YUZpZWxkRm9yQW5ub3RhdGlvbjpcblx0XHRkZWZhdWx0OlxuXHRcdFx0aWYgKG9EYXRhRmllbGQuVGFyZ2V0Py4kdGFyZ2V0Py4kVHlwZSkge1xuXHRcdFx0XHRjb25zdCBkYXRhRmllbGRUYXJnZXQgPSBvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0O1xuXHRcdFx0XHRpZiAoZGF0YUZpZWxkVGFyZ2V0LiRUeXBlID09PSBDb21tdW5pY2F0aW9uQW5ub3RhdGlvblR5cGVzLkNvbnRhY3RUeXBlICYmIGlzUGF0aEFubm90YXRpb25FeHByZXNzaW9uKGRhdGFGaWVsZFRhcmdldC5mbikpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuZm4uJHRhcmdldD8udHlwZTtcblx0XHRcdFx0fSBlbHNlIGlmIChkYXRhRmllbGRUYXJnZXQuJFR5cGUgPT09IFVJQW5ub3RhdGlvblR5cGVzLkRhdGFQb2ludFR5cGUpIHtcblx0XHRcdFx0XHRzRGF0YVR5cGUgPSBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiRQYXRoPy4kVHlwZSB8fCBkYXRhRmllbGRUYXJnZXQuVmFsdWU/LiR0YXJnZXQ/LnR5cGU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gZS5nLiBGaWVsZEdyb3VwIG9yIENoYXJ0XG5cdFx0XHRcdFx0Ly8gRmllbGRHcm91cCBQcm9wZXJ0aWVzIGhhdmUgbm8gdHlwZSwgc28gd2UgZGVmaW5lIGl0IGFzIGEgYm9vbGVhbiB0eXBlIHRvIHByZXZlbnQgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB3aWR0aFxuXHRcdFx0XHRcdHNEYXRhVHlwZSA9XG5cdFx0XHRcdFx0XHRvRGF0YUZpZWxkLlRhcmdldC4kdGFyZ2V0LiRUeXBlID09PSBcImNvbS5zYXAudm9jYWJ1bGFyaWVzLlVJLnYxLkNoYXJ0RGVmaW5pdGlvblR5cGVcIiA/IHVuZGVmaW5lZCA6IFwiRWRtLkJvb2xlYW5cIjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c0RhdGFUeXBlID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRyZXR1cm4gc0RhdGFUeXBlO1xufTtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNPLFNBQVNBLDRCQUE0QixDQUFDQyxTQUFpQyxFQUFnRDtJQUM3SCxPQUFRQSxTQUFTLENBQXFDQyxjQUFjLENBQUMsUUFBUSxDQUFDO0VBQy9FOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTkE7RUFPTyxTQUFTQyx3QkFBd0IsQ0FDdkNGLFNBQWtFLEVBQzVCO0lBQ3RDLE9BQU8sQ0FBQUEsU0FBUyxhQUFUQSxT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
@@ -21,12 +21,14 @@ import { isAnnotationOfType, isPathAnnotationExpression, isProperty } from "sap/
21
21
  import { getDisplayMode } from "sap/fe/core/templating/DisplayModeFormatter";
22
22
  import {
23
23
  getAssociatedCurrencyProperty,
24
+ getAssociatedCurrencyPropertyPath,
24
25
  getAssociatedExternalIdProperty,
25
26
  getAssociatedExternalIdPropertyPath,
26
27
  getAssociatedTextProperty,
27
28
  getAssociatedTextPropertyPath,
28
29
  getAssociatedTimezoneProperty,
29
30
  getAssociatedUnitProperty,
31
+ getAssociatedUnitPropertyPath,
30
32
  hasStaticPercentUnit
31
33
  } from "sap/fe/core/templating/PropertyHelper";
32
34
  import { enhanceDataModelPath, getContextRelativeTargetObjectPath, type DataModelObjectPath } from "../../templating/DataModelPathHelper";
@@ -350,7 +352,6 @@ export function collectRelatedProperties(
350
352
  ): ComplexPropertyInfo {
351
353
  if (path && property) {
352
354
  let valueIndex: number;
353
- let currencyOrUoMIndex: number;
354
355
  /* EXTERNALID */
355
356
  const externalIdPath = getAssociatedExternalIdPropertyPath(property);
356
357
  const externalIdProperty = getAssociatedExternalIdProperty(property);
@@ -372,6 +373,7 @@ export function collectRelatedProperties(
372
373
  const propertyDataModelObjectPath = enhanceDataModelPath<Property>(dataModelObjectPath, externalIdPath || path);
373
374
  const textPropertyDataModelObjectPath = enhanceDataModelPath<Property>(propertyDataModelObjectPath, textPropertyPath);
374
375
  const textRelativePath = getContextRelativeTargetObjectPath(textPropertyDataModelObjectPath);
376
+ const relativePath = getContextRelativeTargetObjectPath(propertyDataModelObjectPath);
375
377
 
376
378
  if (relatedProperties.exportSettings?.template) {
377
379
  // FieldGroup use-case. Need to add each Field in new line.
@@ -428,20 +430,14 @@ export function collectRelatedProperties(
428
430
  const timezoneAnnotation = property?.annotations?.Common?.Timezone;
429
431
 
430
432
  if (currencyOrUoMProperty) {
431
- valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, path, property);
432
- currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(
433
+ collectCurrencyOrUnitProperties(
433
434
  relatedProperties,
434
- navigationPathPrefix + currencyOrUnitAnnotation.path,
435
- currencyOrUnitAnnotation.$target!
435
+ relativePath ?? path,
436
+ addUnitInTemplate,
437
+ propertyDataModelObjectPath,
438
+ currencyOrUoMProperty,
439
+ currencyProperty
436
440
  );
437
- if (addUnitInTemplate) {
438
- _appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
439
- } else {
440
- relatedProperties.exportSettings.unitProperty = navigationPathPrefix + currencyOrUnitAnnotation.path;
441
- }
442
- if (currencyProperty) {
443
- relatedProperties.exportSettings.isCurrency = true;
444
- }
445
441
  } else if (timezoneProperty && timezoneAnnotation?.$target) {
446
442
  collectTimezoneProperties(property, relatedProperties, path, addUnitInTemplate);
447
443
  } else if (
@@ -574,6 +570,46 @@ function collectTimezoneProperties(
574
570
  }
575
571
  }
576
572
 
573
+ /**
574
+ * Collect the related properties from a property with currencies or units.
575
+ *
576
+ * @param relatedProperties The related properties identified so far for the column.
577
+ * @param relativePath The property relative path.
578
+ * @param addUnitInTemplate Specify if the unit should be added in the template.
579
+ * @param propertyDataModelObjectPath The data model object path of the property to be considered.
580
+ * @param currencyOrUoMProperty The currency or unit of measure property linked to the column.
581
+ * @param currencyProperty The currency property linked to the column.
582
+ */
583
+ function collectCurrencyOrUnitProperties(
584
+ relatedProperties: ComplexPropertyInfo,
585
+ relativePath: string,
586
+ addUnitInTemplate: boolean,
587
+ propertyDataModelObjectPath: DataModelObjectPath<Property>,
588
+ currencyOrUoMProperty: Property,
589
+ currencyProperty?: Property
590
+ ): void {
591
+ const property = propertyDataModelObjectPath.targetObject;
592
+ if (property) {
593
+ const currencyOrUnitPropertyPath = getAssociatedCurrencyPropertyPath(property) || getAssociatedUnitPropertyPath(property);
594
+ const unitOrCurrencyPropertyDataModelObjectPath = enhanceDataModelPath<Property>(
595
+ propertyDataModelObjectPath,
596
+ currencyOrUnitPropertyPath
597
+ );
598
+ const unitOrCurrencyRelativePath = getContextRelativeTargetObjectPath(unitOrCurrencyPropertyDataModelObjectPath);
599
+ const valueIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, relativePath, property);
600
+ const currencyOrUoMIndex = _setRelatedPropertiesAndGetIndex(relatedProperties, unitOrCurrencyRelativePath!, currencyOrUoMProperty);
601
+ if (addUnitInTemplate) {
602
+ _appendTemplate(relatedProperties, `{${valueIndex}} {${currencyOrUoMIndex}}`);
603
+ } else {
604
+ relatedProperties.exportSettings.unitProperty = unitOrCurrencyRelativePath;
605
+ }
606
+ if (currencyProperty) {
607
+ relatedProperties.exportSettings.isCurrency = true;
608
+ }
609
+ relatedProperties.exportSettings.scale = property.scale;
610
+ }
611
+ }
612
+
577
613
  /**
578
614
  * Collect properties consumed by a DataField.
579
615
  * This is for populating the ComplexPropertyInfos of the table delegate.
@@ -582,7 +618,7 @@ function collectTimezoneProperties(
582
618
  * @param converterContext The converter context.
583
619
  * @param tableType The table type.
584
620
  * @param relatedProperties The properties identified so far.
585
- * @param isEmbedded True if the DataField is embedded in another annotation (e.g. FieldGroup).
621
+ * @param isEmbedded True if the DataField is embedded in another annotation (such as FieldGroup).
586
622
  * @returns The properties related to the DataField.
587
623
  */
588
624
  export function collectRelatedPropertiesRecursively(
@@ -4,7 +4,7 @@
4
4
  "id": "sap.fe.core.fpm",
5
5
  "type": "component",
6
6
  "applicationVersion": {
7
- "version": "1.124.2"
7
+ "version": "1.124.3"
8
8
  },
9
9
  "title": "Object Page",
10
10
  "tags": {
@@ -48,7 +48,7 @@ sap.ui.define(["sap/base/Log", "sap/fe/core/formatters/CriticalityFormatter", "s
48
48
  controls: [],
49
49
  elements: [],
50
50
  // eslint-disable-next-line no-template-curly-in-string
51
- version: "1.124.2",
51
+ version: "1.124.3",
52
52
  noLibraryCSS: true,
53
53
  extensions: {
54
54
  //Configuration used for rule loading of Support Assistant