@sapui5/sap.fe.base 1.131.0 → 1.132.0

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.
@@ -48,7 +48,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
48
48
  }
49
49
  if (!oSource || !oSource.isA(apiFQN)) {
50
50
  const oSourceMap = this.instanceMap.get(this);
51
- oSource = oSourceMap === null || oSourceMap === void 0 ? void 0 : oSourceMap[oSourceMap.length - 1];
51
+ oSource = oSourceMap?.[oSourceMap.length - 1];
52
52
  }
53
53
  let targetControl;
54
54
  if (oSource && oSource.isA(apiFQN)) {
@@ -85,14 +85,13 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
85
85
  */
86
86
  function defineState() {
87
87
  return function (target, propertyKey, propertyDescriptor) {
88
- var _initializer, _ref;
89
88
  const metadata = ensureMetadata(target);
90
89
  if (metadata.stateProperty !== undefined) {
91
90
  throw new Error("Only one state property per control is allowed");
92
91
  }
93
92
  metadata.stateProperty = propertyKey;
94
93
  delete propertyDescriptor.writable;
95
- metadata.statePropertyDefaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
94
+ metadata.statePropertyDefaultValue ??= propertyDescriptor.initializer?.();
96
95
  delete propertyDescriptor.initializer;
97
96
  return propertyDescriptor;
98
97
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
@@ -235,7 +234,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
235
234
  _exports.event = event;
236
235
  function property(attributeDefinition) {
237
236
  return function (target, propertyKey, propertyDescriptor) {
238
- var _initializer2, _ref2;
239
237
  const metadata = ensureMetadata(target);
240
238
  if (attributeDefinition.bindable === undefined) {
241
239
  attributeDefinition.bindable = true;
@@ -248,7 +246,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
248
246
  metadata.properties[propertyKey] = attributeDefinition;
249
247
  }
250
248
  delete propertyDescriptor.writable;
251
- attributeDefinition.defaultValue ??= (_initializer2 = (_ref2 = propertyDescriptor).initializer) === null || _initializer2 === void 0 ? void 0 : _initializer2.call(_ref2);
249
+ attributeDefinition.defaultValue ??= propertyDescriptor.initializer?.();
252
250
  delete propertyDescriptor.initializer;
253
251
  return propertyDescriptor;
254
252
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
@@ -262,7 +260,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
262
260
  _exports.property = property;
263
261
  function aggregation(aggregationDefinition) {
264
262
  return function (target, propertyKey, propertyDescriptor) {
265
- var _initializer3, _ref3;
266
263
  const metadata = ensureMetadata(target);
267
264
  if (aggregationDefinition.multiple === undefined) {
268
265
  // UI5 defaults this to true but this is just weird...
@@ -275,7 +272,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
275
272
  metadata.defaultAggregation = propertyKey;
276
273
  }
277
274
  delete propertyDescriptor.writable;
278
- aggregationDefinition.defaultValue ??= (_initializer3 = (_ref3 = propertyDescriptor).initializer) === null || _initializer3 === void 0 ? void 0 : _initializer3.call(_ref3);
275
+ aggregationDefinition.defaultValue ??= propertyDescriptor.initializer?.();
279
276
  delete propertyDescriptor.initializer;
280
277
  return propertyDescriptor;
281
278
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
@@ -325,9 +322,9 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
325
322
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
326
323
  args[_key] = arguments[_key];
327
324
  }
328
- if (args !== null && args !== void 0 && args.length) {
325
+ if (args?.length) {
329
326
  const currentTarget = currentConstructor.getAPI(args[0]);
330
- currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget[propertykey.toString()](...args);
327
+ currentTarget?.[propertykey.toString()](...args);
331
328
  }
332
329
  };
333
330
  };
@@ -371,12 +368,11 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
371
368
  */
372
369
  function mixin(interfaceClass) {
373
370
  return function (baseCtor) {
374
- var _interfaceClass$proto, _interfaceClass$proto2, _interfaceClass$proto3, _interfaceClass$proto4;
375
371
  if (baseCtor.prototype.extend) {
376
372
  throw new Error("The mixinInterface decorator must be placed after `defineUi5Class`");
377
373
  }
378
374
  const metadata = ensureMetadata(baseCtor.prototype);
379
- const interfaceName = (_interfaceClass$proto = (_interfaceClass$proto2 = interfaceClass.prototype).getInterfaceName) === null || _interfaceClass$proto === void 0 ? void 0 : _interfaceClass$proto.call(_interfaceClass$proto2);
375
+ const interfaceName = interfaceClass.prototype.getInterfaceName?.();
380
376
  if (interfaceName) {
381
377
  metadata.interfaces.push(interfaceName);
382
378
  }
@@ -386,7 +382,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
386
382
  }
387
383
  });
388
384
  // Hook to add potentially more logic to the mixin
389
- (_interfaceClass$proto3 = (_interfaceClass$proto4 = interfaceClass.prototype).setupMixin) === null || _interfaceClass$proto3 === void 0 ? void 0 : _interfaceClass$proto3.call(_interfaceClass$proto4, baseCtor);
385
+ interfaceClass.prototype.setupMixin?.(baseCtor);
390
386
  return baseCtor;
391
387
  };
392
388
  }
@@ -466,82 +462,96 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
466
462
  return oTarget;
467
463
  }
468
464
  function _createStateProperty(obj, targetControl) {
469
- var _obj$metadata;
470
- if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.stateProperty) {
471
- const stateModel = new JSONModel({});
472
- targetControl.setModel(stateModel, "$componentState");
465
+ if (obj.metadata?.stateProperty || targetControl?.getModel && targetControl.getModel("$componentState")) {
466
+ if (obj.metadata?.stateProperty) {
467
+ targetControl.setModel(new JSONModel(), "$componentState");
468
+ }
469
+ const stateModel = targetControl.getModel("$componentState");
473
470
  let updatingState = false;
474
471
  const boundToStateProps = [];
475
- for (const propertyName in obj.metadata.properties) {
472
+ for (const propertyName in obj.metadata?.properties) {
476
473
  const propertyDef = obj.metadata.properties[propertyName];
477
474
  if (propertyDef.bindToState) {
478
475
  boundToStateProps.push(propertyName);
479
476
  }
480
477
  }
478
+ // as we may have bound properties in parent classes and subclasses, we keep track of those in the model itself
479
+ const initialBoundProperties = stateModel.getProperty("/__boundProperties") ?? [];
480
+ stateModel.setProperty("/__boundProperties", [...initialBoundProperties, ...boundToStateProps]);
481
481
  stateModel.attachPropertyChange(evt => {
482
- var _evt$getParameter;
483
- const path = (_evt$getParameter = evt.getParameter("path")) === null || _evt$getParameter === void 0 ? void 0 : _evt$getParameter.substring(1); // to remove the first /
482
+ const path = evt.getParameter("path")?.substring(1); // to remove the first /
484
483
  if (path && boundToStateProps.includes(path)) {
485
484
  targetControl.setProperty(path, evt.getParameter("value"));
486
485
  }
487
486
  });
488
- // This method can be used to force the state to be applied and wait for it to be applied in tests
489
- targetControl._updateState = async function () {
490
- delete this._updateStateTimer;
491
- if (!updatingState) {
492
- var _onStateChange, _ref4;
493
- updatingState = true;
494
- await ((_onStateChange = (_ref4 = this).onStateChange) === null || _onStateChange === void 0 ? void 0 : _onStateChange.call(_ref4, this._changedProps));
495
- this._changedProps = [];
496
- updatingState = false;
497
- }
498
- };
499
- targetControl._updateStateDebounced = function (changedProp) {
500
- this._changedProps ??= [];
501
- if (!this._changedProps.includes(changedProp)) {
502
- this._changedProps.push(changedProp);
503
- }
504
- if (!this._updateStateTimer && !updatingState) {
505
- this._updateStateTimer = setTimeout(() => {
506
- this._updateState();
507
- }, 200);
508
- }
509
- };
510
- Object.defineProperty(targetControl, obj.metadata.stateProperty, {
511
- configurable: true,
512
- get: () => {
513
- return new Proxy(stateModel, {
514
- get: (target, prop) => {
515
- return _getHandlerForStateProperty(target, prop);
516
- },
517
- set: (setStateModel, prop, value) => {
518
- if (boundToStateProps.includes(prop.toString())) {
519
- targetControl._ignoreStatePropertyUpdate = true;
520
- targetControl.setProperty(prop.toString(), value);
521
- targetControl._ignoreStatePropertyUpdate = false;
487
+ if (obj.metadata?.stateProperty) {
488
+ // This method can be used to force the state to be applied and wait for it to be applied in tests
489
+ targetControl._updateState = async function () {
490
+ delete this._updateStateTimer;
491
+ if (!updatingState) {
492
+ updatingState = true;
493
+ await this.onStateChange?.(this._changedProps);
494
+ this._changedProps = [];
495
+ updatingState = false;
496
+ }
497
+ };
498
+ targetControl._updateStateDebounced = function (changedProp) {
499
+ this._changedProps ??= [];
500
+ if (!this._changedProps.includes(changedProp)) {
501
+ this._changedProps.push(changedProp);
502
+ }
503
+ if (!this._updateStateTimer && !updatingState) {
504
+ this._updateStateTimer = setTimeout(() => {
505
+ this._updateState();
506
+ }, 200);
507
+ }
508
+ };
509
+ Object.defineProperty(targetControl, obj.metadata.stateProperty, {
510
+ configurable: true,
511
+ get: () => {
512
+ return new Proxy(stateModel, {
513
+ get: (target, prop) => {
514
+ return _getHandlerForStateProperty(target, prop);
515
+ },
516
+ set: (setStateModel, prop, value) => {
517
+ // we need to check whether the property is a known bound property in any of the related classes
518
+ const knownBoundProperties = setStateModel.getProperty("/__boundProperties") ?? [];
519
+ if (knownBoundProperties.includes(prop.toString())) {
520
+ targetControl._ignoreStatePropertyUpdate = true;
521
+ targetControl.setProperty(prop.toString(), value);
522
+ targetControl._ignoreStatePropertyUpdate = false;
523
+ }
524
+ const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
525
+ targetControl._updateStateDebounced(prop.toString());
526
+ return setResult;
522
527
  }
523
- const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
524
- targetControl._updateStateDebounced(prop.toString());
525
- return setResult;
526
- }
527
- });
528
- },
529
- set: function (value) {
530
- // Replacing the complete state
531
- stateModel.setProperty(`/`, value);
528
+ });
529
+ },
530
+ set: function (value) {
531
+ const knownBoundProperties = stateModel.getProperty("/__boundProperties") ?? [];
532
+ // Replacing the complete state
533
+ stateModel.setProperty(`/`, value);
534
+ // restoring the boundProperties references
535
+ stateModel.setProperty("/__boundProperties", knownBoundProperties);
536
+ }
537
+ });
538
+ if (obj.metadata.statePropertyDefaultValue) {
539
+ targetControl[obj.metadata.stateProperty] = {
540
+ ...obj.metadata.statePropertyDefaultValue
541
+ };
532
542
  }
533
- });
534
- if (obj.metadata.statePropertyDefaultValue) {
535
- targetControl[obj.metadata.stateProperty] = {
536
- ...obj.metadata.statePropertyDefaultValue
543
+ const fnApplySettings = targetControl.applySettings;
544
+ targetControl.applySettings = function (mSettings) {
545
+ delete mSettings?.models?.$componentState;
546
+ return fnApplySettings.call(this, mSettings);
537
547
  };
538
548
  }
539
549
  const fnSetProperty = targetControl.setProperty;
540
550
  if (boundToStateProps.length > 0) {
541
551
  targetControl.setProperty = function (sPropertyName, oValue, bSuppressInvalidate) {
542
552
  if (boundToStateProps.includes(sPropertyName) && !this._ignoreStatePropertyUpdate) {
543
- var _obj$metadata2;
544
- this[(_obj$metadata2 = obj.metadata) === null || _obj$metadata2 === void 0 ? void 0 : _obj$metadata2.stateProperty][sPropertyName] = oValue;
553
+ stateModel.setProperty(`/${sPropertyName}`, oValue);
554
+ targetControl._updateStateDebounced(sPropertyName);
545
555
  }
546
556
  return fnSetProperty.call(this, sPropertyName, oValue, bSuppressInvalidate);
547
557
  };
@@ -557,8 +567,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
557
567
  * @returns The metadata class
558
568
  */
559
569
  function registerUI5Metadata(clazz, name, inObj) {
560
- var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata3;
561
- if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
570
+ if (clazz.getMetadata?.().isA("sap.ui.core.mvc.ControllerExtension")) {
562
571
  Object.getOwnPropertyNames(inObj).forEach(objName => {
563
572
  const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
564
573
  if (descriptor && !descriptor.enumerable) {
@@ -572,7 +581,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
572
581
  obj.override = inObj.override;
573
582
  obj.constructor = clazz;
574
583
  obj.metadata.baseType = Object.getPrototypeOf(clazz.prototype).getMetadata().getName();
575
- if ((clazz === null || clazz === void 0 ? void 0 : (_clazz$getMetadata2 = clazz.getMetadata()) === null || _clazz$getMetadata2 === void 0 ? void 0 : _clazz$getMetadata2.getStereotype()) === "control") {
584
+ if (clazz?.getMetadata()?.getStereotype() === "control") {
576
585
  const rendererDefinition = inObj.renderer || clazz.renderer || clazz.render;
577
586
  obj.renderer = {
578
587
  apiVersion: 2
@@ -583,7 +592,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
583
592
  obj.renderer = rendererDefinition;
584
593
  }
585
594
  }
586
- obj.metadata.interfaces = ((_inObj$metadata = inObj.metadata) === null || _inObj$metadata === void 0 ? void 0 : _inObj$metadata.interfaces) || ((_clazz$metadata = clazz.metadata) === null || _clazz$metadata === void 0 ? void 0 : _clazz$metadata.interfaces);
595
+ obj.metadata.interfaces = inObj.metadata?.interfaces || clazz.metadata?.interfaces;
587
596
  Object.keys(clazz.prototype).forEach(key => {
588
597
  if (key !== "metadata") {
589
598
  try {
@@ -593,7 +602,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
593
602
  }
594
603
  }
595
604
  });
596
- if ((_obj$metadata3 = obj.metadata) !== null && _obj$metadata3 !== void 0 && _obj$metadata3.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
605
+ if (obj.metadata?.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
597
606
  for (const cExtName in obj.metadata.controllerExtensions) {
598
607
  obj[cExtName] = obj.metadata.controllerExtensions[cExtName];
599
608
  }
@@ -658,7 +667,8 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
658
667
  }
659
668
  });
660
669
  }
661
- if (propertyDefault !== undefined) {
670
+ if (propertyDefault !== undefined && this[propertyKey] !== propertyDefault) {
671
+ // don't overwrite the default value if it's already there
662
672
  this._applyingSettings = true;
663
673
  this[propertyKey] = propertyDefault;
664
674
  this._applyingSettings = false;
@@ -683,7 +693,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
683
693
  }
684
694
  }
685
695
  });
686
- if (defaultValue && defaultValue !== null && defaultValue !== void 0 && defaultValue.isA) {
696
+ if (defaultValue && defaultValue?.isA) {
687
697
  this._applyingSettings = true;
688
698
  this[aggregationKey] = defaultValue;
689
699
  this._applyingSettings = false;
@@ -771,4 +781,4 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
771
781
  }
772
782
  return _exports;
773
783
  }, false);
774
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwiX2luaXRpYWxpemVyIiwiX3JlZiIsInN0YXRlUHJvcGVydHkiLCJFcnJvciIsIndyaXRhYmxlIiwic3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSIsImluaXRpYWxpemVyIiwiY2FsbCIsIl9leHBvcnRzIiwibWV0aG9kT3ZlcnJpZGUiLCJleHRlbnNpb25OYW1lIiwib3ZlcnJpZGUiLCJvdmVycmlkZXMiLCJjdXJyZW50VGFyZ2V0IiwiZXh0ZW5zaW9uIiwidG9TdHJpbmciLCJleHRlbnNpYmxlIiwib3ZlcnJpZGVFeGVjdXRpb24iLCJkZXNjcmlwdG9yIiwiaG9va2FibGUiLCJwdWJsaWNFeHRlbnNpb24iLCJlbnVtZXJhYmxlIiwicHVibGljIiwicHJpdmF0ZUV4dGVuc2lvbiIsImZpbmFsRXh0ZW5zaW9uIiwiZmluYWwiLCJ1c2luZ0V4dGVuc2lvbiIsImV4dGVuc2lvbkNsYXNzIiwiZXZlbnQiLCJldmVudEtleSIsInByb3BlcnR5IiwiYXR0cmlidXRlRGVmaW5pdGlvbiIsIl9pbml0aWFsaXplcjIiLCJfcmVmMiIsImJpbmRhYmxlIiwiaXNCaW5kaW5nSW5mbyIsImdyb3VwIiwiZGVmYXVsdFZhbHVlIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJfaW5pdGlhbGl6ZXIzIiwiX3JlZjMiLCJtdWx0aXBsZSIsImlzRGVmYXVsdCIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFzc29jaWF0aW9uIiwidWk1QXNzb2NpYXRpb25NZXRhZGF0YSIsImltcGxlbWVudEludGVyZmFjZSIsImludGVyZmFjZU5hbWUiLCJ4bWxFdmVudEhhbmRsZXIiLCJwcm9wZXJ0eWtleSIsImN1cnJlbnRDb25zdHJ1Y3RvciIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZGVmaW5lVUk1Q2xhc3MiLCJzVGFyZ2V0IiwibWV0YWRhdGFEZWZpbml0aW9uIiwicHJvdG90eXBlIiwia2V5IiwiaXNBcnJheSIsImNvbmNhdCIsInJlZ2lzdGVyVUk1TWV0YWRhdGEiLCJtaXhpbiIsImludGVyZmFjZUNsYXNzIiwiYmFzZUN0b3IiLCJfaW50ZXJmYWNlQ2xhc3MkcHJvdG8iLCJfaW50ZXJmYWNlQ2xhc3MkcHJvdG8yIiwiX2ludGVyZmFjZUNsYXNzJHByb3RvMyIsIl9pbnRlcmZhY2VDbGFzcyRwcm90bzQiLCJleHRlbmQiLCJnZXRJbnRlcmZhY2VOYW1lIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJuYW1lIiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJjcmVhdGUiLCJzZXR1cE1peGluIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsIl9nZXRIYW5kbGVyRm9yU3RhdGVQcm9wZXJ0eSIsImpzb25Nb2RlbCIsInByb3AiLCJwYXRoSW5Nb2RlbCIsIm9PYmoiLCJkZWVwQ2xvbmUiLCJnZXRPYmplY3QiLCJvVGFyZ2V0IiwibW9kZWwiLCJQcm94eSIsInAiLCJyZWNlaXZlciIsInJlZiIsIlJlZmxlY3QiLCJiaW5kIiwiaXNOYU4iLCJOdW1iZXIiLCJfX2JpbmRpbmdJbmZvIiwicGF0aCIsIl9jcmVhdGVTdGF0ZVByb3BlcnR5Iiwib2JqIiwiX29iaiRtZXRhZGF0YSIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInVwZGF0aW5nU3RhdGUiLCJib3VuZFRvU3RhdGVQcm9wcyIsInByb3BlcnR5TmFtZSIsInByb3BlcnR5RGVmIiwiYmluZFRvU3RhdGUiLCJhdHRhY2hQcm9wZXJ0eUNoYW5nZSIsImV2dCIsIl9ldnQkZ2V0UGFyYW1ldGVyIiwiZ2V0UGFyYW1ldGVyIiwic3Vic3RyaW5nIiwiaW5jbHVkZXMiLCJzZXRQcm9wZXJ0eSIsIl91cGRhdGVTdGF0ZSIsIl91cGRhdGVTdGF0ZVRpbWVyIiwiX29uU3RhdGVDaGFuZ2UiLCJfcmVmNCIsIm9uU3RhdGVDaGFuZ2UiLCJfY2hhbmdlZFByb3BzIiwiX3VwZGF0ZVN0YXRlRGVib3VuY2VkIiwiY2hhbmdlZFByb3AiLCJzZXRUaW1lb3V0IiwiY29uZmlndXJhYmxlIiwic2V0U3RhdGVNb2RlbCIsInZhbHVlIiwiX2lnbm9yZVN0YXRlUHJvcGVydHlVcGRhdGUiLCJzZXRSZXN1bHQiLCJmblNldFByb3BlcnR5Iiwic1Byb3BlcnR5TmFtZSIsIm9WYWx1ZSIsImJTdXBwcmVzc0ludmFsaWRhdGUiLCJfb2JqJG1ldGFkYXRhMiIsImNsYXp6IiwiaW5PYmoiLCJfY2xhenokZ2V0TWV0YWRhdGEiLCJfY2xhenokZ2V0TWV0YWRhdGEyIiwiX2luT2JqJG1ldGFkYXRhIiwiX2NsYXp6JG1ldGFkYXRhIiwiX29iaiRtZXRhZGF0YTMiLCJvYmpOYW1lIiwiYmFzZVR5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldFN0ZXJlb3R5cGUiLCJyZW5kZXJlckRlZmluaXRpb24iLCJyZW5kZXJlciIsInJlbmRlciIsImFwaVZlcnNpb24iLCJrZXlzIiwiZSIsImNFeHROYW1lIiwib3V0cHV0IiwiZm5Jbml0IiwiaW5pdCIsImZuQWZ0ZXJJbml0IiwiYWZ0ZXJJbml0IiwiX3RoaXMiLCJfbGVuMiIsIl9rZXkyIiwiYXBwbHkiLCJhUHJvcGVydHlLZXlzIiwicHJvcGVydHlEZWZhdWx0IiwiX2JpbmRpbmdQcm9wZXJ0aWVzIiwidiIsIm1Qcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsImdldFByb3BlcnR5IiwiYmluZGluZ1Byb3BlcnR5VmFsdWUiLCJwcm9wVmFsdWUiLCJfYXBwbHlpbmdTZXR0aW5ncyIsImFBZ2dyZWdhdGlvbktleXMiLCJhZ2dyZWdhdGlvbktleSIsImFnZ3JlZ2F0aW9uRGVmIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkNvbnRlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImFBc3NvY2lhdGlvbktleXMiLCJhc3NvY2lhdGlvbktleSIsInNldEFzc29jaWF0aW9uIiwiZ2V0QXNzb2NpYXRpb24iLCJyZWZlcmVuY2VQcm9wZXJ0aWVzIiwibWV0aG9kTmFtZSIsIm1ldGhvZERlZmluaXRpb24iLCJtZXRob2RIb2xkZXIiLCJtZXRob2RBcnJheXMiLCJyZXZlcnNlIiwiX2xlbjMiLCJtZXRob2RBcmdzIiwiX2tleTMiLCJhcmciLCJvRXh0ZW5zaW9uIiwicG9sIiwiX2xlbjQiLCJfa2V5NCIsIm9DbGFzcyIsIk1ldGFkYXRhIiwiY3JlYXRlQ2xhc3MiLCJ1aWQiLCJDb250cm9sbGVyTWV0YWRhdGEiLCJfc3RhdGljT3ZlcnJpZGUiLCJfb3ZlcnJpZGUiLCJPYmplY3RQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDbGFzc1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB7IGhvb2thYmxlIH0gZnJvbSBcInNhcC9mZS9iYXNlL0hvb2tTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NZXRhZGF0YVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyAkQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQ29udHJvbGxlck1ldGFkYXRhIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlck1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbCRQcm9wZXJ0eUNoYW5nZUV2ZW50IH0gZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5cbnR5cGUgT3ZlcnJpZGVEZWZpbml0aW9uID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xudHlwZSBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGVFeGVjdXRpb24/OiBPdmVycmlkZUV4ZWN1dGlvbjtcblx0cHVibGljPzogYm9vbGVhbjtcblx0ZmluYWw/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIE5vbkFic3RyYWN0Q2xhc3M8VD4gPSBQaWNrPFQsIGtleW9mIFQ+ICYgKG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUKTtcblxudHlwZSBVSTVQcm9wZXJ0eU1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGJpbmRhYmxlPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRncm91cD86IHN0cmluZztcblx0ZGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0YnlWYWx1ZT86IGJvb2xlYW47XG5cdGlzQmluZGluZ0luZm8/OiBib29sZWFuO1xuXHRiaW5kVG9TdGF0ZT86IHN0cmluZztcblx0ZXhwZWN0ZWRBbm5vdGF0aW9ucz86IHN0cmluZ1tdO1xuXHRleHBlY3RlZFR5cGVzPzogc3RyaW5nW107XG5cdGFsbG93ZWRWYWx1ZXM/OiBzdHJpbmdbXTtcblx0dmlzaWJpbGl0eT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGFsdFR5cGVzPzogc3RyaW5nW107XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0ZGVmYXVsdENsYXNzPzogdW5rbm93bjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xuXHRmb3J3YXJkaW5nPzogb2JqZWN0O1xufTtcbmV4cG9ydCB0eXBlIFVJNUFzc29jaWF0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiA9IHtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xuXHRjb250cm9sbGVyRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdHlwZW9mIENvbnRyb2xsZXJFeHRlbnNpb24gfCBGdW5jdGlvbj47XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFVJNVByb3BlcnR5TWV0YWRhdGE+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGE+O1xuXHRyZWZlcmVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcblx0YXNzb2NpYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhPjtcblx0bWV0aG9kczogUmVjb3JkPHN0cmluZywgVUk1Q29udHJvbGxlck1ldGhvZERlZmluaXRpb24+O1xuXHRldmVudHM6IFJlY29yZDxzdHJpbmcsIHt9Pjtcblx0aW50ZXJmYWNlczogc3RyaW5nW107XG5cdGxpYnJhcnk/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG5cdGNvbmZpZz86IHtcblx0XHRmdWxsV2lkdGg/OiBib29sZWFuO1xuXHR9O1xuXHRzdGF0ZVByb3BlcnR5Pzogc3RyaW5nO1xuXHRzdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0bWFuaWZlc3Q/OiBzdHJpbmcgfCB1bmtub3duO1xuXHRyZXR1cm5UeXBlcz86IHN0cmluZ1tdO1xuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiB1bmtub3duO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc29yRGVzY3JpcHRvcjxUPiA9IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFQ+ICYgeyBpbml0aWFsaXplcj86ICgpID0+IFQgfTtcbnR5cGUgVUk1Q29udHJvbGxlckRlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRvdmVycmlkZXM/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1Q29udHJvbERlZmluaXRpb24gPSB7XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0b3ZlcnJpZGU/OiB1bmtub3duO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVBUElDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xuXHRfX2FwaVJlZ2lzdGVyZWQ6IGJvb2xlYW47XG59ICYge1xuXHRbazogc3RyaW5nXTogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBYTUxFdmVudEhvbGRlciA9IHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xufTtcblxudHlwZSBDb250cm9sUHJvcGVydHlOYW1lczxUPiA9IHtcblx0Ly8gbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIFRTIGNvbXBpbGVyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBhcnRpYWw8UGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGFydGlhbDxQaWNrPFQsIEs+PiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBDb252ZXJ0Q29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIFwibWV0YVBhdGhcIiB8IFwiY29udGV4dFBhdGhcIiA/IHN0cmluZyA6IFRbS107XG59O1xudHlwZSBDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ29udGV4dCB8IHVuZGVmaW5lZCA/IHN0cmluZyB8IHVuZGVmaW5lZCA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2ZCdWlsZGluZ0Jsb2NrPFQ+ID0gQ29udGV4dFRvU3RyaW5nPFByb3BlcnRpZXNPZjxUPj47XG5leHBvcnQgdHlwZSBTdHJpY3RQcm9wZXJ0aWVzT2Y8VD4gPSBQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+PjtcbmV4cG9ydCB0eXBlIFVJNUFjY2Vzc29yczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgZ2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBnZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICgpID0+IFRbUF07XG59O1xuZXhwb3J0IHR5cGUgVUk1U2V0dGVyczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgc2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBzZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICh2YWx1ZTogVFtQXSkgPT4gVDtcbn07XG5leHBvcnQgdHlwZSBFbmhhbmNlV2l0aFVJNTxUPiA9IHtcblx0bmV3IChwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG5cdG5ldyAoc0lkOiBzdHJpbmcsIHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcbn0gJiBUICZcblx0VUk1QWNjZXNzb3JzPFQ+ICZcblx0VUk1U2V0dGVyczxUPjtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24gPSBcIkluc3RlYWRcIiB8IFwiQmVmb3JlXCIgfCBcIkFmdGVyXCIgfCBcIkFmdGVyQXN5bmNcIiB8IFwiQmVmb3JlQXN5bmNcIjtcblxuY29uc3QgZW5zdXJlTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiB7XG5cdHRhcmdldC5tZXRhZGF0YSA9IG1lcmdlKFxuXHRcdHtcblx0XHRcdGNvbnRyb2xsZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7fSxcblx0XHRcdHJlZmVyZW5jZXM6IHt9LFxuXHRcdFx0YXNzb2NpYXRpb25zOiB7fSxcblx0XHRcdG1ldGhvZHM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fSxcblx0XHRcdGludGVyZmFjZXM6IFtdXG5cdFx0fSxcblx0XHR0YXJnZXQubWV0YWRhdGEgPz8ge31cblx0KSBhcyBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZXR1cm4gdGFyZ2V0Lm1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdGhhdCB3aWxsIGZpbmQgdGhlIGNvcnJlY3QgQVBJIG9iamVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250cm9sIGhpZXJhcmNoeS5cbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEByZXR1cm5zIFRoZSBwcm9wZXIgZ2V0QVBJIGZ1bmN0aW9uIGZvciB0aGlzIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVHZXRBUElGdW5jdGlvbih0YXJnZXQ6IFVJNUFQSUNvbnRyb2wpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgVUk1QVBJQ29udHJvbD4oXG5cdFx0dGhpczogVUk1QVBJQ29udHJvbCxcblx0XHRvRXZlbnQ6IFVJNUV2ZW50LFxuXHRcdGFwaUZRTjogc3RyaW5nID0gdGFyZ2V0LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpXG5cdCk6IFQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBvU291cmNlID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIE1hbmFnZWRPYmplY3QgfCBudWxsO1xuXHRcdGlmICh0YXJnZXQuX2dldEFQSUV4dGVuc2lvbikge1xuXHRcdFx0b1NvdXJjZSA9IHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKG9Tb3VyY2UpID8/IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHdoaWxlIChvU291cmNlICYmICFvU291cmNlLmlzQTxUPihhcGlGUU4pICYmIG9Tb3VyY2UuZ2V0UGFyZW50KSB7XG5cdFx0XHRpZiAodGhpcy5pc0RlcGVuZGVudEJvdW5kKSB7XG5cdFx0XHRcdGNvbnN0IG9EZXBlbmRlbnRzID0gKG9Tb3VyY2UgYXMgQ29udHJvbCkuZ2V0RGVwZW5kZW50cygpO1xuXHRcdFx0XHRjb25zdCBoYXNDb3JyZWN0RGVwZW5kZW50ID0gb0RlcGVuZGVudHMuZmluZCgob0RlcGVuZGVudDogVUk1RWxlbWVudCkgPT4gb0RlcGVuZGVudC5pc0EoYXBpRlFOKSk7XG5cdFx0XHRcdGlmIChoYXNDb3JyZWN0RGVwZW5kZW50KSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IGhhc0NvcnJlY3REZXBlbmRlbnQgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFvU291cmNlIHx8ICFvU291cmNlLmlzQTxUPihhcGlGUU4pKSB7XG5cdFx0XHRjb25zdCBvU291cmNlTWFwID0gdGhpcy5pbnN0YW5jZU1hcC5nZXQodGhpcykgYXMgVFtdO1xuXHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2VNYXA/LltvU291cmNlTWFwLmxlbmd0aCAtIDFdO1xuXHRcdH1cblx0XHRsZXQgdGFyZ2V0Q29udHJvbDtcblx0XHRpZiAob1NvdXJjZSAmJiBvU291cmNlLmlzQTxUPihhcGlGUU4pKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sID0gb1NvdXJjZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldENvbnRyb2w7XG5cdH07XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHdoZW4gYW4geG1sRXZlbnRIYW5kbGVyIGlzIGRlZmluZWQsIHRoZSBgZ2V0QVBJYCBmdW5jdGlvbiBpcyBwcm9wZXJseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGhvbGQgdGhlIHN0YXRpYyBmdW5jdGlvbnNcbiAqL1xuY29uc3QgZW5zdXJlR2V0QVBJID0gZnVuY3Rpb24gKHRhcmdldDogVUk1QVBJQ29udHJvbCk6IHZvaWQge1xuXHRpZiAoIXRhcmdldC5fX2FwaVJlZ2lzdGVyZWQpIHtcblx0XHR0YXJnZXQuX19hcGlSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHR0YXJnZXQuaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuXHRcdHRhcmdldC5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKF9pbnN0YW5jZTogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGlmICghdGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSkge1xuXHRcdFx0XHR0aGlzLmluc3RhbmNlTWFwLnNldChfaW5zdGFuY2UuY29uc3RydWN0b3IsIFtdKTtcblx0XHRcdH1cblx0XHRcdCh0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpIGFzIG9iamVjdFtdKS5wdXNoKF9pbnN0YW5jZSk7XG5cdFx0fTtcblx0XHR0YXJnZXQuZ2V0QVBJID0gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldCk7XG5cdH1cbn07XG5cbnR5cGUgRXh0ZW5kV2l0aE9iamVjdDxULCBLPiA9IFQgZXh0ZW5kcyBvYmplY3QgPyBLICYgeyBbVEtleSBpbiBrZXlvZiBUXT86IEJpbmRpbmdJbmZvSG9sZGVyPFRbVEtleV0+IH0gOiBLO1xuXG5leHBvcnQgdHlwZSBTdGF0ZU9mPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFycmF5PGluZmVyIFU+IHwgUmVhZG9ubHlBcnJheTxpbmZlciBVPiA/IEV4dGVuZFdpdGhPYmplY3Q8VSwgUmVhZG9ubHlBcnJheTxVPj4gOiBUW0tdO1xufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvSG9sZGVyPFQ+ID0gVCAmIHtcblx0X19iaW5kaW5nSW5mbzoge1xuXHRcdHBhdGg6IHN0cmluZztcblx0XHRtb2RlbDogc3RyaW5nO1xuXHRcdHR5cGU6IFQ7XG5cdH07XG59O1xuXG4vKipcbiAqIEFsbG93cyB0byBkZWZpbmUgYSBwcm9wZXJ0eSB0aGF0IHdpbGwgaG9sZCB0aGUgY29udHJvbCBzdGF0ZS5cbiAqXG4gKiBQcm9wZXJ0aWVzIGRlZmluZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYm91bmQgdG8gdGhlIGNvbnRyb2wgc3RhdGUgd2hlbiB1c2VkIGluIEpTWC5cbiAqIEFycmF5cyBuZWVkIHRvIGJlIGJvdW5kIHVzaW5nIHRoZSBgYmluZFN0YXRlYCBmdW5jdGlvbi5cbiAqIEBleHBlcmltZW50YWxcbiAqIEByZXR1cm5zIEEgcHJvcGVydHkgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTdGF0ZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAobWV0YWRhdGEuc3RhdGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IG9uZSBzdGF0ZSBwcm9wZXJ0eSBwZXIgY29udHJvbCBpcyBhbGxvd2VkXCIpO1xuXHRcdH1cblx0XHRtZXRhZGF0YS5zdGF0ZVByb3BlcnR5ID0gcHJvcGVydHlLZXk7XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRtZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qICNyZWdpb24gQ09OVFJPTExFUiBFWFRFTlNJT05TICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kIG5hbWUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzcGVjaWZpYyBjb250cm9sbGVyIGV4dGVuc2lvbiBvciBiYXNlIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZE92ZXJyaWRlKGV4dGVuc2lvbk5hbWU/OiBzdHJpbmcpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5KSB7XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGUpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZSA9IHt9O1xuXHRcdH1cblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZXMpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZXMgPSB7fTtcblx0XHR9XG5cdFx0bGV0IGN1cnJlbnRUYXJnZXQgPSB0YXJnZXQub3ZlcnJpZGVzO1xuXHRcdGlmIChleHRlbnNpb25OYW1lKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdID0ge307XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV07XG5cdFx0fVxuXHRcdGN1cnJlbnRUYXJnZXRbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPilbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBkZWZpbmVkIG92ZXJyaWRlRXhlY3V0aW9uVHlwZS5cbiAqIEBwYXJhbSBvdmVycmlkZUV4ZWN1dGlvbiBUaGUgT3ZlcnJpZGVFeGVjdXRpb24gZGVmaW5pbmcgd2hlbiB0aGUgb3ZlcnJpZGUgc2hvdWxkIHJ1biAoQmVmb3JlIC8gQWZ0ZXIgLyBJbnN0ZWFkKVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2libGUob3ZlcnJpZGVFeGVjdXRpb246IEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLm92ZXJyaWRlRXhlY3V0aW9uID0gb3ZlcnJpZGVFeGVjdXRpb24gYXMgdW5rbm93biBhcyBPdmVycmlkZUV4ZWN1dGlvbjtcblxuXHRcdC8vIGJ5IGRlZmF1bHQsIGV2ZXJ5IGV4dGVuc2libGUgbWV0aG9kIGlzIGFsc28gaG9va2FibGUgKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGFzIEluc3RlYWQpXG5cdFx0aWYgKG92ZXJyaWRlRXhlY3V0aW9uICE9PSBcIkluc3RlYWRcIikge1xuXHRcdFx0aG9va2FibGUob3ZlcnJpZGVFeGVjdXRpb24pKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZSBmb3IgY29udHJvbGxlciBleHRlbnNpb24gdXNhZ2UuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUV4dGVuc2lvbigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ucHVibGljID0gZmFsc2U7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIGNhbm5vdCBiZSBmdXJ0aGVyIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5maW5hbCA9IHRydWU7XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UgaW5zdGFudGlhdGUgYSBjb250cm9sbGVyIGV4dGVuc2lvbiB1bmRlciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIG5hbWUuXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudCgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgZXZlbnRLZXk6IHN0cmluZyB8IFN5bWJvbCkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmV2ZW50c1tldmVudEtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC5cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuZCBjb25maWd1cmVzIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKiBAcGFyYW0gYWdncmVnYXRpb25EZWZpbml0aW9uIFRoZSBhZ2dyZWdhdGlvbiBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5tdWx0aXBsZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBVSTUgZGVmYXVsdHMgdGhpcyB0byB0cnVlIGJ1dCB0aGlzIGlzIGp1c3Qgd2VpcmQuLi5cblx0XHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5tdWx0aXBsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0gPSBhZ2dyZWdhdGlvbkRlZmluaXRpb247XG5cdFx0fVxuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uaXNEZWZhdWx0KSB7XG5cdFx0XHRtZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gPSBwcm9wZXJ0eUtleTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhc3NvY2lhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc29jaWF0aW9uKHVpNUFzc29jaWF0aW9uTWV0YWRhdGE6IFVJNUFzc29jaWF0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0gPSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC5cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGluIHRoZSBtZXRhZGF0YSB0aGF0IHRoaXMgY29udHJvbCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgaW50ZXJmYWNlLlxuICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcGxlbWVudEludGVyZmFjZShpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblxuXHRcdG1ldGFkYXRhLmludGVyZmFjZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0fTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBleHBvc2VkIHN0YXRpY2FsbHkgc28gd2UgY2FuIGNhbGwgaXQgZnJvbSBYTUwuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24geG1sRXZlbnRIYW5kbGVyKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlrZXkpIHtcblx0XHRjb25zdCBjdXJyZW50Q29uc3RydWN0b3I6IFVJNUFQSUNvbnRyb2wgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgdW5rbm93biBhcyBVSTVBUElDb250cm9sO1xuXHRcdGVuc3VyZUdldEFQSShjdXJyZW50Q29uc3RydWN0b3IpO1xuXHRcdGN1cnJlbnRDb25zdHJ1Y3Rvcltwcm9wZXJ0eWtleS50b1N0cmluZygpXSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRcdGlmIChhcmdzPy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhcmdldCA9IGN1cnJlbnRDb25zdHJ1Y3Rvci5nZXRBUEkoYXJnc1swXSBhcyBVSTVFdmVudCk7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQ/Lltwcm9wZXJ0eWtleS50b1N0cmluZygpXSguLi5hcmdzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xufVxuXG50eXBlIFVJNUNvbnRyb2xBbmRNb3JlID0gdHlwZW9mIENvbnRyb2wgJlxuXHRGdW5jdGlvbiAmIHtcblx0XHRyZWdpc3Rlckluc3RhbmNlPzogRnVuY3Rpb247XG5cdFx0b3ZlcnJpZGU/OiBGdW5jdGlvbjtcblx0XHRyZW5kZXJlcj86IHVua25vd247XG5cdFx0cmVuZGVyOiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdH07XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBjbGFzcyBzaG91bGQgZGVmaW5lIGEgVUk1IGNvbnRyb2wgb2YgdGhlIHNwZWNpZmllZCBuYW1lLlxuICogQHBhcmFtIHNUYXJnZXQgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBVSTUgY2xhc3NcbiAqIEBwYXJhbSBtZXRhZGF0YURlZmluaXRpb24gSW5saW5lIG1ldGFkYXRhIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgd2lsbCBjcmVhdGUgYSB1aTUgY2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVJNUNsYXNzKHNUYXJnZXQ6IHN0cmluZywgbWV0YWRhdGFEZWZpbml0aW9uPzogUGFydGlhbDxVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uPik6IENsYXNzRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChjb25zdHJ1Y3RvcjogVUk1Q29udHJvbEFuZE1vcmUpIHtcblx0XHRpZiAoIWNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSkge1xuXHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhID0ge307XG5cdFx0fVxuXHRcdGlmIChtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0XHRpZiAoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pIHtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0Li4uY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0sXG5cdFx0XHRcdFx0XHRcdC4uLihtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dIGFzIG9iamVjdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gbWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVnaXN0ZXJVSTVNZXRhZGF0YShjb25zdHJ1Y3Rvciwgc1RhcmdldCwgY29uc3RydWN0b3IucHJvdG90eXBlKTtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cbnR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYTogdW5rbm93bltdKSA9PiBUO1xuLyoqXG4gKiBNaXhpbiBhIHNwZWNpZmljIGludGVyZmFjZSBpbmNsdWRpbmcgYWxsIGl0cyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGludG8gdGhlIGNvbnRyb2wuXG4gKiBAcGFyYW0gaW50ZXJmYWNlQ2xhc3MgSW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhlIGNvbnRyb2xcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgY2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluPFQgZXh0ZW5kcyBJSW50ZXJmYWNlV2l0aE1peGluPihpbnRlcmZhY2VDbGFzczogQ29uc3RydWN0b3I8VD4pOiBDbGFzc0RlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoYmFzZUN0b3I6IFVJNUNvbnRyb2xBbmRNb3JlKSB7XG5cdFx0aWYgKGJhc2VDdG9yLnByb3RvdHlwZS5leHRlbmQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlRoZSBtaXhpbkludGVyZmFjZSBkZWNvcmF0b3IgbXVzdCBiZSBwbGFjZWQgYWZ0ZXIgYGRlZmluZVVpNUNsYXNzYFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YShiYXNlQ3Rvci5wcm90b3R5cGUpO1xuXHRcdGNvbnN0IGludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VDbGFzcy5wcm90b3R5cGUuZ2V0SW50ZXJmYWNlTmFtZT8uKCk7XG5cdFx0aWYgKGludGVyZmFjZU5hbWUpIHtcblx0XHRcdG1ldGFkYXRhLmludGVyZmFjZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0XHR9XG5cblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnRlcmZhY2VDbGFzcy5wcm90b3R5cGUpLmZvckVhY2goKG5hbWUpID0+IHtcblx0XHRcdGlmIChuYW1lICE9PSBcImNvbnN0cnVjdG9yXCIgJiYgbmFtZSAhPT0gXCJzZXR1cE1peGluXCIpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFxuXHRcdFx0XHRcdGJhc2VDdG9yLnByb3RvdHlwZSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW50ZXJmYWNlQ2xhc3MucHJvdG90eXBlLCBuYW1lKSB8fCBPYmplY3QuY3JlYXRlKG51bGwpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0Ly8gSG9vayB0byBhZGQgcG90ZW50aWFsbHkgbW9yZSBsb2dpYyB0byB0aGUgbWl4aW5cblx0XHRpbnRlcmZhY2VDbGFzcy5wcm90b3R5cGUuc2V0dXBNaXhpbj8uKGJhc2VDdG9yKTtcblx0XHRyZXR1cm4gYmFzZUN0b3I7XG5cdH0gYXMgQ2xhc3NEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVyZmFjZVdpdGhNaXhpbiB7XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlY2VpdmluZyBjb250cm9sLlxuXHQgKiBJZiBub3QgZGVmaW5lZCwgdGhlIGludGVyZmFjZSB3aWxsIG5vdCBiZSBhZGRlZC5cblx0ICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZVxuXHQgKi9cblx0Z2V0SW50ZXJmYWNlTmFtZT8oKTogc3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBIb29rIHRvIGFkZCBtb3JlIGxvZ2ljIHRvIHRoZSBtaXhpbi5cblx0ICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBjb250cm9scyBhcmUgY3JlYXRlZCBhbmQgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgYWRkaXRpb25hbCBsb2dpYyB0byB0aGUgYmFzZSBjbGFzcy5cblx0ICogQHBhcmFtIGJhc2VDbGFzcyBUaGUgYmFzZSBjbGFzcyB0aGF0IHdpbGwgYmUgZXh0ZW5kZWRcblx0ICovXG5cdHNldHVwTWl4aW4/KGJhc2VDbGFzczogRnVuY3Rpb24pOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmZXJlbmNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50PigpOiBSZWY8VD4ge1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQsXG5cdFx0c2V0Q3VycmVudDogZnVuY3Rpb24gKG9Db250cm9sSW5zdGFuY2U6IFQpOiB2b2lkIHtcblx0XHRcdHRoaXMuY3VycmVudCA9IG9Db250cm9sSW5zdGFuY2U7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBvYmplY3Qgd2lsbCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCB0aHJvdWdoIGpzeCB0ZW1wbGF0aW5nLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbmZ1bmN0aW9uIF9nZXRIYW5kbGVyRm9yU3RhdGVQcm9wZXJ0eShqc29uTW9kZWw6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IHBhdGhJbk1vZGVsID0gYC8ke3Byb3AudG9TdHJpbmcoKX1gO1xuXHRjb25zdCBvT2JqID0gZGVlcENsb25lKGpzb25Nb2RlbC5nZXRPYmplY3QocGF0aEluTW9kZWwpKTtcblx0bGV0IG9UYXJnZXQ7XG5cdGlmIChwcm9wID09PSBcIl9fYmluZGluZ0luZm9cIikge1xuXHRcdHJldHVybiB7IG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiIH07XG5cdH1cblx0aWYgKHR5cGVvZiBvT2JqID09PSBcInN0cmluZ1wiKSB7XG5cdFx0b1RhcmdldCA9IG9PYmo7XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9PYmogPT09IFwibnVtYmVyXCIpIHtcblx0XHRvVGFyZ2V0ID0gb09iajtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJib29sZWFuXCIpIHtcblx0XHRvVGFyZ2V0ID0gb09iajtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9PYmopKSB7XG5cdFx0b1RhcmdldCA9IG5ldyBQcm94eShvT2JqLCB7XG5cdFx0XHRnZXQodGFyZ2V0OiB1bmtub3duW10sIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRjb25zdCByZWYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHJldHVybiByZWYuYmluZCh0YXJnZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZiA9PT0gdW5kZWZpbmVkICYmIGlzTmFOKE51bWJlcihwLnRvU3RyaW5nKCkpKSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBwXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVmO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9UYXJnZXQgPSB7IC4uLm9PYmogfTtcblx0fVxuXHRpZiAodHlwZW9mIG9UYXJnZXQgPT09IFwib2JqZWN0XCIpIHtcblx0XHRvVGFyZ2V0Ll9fYmluZGluZ0luZm8gPSB7XG5cdFx0XHRtb2RlbDogXCIkY29tcG9uZW50U3RhdGVcIixcblx0XHRcdHBhdGg6IHBhdGhJbk1vZGVsXG5cdFx0fTtcblx0fVxuXHRyZXR1cm4gb1RhcmdldDtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVN0YXRlUHJvcGVydHkoXG5cdG9iajogVUk1Q29udHJvbERlZmluaXRpb24sXG5cdHRhcmdldENvbnRyb2w6IENvbnRyb2wgJiB7XG5cdFx0X3VwZGF0ZVN0YXRlOiBGdW5jdGlvbjtcblx0XHRfdXBkYXRlU3RhdGVEZWJvdW5jZWQ6IEZ1bmN0aW9uO1xuXHRcdF9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlOiBib29sZWFuO1xuXHRcdF91cGRhdGVTdGF0ZVRpbWVyOiB1bmtub3duO1xuXHRcdF9jaGFuZ2VkUHJvcHM/OiBzdHJpbmdbXTtcblx0fVxuKTogdm9pZCB7XG5cdGlmIChvYmoubWV0YWRhdGE/LnN0YXRlUHJvcGVydHkpIHtcblx0XHRjb25zdCBzdGF0ZU1vZGVsID0gbmV3IEpTT05Nb2RlbCh7fSk7XG5cblx0XHR0YXJnZXRDb250cm9sLnNldE1vZGVsKHN0YXRlTW9kZWwsIFwiJGNvbXBvbmVudFN0YXRlXCIpO1xuXHRcdGxldCB1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0Y29uc3QgYm91bmRUb1N0YXRlUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gb2JqLm1ldGFkYXRhLnByb3BlcnRpZXMpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5RGVmID0gb2JqLm1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHRcdGlmIChwcm9wZXJ0eURlZi5iaW5kVG9TdGF0ZSkge1xuXHRcdFx0XHRib3VuZFRvU3RhdGVQcm9wcy5wdXNoKHByb3BlcnR5TmFtZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHN0YXRlTW9kZWwuYXR0YWNoUHJvcGVydHlDaGFuZ2UoKGV2dDogTW9kZWwkUHJvcGVydHlDaGFuZ2VFdmVudCkgPT4ge1xuXHRcdFx0Y29uc3QgcGF0aCA9IGV2dC5nZXRQYXJhbWV0ZXIoXCJwYXRoXCIpPy5zdWJzdHJpbmcoMSk7IC8vIHRvIHJlbW92ZSB0aGUgZmlyc3QgL1xuXHRcdFx0aWYgKHBhdGggJiYgYm91bmRUb1N0YXRlUHJvcHMuaW5jbHVkZXMocGF0aCkpIHtcblx0XHRcdFx0dGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eShwYXRoLCBldnQuZ2V0UGFyYW1ldGVyKFwidmFsdWVcIikpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGZvcmNlIHRoZSBzdGF0ZSB0byBiZSBhcHBsaWVkIGFuZCB3YWl0IGZvciBpdCB0byBiZSBhcHBsaWVkIGluIHRlc3RzXG5cdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGUgPSBhc3luYyBmdW5jdGlvbiAoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0XHRkZWxldGUgdGhpcy5fdXBkYXRlU3RhdGVUaW1lcjtcblx0XHRcdGlmICghdXBkYXRpbmdTdGF0ZSkge1xuXHRcdFx0XHR1cGRhdGluZ1N0YXRlID0gdHJ1ZTtcblx0XHRcdFx0YXdhaXQgKHRoaXMgYXMgeyBvblN0YXRlQ2hhbmdlPzogRnVuY3Rpb24gfSkub25TdGF0ZUNoYW5nZT8uKHRoaXMuX2NoYW5nZWRQcm9wcyk7XG5cdFx0XHRcdHRoaXMuX2NoYW5nZWRQcm9wcyA9IFtdO1xuXHRcdFx0XHR1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHR0YXJnZXRDb250cm9sLl91cGRhdGVTdGF0ZURlYm91bmNlZCA9IGZ1bmN0aW9uIChjaGFuZ2VkUHJvcDogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMgPz89IFtdO1xuXHRcdFx0aWYgKCF0aGlzLl9jaGFuZ2VkUHJvcHMuaW5jbHVkZXMoY2hhbmdlZFByb3ApKSB7XG5cdFx0XHRcdHRoaXMuX2NoYW5nZWRQcm9wcy5wdXNoKGNoYW5nZWRQcm9wKTtcblx0XHRcdH1cblx0XHRcdGlmICghdGhpcy5fdXBkYXRlU3RhdGVUaW1lciAmJiAhdXBkYXRpbmdTdGF0ZSkge1xuXHRcdFx0XHR0aGlzLl91cGRhdGVTdGF0ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGUoKTtcblx0XHRcdFx0fSwgMjAwKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRDb250cm9sLCBvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eSwge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJveHkoc3RhdGVNb2RlbCwge1xuXHRcdFx0XHRcdGdldDogKHRhcmdldDogSlNPTk1vZGVsLCBwcm9wOiBzdHJpbmcpOiB1bmtub3duID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiBfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHNldDogKHNldFN0YXRlTW9kZWw6IEpTT05Nb2RlbCwgcHJvcCwgdmFsdWUpOiBib29sZWFuID0+IHtcblx0XHRcdFx0XHRcdGlmIChib3VuZFRvU3RhdGVQcm9wcy5pbmNsdWRlcyhwcm9wLnRvU3RyaW5nKCkpKSB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldENvbnRyb2wuX2lnbm9yZVN0YXRlUHJvcGVydHlVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRDb250cm9sLnNldFByb3BlcnR5KHByb3AudG9TdHJpbmcoKSwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRDb250cm9sLl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjb25zdCBzZXRSZXN1bHQgPSBzZXRTdGF0ZU1vZGVsLnNldFByb3BlcnR5KGAvJHtwcm9wLnRvU3RyaW5nKCl9YCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQocHJvcC50b1N0cmluZygpKTtcblx0XHRcdFx0XHRcdHJldHVybiBzZXRSZXN1bHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHQvLyBSZXBsYWNpbmcgdGhlIGNvbXBsZXRlIHN0YXRlXG5cdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoYC9gLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sW29iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5IGFzIGtleW9mIENvbnRyb2xdID0geyAuLi5vYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSB9IGFzIG5ldmVyO1xuXHRcdH1cblx0XHRjb25zdCBmblNldFByb3BlcnR5ID0gdGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eTtcblxuXHRcdGlmIChib3VuZFRvU3RhdGVQcm9wcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sLnNldFByb3BlcnR5ID0gZnVuY3Rpb24gKHNQcm9wZXJ0eU5hbWU6IHN0cmluZywgb1ZhbHVlOiB1bmtub3duLCBiU3VwcHJlc3NJbnZhbGlkYXRlKTogdHlwZW9mIHRhcmdldENvbnRyb2wge1xuXHRcdFx0XHRpZiAoYm91bmRUb1N0YXRlUHJvcHMuaW5jbHVkZXMoc1Byb3BlcnR5TmFtZSkgJiYgIXRoaXMuX2lnbm9yZVN0YXRlUHJvcGVydHlVcGRhdGUpIHtcblx0XHRcdFx0XHQodGhpc1tvYmoubWV0YWRhdGE/LnN0YXRlUHJvcGVydHkgYXMga2V5b2YgdHlwZW9mIHRhcmdldENvbnRyb2xdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzUHJvcGVydHlOYW1lXSA9IG9WYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZm5TZXRQcm9wZXJ0eS5jYWxsKHRoaXMsIHNQcm9wZXJ0eU5hbWUsIG9WYWx1ZSwgYlN1cHByZXNzSW52YWxpZGF0ZSk7XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRjb25zdCBmbkFmdGVySW5pdCA9IG91dHB1dC5wcm90b3R5cGUuYWZ0ZXJJbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0X2NyZWF0ZVN0YXRlUHJvcGVydHkob2JqLCB0aGlzKTtcblx0XHRpZiAoZm5BZnRlckluaXQpIHtcblx0XHRcdGZuQWZ0ZXJJbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fTtcblxuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUFnSkEsTUFBTUEsY0FBYyxHQUFHLFNBQUFBLENBQVVDLE1BQXNELEVBQWdDO0lBQ3RIQSxNQUFNLENBQUNDLFFBQVEsR0FBR0MsS0FBSyxDQUN0QjtNQUNDQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7TUFDeEJDLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZEMsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLE1BQU0sRUFBRSxDQUFDLENBQUM7TUFDVkMsVUFBVSxFQUFFO0lBQ2IsQ0FBQyxFQUNEVixNQUFNLENBQUNDLFFBQVEsSUFBSSxDQUFDLENBQ3JCLENBQWlDO0lBQ2pDLE9BQU9ELE1BQU0sQ0FBQ0MsUUFBUTtFQUN2QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTVSxxQkFBcUJBLENBQUNYLE1BQXFCLEVBQUU7SUFDckQsT0FBTyxVQUVOWSxNQUFnQixFQUVBO01BQUEsSUFEaEJDLE1BQWMsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdkLE1BQU0sQ0FBQ2lCLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO01BRS9DLElBQUlDLE9BQU8sR0FBR1AsTUFBTSxDQUFDUSxTQUFTLENBQUMsQ0FBeUI7TUFDeEQsSUFBSXBCLE1BQU0sQ0FBQ3FCLGdCQUFnQixFQUFFO1FBQzVCRixPQUFPLEdBQUduQixNQUFNLENBQUNxQixnQkFB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VUFBVSxDQUFBQyxLQUFBLElBQUF2TyxTQUFBLENBQUF1TyxLQUFBO2tCQUFBO2tCQUsxQixLQUFLLE1BQU1DLEdBQUcsSUFBSUwsWUFBWSxFQUFFO29CQUMvQixNQUFNSyxHQUFHLENBQUM5QixLQUFLLENBQUNILEtBQUksRUFBRStCLFVBQVUsQ0FBQztrQkFDbEM7Z0JBQ0QsQ0FBQztjQUNGO1lBQ0QsQ0FBQyxDQUFDO1VBQ0g7UUFDRDtNQUNEO01BQ0EzRixvQkFBb0IsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQztNQUMvQixJQUFJeUQsV0FBVyxFQUFFO1FBQ2hCQSxXQUFXLENBQUNLLEtBQUssQ0FBQyxJQUFJLEVBQUVySCxJQUFJLENBQUM7TUFDOUI7SUFDRCxDQUFDO0lBRUQyRixLQUFLLENBQUNySSxRQUFRLEdBQUcsVUFBVThMLFVBQW1CLEVBQVk7TUFDekQsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUNiQSxHQUFHLENBQWNqTixXQUFXLEdBQUcsWUFBd0M7UUFBQSxTQUFBa04sS0FBQSxHQUFBM08sU0FBQSxDQUFBQyxNQUFBLEVBQTNCb0YsSUFBSSxPQUFBQyxLQUFBLENBQUFxSixLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSnZKLElBQUksQ0FBQXVKLEtBQUEsSUFBQTVPLFNBQUEsQ0FBQTRPLEtBQUE7UUFBQTtRQUNoRCxPQUFPNUQsS0FBSyxDQUFDMEIsS0FBSyxDQUFDLElBQUksRUFBRXJILElBQUksQ0FBQztNQUMvQixDQUFDO01BQ0QsTUFBTXdKLE1BQU0sR0FBSUMsUUFBUSxDQUEwQ0MsV0FBVyxDQUM1RS9ELEtBQUssRUFDTCxzQkFBc0JnRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQzdCTixHQUFHLEVBQ0hPLGtCQUNELENBQUM7TUFDREosTUFBTSxDQUFDMU8sV0FBVyxDQUFDLENBQUMsQ0FBQytPLGVBQWUsR0FBR1QsVUFBVTtNQUNqREksTUFBTSxDQUFDMU8sV0FBVyxDQUFDLENBQUMsQ0FBQ2dQLFNBQVMsR0FBSW5FLEtBQUssQ0FBQzdLLFdBQVcsQ0FBQyxDQUFDLENBQTZCZ1AsU0FBUztNQUMzRixPQUFPTixNQUFNO0lBQ2QsQ0FBQztJQUVETyxVQUFVLENBQUMxTixHQUFHLENBQUNrRixJQUFJLEVBQUVzRixNQUFNLENBQUM7SUFFNUIsT0FBT0EsTUFBTTtFQUNkO0VBQUMsT0FBQTFKLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
784
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwic3RhdGVQcm9wZXJ0eSIsIkVycm9yIiwid3JpdGFibGUiLCJzdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlIiwiaW5pdGlhbGl6ZXIiLCJfZXhwb3J0cyIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwibWl4aW4iLCJpbnRlcmZhY2VDbGFzcyIsImJhc2VDdG9yIiwiZXh0ZW5kIiwiZ2V0SW50ZXJmYWNlTmFtZSIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwibmFtZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiY3JlYXRlIiwic2V0dXBNaXhpbiIsImNyZWF0ZVJlZmVyZW5jZSIsImN1cnJlbnQiLCJzZXRDdXJyZW50Iiwib0NvbnRyb2xJbnN0YW5jZSIsImRlZmluZVJlZmVyZW5jZSIsIkJhc2VPYmplY3QiLCJpc09iamVjdEEiLCJfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkiLCJqc29uTW9kZWwiLCJwcm9wIiwicGF0aEluTW9kZWwiLCJvT2JqIiwiZGVlcENsb25lIiwiZ2V0T2JqZWN0Iiwib1RhcmdldCIsIm1vZGVsIiwiUHJveHkiLCJwIiwicmVjZWl2ZXIiLCJyZWYiLCJSZWZsZWN0IiwiYmluZCIsImlzTmFOIiwiTnVtYmVyIiwiX19iaW5kaW5nSW5mbyIsInBhdGgiLCJfY3JlYXRlU3RhdGVQcm9wZXJ0eSIsIm9iaiIsImdldE1vZGVsIiwic2V0TW9kZWwiLCJKU09OTW9kZWwiLCJzdGF0ZU1vZGVsIiwidXBkYXRpbmdTdGF0ZSIsImJvdW5kVG9TdGF0ZVByb3BzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlEZWYiLCJiaW5kVG9TdGF0ZSIsImluaXRpYWxCb3VuZFByb3BlcnRpZXMiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwiYXR0YWNoUHJvcGVydHlDaGFuZ2UiLCJldnQiLCJnZXRQYXJhbWV0ZXIiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsIl91cGRhdGVTdGF0ZSIsIl91cGRhdGVTdGF0ZVRpbWVyIiwib25TdGF0ZUNoYW5nZSIsIl9jaGFuZ2VkUHJvcHMiLCJfdXBkYXRlU3RhdGVEZWJvdW5jZWQiLCJjaGFuZ2VkUHJvcCIsInNldFRpbWVvdXQiLCJjb25maWd1cmFibGUiLCJzZXRTdGF0ZU1vZGVsIiwidmFsdWUiLCJrbm93bkJvdW5kUHJvcGVydGllcyIsIl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlIiwic2V0UmVzdWx0IiwiZm5BcHBseVNldHRpbmdzIiwiYXBwbHlTZXR0aW5ncyIsIm1TZXR0aW5ncyIsIm1vZGVscyIsIiRjb21wb25lbnRTdGF0ZSIsImNhbGwiLCJmblNldFByb3BlcnR5Iiwic1Byb3BlcnR5TmFtZSIsIm9WYWx1ZSIsImJTdXBwcmVzc0ludmFsaWRhdGUiLCJjbGF6eiIsImluT2JqIiwib2JqTmFtZSIsImJhc2VUeXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRTdGVyZW90eXBlIiwicmVuZGVyZXJEZWZpbml0aW9uIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJhcGlWZXJzaW9uIiwia2V5cyIsImUiLCJjRXh0TmFtZSIsIm91dHB1dCIsImZuSW5pdCIsImluaXQiLCJmbkFmdGVySW5pdCIsImFmdGVySW5pdCIsIl90aGlzIiwiX2xlbjIiLCJfa2V5MiIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmYXVsdCIsIl9iaW5kaW5nUHJvcGVydGllcyIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJiaW5kaW5nUHJvcGVydHlWYWx1ZSIsInByb3BWYWx1ZSIsIl9hcHBseWluZ1NldHRpbmdzIiwiYUFnZ3JlZ2F0aW9uS2V5cyIsImFnZ3JlZ2F0aW9uS2V5IiwiYWdncmVnYXRpb25EZWYiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ29udGVudCIsImdldEFnZ3JlZ2F0aW9uIiwiYUFzc29jaWF0aW9uS2V5cyIsImFzc29jaWF0aW9uS2V5Iiwic2V0QXNzb2NpYXRpb24iLCJnZXRBc3NvY2lhdGlvbiIsInJlZmVyZW5jZVByb3BlcnRpZXMiLCJtZXRob2ROYW1lIiwibWV0aG9kRGVmaW5pdGlvbiIsIm1ldGhvZEhvbGRlciIsIm1ldGhvZEFycmF5cyIsInJldmVyc2UiLCJfbGVuMyIsIm1ldGhvZEFyZ3MiLCJfa2V5MyIsImFyZyIsIm9FeHRlbnNpb24iLCJwb2wiLCJfbGVuNCIsIl9rZXk0Iiwib0NsYXNzIiwiTWV0YWRhdGEiLCJjcmVhdGVDbGFzcyIsInVpZCIsIkNvbnRyb2xsZXJNZXRhZGF0YSIsIl9zdGF0aWNPdmVycmlkZSIsIl9vdmVycmlkZSIsIk9iamVjdFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNsYXNzU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsJFByb3BlcnR5Q2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGJpbmRUb1N0YXRlPzogc3RyaW5nO1xuXHRleHBlY3RlZEFubm90YXRpb25zPzogc3RyaW5nW107XG5cdGV4cGVjdGVkVHlwZXM/OiBzdHJpbmdbXTtcblx0YWxsb3dlZFZhbHVlcz86IHN0cmluZ1tdO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YWx0VHlwZXM/OiBzdHJpbmdbXTtcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRpc0RlZmF1bHQ/OiBib29sZWFuO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRkZWZhdWx0Q2xhc3M/OiB1bmtub3duO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG5cdHZpc2liaWxpdHk/OiBzdHJpbmc7XG5cdGZvcndhcmRpbmc/OiBvYmplY3Q7XG59O1xuZXhwb3J0IHR5cGUgVUk1QXNzb2NpYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uID0ge1xuXHRkZWZhdWx0QWdncmVnYXRpb24/OiBzdHJpbmc7XG5cdGNvbnRyb2xsZXJFeHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uPjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgVUk1UHJvcGVydHlNZXRhZGF0YT47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QWdncmVnYXRpb25NZXRhZGF0YT47XG5cdHJlZmVyZW5jZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuXHRhc3NvY2lhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFzc29jaWF0aW9uTWV0YWRhdGE+O1xuXHRtZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbj47XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywge30+O1xuXHRpbnRlcmZhY2VzOiBzdHJpbmdbXTtcblx0bGlicmFyeT86IHN0cmluZztcblx0ZGVzaWdudGltZT86IHN0cmluZztcblx0Y29uZmlnPzoge1xuXHRcdGZ1bGxXaWR0aD86IGJvb2xlYW47XG5cdH07XG5cdHN0YXRlUHJvcGVydHk/OiBzdHJpbmc7XG5cdHN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRtYW5pZmVzdD86IHN0cmluZyB8IHVua25vd247XG5cdHJldHVyblR5cGVzPzogc3RyaW5nW107XG5cdGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IHVua25vd247XG59O1xuZXhwb3J0IHR5cGUgQWNjZXNzb3JEZXNjcmlwdG9yPFQ+ID0gVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8VD4gJiB7IGluaXRpYWxpemVyPzogKCkgPT4gVCB9O1xudHlwZSBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGU/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG92ZXJyaWRlcz86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVDb250cm9sRGVmaW5pdGlvbiA9IHtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRvdmVycmlkZT86IHVua25vd247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUFQSUNvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG5cdF9fYXBpUmVnaXN0ZXJlZDogYm9vbGVhbjtcbn0gJiB7XG5cdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFhNTEV2ZW50SG9sZGVyID0ge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG59O1xuXG50eXBlIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+ID0ge1xuXHQvLyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgVFMgY29tcGlsZXJcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGFydGlhbDxQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+Pj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQYXJ0aWFsPFBpY2s8VCwgSz4+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIENvbnZlcnRDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBLIGV4dGVuZHMgXCJtZXRhUGF0aFwiIHwgXCJjb250ZXh0UGF0aFwiID8gc3RyaW5nIDogVFtLXTtcbn07XG50eXBlIENvbnRleHRUb1N0cmluZzxUPiA9IHtcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDb250ZXh0IHwgdW5kZWZpbmVkID8gc3RyaW5nIHwgdW5kZWZpbmVkIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3BlcnRpZXNPZkJ1aWxkaW5nQmxvY2s8VD4gPSBDb250ZXh0VG9TdHJpbmc8UHJvcGVydGllc09mPFQ+PjtcbmV4cG9ydCB0eXBlIFN0cmljdFByb3BlcnRpZXNPZjxUPiA9IFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+O1xuZXhwb3J0IHR5cGUgVUk1QWNjZXNzb3JzPFQ+ID0ge1xuXHQvLyBBZGQgYWxsIHRoZSBnZXRYWFggbWV0aG9kLCBtaWdodCBhZGQgdG9vIG11Y2ggYXMgSSdtIG5vdCBmaWx0ZXJpbmcgb24gYWN0dWFsIHByb3BlcnRpZXMuLi5cblx0W1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD4gYXMgYGdldCR7Q2FwaXRhbGl6ZTxzdHJpbmcgJiBQPn1gXTogKCkgPT4gVFtQXTtcbn07XG5leHBvcnQgdHlwZSBVSTVTZXR0ZXJzPFQ+ID0ge1xuXHQvLyBBZGQgYWxsIHRoZSBzZXRYWFggbWV0aG9kLCBtaWdodCBhZGQgdG9vIG11Y2ggYXMgSSdtIG5vdCBmaWx0ZXJpbmcgb24gYWN0dWFsIHByb3BlcnRpZXMuLi5cblx0W1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD4gYXMgYHNldCR7Q2FwaXRhbGl6ZTxzdHJpbmcgJiBQPn1gXTogKHZhbHVlOiBUW1BdKSA9PiBUO1xufTtcbmV4cG9ydCB0eXBlIEVuaGFuY2VXaXRoVUk1PFQ+ID0ge1xuXHRuZXcgKHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcblx0bmV3IChzSWQ6IHN0cmluZywgcHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xufSAmIFQgJlxuXHRVSTVBY2Nlc3NvcnM8VD4gJlxuXHRVSTVTZXR0ZXJzPFQ+O1xuXG5leHBvcnQgdHlwZSBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiA9IFwiSW5zdGVhZFwiIHwgXCJCZWZvcmVcIiB8IFwiQWZ0ZXJcIiB8IFwiQWZ0ZXJBc3luY1wiIHwgXCJCZWZvcmVBc3luY1wiO1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uIHwgVUk1Q29udHJvbERlZmluaXRpb24pOiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uIHtcblx0dGFyZ2V0Lm1ldGFkYXRhID0gbWVyZ2UoXG5cdFx0e1xuXHRcdFx0Y29udHJvbGxlckV4dGVuc2lvbnM6IHt9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IHt9LFxuXHRcdFx0cmVmZXJlbmNlczoge30sXG5cdFx0XHRhc3NvY2lhdGlvbnM6IHt9LFxuXHRcdFx0bWV0aG9kczoge30sXG5cdFx0XHRldmVudHM6IHt9LFxuXHRcdFx0aW50ZXJmYWNlczogW11cblx0XHR9LFxuXHRcdHRhcmdldC5tZXRhZGF0YSA/PyB7fVxuXHQpIGFzIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdHJldHVybiB0YXJnZXQubWV0YWRhdGE7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0aGF0IHdpbGwgZmluZCB0aGUgY29ycmVjdCBBUEkgb2JqZWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRyb2wgaGllcmFyY2h5LlxuICogQHBhcmFtIHRhcmdldFxuICogQHJldHVybnMgVGhlIHByb3BlciBnZXRBUEkgZnVuY3Rpb24gZm9yIHRoaXMgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldDogVUk1QVBJQ29udHJvbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBVSTVBUElDb250cm9sPihcblx0XHR0aGlzOiBVSTVBUElDb250cm9sLFxuXHRcdG9FdmVudDogVUk1RXZlbnQsXG5cdFx0YXBpRlFOOiBzdHJpbmcgPSB0YXJnZXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKClcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0aWYgKHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKSB7XG5cdFx0XHRvU291cmNlID0gdGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24ob1NvdXJjZSkgPz8gb1NvdXJjZTtcblx0XHR9XG5cdFx0d2hpbGUgKG9Tb3VyY2UgJiYgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikgJiYgb1NvdXJjZS5nZXRQYXJlbnQpIHtcblx0XHRcdGlmICh0aGlzLmlzRGVwZW5kZW50Qm91bmQpIHtcblx0XHRcdFx0Y29uc3Qgb0RlcGVuZGVudHMgPSAob1NvdXJjZSBhcyBDb250cm9sKS5nZXREZXBlbmRlbnRzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NvcnJlY3REZXBlbmRlbnQgPSBvRGVwZW5kZW50cy5maW5kKChvRGVwZW5kZW50OiBVSTVFbGVtZW50KSA9PiBvRGVwZW5kZW50LmlzQShhcGlGUU4pKTtcblx0XHRcdFx0aWYgKGhhc0NvcnJlY3REZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRvU291cmNlID0gaGFzQ29ycmVjdERlcGVuZGVudCBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9Tb3VyY2UgfHwgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2VNYXAgPSB0aGlzLmluc3RhbmNlTWFwLmdldCh0aGlzKSBhcyBUW107XG5cdFx0XHRvU291cmNlID0gb1NvdXJjZU1hcD8uW29Tb3VyY2VNYXAubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRDb250cm9sO1xuXHRcdGlmIChvU291cmNlICYmIG9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdHRhcmdldENvbnRyb2wgPSBvU291cmNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcblx0fTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgd2hlbiBhbiB4bWxFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlIGBnZXRBUElgIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGFzc2lnbmVkLlxuICogQHBhcmFtIHRhcmdldCBUaGUgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBzaG91bGQgaG9sZCB0aGUgc3RhdGljIGZ1bmN0aW9uc1xuICovXG5jb25zdCBlbnN1cmVHZXRBUEkgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVBUElDb250cm9sKTogdm9pZCB7XG5cdGlmICghdGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCkge1xuXHRcdHRhcmdldC5fX2FwaVJlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHRhcmdldC5pbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG5cdFx0dGFyZ2V0LnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbiAoX2luc3RhbmNlOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpKSB7XG5cdFx0XHRcdHRoaXMuaW5zdGFuY2VNYXAuc2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvciwgW10pO1xuXHRcdFx0fVxuXHRcdFx0KHRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikgYXMgb2JqZWN0W10pLnB1c2goX2luc3RhbmNlKTtcblx0XHR9O1xuXHRcdHRhcmdldC5nZXRBUEkgPSBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0KTtcblx0fVxufTtcblxudHlwZSBFeHRlbmRXaXRoT2JqZWN0PFQsIEs+ID0gVCBleHRlbmRzIG9iamVjdCA/IEsgJiB7IFtUS2V5IGluIGtleW9mIFRdPzogQmluZGluZ0luZm9Ib2xkZXI8VFtUS2V5XT4gfSA6IEs7XG5cbmV4cG9ydCB0eXBlIFN0YXRlT2Y8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gfCBSZWFkb25seUFycmF5PGluZmVyIFU+ID8gRXh0ZW5kV2l0aE9iamVjdDxVLCBSZWFkb25seUFycmF5PFU+PiA6IFRbS107XG59O1xuZXhwb3J0IHR5cGUgQmluZGluZ0luZm9Ib2xkZXI8VD4gPSBUICYge1xuXHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsOiBzdHJpbmc7XG5cdFx0dHlwZTogVDtcblx0fTtcbn07XG5cbi8qKlxuICogQWxsb3dzIHRvIGRlZmluZSBhIHByb3BlcnR5IHRoYXQgd2lsbCBob2xkIHRoZSBjb250cm9sIHN0YXRlLlxuICpcbiAqIFByb3BlcnRpZXMgZGVmaW5lZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGUgY29udHJvbCBzdGF0ZSB3aGVuIHVzZWQgaW4gSlNYLlxuICogQXJyYXlzIG5lZWQgdG8gYmUgYm91bmQgdXNpbmcgdGhlIGBiaW5kU3RhdGVgIGZ1bmN0aW9uLlxuICogQGV4cGVyaW1lbnRhbFxuICogQHJldHVybnMgQSBwcm9wZXJ0eSBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVN0YXRlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChtZXRhZGF0YS5zdGF0ZVByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9ubHkgb25lIHN0YXRlIHByb3BlcnR5IHBlciBjb250cm9sIGlzIGFsbG93ZWRcIik7XG5cdFx0fVxuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHkgPSBwcm9wZXJ0eUtleTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kT3ZlcnJpZGUoZXh0ZW5zaW9uTmFtZT86IHN0cmluZyk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZSkge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlID0ge307XG5cdFx0fVxuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlcykge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlcyA9IHt9O1xuXHRcdH1cblx0XHRsZXQgY3VycmVudFRhcmdldCA9IHRhcmdldC5vdmVycmlkZXM7XG5cdFx0aWYgKGV4dGVuc2lvbk5hbWUpIHtcblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb24pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXTtcblx0XHR9XG5cdFx0Y3VycmVudFRhcmdldFtwcm9wZXJ0eUtleS50b1N0cmluZygpXSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+KVtwcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24gYmFzZWQgb24gdGhlIGRlZmluZWQgb3ZlcnJpZGVFeGVjdXRpb25UeXBlLlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaWNFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IHRydWU7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgb25seSBhdmFpbGFibGUgZm9yIGludGVybmFsIHVzYWdlIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBleHRlbnNpb25DbGFzcyBUaGUgY29udHJvbGxlciBleHRlbnNpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNpbmdFeHRlbnNpb24oZXh0ZW5zaW9uQ2xhc3M6IHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRtZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IGV4dGVuc2lvbkNsYXNzO1xuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qICNlbmRyZWdpb24gKi9cblxuLyogI3JlZ2lvbiBDT05UUk9MICovXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiBldmVudCBvbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb24gVGhlIHByb3BlcnR5IGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShhdHRyaWJ1dGVEZWZpbml0aW9uOiBVSTVQcm9wZXJ0eU1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSBmYWxzZTtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZ3JvdXAgPSBcIkRhdGFcIjtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBhdHRyaWJ1dGVEZWZpbml0aW9uO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhZ2dyZWdhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3M/Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3Moc1RhcmdldDogc3RyaW5nLCBtZXRhZGF0YURlZmluaXRpb24/OiBQYXJ0aWFsPFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24+KTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdG9yOiBVSTVDb250cm9sQW5kTW9yZSkge1xuXHRcdGlmICghY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhKSB7XG5cdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEgPSB7fTtcblx0XHR9XG5cdFx0aWYgKG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSkge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0ge1xuXHRcdFx0XHRcdFx0XHQuLi5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSxcblx0XHRcdFx0XHRcdFx0Li4uKG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl0gYXMgb2JqZWN0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWdpc3RlclVJNU1ldGFkYXRhKGNvbnN0cnVjdG9yLCBzVGFyZ2V0LCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hOiB1bmtub3duW10pID0+IFQ7XG4vKipcbiAqIE1peGluIGEgc3BlY2lmaWMgaW50ZXJmYWNlIGluY2x1ZGluZyBhbGwgaXRzIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgaW50byB0aGUgY29udHJvbC5cbiAqIEBwYXJhbSBpbnRlcmZhY2VDbGFzcyBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB0aGUgY29udHJvbFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIElJbnRlcmZhY2VXaXRoTWl4aW4+KGludGVyZmFjZUNsYXNzOiBDb25zdHJ1Y3RvcjxUPik6IENsYXNzRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChiYXNlQ3RvcjogVUk1Q29udHJvbEFuZE1vcmUpIHtcblx0XHRpZiAoYmFzZUN0b3IucHJvdG90eXBlLmV4dGVuZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIG1peGluSW50ZXJmYWNlIGRlY29yYXRvciBtdXN0IGJlIHBsYWNlZCBhZnRlciBgZGVmaW5lVWk1Q2xhc3NgXCIpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKGJhc2VDdG9yLnByb3RvdHlwZSk7XG5cdFx0Y29uc3QgaW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZUNsYXNzLnByb3RvdHlwZS5nZXRJbnRlcmZhY2VOYW1lPy4oKTtcblx0XHRpZiAoaW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHRcdH1cblxuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGludGVyZmFjZUNsYXNzLnByb3RvdHlwZSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0aWYgKG5hbWUgIT09IFwiY29uc3RydWN0b3JcIiAmJiBuYW1lICE9PSBcInNldHVwTWl4aW5cIikge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0YmFzZUN0b3IucHJvdG90eXBlLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbnRlcmZhY2VDbGFzcy5wcm90b3R5cGUsIG5hbWUpIHx8IE9iamVjdC5jcmVhdGUobnVsbClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBIb29rIHRvIGFkZCBwb3RlbnRpYWxseSBtb3JlIGxvZ2ljIHRvIHRoZSBtaXhpblxuXHRcdGludGVyZmFjZUNsYXNzLnByb3RvdHlwZS5zZXR1cE1peGluPy4oYmFzZUN0b3IpO1xuXHRcdHJldHVybiBiYXNlQ3Rvcjtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJmYWNlV2l0aE1peGluIHtcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmVjZWl2aW5nIGNvbnRyb2wuXG5cdCAqIElmIG5vdCBkZWZpbmVkLCB0aGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIGFkZGVkLlxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlXG5cdCAqL1xuXHRnZXRJbnRlcmZhY2VOYW1lPygpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gYWRkIG1vcmUgbG9naWMgdG8gdGhlIG1peGluLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRyb2xzIGFyZSBjcmVhdGVkIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgc29tZSBhZGRpdGlvbmFsIGxvZ2ljIHRvIHRoZSBiYXNlIGNsYXNzLlxuXHQgKiBAcGFyYW0gYmFzZUNsYXNzIFRoZSBiYXNlIGNsYXNzIHRoYXQgd2lsbCBiZSBleHRlbmRlZFxuXHQgKi9cblx0c2V0dXBNaXhpbj8oYmFzZUNsYXNzOiBGdW5jdGlvbik6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWZlcmVuY2U8VCBleHRlbmRzIFVJNUVsZW1lbnQ+KCk6IFJlZjxUPiB7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVCxcblx0XHRzZXRDdXJyZW50OiBmdW5jdGlvbiAob0NvbnRyb2xJbnN0YW5jZTogVCk6IHZvaWQge1xuXHRcdFx0dGhpcy5jdXJyZW50ID0gb0NvbnRyb2xJbnN0YW5jZTtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgZm9sbG93aW5nIG9iamVjdCB3aWxsIGhvbGQgYSByZWZlcmVuY2UgdG8gYSBjb250cm9sIHRocm91Z2gganN4IHRlbXBsYXRpbmcuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVmZXJlbmNlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKEJhc2VPYmplY3QuaXNPYmplY3RBKHRhcmdldCwgXCJzYXAudWkuY29yZS5Db250cm9sXCIpKSB7XG5cdFx0XHRpZiAoIW1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdG1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0KHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplciA9IGNyZWF0ZVJlZmVyZW5jZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuZnVuY3Rpb24gX2dldEhhbmRsZXJGb3JTdGF0ZVByb3BlcnR5KGpzb25Nb2RlbDogSlNPTk1vZGVsLCBwcm9wOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3QgcGF0aEluTW9kZWwgPSBgLyR7cHJvcC50b1N0cmluZygpfWA7XG5cdGNvbnN0IG9PYmogPSBkZWVwQ2xvbmUoanNvbk1vZGVsLmdldE9iamVjdChwYXRoSW5Nb2RlbCkpO1xuXHRsZXQgb1RhcmdldDtcblx0aWYgKHByb3AgPT09IFwiX19iaW5kaW5nSW5mb1wiKSB7XG5cdFx0cmV0dXJuIHsgbW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIgfTtcblx0fVxuXHRpZiAodHlwZW9mIG9PYmogPT09IFwic3RyaW5nXCIpIHtcblx0XHRvVGFyZ2V0ID0gb09iajtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJudW1iZXJcIikge1xuXHRcdG9UYXJnZXQgPSBvT2JqO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvT2JqID09PSBcImJvb2xlYW5cIikge1xuXHRcdG9UYXJnZXQgPSBvT2JqO1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob09iaikpIHtcblx0XHRvVGFyZ2V0ID0gbmV3IFByb3h5KG9PYmosIHtcblx0XHRcdGdldCh0YXJnZXQ6IHVua25vd25bXSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogdW5rbm93bltdKTogdW5rbm93biB7XG5cdFx0XHRcdGNvbnN0IHJlZiA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXHRcdFx0XHRpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlZi5iaW5kKHRhcmdldCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVmID09PSB1bmRlZmluZWQgJiYgaXNOYU4oTnVtYmVyKHAudG9TdHJpbmcoKSkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdF9fYmluZGluZ0luZm86IHtcblx0XHRcdFx0XHRcdFx0bW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IHBcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZWY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldCA9IHsgLi4ub09iaiB9O1xuXHR9XG5cdGlmICh0eXBlb2Ygb1RhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdG9UYXJnZXQuX19iaW5kaW5nSW5mbyA9IHtcblx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0cGF0aDogcGF0aEluTW9kZWxcblx0XHR9O1xuXHR9XG5cdHJldHVybiBvVGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3RhdGVQcm9wZXJ0eShcblx0b2JqOiBVSTVDb250cm9sRGVmaW5pdGlvbixcblx0dGFyZ2V0Q29udHJvbDogQ29udHJvbCAmIHtcblx0XHRfdXBkYXRlU3RhdGU6IEZ1bmN0aW9uO1xuXHRcdF91cGRhdGVTdGF0ZURlYm91bmNlZDogRnVuY3Rpb247XG5cdFx0X2lnbm9yZVN0YXRlUHJvcGVydHlVcGRhdGU6IGJvb2xlYW47XG5cdFx0X3VwZGF0ZVN0YXRlVGltZXI6IHVua25vd247XG5cdFx0X2NoYW5nZWRQcm9wcz86IHN0cmluZ1tdO1xuXHR9XG4pOiB2b2lkIHtcblx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSB8fCAodGFyZ2V0Q29udHJvbD8uZ2V0TW9kZWwgJiYgdGFyZ2V0Q29udHJvbC5nZXRNb2RlbChcIiRjb21wb25lbnRTdGF0ZVwiKSkpIHtcblx0XHRpZiAob2JqLm1ldGFkYXRhPy5zdGF0ZVByb3BlcnR5KSB7XG5cdFx0XHR0YXJnZXRDb250cm9sLnNldE1vZGVsKG5ldyBKU09OTW9kZWwoKSwgXCIkY29tcG9uZW50U3RhdGVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHN0YXRlTW9kZWwgPSB0YXJnZXRDb250cm9sLmdldE1vZGVsKFwiJGNvbXBvbmVudFN0YXRlXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGxldCB1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0Y29uc3QgYm91bmRUb1N0YXRlUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gb2JqLm1ldGFkYXRhPy5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURlZiA9IG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlEZWYuYmluZFRvU3RhdGUpIHtcblx0XHRcdFx0Ym91bmRUb1N0YXRlUHJvcHMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBhcyB3ZSBtYXkgaGF2ZSBib3VuZCBwcm9wZXJ0aWVzIGluIHBhcmVudCBjbGFzc2VzIGFuZCBzdWJjbGFzc2VzLCB3ZSBrZWVwIHRyYWNrIG9mIHRob3NlIGluIHRoZSBtb2RlbCBpdHNlbGZcblx0XHRjb25zdCBpbml0aWFsQm91bmRQcm9wZXJ0aWVzID0gc3RhdGVNb2RlbC5nZXRQcm9wZXJ0eShcIi9fX2JvdW5kUHJvcGVydGllc1wiKSA/PyBbXTtcblx0XHRzdGF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL19fYm91bmRQcm9wZXJ0aWVzXCIsIFsuLi5pbml0aWFsQm91bmRQcm9wZXJ0aWVzLCAuLi5ib3VuZFRvU3RhdGVQcm9wc10pO1xuXG5cdFx0c3RhdGVNb2RlbC5hdHRhY2hQcm9wZXJ0eUNoYW5nZSgoZXZ0OiBNb2RlbCRQcm9wZXJ0eUNoYW5nZUV2ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBwYXRoID0gZXZ0LmdldFBhcmFtZXRlcihcInBhdGhcIik/LnN1YnN0cmluZygxKTsgLy8gdG8gcmVtb3ZlIHRoZSBmaXJzdCAvXG5cdFx0XHRpZiAocGF0aCAmJiBib3VuZFRvU3RhdGVQcm9wcy5pbmNsdWRlcyhwYXRoKSkge1xuXHRcdFx0XHR0YXJnZXRDb250cm9sLnNldFByb3BlcnR5KHBhdGgsIGV2dC5nZXRQYXJhbWV0ZXIoXCJ2YWx1ZVwiKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSkge1xuXHRcdFx0Ly8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHN0YXRlIHRvIGJlIGFwcGxpZWQgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGFwcGxpZWQgaW4gdGVzdHNcblx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fdXBkYXRlU3RhdGVUaW1lcjtcblx0XHRcdFx0aWYgKCF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXQgKHRoaXMgYXMgeyBvblN0YXRlQ2hhbmdlPzogRnVuY3Rpb24gfSkub25TdGF0ZUNoYW5nZT8uKHRoaXMuX2NoYW5nZWRQcm9wcyk7XG5cdFx0XHRcdFx0dGhpcy5fY2hhbmdlZFByb3BzID0gW107XG5cdFx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQgPSBmdW5jdGlvbiAoY2hhbmdlZFByb3A6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMgPz89IFtdO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2NoYW5nZWRQcm9wcy5pbmNsdWRlcyhjaGFuZ2VkUHJvcCkpIHtcblx0XHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMucHVzaChjaGFuZ2VkUHJvcCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0aGlzLl91cGRhdGVTdGF0ZVRpbWVyICYmICF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGUoKTtcblx0XHRcdFx0XHR9LCAyMDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldENvbnRyb2wsIG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5LCB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm94eShzdGF0ZU1vZGVsLCB7XG5cdFx0XHRcdFx0XHRnZXQ6ICh0YXJnZXQ6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRzZXQ6IChzZXRTdGF0ZU1vZGVsOiBKU09OTW9kZWwsIHByb3AsIHZhbHVlKTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYSBrbm93biBib3VuZCBwcm9wZXJ0eSBpbiBhbnkgb2YgdGhlIHJlbGF0ZWQgY2xhc3Nlc1xuXHRcdFx0XHRcdFx0XHRjb25zdCBrbm93bkJvdW5kUHJvcGVydGllcyA9IHNldFN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIikgPz8gW107XG5cdFx0XHRcdFx0XHRcdGlmIChrbm93bkJvdW5kUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wLnRvU3RyaW5nKCkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5faWdub3JlU3RhdGVQcm9wZXJ0eVVwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eShwcm9wLnRvU3RyaW5nKCksIHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRDb250cm9sLl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2V0UmVzdWx0ID0gc2V0U3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7cHJvcC50b1N0cmluZygpfWAsIHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQocHJvcC50b1N0cmluZygpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNldFJlc3VsdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0XHRjb25zdCBrbm93bkJvdW5kUHJvcGVydGllcyA9IHN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIikgPz8gW107XG5cdFx0XHRcdFx0Ly8gUmVwbGFjaW5nIHRoZSBjb21wbGV0ZSBzdGF0ZVxuXHRcdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoYC9gLCB2YWx1ZSk7XG5cdFx0XHRcdFx0Ly8gcmVzdG9yaW5nIHRoZSBib3VuZFByb3BlcnRpZXMgcmVmZXJlbmNlc1xuXHRcdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIiwga25vd25Cb3VuZFByb3BlcnRpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSkge1xuXHRcdFx0XHR0YXJnZXRDb250cm9sW29iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5IGFzIGtleW9mIENvbnRyb2xdID0geyAuLi5vYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSB9IGFzIG5ldmVyO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZm5BcHBseVNldHRpbmdzID0gdGFyZ2V0Q29udHJvbC5hcHBseVNldHRpbmdzO1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5hcHBseVNldHRpbmdzID0gZnVuY3Rpb24gKG1TZXR0aW5nczogeyBtb2RlbHM/OiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gfSk6IHR5cGVvZiB0YXJnZXRDb250cm9sIHtcblx0XHRcdFx0ZGVsZXRlIG1TZXR0aW5ncz8ubW9kZWxzPy4kY29tcG9uZW50U3RhdGU7XG5cdFx0XHRcdHJldHVybiBmbkFwcGx5U2V0dGluZ3MuY2FsbCh0aGlzLCBtU2V0dGluZ3MpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0Y29uc3QgZm5TZXRQcm9wZXJ0eSA9IHRhcmdldENvbnRyb2wuc2V0UHJvcGVydHk7XG5cblx0XHRpZiAoYm91bmRUb1N0YXRlUHJvcHMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcsIG9WYWx1ZTogdW5rbm93biwgYlN1cHByZXNzSW52YWxpZGF0ZSk6IHR5cGVvZiB0YXJnZXRDb250cm9sIHtcblx0XHRcdFx0aWYgKGJvdW5kVG9TdGF0ZVByb3BzLmluY2x1ZGVzKHNQcm9wZXJ0eU5hbWUpICYmICF0aGlzLl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlKSB7XG5cdFx0XHRcdFx0c3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7c1Byb3BlcnR5TmFtZX1gLCBvVmFsdWUpO1xuXHRcdFx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkKHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmblNldFByb3BlcnR5LmNhbGwodGhpcywgc1Byb3BlcnR5TmFtZSwgb1ZhbHVlLCBiU3VwcHJlc3NJbnZhbGlkYXRlKTtcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaGVhdnkgbGlmdGluZyB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGNyZWF0aW5nIHRoZSBjbGFzcyBwcm9wZXJ0eSBmb3IgdWk1IHRvIHVzZS5cbiAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgcHJvdG90eXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gKiBAcGFyYW0gaW5PYmogVGhlIG1ldGFkYXRhIG9iamVjdFxuICogQHJldHVybnMgVGhlIG1ldGFkYXRhIGNsYXNzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY2xheno6IFVJNUNvbnRyb2xBbmRNb3JlLCBuYW1lOiBzdHJpbmcsIGluT2JqOiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogRnVuY3Rpb24ge1xuXHRpZiAoY2xhenouZ2V0TWV0YWRhdGE/LigpLmlzQShcInNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uXCIpKSB7XG5cdFx0T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5PYmopLmZvckVhY2goKG9iak5hbWUpID0+IHtcblx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluT2JqLCBvYmpOYW1lKTtcblx0XHRcdGlmIChkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLmVudW1lcmFibGUpIHtcblx0XHRcdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBvYmo6IGFueSA9IHt9O1xuXHRvYmoubWV0YWRhdGEgPSBpbk9iai5tZXRhZGF0YSB8fCB7fTtcblx0b2JqLm92ZXJyaWRlID0gaW5PYmoub3ZlcnJpZGU7XG5cdG9iai5jb25zdHJ1Y3RvciA9IGNsYXp6O1xuXHRvYmoubWV0YWRhdGEuYmFzZVR5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhenoucHJvdG90eXBlKS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKTtcblxuXHRpZiAoKGNsYXp6Py5nZXRNZXRhZGF0YSgpIGFzIHVua25vd24gYXMgeyBnZXRTdGVyZW90eXBlOiBGdW5jdGlvbiB9KT8uZ2V0U3RlcmVvdHlwZSgpID09PSBcImNvbnRyb2xcIikge1xuXHRcdGNvbnN0IHJlbmRlcmVyRGVmaW5pdGlvbiA9IGluT2JqLnJlbmRlcmVyIHx8IGNsYXp6LnJlbmRlcmVyIHx8IGNsYXp6LnJlbmRlcjtcblx0XHRvYmoucmVuZGVyZXIgPSB7IGFwaVZlcnNpb246IDIgfTtcblx0XHRpZiAodHlwZW9mIHJlbmRlcmVyRGVmaW5pdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvYmoucmVuZGVyZXIucmVuZGVyID0gcmVuZGVyZXJEZWZpbml0aW9uO1xuXHRcdH0gZWxzZSBpZiAocmVuZGVyZXJEZWZpbml0aW9uICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqLnJlbmRlcmVyID0gcmVuZGVyZXJEZWZpbml0aW9uO1xuXHRcdH1cblx0fVxuXHRvYmoubWV0YWRhdGEuaW50ZXJmYWNlcyA9IGluT2JqLm1ldGFkYXRhPy5pbnRlcmZhY2VzIHx8IGNsYXp6Lm1ldGFkYXRhPy5pbnRlcmZhY2VzO1xuXHRPYmplY3Qua2V5cyhjbGF6ei5wcm90b3R5cGUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdGlmIChrZXkgIT09IFwibWV0YWRhdGFcIikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0b2JqW2tleV0gPSBjbGF6ei5wcm90b3R5cGVba2V5XTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0aWYgKG9iai5tZXRhZGF0YT8uY29udHJvbGxlckV4dGVuc2lvbnMgJiYgT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBjRXh0TmFtZSBpbiBvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnMpIHtcblx0XHRcdG9ialtjRXh0TmFtZV0gPSBvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbY0V4dE5hbWVdO1xuXHRcdH1cblx0fVxuXHRjb25zdCBvdXRwdXQgPSBjbGF6ei5leHRlbmQobmFtZSwgb2JqKSBhcyB0eXBlb2YgQ29udHJvbCAmIEZ1bmN0aW9uO1xuXHRjb25zdCBmbkluaXQgPSBvdXRwdXQucHJvdG90eXBlLmluaXQ7XG5cdGNvbnN0IGZuQWZ0ZXJJbml0ID0gb3V0cHV0LnByb3RvdHlwZS5hZnRlckluaXQ7XG5cdG91dHB1dC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRpZiAoZm5Jbml0KSB7XG5cdFx0XHRmbkluaXQuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fVxuXHRcdGlmIChjbGF6ei5yZWdpc3Rlckluc3RhbmNlKSB7XG5cdFx0XHRjbGF6ei5yZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuXHRcdH1cblx0XHR0aGlzLm1ldGFkYXRhID0gb2JqLm1ldGFkYXRhO1xuXG5cdFx0aWYgKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlLZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnByb3BlcnRpZXMpO1xuXHRcdFx0YVByb3BlcnR5S2V5cy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eURlZiA9IG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0Ly8gSWYgYSB2YWx1ZSB3YXMgc2V0IGluIGBpbml0YCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBzZXQgaW4gdGhlIHZhbHVlIGluIHRoZSBlbmRcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWZhdWx0ID0gdGhpc1twcm9wZXJ0eUtleV0gPz8gcHJvcGVydHlEZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRpZiAocHJvcGVydHlEZWYuaXNCaW5kaW5nSW5mbyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzID8/PSB7fTtcblxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1Qcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA9IHY7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldCgpOiB1bmtub3duIHtcblx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIHByb3BlcnR5IGZpcnN0IGFuZCBub3QganVzdCB0aGUgX2JpbmRpbmdQcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHRcdC8vIER1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgd2l0aCBhIG5vbiBiaW5kaW5nIHZhbHVlLCBzZXRQcm9wZXJ0eSBpcyBjYWxsZWQgYW5kIG5vdCBiaW5kUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBiaW5kaW5nUHJvcGVydHlWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIHNldCB0byBhIGRpZmZlcmVudCB2YWx1ZSB3ZSB1cGRhdGUgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlICE9PSBiaW5kaW5nUHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcFZhbHVlID0gdGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldO1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnByb3BWYWx1ZSB9OyAvLyBDcmVhdGUgc2hhbGxvdyBjb3B5XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3BWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSwgdik7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcGVydHlEZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgdGhpc1twcm9wZXJ0eUtleV0gIT09IHByb3BlcnR5RGVmYXVsdCkge1xuXHRcdFx0XHRcdC8vIGRvbid0IG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIGFscmVhZHkgdGhlcmVcblx0XHRcdFx0XHR0aGlzLl9hcHBseWluZ1NldHRpbmdzID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzW3Byb3BlcnR5S2V5XSA9IHByb3BlcnR5RGVmYXVsdDtcblx0XHRcdFx0XHR0aGlzLl9hcHBseWluZ1NldHRpbmdzID0gZmFsc2U7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX2FwcGx5aW5nU2V0dGluZ3M7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYUFnZ3JlZ2F0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnMpO1xuXHRcdFx0YUFnZ3JlZ2F0aW9uS2V5cy5mb3JFYWNoKChhZ2dyZWdhdGlvbktleSkgPT4ge1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZiA9IG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzW2FnZ3JlZ2F0aW9uS2V5XSA/PyBhZ2dyZWdhdGlvbkRlZi5kZWZhdWx0VmFsdWU7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhZ2dyZWdhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChkZWZhdWx0VmFsdWUgJiYgKGRlZmF1bHRWYWx1ZSBhcyBVSTVFbGVtZW50KT8uaXNBKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1thZ2dyZWdhdGlvbktleV0gPSBkZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBc3NvY2lhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYXNzb2NpYXRpb25zKTtcblx0XHRcdGFBc3NvY2lhdGlvbktleXMuZm9yRWFjaCgoYXNzb2NpYXRpb25LZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGFzc29jaWF0aW9uS2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEFzc29jaWF0aW9uKGFzc29jaWF0aW9uS2V5LCB2KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Db250ZW50ID0gdGhpcy5nZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSk7XG5cdFx0XHRcdFx0XHRpZiAob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9uc1thc3NvY2lhdGlvbktleV0ubXVsdGlwbGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudCB8fCBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpIHtcblx0XHRcdGNvbnN0IHJlZmVyZW5jZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEucmVmZXJlbmNlcyk7XG5cdFx0XHRyZWZlcmVuY2VQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogY3JlYXRlUmVmZXJlbmNlKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gb2JqLm1ldGFkYXRhLm1ldGhvZHMpIHtcblx0XHRcdFx0Y29uc3QgbWV0aG9kRGVmaW5pdGlvbiA9IG9iai5tZXRhZGF0YS5tZXRob2RzW21ldGhvZE5hbWVdO1xuXHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJBZnRlckFzeW5jXCIgfHwgbWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLm1ldGhvZEhvbGRlcikge1xuXHRcdFx0XHRcdFx0dGhpcy5tZXRob2RIb2xkZXIgPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0gPSBbdGhpc1ttZXRob2ROYW1lXV07XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG1ldGhvZE5hbWUsIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IEZ1bmN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXS5wdXNoKHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYXN5bmMgKC4uLm1ldGhvZEFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1ldGhvZEFycmF5cyA9IHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZEFycmF5cy5yZXZlcnNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXJnIG9mIG1ldGhvZEFycmF5cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgYXJnLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRfY3JlYXRlU3RhdGVQcm9wZXJ0eShvYmosIHRoaXMpO1xuXHRcdGlmIChmbkFmdGVySW5pdCkge1xuXHRcdFx0Zm5BZnRlckluaXQuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fVxuXHR9O1xuXG5cdGNsYXp6Lm92ZXJyaWRlID0gZnVuY3Rpb24gKG9FeHRlbnNpb246IHVua25vd24pOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgcG9sID0ge307XG5cdFx0KHBvbCBhcyBGdW5jdGlvbikuY29uc3RydWN0b3IgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogRnVuY3Rpb24ge1xuXHRcdFx0cmV0dXJuIGNsYXp6LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NsYXNzID0gKE1ldGFkYXRhIGFzIHVua25vd24gYXMgeyBjcmVhdGVDbGFzczogRnVuY3Rpb24gfSkuY3JlYXRlQ2xhc3MoXG5cdFx0XHRjbGF6eixcblx0XHRcdGBhbm9ueW1vdXNFeHRlbnNpb25+JHt1aWQoKX1gLFxuXHRcdFx0cG9sLFxuXHRcdFx0Q29udHJvbGxlck1ldGFkYXRhXG5cdFx0KTtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fc3RhdGljT3ZlcnJpZGUgPSBvRXh0ZW5zaW9uO1xuXHRcdG9DbGFzcy5nZXRNZXRhZGF0YSgpLl9vdmVycmlkZSA9IChjbGF6ei5nZXRNZXRhZGF0YSgpIGFzIHsgX292ZXJyaWRlPzogdW5rbm93biB9KS5fb3ZlcnJpZGU7XG5cdFx0cmV0dXJuIG9DbGFzcztcblx0fTtcblxuXHRPYmplY3RQYXRoLnNldChuYW1lLCBvdXRwdXQpO1xuXG5cdHJldHVybiBvdXRwdXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztFQWdKQSxNQUFNQSxjQUFjLEdBQUcsU0FBQUEsQ0FBVUMsTUFBc0QsRUFBZ0M7SUFDdEhBLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHQyxLQUFLLENBQ3RCO01BQ0NDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztNQUN4QkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO01BQ2RDLFlBQVksRUFBRSxDQUFDLENBQUM7TUFDaEJDLE9BQU8sRUFBRSxDQUFDLENBQUM7TUFDWEMsTUFBTSxFQUFFLENBQUMsQ0FBQztNQUNWQyxVQUFVLEVBQUU7SUFDYixDQUFDLEVBQ0RWLE1BQU0sQ0FBQ0MsUUFBUSxJQUFJLENBQUMsQ0FDckIsQ0FBaUM7SUFDakMsT0FBT0Qs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QyxLQUFBLElBQUEzTixTQUFBLENBQUEyTixLQUFBO2tCQUFBO2tCQUsxQixLQUFLLE1BQU1DLEdBQUcsSUFBSUwsWUFBWSxFQUFFO29CQUMvQixNQUFNSyxHQUFHLENBQUM3QixLQUFLLENBQUNILEtBQUksRUFBRThCLFVBQVUsQ0FBQztrQkFDbEM7Z0JBQ0QsQ0FBQztjQUNGO1lBQ0QsQ0FBQyxDQUFDO1VBQ0g7UUFDRDtNQUNEO01BQ0ExRixvQkFBb0IsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQztNQUMvQixJQUFJeUQsV0FBVyxFQUFFO1FBQ2hCQSxXQUFXLENBQUNLLEtBQUssQ0FBQyxJQUFJLEVBQUVqSCxJQUFJLENBQUM7TUFDOUI7SUFDRCxDQUFDO0lBRUQ0RixLQUFLLENBQUNsSSxRQUFRLEdBQUcsVUFBVXFMLFVBQW1CLEVBQVk7TUFDekQsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUNiQSxHQUFHLENBQWNyTSxXQUFXLEdBQUcsWUFBd0M7UUFBQSxTQUFBc00sS0FBQSxHQUFBL04sU0FBQSxDQUFBQyxNQUFBLEVBQTNCNkUsSUFBSSxPQUFBQyxLQUFBLENBQUFnSixLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSmxKLElBQUksQ0FBQWtKLEtBQUEsSUFBQWhPLFNBQUEsQ0FBQWdPLEtBQUE7UUFBQTtRQUNoRCxPQUFPdEQsS0FBSyxDQUFDcUIsS0FBSyxDQUFDLElBQUksRUFBRWpILElBQUksQ0FBQztNQUMvQixDQUFDO01BQ0QsTUFBTW1KLE1BQU0sR0FBSUMsUUFBUSxDQUEwQ0MsV0FBVyxDQUM1RXpELEtBQUssRUFDTCxzQkFBc0IwRCxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQzdCTixHQUFHLEVBQ0hPLGtCQUNELENBQUM7TUFDREosTUFBTSxDQUFDOU4sV0FBVyxDQUFDLENBQUMsQ0FBQ21PLGVBQWUsR0FBR1QsVUFBVTtNQUNqREksTUFBTSxDQUFDOU4sV0FBVyxDQUFDLENBQUMsQ0FBQ29PLFNBQVMsR0FBSTdELEtBQUssQ0FBQ3ZLLFdBQVcsQ0FBQyxDQUFDLENBQTZCb08sU0FBUztNQUMzRixPQUFPTixNQUFNO0lBQ2QsQ0FBQztJQUVETyxVQUFVLENBQUM5TSxHQUFHLENBQUN1RSxJQUFJLEVBQUVzRixNQUFNLENBQUM7SUFFNUIsT0FBT0EsTUFBTTtFQUNkO0VBQUMsT0FBQWxKLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==