@getopenpay/openpay-js 0.5.15 → 0.5.16

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.
@@ -1,8 +1,8 @@
1
- import { z as Ar, p as g, _ as X, s as Pr, l as Sr, j as Ir, q as vr, y as yr, dK as hr, h as gr, dL as mr, n as Cr, r as Nr, i as Mr, m as Ur, o as Br, t as br, u as Dr } from "./url-CdPstDG9.js";
2
- import { i as G, s as Q, u as Xr } from "./suppress-tracing-B94rObkn.js";
3
- import { d as c } from "./diag-api-CMlZXyyv.js";
1
+ import { z as Ar, p as g, _ as X, s as Pr, l as Sr, j as Ir, q as vr, y as yr, dK as hr, h as gr, dL as mr, n as Cr, r as Nr, i as Mr, m as Ur, o as Br, t as br, u as Dr } from "./url-CgnFZYDI.js";
2
+ import { i as G, s as Q, u as Xr } from "./suppress-tracing-Cu47NVB2.js";
3
+ import { d as c } from "./diag-api-BaoBTidT.js";
4
4
  import { h as q, E as Gr } from "./ExportResult-BacsqwKA.js";
5
- import { f as u, t as N, i as k, T as M, c as wr, b as Vr, a as K } from "./index-j7i6AeZa.js";
5
+ import { f as u, t as N, i as k, T as M, c as wr, b as Vr, a as K } from "./index-Dcezwdcs.js";
6
6
  import { a as jr, bm as Hr } from "./sdk-info-ChuKu8zW.js";
7
7
  var l;
8
8
  (function(r) {
@@ -61,7 +61,7 @@ function Wr(r) {
61
61
  }
62
62
  var Zr = (
63
63
  /** @class */
64
- function() {
64
+ (function() {
65
65
  function r() {
66
66
  }
67
67
  return r.prototype.inject = function(e, t, n) {
@@ -90,10 +90,10 @@ var Zr = (
90
90
  }, r.prototype.fields = function() {
91
91
  return [m];
92
92
  }, r;
93
- }()
93
+ })()
94
94
  ), $r = (
95
95
  /** @class */
96
- function() {
96
+ (function() {
97
97
  function r(e, t) {
98
98
  this._monotonicClock = t, this._epochMillis = e.now(), this._performanceMillis = t.now();
99
99
  }
@@ -101,7 +101,7 @@ var Zr = (
101
101
  var e = this._monotonicClock.now() - this._performanceMillis;
102
102
  return this._epochMillis + e;
103
103
  }, r;
104
- }()
104
+ })()
105
105
  ), tr = function(r) {
106
106
  var e = typeof Symbol == "function" && Symbol.iterator, t = e && r[e], n = 0;
107
107
  if (t) return t.call(r);
@@ -442,12 +442,12 @@ function de(r) {
442
442
  }
443
443
  var Le = 8, Ae = 16, Pe = (
444
444
  /** @class */
445
- /* @__PURE__ */ function() {
445
+ /* @__PURE__ */ (function() {
446
446
  function r() {
447
447
  this.generateTraceId = Y(Ae), this.generateSpanId = Y(Le);
448
448
  }
449
449
  return r;
450
- }()
450
+ })()
451
451
  ), R = Array(32);
452
452
  function Y(r) {
453
453
  return function() {
@@ -469,7 +469,7 @@ var Ie = function(r) {
469
469
  throw new TypeError(e ? "Object is not iterable." : "Symbol.iterator is not defined.");
470
470
  }, ve = (
471
471
  /** @class */
472
- function() {
472
+ (function() {
473
473
  function r(e) {
474
474
  e === void 0 && (e = {});
475
475
  var t;
@@ -511,7 +511,7 @@ var Ie = function(r) {
511
511
  }, r.prototype.fields = function() {
512
512
  return this._fields.slice();
513
513
  }, r;
514
- }()
514
+ })()
515
515
  ), B = "[_0-9a-z-*/]", ye = "[a-z]" + B + "{0,255}", he = "[a-z0-9]" + B + "{0,240}@[a-z]" + B + "{0,13}", ge = new RegExp("^(?:" + ye + "|" + he + ")$"), me = /^[ -~]{0,255}[!-~]$/, Ce = /,|=/;
516
516
  function Ne(r) {
517
517
  return ge.test(r);
@@ -521,7 +521,7 @@ function Me(r) {
521
521
  }
522
522
  var z = 32, Ue = 512, W = ",", Z = "=", fr = (
523
523
  /** @class */
524
- function() {
524
+ (function() {
525
525
  function r(e) {
526
526
  this._internalState = /* @__PURE__ */ new Map(), e && this._parse(e);
527
527
  }
@@ -553,7 +553,7 @@ var z = 32, Ue = 512, W = ",", Z = "=", fr = (
553
553
  var e = new r();
554
554
  return e._internalState = new Map(this._internalState), e;
555
555
  }, r;
556
- }()
556
+ })()
557
557
  ), L = "traceparent", A = "tracestate", Be = "00", be = "(?!ff)[\\da-f]{2}", De = "(?![0]{32})[\\da-f]{32}", Xe = "(?![0]{16})[\\da-f]{16}", Ge = "[\\da-f]{2}", we = new RegExp("^\\s?(" + be + ")-(" + De + ")-(" + Xe + ")-(" + Ge + ")(-.*)?\\s?$");
558
558
  function sr(r) {
559
559
  var e = we.exec(r);
@@ -565,7 +565,7 @@ function sr(r) {
565
565
  }
566
566
  var Ve = (
567
567
  /** @class */
568
- function() {
568
+ (function() {
569
569
  function r() {
570
570
  }
571
571
  return r.prototype.inject = function(e, t, n) {
@@ -594,7 +594,7 @@ var Ve = (
594
594
  }, r.prototype.fields = function() {
595
595
  return [L, A];
596
596
  }, r;
597
- }()
597
+ })()
598
598
  ), H = wr("OpenTelemetry SDK Context Key RPC_METADATA"), b;
599
599
  (function(r) {
600
600
  r.HTTP = "http";
@@ -610,7 +610,7 @@ function xe(r) {
610
610
  }
611
611
  var D = (
612
612
  /** @class */
613
- function() {
613
+ (function() {
614
614
  function r() {
615
615
  }
616
616
  return r.prototype.shouldSample = function() {
@@ -620,10 +620,10 @@ var D = (
620
620
  }, r.prototype.toString = function() {
621
621
  return "AlwaysOffSampler";
622
622
  }, r;
623
- }()
623
+ })()
624
624
  ), P = (
625
625
  /** @class */
626
- function() {
626
+ (function() {
627
627
  function r() {
628
628
  }
629
629
  return r.prototype.shouldSample = function() {
@@ -633,10 +633,10 @@ var D = (
633
633
  }, r.prototype.toString = function() {
634
634
  return "AlwaysOnSampler";
635
635
  }, r;
636
- }()
636
+ })()
637
637
  ), Fe = (
638
638
  /** @class */
639
- function() {
639
+ (function() {
640
640
  function r(e) {
641
641
  var t, n, a, i;
642
642
  this._root = e.root, this._root || (Er(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new P()), this._remoteParentSampled = (t = e.remoteParentSampled) !== null && t !== void 0 ? t : new P(), this._remoteParentNotSampled = (n = e.remoteParentNotSampled) !== null && n !== void 0 ? n : new D(), this._localParentSampled = (a = e.localParentSampled) !== null && a !== void 0 ? a : new P(), this._localParentNotSampled = (i = e.localParentNotSampled) !== null && i !== void 0 ? i : new D();
@@ -647,10 +647,10 @@ var D = (
647
647
  }, r.prototype.toString = function() {
648
648
  return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
649
649
  }, r;
650
- }()
650
+ })()
651
651
  ), Ke = (
652
652
  /** @class */
653
- function() {
653
+ (function() {
654
654
  function r(e) {
655
655
  e === void 0 && (e = 0), this._ratio = e, this._ratio = this._normalize(e), this._upperBound = Math.floor(this._ratio * 4294967295);
656
656
  }
@@ -669,7 +669,7 @@ var D = (
669
669
  }
670
670
  return t;
671
671
  }, r;
672
- }()
672
+ })()
673
673
  ), Ye = "[object Object]", ze = "[object Null]", We = "[object Undefined]", Ze = Function.prototype, lr = Ze.toString, $e = lr.call(Object), Je = Qe(Object.getPrototypeOf, Object), Or = Object.prototype, cr = Or.hasOwnProperty, f = Symbol ? Symbol.toStringTag : void 0, Rr = Or.toString;
674
674
  function Qe(r, e) {
675
675
  return function(t) {
@@ -779,7 +779,7 @@ function S(r) {
779
779
  function at(r, e) {
780
780
  return !(!$(r) || !$(e));
781
781
  }
782
- var it = /* @__PURE__ */ function() {
782
+ var it = /* @__PURE__ */ (function() {
783
783
  var r = function(e, t) {
784
784
  return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, a) {
785
785
  n.__proto__ = a;
@@ -796,16 +796,16 @@ var it = /* @__PURE__ */ function() {
796
796
  }
797
797
  e.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n());
798
798
  };
799
- }(), Lr = (
799
+ })(), Lr = (
800
800
  /** @class */
801
- function(r) {
801
+ (function(r) {
802
802
  it(e, r);
803
803
  function e(t) {
804
804
  var n = r.call(this, t) || this;
805
805
  return Object.setPrototypeOf(n, e.prototype), n;
806
806
  }
807
807
  return e;
808
- }(Error)
808
+ })(Error)
809
809
  );
810
810
  function ot(r, e) {
811
811
  var t, n = new Promise(function(i, o) {
@@ -824,7 +824,7 @@ function _t(r) {
824
824
  }
825
825
  var Et = (
826
826
  /** @class */
827
- function() {
827
+ (function() {
828
828
  function r() {
829
829
  var e = this;
830
830
  this._promise = new Promise(function(t, n) {
@@ -842,7 +842,7 @@ var Et = (
842
842
  }, r.prototype.reject = function(e) {
843
843
  this._reject(e);
844
844
  }, r;
845
- }()
845
+ })()
846
846
  ), Tt = function(r, e) {
847
847
  var t = typeof Symbol == "function" && r[Symbol.iterator];
848
848
  if (!t) return r;
@@ -865,7 +865,7 @@ var Et = (
865
865
  return r.concat(i || Array.prototype.slice.call(e));
866
866
  }, ft = (
867
867
  /** @class */
868
- function() {
868
+ (function() {
869
869
  function r(e, t) {
870
870
  this._callback = e, this._that = t, this._isCalled = !1, this._deferred = new Et();
871
871
  }
@@ -898,7 +898,7 @@ var Et = (
898
898
  }
899
899
  return this._deferred.promise;
900
900
  }, r;
901
- }()
901
+ })()
902
902
  );
903
903
  function st(r, e) {
904
904
  return new Promise(function(t) {
@@ -1009,4 +1009,4 @@ export {
1009
1009
  Qr as s,
1010
1010
  Se as u
1011
1011
  };
1012
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBtfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogYXMgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nLCBwIGFzIHByb3BhZ2F0aW9uLCBfIGFzIF9nbG9iYWxUaGlzLCBzIGFzIGFkZEhyVGltZXMsIGwgYXMgZ2V0VGltZU9yaWdpbiwgaiBhcyBoclRpbWUsIHEgYXMgaHJUaW1lRHVyYXRpb24sIHkgYXMgaHJUaW1lVG9NaWNyb3NlY29uZHMsIGRLIGFzIGhyVGltZVRvTWlsbGlzZWNvbmRzLCBoIGFzIGhyVGltZVRvTmFub3NlY29uZHMsIGRMIGFzIGhyVGltZVRvVGltZVN0YW1wLCBuIGFzIGlzVGltZUlucHV0LCByIGFzIGlzVGltZUlucHV0SHJUaW1lLCBpIGFzIGlzVXJsSWdub3JlZCwgbSBhcyBtaWxsaXNUb0hyVGltZSwgbyBhcyBvdHBlcmZvcm1hbmNlLCB0IGFzIHRpbWVJbnB1dFRvSHJUaW1lLCB1IGFzIHVybE1hdGNoZXMgfSBmcm9tICcuL3VybC0hfnswMGR9fi5qcyc7XG5pbXBvcnQgeyBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQsIHMgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVuc3VwcHJlc3NUcmFjaW5nIH0gZnJvbSAnLi9zdXBwcmVzcy10cmFjaW5nLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IGQgYXMgZGlhZyB9IGZyb20gJy4vZGlhZy1hcGktIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaCBhcyBoZXhUb0JpbmFyeSwgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuaW1wb3J0IHsgZiBhcyBEaWFnTG9nTGV2ZWwsIHQgYXMgdHJhY2UsIGkgYXMgaXNTcGFuQ29udGV4dFZhbGlkLCBUIGFzIFRyYWNlRmxhZ3MsIGMgYXMgY3JlYXRlQ29udGV4dEtleSwgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0IH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBhIGFzIFNES19JTkZPLCBibSBhcyBWRVJTSU9OJDEgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwaH1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvbmUgZGVjbGFyZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIEEgc2FtcGxpbmcgZGVjaXNpb24gdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHtAbGluayBTcGFufSB3aWxsIGJlIHJlY29yZGVkXG4gKiBhbmQgY29sbGVjdGVkLlxuICovXG52YXIgU2FtcGxpbmdEZWNpc2lvbjtcbihmdW5jdGlvbiAoU2FtcGxpbmdEZWNpc2lvbikge1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IGZhbHNlYCwgc3BhbiB3aWxsIG5vdCBiZSByZWNvcmRlZCBhbmQgYWxsIGV2ZW50c1xuICAgICAqIGFuZCBhdHRyaWJ1dGVzIHdpbGwgYmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJOT1RfUkVDT1JEXCJdID0gMF0gPSBcIk5PVF9SRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCwgYnV0IGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgTk9UIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRcIl0gPSAxXSA9IFwiUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAgQU5EIGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRF9BTkRfU0FNUExFRFwiXSA9IDJdID0gXCJSRUNPUkRfQU5EX1NBTVBMRURcIjtcbn0pKFNhbXBsaW5nRGVjaXNpb24gfHwgKFNhbXBsaW5nRGVjaXNpb24gPSB7fSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SID0gJz0nO1xudmFyIEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IgPSAnOyc7XG52YXIgQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IgPSAnLCc7XG4vLyBOYW1lIG9mIHRoZSBodHRwIGhlYWRlciB1c2VkIHRvIHByb3BhZ2F0ZSB0aGUgYmFnZ2FnZVxudmFyIEJBR0dBR0VfSEVBREVSID0gJ2JhZ2dhZ2UnO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgbmFtZS12YWx1ZSBwYWlycyBhbGxvd2VkIGJ5IHczYyBzcGVjXG52YXIgQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyA9IDE4MDtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBhIHNpbmdsZSBuYW1lLXZhbHVlIHBhaXIgYWxsb3dlZCBieSB3M2Mgc3BlY1xudmFyIEJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTID0gNDA5Njtcbi8vIE1heGltdW0gdG90YWwgbGVuZ3RoIG9mIGFsbCBuYW1lLXZhbHVlIHBhaXJzIGFsbG93ZWQgYnkgdzNjIHNwZWNcbnZhciBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPSA4MTkyO1xuXG52YXIgX19yZWFkJDMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzZXJpYWxpemVLZXlQYWlycyhrZXlQYWlycykge1xuICAgIHJldHVybiBrZXlQYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGhWYWx1ZSwgY3VycmVudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBcIlwiICsgaFZhbHVlICsgKGhWYWx1ZSAhPT0gJycgPyBCQUdHQUdFX0lURU1TX1NFUEFSQVRPUiA6ICcnKSArIGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPyBoVmFsdWUgOiB2YWx1ZTtcbiAgICB9LCAnJyk7XG59XG5mdW5jdGlvbiBnZXRLZXlQYWlycyhiYWdnYWdlKSB7XG4gICAgcmV0dXJuIGJhZ2dhZ2UuZ2V0QWxsRW50cmllcygpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkJDMoX2EsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS52YWx1ZSk7XG4gICAgICAgIC8vIGluY2x1ZGUgb3BhcXVlIG1ldGFkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIE5PVEU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgVVJJLWVuY29kZSB0aGUgbWV0YWRhdGEgLSB0aGF0IHJlc3BvbnNpYmlsaXR5IGZhbGxzIG9uIHRoZSBtZXRhZGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAodmFsdWUubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkgKz0gQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUiArIHZhbHVlLm1ldGFkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VQYWlyS2V5VmFsdWUoZW50cnkpIHtcbiAgICB2YXIgdmFsdWVQcm9wcyA9IGVudHJ5LnNwbGl0KEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IpO1xuICAgIGlmICh2YWx1ZVByb3BzLmxlbmd0aCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGtleVBhaXJQYXJ0ID0gdmFsdWVQcm9wcy5zaGlmdCgpO1xuICAgIGlmICgha2V5UGFpclBhcnQpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBrZXlQYWlyUGFydC5pbmRleE9mKEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5UGFpclBhcnQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCkpO1xuICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlQYWlyUGFydC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCkpO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICBpZiAodmFsdWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1ldGFkYXRhID0gYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nKHZhbHVlUHJvcHMuam9pbihCQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIG1ldGFkYXRhOiBtZXRhZGF0YSB9O1xufVxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBzZXJpYWxpemVkIGluIHRoZSBiYWdnYWdlIEhUVFAgRm9ybWF0ICh3aXRob3V0IG1ldGFkYXRhKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYmFnZ2FnZS9ibG9iL21hc3Rlci9iYWdnYWdlL0hUVFBfSEVBREVSX0ZPUk1BVC5tZFxuICovXG5mdW5jdGlvbiBwYXJzZUtleVBhaXJzSW50b1JlY29yZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5UGFpcikgeyByZXR1cm4ga2V5UGFpciAhPT0gdW5kZWZpbmVkICYmIGtleVBhaXIudmFsdWUubGVuZ3RoID4gMDsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoaGVhZGVycywga2V5UGFpcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBoZWFkZXJzW2tleVBhaXIua2V5XSA9IGtleVBhaXIudmFsdWU7XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH0sIHt9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvcGFnYXRlcyB7QGxpbmsgQmFnZ2FnZX0gdGhyb3VnaCBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFnZ2FnZSBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JhZ2dhZ2UvXG4gKi9cbnZhciBXM0NCYWdnYWdlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXM0NCYWdnYWdlUHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDQmFnZ2FnZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGJhZ2dhZ2UgPSBwcm9wYWdhdGlvbi5nZXRCYWdnYWdlKGNvbnRleHQpO1xuICAgICAgICBpZiAoIWJhZ2dhZ2UgfHwgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGtleVBhaXJzID0gZ2V0S2V5UGFpcnMoYmFnZ2FnZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyLmxlbmd0aCA8PSBCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zbGljZSgwLCBCQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTKTtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gc2VyaWFsaXplS2V5UGFpcnMoa2V5UGFpcnMpO1xuICAgICAgICBpZiAoaGVhZGVyVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUiwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0dGVyLmdldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUik7XG4gICAgICAgIHZhciBiYWdnYWdlU3RyaW5nID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSlcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWUuam9pbihCQUdHQUdFX0lURU1TX1NFUEFSQVRPUilcbiAgICAgICAgICAgIDogaGVhZGVyVmFsdWU7XG4gICAgICAgIGlmICghYmFnZ2FnZVN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgYmFnZ2FnZSA9IHt9O1xuICAgICAgICBpZiAoYmFnZ2FnZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IGJhZ2dhZ2VTdHJpbmcuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGtleVBhaXIgPSBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICAgICAgICAgIHZhciBiYWdnYWdlRW50cnkgPSB7IHZhbHVlOiBrZXlQYWlyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgaWYgKGtleVBhaXIubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFnZ2FnZUVudHJ5Lm1ldGFkYXRhID0ga2V5UGFpci5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFnZ2FnZVtrZXlQYWlyLmtleV0gPSBiYWdnYWdlRW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmVudHJpZXMoYmFnZ2FnZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRpb24uc2V0QmFnZ2FnZShjb250ZXh0LCBwcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKGJhZ2dhZ2UpKTtcbiAgICB9O1xuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbQkFHR0FHRV9IRUFERVJdO1xuICAgIH07XG4gICAgcmV0dXJuIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB1dGlsaXR5IGZvciByZXR1cm5pbmcgd2FsbCB0aW1lcyBhbmNob3JlZCB0byBhIGdpdmVuIHBvaW50IGluIHRpbWUuIFdhbGwgdGltZSBtZWFzdXJlbWVudHMgd2lsbFxuICogbm90IGJlIHRha2VuIGZyb20gdGhlIHN5c3RlbSwgYnV0IGluc3RlYWQgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyBhIG1vbm90b25pYyBjbG9jayB0aW1lXG4gKiB0byB0aGUgYW5jaG9yIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lIGNhbiBjaGFuZ2UgYW5kIHJlc3VsdCBpbiB1bmV4cGVjdGVkIHNpdHVhdGlvbnMgbGlrZVxuICogc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGV5IGFyZSBzdGFydGVkLiBDcmVhdGluZyBhbiBhbmNob3JlZCBjbG9jayBmb3IgZWFjaCBsb2NhbCByb290IHNwYW5cbiAqIGVuc3VyZXMgdGhhdCBzcGFuIHRpbWluZ3MgYW5kIGR1cmF0aW9ucyBhcmUgYWNjdXJhdGUgd2hpbGUgcHJldmVudGluZyBzcGFuIHRpbWVzIGZyb20gZHJpZnRpbmdcbiAqIHRvbyBmYXIgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLlxuICpcbiAqIE9ubHkgY3JlYXRpbmcgYW4gYW5jaG9yZWQgY2xvY2sgb25jZSBwZXIgbG9jYWwgdHJhY2UgZW5zdXJlcyBzcGFuIHRpbWVzIGFyZSBjb3JyZWN0IHJlbGF0aXZlXG4gKiB0byBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgYSBjaGlsZCBzcGFuIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YXJ0IHRpbWUgYmVmb3JlIGl0cyBwYXJlbnQgZXZlblxuICogaWYgdGhlIHN5c3RlbSBjbG9jayBpcyBjb3JyZWN0ZWQgZHVyaW5nIHRoZSBsb2NhbCB0cmFjZS5cbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBPVGVsIEphdmEgYW5jaG9yZWQgY2xvY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWphdmEvYmxvYi9tYWluL3Nkay90cmFjZS9zcmMvbWFpbi9qYXZhL2lvL29wZW50ZWxlbWV0cnkvc2RrL3RyYWNlL0FuY2hvcmVkQ2xvY2suamF2YVxuICovXG52YXIgQW5jaG9yZWRDbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQW5jaG9yZWRDbG9jayBhbmNob3JlZCB0byB0aGUgY3VycmVudCB0aW1lIHJldHVybmVkIGJ5IHN5c3RlbUNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN5c3RlbUNsb2NrIHNob3VsZCBiZSBhIGNsb2NrIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEgMTk3MCBzdWNoIGFzIERhdGVcbiAgICAgKiBAcGFyYW0gbW9ub3RvbmljQ2xvY2sgc2hvdWxkIGJlIGEgY2xvY2sgdGhhdCBjb3VudHMgbWlsbGlzZWNvbmRzIG1vbm90b25pY2FsbHkgc3VjaCBhcyB3aW5kb3cucGVyZm9ybWFuY2Ugb3IgcGVyZl9ob29rcy5wZXJmb3JtYW5jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFuY2hvcmVkQ2xvY2soc3lzdGVtQ2xvY2ssIG1vbm90b25pY0Nsb2NrKSB7XG4gICAgICAgIHRoaXMuX21vbm90b25pY0Nsb2NrID0gbW9ub3RvbmljQ2xvY2s7XG4gICAgICAgIHRoaXMuX2Vwb2NoTWlsbGlzID0gc3lzdGVtQ2xvY2subm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzID0gbW9ub3RvbmljQ2xvY2subm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlXG4gICAgICogQW5jaG9yZWRDbG9jayB3YXMgY3JlYXRlZCB0byB0aGUgY3JlYXRpb24gZXBvY2ggdGltZVxuICAgICAqL1xuICAgIEFuY2hvcmVkQ2xvY2sucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fbW9ub3RvbmljQ2xvY2subm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vwb2NoTWlsbGlzICsgZGVsdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQW5jaG9yZWRDbG9jaztcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciBvdXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQkMihfYy52YWx1ZSwgMiksIGtleSA9IF9kWzBdLCB2YWwgPSBfZFsxXTtcbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWUodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKHZhbCk7XG59XG5mdW5jdGlvbiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheShhcnIpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdHlwZTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBhcnJfMSA9IF9fdmFsdWVzJDEoYXJyKSwgYXJyXzFfMSA9IGFycl8xLm5leHQoKTsgIWFycl8xXzEuZG9uZTsgYXJyXzFfMSA9IGFycl8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWQgZWxlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuY291bnRlcmVkIGFuIGludmFsaWQgcHJpbWl0aXZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcnJfMV8xICYmICFhcnJfMV8xLmRvbmUgJiYgKF9hID0gYXJyXzEucmV0dXJuKSkgX2EuY2FsbChhcnJfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQcmltaXRpdmVBdHRyaWJ1dGVWYWx1ZSh2YWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBsb2dzIGFuIGVycm9yIHVzaW5nIHRoZSBwcm92aWRlZCBsb2dnZXIsIG9yIGFcbiAqIGNvbnNvbGUgbG9nZ2VyIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBsb2dnaW5nRXJyb3JIYW5kbGVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXgpIHtcbiAgICAgICAgZGlhZy5lcnJvcihzdHJpbmdpZnlFeGNlcHRpb24oZXgpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleGNlcHRpb24gaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUV4Y2VwdGlvbihleCkge1xuICAgIGlmICh0eXBlb2YgZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBleDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmbGF0dGVuRXhjZXB0aW9uKGV4KSk7XG4gICAgfVxufVxuLyoqXG4gKiBGbGF0dGVucyBhbiBleGNlcHRpb24gaW50byBrZXktdmFsdWUgcGFpcnMgYnkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluXG4gKiBhbmQgY29lcmNpbmcgdmFsdWVzIHRvIHN0cmluZ3MuIER1cGxpY2F0ZSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuO1xuICogdGhlIGZpcnN0IGluc2VydCB3aW5zLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuRXhjZXB0aW9uKGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJyZW50ID0gZXg7XG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY3VycmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBUaGUgZ2xvYmFsIGVycm9yIGhhbmRsZXIgZGVsZWdhdGUgKi9cbnZhciBkZWxlZ2F0ZUhhbmRsZXIgPSBsb2dnaW5nRXJyb3JIYW5kbGVyKCk7XG4vKipcbiAqIFNldCB0aGUgZ2xvYmFsIGVycm9yIGhhbmRsZXJcbiAqIEBwYXJhbSB7RXJyb3JIYW5kbGVyfSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHNldEdsb2JhbEVycm9ySGFuZGxlcihoYW5kbGVyKSB7XG4gICAgZGVsZWdhdGVIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIGdsb2JhbEVycm9ySGFuZGxlcihleCkge1xuICAgIHRyeSB7XG4gICAgICAgIGRlbGVnYXRlSGFuZGxlcihleCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkgeyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBUcmFjZXNTYW1wbGVyVmFsdWVzO1xuKGZ1bmN0aW9uIChUcmFjZXNTYW1wbGVyVmFsdWVzKSB7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIkFsd2F5c09mZlwiXSA9IFwiYWx3YXlzX29mZlwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJBbHdheXNPblwiXSA9IFwiYWx3YXlzX29uXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT2ZmXCJdID0gXCJwYXJlbnRiYXNlZF9hbHdheXNfb2ZmXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT25cIl0gPSBcInBhcmVudGJhc2VkX2Fsd2F5c19vblwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJQYXJlbnRCYXNlZFRyYWNlSWRSYXRpb1wiXSA9IFwicGFyZW50YmFzZWRfdHJhY2VpZHJhdGlvXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlRyYWNlSWRSYXRpb1wiXSA9IFwidHJhY2VpZHJhdGlvXCI7XG59KShUcmFjZXNTYW1wbGVyVmFsdWVzIHx8IChUcmFjZXNTYW1wbGVyVmFsdWVzID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBERUZBVUxUX0xJU1RfU0VQQVJBVE9SID0gJywnO1xuLyoqXG4gKiBFbnZpcm9ubWVudCBpbnRlcmZhY2UgdG8gZGVmaW5lIGFsbCBuYW1lc1xuICovXG52YXIgRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTID0gWydPVEVMX1NES19ESVNBQkxFRCddO1xuZnVuY3Rpb24gaXNFbnZWYXJBQm9vbGVhbihrZXkpIHtcbiAgICByZXR1cm4gKEVOVklST05NRU5UX0JPT0xFQU5fS0VZUy5pbmRleE9mKGtleSkgPiAtMSk7XG59XG52YXIgRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTID0gW1xuICAgICdPVEVMX0JTUF9FWFBPUlRfVElNRU9VVCcsXG4gICAgJ09URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRScsXG4gICAgJ09URUxfQlNQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CU1BfU0NIRURVTEVfREVMQVknLFxuICAgICdPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQnLFxuICAgICdPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX1NDSEVEVUxFX0RFTEFZJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19USU1FT1VUJyxcbiAgICAnT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfUE9SVCcsXG5dO1xuZnVuY3Rpb24gaXNFbnZWYXJBTnVtYmVyKGtleSkge1xuICAgIHJldHVybiAoRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTLmluZGV4T2Yoa2V5KSA+IC0xKTtcbn1cbnZhciBFTlZJUk9OTUVOVF9MSVNUU19LRVlTID0gW1xuICAgICdPVEVMX05PX1BBVENIX01PRFVMRVMnLFxuICAgICdPVEVMX1BST1BBR0FUT1JTJyxcbiAgICAnT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4nLFxuXTtcbmZ1bmN0aW9uIGlzRW52VmFyQUxpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIEVOVklST05NRU5UX0xJU1RTX0tFWVMuaW5kZXhPZihrZXkpID4gLTE7XG59XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUID0gSW5maW5pdHk7XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCA9IDEyODtcbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqL1xudmFyIERFRkFVTFRfRU5WSVJPTk1FTlQgPSB7XG4gICAgT1RFTF9TREtfRElTQUJMRUQ6IGZhbHNlLFxuICAgIENPTlRBSU5FUl9OQU1FOiAnJyxcbiAgICBFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSV9WNDogJycsXG4gICAgRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUkk6ICcnLFxuICAgIEhPU1ROQU1FOiAnJyxcbiAgICBLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVDogJycsXG4gICAgTkFNRVNQQUNFOiAnJyxcbiAgICBPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDogMzAwMDAsXG4gICAgT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU6IDIwNDgsXG4gICAgT1RFTF9CU1BfU0NIRURVTEVfREVMQVk6IDUwMDAsXG4gICAgT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUOiAzMDAwMCxcbiAgICBPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFOiAyMDQ4LFxuICAgIE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTogNTAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9IT1NUOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9QT1JUOiA2ODMyLFxuICAgIE9URUxfRVhQT1JURVJfSkFFR0VSX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9QQVNTV09SRDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfRU5EUE9JTlQ6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOiAxMDAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOiAnaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFucycsXG4gICAgT1RFTF9MT0dfTEVWRUw6IERpYWdMb2dMZXZlbC5JTkZPLFxuICAgIE9URUxfTk9fUEFUQ0hfTU9EVUxFUzogW10sXG4gICAgT1RFTF9QUk9QQUdBVE9SUzogWyd0cmFjZWNvbnRleHQnLCAnYmFnZ2FnZSddLFxuICAgIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUzogJycsXG4gICAgT1RFTF9TRVJWSUNFX05BTUU6ICcnLFxuICAgIE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUOiBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICBPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDogMTI4LFxuICAgIE9URUxfU1BBTl9MSU5LX0NPVU5UX0xJTUlUOiAxMjgsXG4gICAgT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsXG4gICAgT1RFTF9UUkFDRVNfRVhQT1JURVI6ICcnLFxuICAgIE9URUxfVFJBQ0VTX1NBTVBMRVI6IFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixcbiAgICBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzogJycsXG4gICAgT1RFTF9MT0dTX0VYUE9SVEVSOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0lOU0VDVVJFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19JTlNFQ1VSRTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NPTVBSRVNTSU9OOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0tFWTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NMSUVOVF9DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfUFJPVE9DT0w6ICdodHRwL3Byb3RvYnVmJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1BST1RPQ09MOiAnaHR0cC9wcm90b2J1ZicsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfVEVNUE9SQUxJVFlfUFJFRkVSRU5DRTogJ2N1bXVsYXRpdmUnLFxuICAgIE9URUxfU0VNQ09OVl9TVEFCSUxJVFlfT1BUX0lOOiBbXSxcbn07XG4vKipcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZXNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSBTdHJpbmcodmFsdWVzW2tleV0pO1xuICAgIC8vIHN1cHBvcnQgY2FzZS1pbnNlbnNpdGl2ZSBcInRydWVcIlxuICAgIGVudmlyb25tZW50W2tleV0gPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4vKipcbiAqIFBhcnNlcyBhIHZhcmlhYmxlIGFzIG51bWJlciB3aXRoIG51bWJlciB2YWxpZGF0aW9uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIGVudmlyb25tZW50XG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG5hbWUsIGVudmlyb25tZW50LCB2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gICAgaWYgKG1pbiA9PT0gdm9pZCAwKSB7IG1pbiA9IC1JbmZpbml0eTsgfVxuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSBJbmZpbml0eTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVzW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIodmFsdWVzW25hbWVdKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gbWluO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudFtuYW1lXSA9IG1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBsaXN0LWxpa2Ugc3RyaW5ncyBmcm9tIGlucHV0IGludG8gb3V0cHV0LlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIHNlcGFyYXRvclxuICovXG5mdW5jdGlvbiBwYXJzZVN0cmluZ0xpc3QobmFtZSwgb3V0cHV0LCBpbnB1dCwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IERFRkFVTFRfTElTVF9TRVBBUkFUT1I7IH1cbiAgICB2YXIgZ2l2ZW5WYWx1ZSA9IGlucHV0W25hbWVdO1xuICAgIGlmICh0eXBlb2YgZ2l2ZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3V0cHV0W25hbWVdID0gZ2l2ZW5WYWx1ZS5zcGxpdChzZXBhcmF0b3IpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi50cmltKCk7IH0pO1xuICAgIH1cbn1cbi8vIFRoZSBzdXBwb3J0IHN0cmluZyAtPiBEaWFnTG9nTGV2ZWwgbWFwcGluZ3NcbnZhciBsb2dMZXZlbE1hcCA9IHtcbiAgICBBTEw6IERpYWdMb2dMZXZlbC5BTEwsXG4gICAgVkVSQk9TRTogRGlhZ0xvZ0xldmVsLlZFUkJPU0UsXG4gICAgREVCVUc6IERpYWdMb2dMZXZlbC5ERUJVRyxcbiAgICBJTkZPOiBEaWFnTG9nTGV2ZWwuSU5GTyxcbiAgICBXQVJOOiBEaWFnTG9nTGV2ZWwuV0FSTixcbiAgICBFUlJPUjogRGlhZ0xvZ0xldmVsLkVSUk9SLFxuICAgIE5PTkU6IERpYWdMb2dMZXZlbC5OT05FLFxufTtcbi8qKlxuICogRW52aXJvbm1lbnRhbGx5IHNldHMgbG9nIGxldmVsIGlmIHZhbGlkIGxvZyBsZXZlbCBzdHJpbmcgaXMgcHJvdmlkZWRcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBzZXRMb2dMZXZlbEZyb21FbnYoa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRoZUxldmVsID0gbG9nTGV2ZWxNYXBbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0aGVMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudFtrZXldID0gdGhlTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBlbnZpcm9ubWVudCB2YWx1ZXNcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VFbnZpcm9ubWVudCh2YWx1ZXMpIHtcbiAgICB2YXIgZW52aXJvbm1lbnQgPSB7fTtcbiAgICBmb3IgKHZhciBlbnYgaW4gREVGQVVMVF9FTlZJUk9OTUVOVCkge1xuICAgICAgICB2YXIga2V5ID0gZW52O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnT1RFTF9MT0dfTEVWRUwnOlxuICAgICAgICAgICAgICAgIHNldExvZ0xldmVsRnJvbUVudihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNFbnZWYXJBQm9vbGVhbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQm9vbGVhbihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU51bWJlcihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFMaXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdHJpbmdMaXN0KGtleSwgZW52aXJvbm1lbnQsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50W2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldEVudigpIHtcbiAgICB2YXIgZ2xvYmFsRW52ID0gcGFyc2VFbnZpcm9ubWVudChfZ2xvYmFsVGhpcyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfRU5WSVJPTk1FTlQsIGdsb2JhbEVudik7XG59XG5mdW5jdGlvbiBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHBhcnNlRW52aXJvbm1lbnQoX2dsb2JhbFRoaXMpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuZnVuY3Rpb24gaGV4VG9CYXNlNjQoaGV4U3RyKSB7XG4gICAgcmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoaGV4VG9CaW5hcnkoaGV4U3RyKSksIGZhbHNlKSkpO1xufVxuXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICovXG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiB1bnJlZlRpbWVyKF90aW1lcikgeyB9XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqIENvbWJpbmVzIG11bHRpcGxlIHByb3BhZ2F0b3JzIGludG8gYSBzaW5nbGUgcHJvcGFnYXRvci4gKi9cbnZhciBDb21wb3NpdGVQcm9wYWdhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbXBvc2l0ZSBwcm9wYWdhdG9yIGZyb20gYSBsaXN0IG9mIHByb3BhZ2F0b3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtjb25maWddIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjb21wb3NpdGUgcHJvcGFnYXRvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvc2l0ZVByb3BhZ2F0b3IoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0b3JzID0gKF9hID0gY29uZmlnLnByb3BhZ2F0b3JzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuX3Byb3BhZ2F0b3JzXG4gICAgICAgICAgICAvLyBvbGRlciBwcm9wYWdhdG9ycyBtYXkgbm90IGhhdmUgZmllbGRzIGZ1bmN0aW9uLCBudWxsIGNoZWNrIHRvIGJlIHN1cmVcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuICh0eXBlb2YgcC5maWVsZHMgPT09ICdmdW5jdGlvbicgPyBwLmZpZWxkcygpIDogW10pOyB9KVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geC5jb25jYXQoeSk7IH0sIFtdKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY2FycmllciBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBpbmplY3RcbiAgICAgKiBAcGFyYW0gY2FycmllciBDYXJyaWVyIGludG8gd2hpY2ggY29udGV4dCB3aWxsIGJlIGluamVjdGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5fcHJvcGFnYXRvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdG9yLmluamVjdChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byBpbmplY3Qgd2l0aCBcIiArIHByb3BhZ2F0b3IuY29uc3RydWN0b3IubmFtZSArIFwiLiBFcnI6IFwiICsgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY29udGV4dCBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBhZGQgdmFsdWVzIHRvXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgY29udGV4dFxuICAgICAqL1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgY2FycmllciwgZ2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wYWdhdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKGN0eCwgcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvci5leHRyYWN0KGN0eCwgY2FycmllciwgZ2V0dGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJGYWlsZWQgdG8gZXh0cmFjdCB3aXRoIFwiICsgcHJvcGFnYXRvci5jb25zdHJ1Y3Rvci5uYW1lICsgXCIuIEVycjogXCIgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3R4O1xuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcmV0dXJuIGEgbmV3IGFycmF5IHNvIG91ciBmaWVsZHMgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuc2xpY2UoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb3NpdGVQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBWQUxJRF9LRVlfQ0hBUl9SQU5HRSA9ICdbXzAtOWEtei0qL10nO1xudmFyIFZBTElEX0tFWSA9IFwiW2Etel1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNTV9XCI7XG52YXIgVkFMSURfVkVORE9SX0tFWSA9IFwiW2EtejAtOV1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNDB9QFthLXpdXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMTN9XCI7XG52YXIgVkFMSURfS0VZX1JFR0VYID0gbmV3IFJlZ0V4cChcIl4oPzpcIiArIFZBTElEX0tFWSArIFwifFwiICsgVkFMSURfVkVORE9SX0tFWSArIFwiKSRcIik7XG52YXIgVkFMSURfVkFMVUVfQkFTRV9SRUdFWCA9IC9eWyAtfl17MCwyNTV9WyEtfl0kLztcbnZhciBJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYID0gLyx8PS87XG4vKipcbiAqIEtleSBpcyBvcGFxdWUgc3RyaW5nIHVwIHRvIDI1NiBjaGFyYWN0ZXJzIHByaW50YWJsZS4gSXQgTVVTVCBiZWdpbiB3aXRoIGFcbiAqIGxvd2VyY2FzZSBsZXR0ZXIsIGFuZCBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBsZXR0ZXJzIGEteiwgZGlnaXRzIDAtOSxcbiAqIHVuZGVyc2NvcmVzIF8sIGRhc2hlcyAtLCBhc3Rlcmlza3MgKiwgYW5kIGZvcndhcmQgc2xhc2hlcyAvLlxuICogRm9yIG11bHRpLXRlbmFudCB2ZW5kb3Igc2NlbmFyaW9zLCBhbiBhdCBzaWduIChAKSBjYW4gYmUgdXNlZCB0byBwcmVmaXggdGhlXG4gKiB2ZW5kb3IgbmFtZS4gVmVuZG9ycyBTSE9VTEQgc2V0IHRoZSB0ZW5hbnQgSUQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5LlxuICogc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyNrZXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgcmV0dXJuIFZBTElEX0tFWV9SRUdFWC50ZXN0KGtleSk7XG59XG4vKipcbiAqIFZhbHVlIGlzIG9wYXF1ZSBzdHJpbmcgdXAgdG8gMjU2IGNoYXJhY3RlcnMgcHJpbnRhYmxlIEFTQ0lJIFJGQzAwMjBcbiAqIGNoYXJhY3RlcnMgKGkuZS4sIHRoZSByYW5nZSAweDIwIHRvIDB4N0UpIGV4Y2VwdCBjb21tYSAsIGFuZCA9LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMgPSAzMjtcbnZhciBNQVhfVFJBQ0VfU1RBVEVfTEVOID0gNTEyO1xudmFyIExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG52YXIgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSID0gJz0nO1xuLyoqXG4gKiBUcmFjZVN0YXRlIG11c3QgYmUgYSBjbGFzcyBhbmQgbm90IGEgc2ltcGxlIG9iamVjdCB0eXBlIGJlY2F1c2Ugb2YgdGhlIHNwZWNcbiAqIHJlcXVpcmVtZW50IChodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8jdHJhY2VzdGF0ZS1maWVsZCkuXG4gKlxuICogSGVyZSBpcyB0aGUgbGlzdCBvZiBhbGxvd2VkIG11dGF0aW9uczpcbiAqIC0gTmV3IGtleS12YWx1ZSBwYWlyIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcbiAqIC0gVGhlIHZhbHVlIG9mIGFueSBrZXkgY2FuIGJlIHVwZGF0ZWQuIE1vZGlmaWVkIGtleXMgTVVTVCBiZSBtb3ZlZCB0byB0aGVcbiAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAqL1xudmFyIFRyYWNlU3RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VTdGF0ZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlKVxuICAgICAgICAgICAgdGhpcy5fcGFyc2UocmF3VHJhY2VTdGF0ZSk7XG4gICAgfVxuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGUgZGlmZmVyZW50IGFwcHJvYWNoZXMobWFwIHZzIGxpc3QpIGFuZFxuICAgICAgICAvLyB1c2UgdGhlIGZhc3RlciBvbmUuXG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFN0YXRlLmdldChrZXkpO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5cygpXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIGtleSkge1xuICAgICAgICAgICAgYWdnLnB1c2goa2V5ICsgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSICsgX3RoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9wYXJzZSA9IGZ1bmN0aW9uIChyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gU3RvcmUgaW4gcmV2ZXJzZSBzbyBuZXcga2V5cyAoLnNldCguLi4pKSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIHBhcnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIHZhciBpID0gbGlzdE1lbWJlci5pbmRleE9mKExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUik7XG4gICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gbGlzdE1lbWJlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWdnO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSByZXZlcnNlKCkgcmVxdWlyZW1lbnQsIHRydW5jIG11c3QgYmUgZG9uZSBhZnRlciBtYXAgaXMgY3JlYXRlZFxuICAgICAgICBpZiAodGhpcy5faW50ZXJuYWxTdGF0ZS5zaXplID4gTUFYX1RSQUNFX1NUQVRFX0lURU1TKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcChBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gVXNlIHJldmVyc2Ugc2FtZSBhcyBvcmlnaW5hbCB0cmFjZXN0YXRlIHBhcnNlIGNoYWluXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIE1BWF9UUkFDRV9TVEFURV9JVEVNUykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fa2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcCh0aGlzLl9pbnRlcm5hbFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VTdGF0ZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgVFJBQ0VfUEFSRU5UX0hFQURFUiA9ICd0cmFjZXBhcmVudCc7XG52YXIgVFJBQ0VfU1RBVEVfSEVBREVSID0gJ3RyYWNlc3RhdGUnO1xudmFyIFZFUlNJT04gPSAnMDAnO1xudmFyIFZFUlNJT05fUEFSVCA9ICcoPyFmZilbXFxcXGRhLWZdezJ9JztcbnZhciBUUkFDRV9JRF9QQVJUID0gJyg/IVswXXszMn0pW1xcXFxkYS1mXXszMn0nO1xudmFyIFBBUkVOVF9JRF9QQVJUID0gJyg/IVswXXsxNn0pW1xcXFxkYS1mXXsxNn0nO1xudmFyIEZMQUdTX1BBUlQgPSAnW1xcXFxkYS1mXXsyfSc7XG52YXIgVFJBQ0VfUEFSRU5UX1JFR0VYID0gbmV3IFJlZ0V4cChcIl5cXFxccz8oXCIgKyBWRVJTSU9OX1BBUlQgKyBcIiktKFwiICsgVFJBQ0VfSURfUEFSVCArIFwiKS0oXCIgKyBQQVJFTlRfSURfUEFSVCArIFwiKS0oXCIgKyBGTEFHU19QQVJUICsgXCIpKC0uKik/XFxcXHM/JFwiKTtcbi8qKlxuICogUGFyc2VzIGluZm9ybWF0aW9uIGZyb20gdGhlIFt0cmFjZXBhcmVudF0gc3BhbiB0YWcgYW5kIGNvbnZlcnRzIGl0IGludG8ge0BsaW5rIFNwYW5Db250ZXh0fVxuICogQHBhcmFtIHRyYWNlUGFyZW50IC0gQSBtZXRhIHByb3BlcnR5IHRoYXQgY29tZXMgZnJvbSBzZXJ2ZXIuXG4gKiAgICAgSXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzZXJ2ZXIgc2lkZSB0byBoYXZlIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHRyYWNlIElkLFxuICogICAgIGEgcGFyZW50IHNwYW4gSWQgdGhhdCB3YXMgc2V0IG9uIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHNwYW4sXG4gKiAgICAgYW5kIHRoZSB0cmFjZSBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc2VydmVyJ3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAqICAgICAoMDEgPSBzYW1wbGVkLCAwMCA9IG5vdCBzYW1wbGVkKS5cbiAqICAgICBmb3IgZXhhbXBsZTogJ3t2ZXJzaW9ufS17dHJhY2VJZH0te3NwYW5JZH0te3NhbXBsZURlY2lzaW9ufSdcbiAqICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0L31cbiAqL1xuZnVuY3Rpb24gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCkge1xuICAgIHZhciBtYXRjaCA9IFRSQUNFX1BBUkVOVF9SRUdFWC5leGVjKHRyYWNlUGFyZW50KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMuIElmIHRoZXJlIGFyZSBtb3JlIHBhcnRzLCB3ZSBvbmx5IHJlamVjdCBpdCBpZiBpdCdzIHVzaW5nIHZlcnNpb24gMDBcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3ZlcnNpb25pbmctb2YtdHJhY2VwYXJlbnRcbiAgICBpZiAobWF0Y2hbMV0gPT09ICcwMCcgJiYgbWF0Y2hbNV0pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyYWNlSWQ6IG1hdGNoWzJdLFxuICAgICAgICBzcGFuSWQ6IG1hdGNoWzNdLFxuICAgICAgICB0cmFjZUZsYWdzOiBwYXJzZUludChtYXRjaFs0XSwgMTYpLFxuICAgIH07XG59XG4vKipcbiAqIFByb3BhZ2F0ZXMge0BsaW5rIFNwYW5Db250ZXh0fSB0aHJvdWdoIFRyYWNlIENvbnRleHQgZm9ybWF0IHByb3BhZ2F0aW9uLlxuICpcbiAqIEJhc2VkIG9uIHRoZSBUcmFjZSBDb250ZXh0IHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC9cbiAqL1xudmFyIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgc3BhbkNvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcGFuQ29udGV4dCB8fFxuICAgICAgICAgICAgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSB8fFxuICAgICAgICAgICAgIWlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB0cmFjZVBhcmVudCA9IFZFUlNJT04gKyBcIi1cIiArIHNwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHNwYW5Db250ZXh0LnNwYW5JZCArIFwiLTBcIiArIE51bWJlcihzcGFuQ29udGV4dC50cmFjZUZsYWdzIHx8IFRyYWNlRmxhZ3MuTk9ORSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBzZXR0ZXIuc2V0KGNhcnJpZXIsIFRSQUNFX1BBUkVOVF9IRUFERVIsIHRyYWNlUGFyZW50KTtcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlU3RhdGUpIHtcbiAgICAgICAgICAgIHNldHRlci5zZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSLCBzcGFuQ29udGV4dC50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIHRyYWNlUGFyZW50SGVhZGVyID0gZ2V0dGVyLmdldChjYXJyaWVyLCBUUkFDRV9QQVJFTlRfSEVBREVSKTtcbiAgICAgICAgaWYgKCF0cmFjZVBhcmVudEhlYWRlcilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgdHJhY2VQYXJlbnQgPSBBcnJheS5pc0FycmF5KHRyYWNlUGFyZW50SGVhZGVyKVxuICAgICAgICAgICAgPyB0cmFjZVBhcmVudEhlYWRlclswXVxuICAgICAgICAgICAgOiB0cmFjZVBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFjZVBhcmVudCAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCk7XG4gICAgICAgIGlmICghc3BhbkNvbnRleHQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgc3BhbkNvbnRleHQuaXNSZW1vdGUgPSB0cnVlO1xuICAgICAgICB2YXIgdHJhY2VTdGF0ZUhlYWRlciA9IGdldHRlci5nZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGVIZWFkZXIpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYHRyYWNlc3RhdGVgIGhlYWRlciBpcyBmb3VuZCwgd2UgbWVyZ2UgdGhlbSBpbnRvIGFcbiAgICAgICAgICAgIC8vIHNpbmdsZSBoZWFkZXIuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBBcnJheS5pc0FycmF5KHRyYWNlU3RhdGVIZWFkZXIpXG4gICAgICAgICAgICAgICAgPyB0cmFjZVN0YXRlSGVhZGVyLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIDogdHJhY2VTdGF0ZUhlYWRlcjtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0LnRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSh0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnID8gc3RhdGUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjZS5zZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCk7XG4gICAgfTtcbiAgICBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbVFJBQ0VfUEFSRU5UX0hFQURFUiwgVFJBQ0VfU1RBVEVfSEVBREVSXTtcbiAgICB9O1xuICAgIHJldHVybiBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBSUENfTUVUQURBVEFfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBTREsgQ29udGV4dCBLZXkgUlBDX01FVEFEQVRBJyk7XG52YXIgUlBDVHlwZTtcbihmdW5jdGlvbiAoUlBDVHlwZSkge1xuICAgIFJQQ1R5cGVbXCJIVFRQXCJdID0gXCJodHRwXCI7XG59KShSUENUeXBlIHx8IChSUENUeXBlID0ge30pKTtcbmZ1bmN0aW9uIHNldFJQQ01ldGFkYXRhKGNvbnRleHQsIG1ldGEpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZLCBtZXRhKTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cbmZ1bmN0aW9uIGdldFJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLlxuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuXG4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uZSBkZWZpbmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qKlxuICogYmFzZWQgb24gbG9kYXNoIGluIG9yZGVyIHRvIHN1cHBvcnQgZXNtIGJ1aWxkcyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbiAqIGxvZGFzaCBpcyB1c2luZyBNSVQgTGljZW5zZS5cbiAqKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nO1xudmFyIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICB9XG4gICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB2YXIgdW5tYXNrZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHVubWFza2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc2lsZW5jZVxuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIE1BWF9MRVZFTCA9IDIwO1xuLyoqXG4gKiBNZXJnZXMgb2JqZWN0cyB0b2dldGhlclxuICogQHBhcmFtIGFyZ3MgLSBvYmplY3RzIC8gdmFsdWVzIHRvIGJlIG1lcmdlZFxuICovXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGFyZ3Muc2hpZnQoKTtcbiAgICB2YXIgb2JqZWN0cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSBtZXJnZVR3b09iamVjdHMocmVzdWx0LCBhcmdzLnNoaWZ0KCksIDAsIG9iamVjdHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdGFrZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIE1lcmdlcyB0d28gb2JqZWN0c1xuICogQHBhcmFtIG9uZSAtIGZpcnN0IG9iamVjdFxuICogQHBhcmFtIHR3byAtIHNlY29uZCBvYmplY3RcbiAqIEBwYXJhbSBsZXZlbCAtIGN1cnJlbnQgZGVlcCBsZXZlbFxuICogQHBhcmFtIG9iamVjdHMgLSBvYmplY3RzIGhvbGRlciB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVmZXJlbmNlZCAtIHRvIHByZXZlbnRcbiAqIGN5Y2xpYyBkZXBlbmRlbmN5XG4gKi9cbmZ1bmN0aW9uIG1lcmdlVHdvT2JqZWN0cyhvbmUsIHR3bywgbGV2ZWwsIG9iamVjdHMpIHtcbiAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IDA7IH1cbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChsZXZlbCA+IE1BWF9MRVZFTCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXZlbCsrO1xuICAgIGlmIChpc1ByaW1pdGl2ZShvbmUpIHx8IGlzUHJpbWl0aXZlKHR3bykgfHwgaXNGdW5jdGlvbih0d28pKSB7XG4gICAgICAgIHJlc3VsdCA9IHRha2VWYWx1ZSh0d28pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KG9uZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gb25lLnNsaWNlKCk7XG4gICAgICAgIGlmIChpc0FycmF5KHR3bykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdHdvLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRha2VWYWx1ZSh0d29baV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCh0d28pKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9uZSkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHR3bykpIHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkTWVyZ2Uob25lLCB0d28pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9uZSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHR3b1ZhbHVlID0gdHdvW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHR3b1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR3b1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajEgPSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajIgPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc09iamVjdFJlZmVyZW5jZWQob25lLCBrZXksIG9iamVjdHMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNPYmplY3RSZWZlcmVuY2VkKHR3bywga2V5LCBvYmplY3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9iajEpICYmIGlzT2JqZWN0KG9iajIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjEgPSBvYmplY3RzLmdldChvYmoxKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyMiA9IG9iamVjdHMuZ2V0KG9iajIpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7IG9iajogb25lLCBrZXk6IGtleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIyLnB1c2goeyBvYmo6IHR3bywga2V5OiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMSwgYXJyMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMiwgYXJyMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlVHdvT2JqZWN0cyhyZXN1bHRba2V5XSwgdHdvVmFsdWUsIGxldmVsLCBvYmplY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHR3bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBvYmplY3QgaGFzIGJlZW4gYWxyZWFkeSByZWZlcmVuY2VcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIHdhc09iamVjdFJlZmVyZW5jZWQob2JqLCBrZXksIG9iamVjdHMpIHtcbiAgICB2YXIgYXJyID0gb2JqZWN0cy5nZXQob2JqW2tleV0pIHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICB2YXIgaW5mbyA9IGFycltpXTtcbiAgICAgICAgaWYgKGluZm8ua2V5ID09PSBrZXkgJiYgaW5mby5vYmogPT09IG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gKCFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc0Z1bmN0aW9uKHZhbHVlKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgdmFsdWUgPT09IG51bGwpO1xufVxuZnVuY3Rpb24gc2hvdWxkTWVyZ2Uob25lLCB0d28pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob25lKSB8fCAhaXNQbGFpbk9iamVjdCh0d28pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRXJyb3IgdGhhdCBpcyB0aHJvd24gb24gdGltZW91dHMuXG4gKi9cbnZhciBUaW1lb3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRpbWVvdXRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lb3V0RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICAvLyBtYW51YWxseSBhZGp1c3QgcHJvdG90eXBlIHRvIHJldGFpbiBgaW5zdGFuY2VvZmAgZnVuY3Rpb25hbGl0eSB3aGVuIHRhcmdldGluZyBFUzUsIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYWluL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVGltZW91dEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbi8qKlxuICogQWRkcyBhIHRpbWVvdXQgdG8gYSBwcm9taXNlIGFuZCByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgdGltZW91dCBoYXMgZWxhcHNlZC4gQWxzbyByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZVxuICogcmVqZWN0cywgYW5kIHJlc29sdmVzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZSByZXNvbHZlcy5cbiAqXG4gKiA8cD4gTk9URTogdGhpcyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGl0IHRocm93cyBhIHtAbGluayBUaW1lb3V0RXJyb3J9LlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIHByb21pc2UgdG8gdXNlIHdpdGggdGltZW91dC5cbiAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXQpIHtcbiAgICB2YXIgdGltZW91dEhhbmRsZTtcbiAgICB2YXIgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiB0aW1lb3V0RnVuY3Rpb24oX3Jlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0SGFuZGxlcigpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCdPcGVyYXRpb24gdGltZWQgb3V0LicpKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZW91dFByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENoZWNrcyBpZiBjZXJ0YWluIGZ1bmN0aW9uIGhhcyBiZWVuIGFscmVhZHkgd3JhcHBlZFxuICogQHBhcmFtIGZ1bmNcbiAqL1xuZnVuY3Rpb24gaXNXcmFwcGVkKGZ1bmMpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fb3JpZ2luYWwgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGZ1bmMuX191bndyYXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZnVuYy5fX3dyYXBwZWQgPT09IHRydWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIERlZmVycmVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgX3RoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZlcnJlZC5wcm90b3R5cGUsIFwicHJvbWlzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWwpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fcmVqZWN0KGVycik7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIEJpbmQgdGhlIGNhbGxiYWNrIGFuZCBvbmx5IGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSByZWdhcmRsZXNzIGhvdyBtYW55IHRpbWVzIGBCaW5kT25jZUZ1dHVyZS5jYWxsYCBpcyBpbnZva2VkLlxuICovXG52YXIgQmluZE9uY2VGdXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZE9uY2VGdXR1cmUoX2NhbGxiYWNrLCBfdGhhdCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IF9jYWxsYmFjaztcbiAgICAgICAgdGhpcy5fdGhhdCA9IF90aGF0O1xuICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcImlzQ2FsbGVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcInByb21pc2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgoX2EgPSB0aGlzLl9jYWxsYmFjaykuY2FsbC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbdGhpcy5fdGhhdF0sIF9fcmVhZChhcmdzKSwgZmFsc2UpKSkudGhlbihmdW5jdGlvbiAodmFsKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh2YWwpOyB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRPbmNlRnV0dXJlO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKiBTaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IEV4cG9ydGVycyB3aGlsZSBleHBvcnRpbmcgZGF0YSwgaW5jbHVkaW5nIHN1cHByZXNzaW9uIG9mIFRyYWNlcy5cbiAqL1xuZnVuY3Rpb24gX2V4cG9ydChleHBvcnRlciwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwb3J0ZXIuZXhwb3J0KGFyZywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBiYWdnYWdlVXRpbHMgPSB7XG4gICAgZ2V0S2V5UGFpcnM6IGdldEtleVBhaXJzLFxuICAgIHNlcmlhbGl6ZUtleVBhaXJzOiBzZXJpYWxpemVLZXlQYWlycyxcbiAgICBwYXJzZUtleVBhaXJzSW50b1JlY29yZDogcGFyc2VLZXlQYWlyc0ludG9SZWNvcmQsXG4gICAgcGFyc2VQYWlyS2V5VmFsdWU6IHBhcnNlUGFpcktleVZhbHVlLFxufTtcbnZhciBpbnRlcm5hbCA9IHtcbiAgICBfZXhwb3J0OiBfZXhwb3J0LFxufTtcblxuY29uc3QgZXNtID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoLyojX19QVVJFX18qL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIEFsd2F5c09mZlNhbXBsZXIsXG4gICAgQWx3YXlzT25TYW1wbGVyLFxuICAgIEFuY2hvcmVkQ2xvY2ssXG4gICAgQmluZE9uY2VGdXR1cmUsXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvcixcbiAgICBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgREVGQVVMVF9FTlZJUk9OTUVOVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgIGdldCBFeHBvcnRSZXN1bHRDb2RlICgpIHsgcmV0dXJuIEV4cG9ydFJlc3VsdENvZGU7IH0sXG4gICAgUGFyZW50QmFzZWRTYW1wbGVyLFxuICAgIGdldCBSUENUeXBlICgpIHsgcmV0dXJuIFJQQ1R5cGU7IH0sXG4gICAgUmFuZG9tSWRHZW5lcmF0b3IsXG4gICAgU0RLX0lORk8sXG4gICAgVFJBQ0VfUEFSRU5UX0hFQURFUixcbiAgICBUUkFDRV9TVEFURV9IRUFERVIsXG4gICAgVGltZW91dEVycm9yLFxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcixcbiAgICBUcmFjZVN0YXRlLFxuICAgIGdldCBUcmFjZXNTYW1wbGVyVmFsdWVzICgpIHsgcmV0dXJuIFRyYWNlc1NhbXBsZXJWYWx1ZXM7IH0sXG4gICAgVkVSU0lPTjogVkVSU0lPTiQxLFxuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLFxuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsXG4gICAgX2dsb2JhbFRoaXMsXG4gICAgYWRkSHJUaW1lcyxcbiAgICBiYWdnYWdlVXRpbHMsXG4gICAgY2FsbFdpdGhUaW1lb3V0LFxuICAgIGRlbGV0ZVJQQ01ldGFkYXRhLFxuICAgIGdldEVudixcbiAgICBnZXRFbnZXaXRob3V0RGVmYXVsdHMsXG4gICAgZ2V0UlBDTWV0YWRhdGEsXG4gICAgZ2V0VGltZU9yaWdpbixcbiAgICBnbG9iYWxFcnJvckhhbmRsZXIsXG4gICAgaGV4VG9CYXNlNjQsXG4gICAgaGV4VG9CaW5hcnksXG4gICAgaHJUaW1lLFxuICAgIGhyVGltZUR1cmF0aW9uLFxuICAgIGhyVGltZVRvTWljcm9zZWNvbmRzLFxuICAgIGhyVGltZVRvTWlsbGlzZWNvbmRzLFxuICAgIGhyVGltZVRvTmFub3NlY29uZHMsXG4gICAgaHJUaW1lVG9UaW1lU3RhbXAsXG4gICAgaW50ZXJuYWwsXG4gICAgaXNBdHRyaWJ1dGVLZXksXG4gICAgaXNBdHRyaWJ1dGVWYWx1ZSxcbiAgICBpc1RpbWVJbnB1dCxcbiAgICBpc1RpbWVJbnB1dEhyVGltZSxcbiAgICBpc1RyYWNpbmdTdXBwcmVzc2VkLFxuICAgIGlzVXJsSWdub3JlZCxcbiAgICBpc1dyYXBwZWQsXG4gICAgbG9nZ2luZ0Vycm9ySGFuZGxlcixcbiAgICBtZXJnZSxcbiAgICBtaWxsaXNUb0hyVGltZSxcbiAgICBvdHBlcmZvcm1hbmNlLFxuICAgIHBhcnNlRW52aXJvbm1lbnQsXG4gICAgcGFyc2VUcmFjZVBhcmVudCxcbiAgICBzYW5pdGl6ZUF0dHJpYnV0ZXMsXG4gICAgc2V0R2xvYmFsRXJyb3JIYW5kbGVyLFxuICAgIHNldFJQQ01ldGFkYXRhLFxuICAgIHN1cHByZXNzVHJhY2luZyxcbiAgICB0aW1lSW5wdXRUb0hyVGltZSxcbiAgICB1bnJlZlRpbWVyLFxuICAgIHVuc3VwcHJlc3NUcmFjaW5nLFxuICAgIHVybE1hdGNoZXNcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSkpO1xuXG5leHBvcnQgeyBCaW5kT25jZUZ1dHVyZSBhcyBCLCBDb21wb3NpdGVQcm9wYWdhdG9yIGFzIEMsIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIGFzIEQsIFNhbXBsaW5nRGVjaXNpb24gYXMgUywgVHJhY2VzU2FtcGxlclZhbHVlcyBhcyBULCBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yIGFzIFcsIGdldEVudiBhcyBhLCBnZXRFbnZXaXRob3V0RGVmYXVsdHMgYXMgYiwgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIGFzIGMsIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yIGFzIGQsIGludGVybmFsIGFzIGUsIGVzbSBhcyBmLCBnbG9iYWxFcnJvckhhbmRsZXIgYXMgZywgaXNBdHRyaWJ1dGVWYWx1ZSBhcyBpLCBtZXJnZSBhcyBtLCBzYW5pdGl6ZUF0dHJpYnV0ZXMgYXMgcywgdW5yZWZUaW1lciBhcyB1IH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQyxLQUFLQyxHQUFhLEtBQUtDLEdBQWEsS0FBS0MsSUFBWSxLQUFLQyxJQUFlLEtBQUtDLElBQVEsS0FBS0MsSUFBZ0IsS0FBS0MsSUFBc0IsTUFBTUMsSUFBc0IsS0FBS0MsSUFBcUIsTUFBTUMsSUFBbUIsS0FBS0MsSUFBYSxLQUFLQyxJQUFtQixLQUFLQyxJQUFjLEtB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O0FBQUEsRUFDQSxxQkFBQUM7QUFBQSxFQUNBLG1CQUFBQztBQUFBLEVBQ0EsVUFBQXNTO0FBQUEsRUFDQSxnQkFBQXBOO0FBQUEsRUFDQSxrQkFBQUM7QUFBQSxFQUNBLGFBQUFsRjtBQUFBLEVBQ0EsbUJBQUFDO0FBQUEsRUFDQSxxQkFBQU07QUFBQSxFQUNBLGNBQUFMO0FBQUEsRUFDQSxXQUFBd1I7QUFBQSxFQUNBLHFCQUFBN0w7QUFBQSxFQUNBLE9BQUFxSjtBQUFBLEVBQ0EsZ0JBQUEvTztBQUFBLEVBQ0EsZUFBQUM7QUFBQSxFQUNBLGtCQUFBZ0k7QUFBQSxFQUNBLGtCQUFBeUQ7QUFBQSxFQUNBLG9CQUFBbkg7QUFBQSxFQUNBLHVCQUFBMEI7QUFBQSxFQUNBLGdCQUFBbUc7QUFBQSxFQUNBLGlCQUFBL0w7QUFBQSxFQUNBLG1CQUFBSDtBQUFBLEVBQ0EsWUFBQWtKO0FBQUEsRUFDQSxtQkFBQTlJO0FBQUEsRUFDQSxZQUFBSDtBQUNKLEdBQUcsT0FBTyxhQUFhLEVBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQzsiLAogICJuYW1lcyI6IFsiYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIiwgInByb3BhZ2F0aW9uIiwgIl9nbG9iYWxUaGlzIiwgImFkZEhyVGltZXMiLCAiZ2V0VGltZU9yaWdpbiIsICJoclRpbWUiLCAiaHJUaW1lRHVyYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaHJUaW1lVG9NaWxsaXNlY29uZHMiLCAiaHJUaW1lVG9OYW5vc2Vjb25kcyIsICJoclRpbWVUb1RpbWVTdGFtcCIsICJpc1RpbWVJbnB1dCIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJpc1VybElnbm9yZWQiLCAibWlsbGlzVG9IclRpbWUiLCAib3RwZXJmb3JtYW5jZSIsICJ0aW1lSW5wdXRUb0hyVGltZSIsICJ1cmxNYXRjaGVzIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAic3VwcHJlc3NUcmFjaW5nIiwgInVuc3VwcHJlc3NUcmFjaW5nIiwgImRpYWciLCAiaGV4VG9CaW5hcnkiLCAiRXhwb3J0UmVzdWx0Q29kZSIsICJEaWFnTG9nTGV2ZWwiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiY3JlYXRlQ29udGV4dEtleSIsICJpc1ZhbGlkVHJhY2VJZCIsICJjb250ZXh0IiwgIlNES19JTkZPIiwgIlZFUlNJT04kMSIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SIiwgIkJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9IRUFERVIiLCAiQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEgiLCAiX19yZWFkJDMiLCAibyIsICJuIiwgIm0iLCAiaSIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAic2VyaWFsaXplS2V5UGFpcnMiLCAia2V5UGFpcnMiLCAiaFZhbHVlIiwgImN1cnJlbnQiLCAidmFsdWUiLCAiZ2V0S2V5UGFpcnMiLCAiYmFnZ2FnZSIsICJfYSIsICJfYiIsICJrZXkiLCAiZW50cnkiLCAicGFyc2VQYWlyS2V5VmFsdWUiLCAidmFsdWVQcm9wcyIsICJrZXlQYWlyUGFydCIsICJzZXBhcmF0b3JJbmRleCIsICJtZXRhZGF0YSIsICJwYXJzZUtleVBhaXJzSW50b1JlY29yZCIsICJrZXlQYWlyIiwgImhlYWRlcnMiLCAiVzNDQmFnZ2FnZVByb3BhZ2F0b3IiLCAiY2FycmllciIsICJzZXR0ZXIiLCAicGFpciIsICJoZWFkZXJWYWx1ZSIsICJnZXR0ZXIiLCAiYmFnZ2FnZVN0cmluZyIsICJwYWlycyIsICJiYWdnYWdlRW50cnkiLCAiQW5jaG9yZWRDbG9jayIsICJzeXN0ZW1DbG9jayIsICJtb25vdG9uaWNDbG9jayIsICJkZWx0YSIsICJfX3ZhbHVlcyQxIiwgInMiLCAiX19yZWFkJDIiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXMiLCAiZV8xIiwgIm91dCIsICJfYyIsICJfZCIsICJ2YWwiLCAiaXNBdHRyaWJ1dGVLZXkiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJlXzFfMSIsICJpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSIsICJpc1ZhbGlkUHJpbWl0aXZlQXR0cmlidXRlVmFsdWUiLCAiYXJyIiwgImVfMiIsICJ0eXBlIiwgImFycl8xIiwgImFycl8xXzEiLCAiZWxlbWVudCIsICJlXzJfMSIsICJsb2dnaW5nRXJyb3JIYW5kbGVyIiwgImV4IiwgInN0cmluZ2lmeUV4Y2VwdGlvbiIsICJmbGF0dGVuRXhjZXB0aW9uIiwgInJlc3VsdCIsICJwcm9wZXJ0eU5hbWUiLCAiZGVsZWdhdGVIYW5kbGVyIiwgInNldEdsb2JhbEVycm9ySGFuZGxlciIsICJoYW5kbGVyIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgIkRFRkFVTFRfTElTVF9TRVBBUkFUT1IiLCAiRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTIiwgImlzRW52VmFyQUJvb2xlYW4iLCAiRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTIiwgImlzRW52VmFyQU51bWJlciIsICJFTlZJUk9OTUVOVF9MSVNUU19LRVlTIiwgImlzRW52VmFyQUxpc3QiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9FTlZJUk9OTUVOVCIsICJwYXJzZUJvb2xlYW4iLCAiZW52aXJvbm1lbnQiLCAidmFsdWVzIiwgInBhcnNlTnVtYmVyIiwgIm5hbWUiLCAibWluIiwgIm1heCIsICJwYXJzZVN0cmluZ0xpc3QiLCAib3V0cHV0IiwgImlucHV0IiwgInNlcGFyYXRvciIsICJnaXZlblZhbHVlIiwgInYiLCAibG9nTGV2ZWxNYXAiLCAic2V0TG9nTGV2ZWxGcm9tRW52IiwgInRoZUxldmVsIiwgInBhcnNlRW52aXJvbm1lbnQiLCAiZW52IiwgImdldEVudiIsICJnbG9iYWxFbnYiLCAiZ2V0RW52V2l0aG91dERlZmF1bHRzIiwgIl9fcmVhZCQxIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJoZXhUb0Jhc2U2NCIsICJoZXhTdHIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJ1bnJlZlRpbWVyIiwgIl90aW1lciIsICJfX3ZhbHVlcyIsICJDb21wb3NpdGVQcm9wYWdhdG9yIiwgImNvbmZpZyIsICJwIiwgIngiLCAieSIsICJwcm9wYWdhdG9yIiwgImVyciIsICJjdHgiLCAiVkFMSURfS0VZX0NIQVJfUkFOR0UiLCAiVkFMSURfS0VZIiwgIlZBTElEX1ZFTkRPUl9LRVkiLCAiVkFMSURfS0VZX1JFR0VYIiwgIlZBTElEX1ZBTFVFX0JBU0VfUkVHRVgiLCAiSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCIsICJ2YWxpZGF0ZUtleSIsICJ2YWxpZGF0ZVZhbHVlIiwgIk1BWF9UUkFDRV9TVEFURV9JVEVNUyIsICJNQVhfVFJBQ0VfU1RBVEVfTEVOIiwgIkxJU1RfTUVNQkVSU19TRVBBUkFUT1IiLCAiTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSIiwgIlRyYWNlU3RhdGUiLCAicmF3VHJhY2VTdGF0ZSIsICJ0cmFjZVN0YXRlIiwgIl90aGlzIiwgImFnZyIsICJwYXJ0IiwgImxpc3RNZW1iZXIiLCAiVFJBQ0VfUEFSRU5UX0hFQURFUiIsICJUUkFDRV9TVEFURV9IRUFERVIiLCAiVkVSU0lPTiIsICJWRVJTSU9OX1BBUlQiLCAiVFJBQ0VfSURfUEFSVCIsICJQQVJFTlRfSURfUEFSVCIsICJGTEFHU19QQVJUIiwgIlRSQUNFX1BBUkVOVF9SRUdFWCIsICJwYXJzZVRyYWNlUGFyZW50IiwgInRyYWNlUGFyZW50IiwgIm1hdGNoIiwgIlczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IiLCAic3BhbkNvbnRleHQiLCAidHJhY2VQYXJlbnRIZWFkZXIiLCAidHJhY2VTdGF0ZUhlYWRlciIsICJzdGF0ZSIsICJSUENfTUVUQURBVEFfS0VZIiwgIlJQQ1R5cGUiLCAic2V0UlBDTWV0YWRhdGEiLCAibWV0YSIsICJkZWxldGVSUENNZXRhZGF0YSIsICJnZXRSUENNZXRhZGF0YSIsICJBbHdheXNPZmZTYW1wbGVyIiwgIkFsd2F5c09uU2FtcGxlciIsICJQYXJlbnRCYXNlZFNhbXBsZXIiLCAidHJhY2VJZCIsICJzcGFuTmFtZSIsICJzcGFuS2luZCIsICJsaW5rcyIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJvYmplY3RUYWciLCAibnVsbFRhZyIsICJ1bmRlZmluZWRUYWciLCAiZnVuY1Byb3RvIiwgImZ1bmNUb1N0cmluZyIsICJvYmplY3RDdG9yU3RyaW5nIiwgImdldFByb3RvdHlwZSIsICJvdmVyQXJnIiwgIm9iamVjdFByb3RvIiwgImhhc093blByb3BlcnR5IiwgInN5bVRvU3RyaW5nVGFnIiwgIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwgImZ1bmMiLCAidHJhbnNmb3JtIiwgImFyZyIsICJpc1BsYWluT2JqZWN0IiwgImlzT2JqZWN0TGlrZSIsICJiYXNlR2V0VGFnIiwgInByb3RvIiwgIkN0b3IiLCAiZ2V0UmF3VGFnIiwgIm9iamVjdFRvU3RyaW5nIiwgImlzT3duIiwgInRhZyIsICJ1bm1hc2tlZCIsICJNQVhfTEVWRUwiLCAibWVyZ2UiLCAiYXJncyIsICJfaSIsICJvYmplY3RzIiwgIm1lcmdlVHdvT2JqZWN0cyIsICJ0YWtlVmFsdWUiLCAiaXNBcnJheSIsICJvbmUiLCAidHdvIiwgImxldmVsIiwgImlzUHJpbWl0aXZlIiwgImlzRnVuY3Rpb24iLCAiaiIsICJpc09iamVjdCIsICJrZXlzIiwgInNob3VsZE1lcmdlIiwgInR3b1ZhbHVlIiwgIm9iajEiLCAib2JqMiIsICJ3YXNPYmplY3RSZWZlcmVuY2VkIiwgImFycjEiLCAiYXJyMiIsICJvYmoiLCAiaW5mbyIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiVGltZW91dEVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgImNhbGxXaXRoVGltZW91dCIsICJwcm9taXNlIiwgInRpbWVvdXQiLCAidGltZW91dEhhbmRsZSIsICJ0aW1lb3V0UHJvbWlzZSIsICJfcmVzb2x2ZSIsICJyZWplY3QiLCAicmVhc29uIiwgImlzV3JhcHBlZCIsICJEZWZlcnJlZCIsICJyZXNvbHZlIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkJpbmRPbmNlRnV0dXJlIiwgIl9jYWxsYmFjayIsICJfdGhhdCIsICJfZXhwb3J0IiwgImV4cG9ydGVyIiwgImJhZ2dhZ2VVdGlscyIsICJpbnRlcm5hbCIsICJlc20iXQp9Cg==
1012
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBtfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogYXMgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nLCBwIGFzIHByb3BhZ2F0aW9uLCBfIGFzIF9nbG9iYWxUaGlzLCBzIGFzIGFkZEhyVGltZXMsIGwgYXMgZ2V0VGltZU9yaWdpbiwgaiBhcyBoclRpbWUsIHEgYXMgaHJUaW1lRHVyYXRpb24sIHkgYXMgaHJUaW1lVG9NaWNyb3NlY29uZHMsIGRLIGFzIGhyVGltZVRvTWlsbGlzZWNvbmRzLCBoIGFzIGhyVGltZVRvTmFub3NlY29uZHMsIGRMIGFzIGhyVGltZVRvVGltZVN0YW1wLCBuIGFzIGlzVGltZUlucHV0LCByIGFzIGlzVGltZUlucHV0SHJUaW1lLCBpIGFzIGlzVXJsSWdub3JlZCwgbSBhcyBtaWxsaXNUb0hyVGltZSwgbyBhcyBvdHBlcmZvcm1hbmNlLCB0IGFzIHRpbWVJbnB1dFRvSHJUaW1lLCB1IGFzIHVybE1hdGNoZXMgfSBmcm9tICcuL3VybC0hfnswMGR9fi5qcyc7XG5pbXBvcnQgeyBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQsIHMgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVuc3VwcHJlc3NUcmFjaW5nIH0gZnJvbSAnLi9zdXBwcmVzcy10cmFjaW5nLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IGQgYXMgZGlhZyB9IGZyb20gJy4vZGlhZy1hcGktIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaCBhcyBoZXhUb0JpbmFyeSwgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuaW1wb3J0IHsgZiBhcyBEaWFnTG9nTGV2ZWwsIHQgYXMgdHJhY2UsIGkgYXMgaXNTcGFuQ29udGV4dFZhbGlkLCBUIGFzIFRyYWNlRmxhZ3MsIGMgYXMgY3JlYXRlQ29udGV4dEtleSwgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0IH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBhIGFzIFNES19JTkZPLCBibSBhcyBWRVJTSU9OJDEgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwaH1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvbmUgZGVjbGFyZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIEEgc2FtcGxpbmcgZGVjaXNpb24gdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHtAbGluayBTcGFufSB3aWxsIGJlIHJlY29yZGVkXG4gKiBhbmQgY29sbGVjdGVkLlxuICovXG52YXIgU2FtcGxpbmdEZWNpc2lvbjtcbihmdW5jdGlvbiAoU2FtcGxpbmdEZWNpc2lvbikge1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IGZhbHNlYCwgc3BhbiB3aWxsIG5vdCBiZSByZWNvcmRlZCBhbmQgYWxsIGV2ZW50c1xuICAgICAqIGFuZCBhdHRyaWJ1dGVzIHdpbGwgYmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJOT1RfUkVDT1JEXCJdID0gMF0gPSBcIk5PVF9SRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCwgYnV0IGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgTk9UIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRcIl0gPSAxXSA9IFwiUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAgQU5EIGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRF9BTkRfU0FNUExFRFwiXSA9IDJdID0gXCJSRUNPUkRfQU5EX1NBTVBMRURcIjtcbn0pKFNhbXBsaW5nRGVjaXNpb24gfHwgKFNhbXBsaW5nRGVjaXNpb24gPSB7fSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SID0gJz0nO1xudmFyIEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IgPSAnOyc7XG52YXIgQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IgPSAnLCc7XG4vLyBOYW1lIG9mIHRoZSBodHRwIGhlYWRlciB1c2VkIHRvIHByb3BhZ2F0ZSB0aGUgYmFnZ2FnZVxudmFyIEJBR0dBR0VfSEVBREVSID0gJ2JhZ2dhZ2UnO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgbmFtZS12YWx1ZSBwYWlycyBhbGxvd2VkIGJ5IHczYyBzcGVjXG52YXIgQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyA9IDE4MDtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBhIHNpbmdsZSBuYW1lLXZhbHVlIHBhaXIgYWxsb3dlZCBieSB3M2Mgc3BlY1xudmFyIEJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTID0gNDA5Njtcbi8vIE1heGltdW0gdG90YWwgbGVuZ3RoIG9mIGFsbCBuYW1lLXZhbHVlIHBhaXJzIGFsbG93ZWQgYnkgdzNjIHNwZWNcbnZhciBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPSA4MTkyO1xuXG52YXIgX19yZWFkJDMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzZXJpYWxpemVLZXlQYWlycyhrZXlQYWlycykge1xuICAgIHJldHVybiBrZXlQYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGhWYWx1ZSwgY3VycmVudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBcIlwiICsgaFZhbHVlICsgKGhWYWx1ZSAhPT0gJycgPyBCQUdHQUdFX0lURU1TX1NFUEFSQVRPUiA6ICcnKSArIGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPyBoVmFsdWUgOiB2YWx1ZTtcbiAgICB9LCAnJyk7XG59XG5mdW5jdGlvbiBnZXRLZXlQYWlycyhiYWdnYWdlKSB7XG4gICAgcmV0dXJuIGJhZ2dhZ2UuZ2V0QWxsRW50cmllcygpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkJDMoX2EsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS52YWx1ZSk7XG4gICAgICAgIC8vIGluY2x1ZGUgb3BhcXVlIG1ldGFkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIE5PVEU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgVVJJLWVuY29kZSB0aGUgbWV0YWRhdGEgLSB0aGF0IHJlc3BvbnNpYmlsaXR5IGZhbGxzIG9uIHRoZSBtZXRhZGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAodmFsdWUubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkgKz0gQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUiArIHZhbHVlLm1ldGFkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VQYWlyS2V5VmFsdWUoZW50cnkpIHtcbiAgICB2YXIgdmFsdWVQcm9wcyA9IGVudHJ5LnNwbGl0KEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IpO1xuICAgIGlmICh2YWx1ZVByb3BzLmxlbmd0aCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGtleVBhaXJQYXJ0ID0gdmFsdWVQcm9wcy5zaGlmdCgpO1xuICAgIGlmICgha2V5UGFpclBhcnQpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBrZXlQYWlyUGFydC5pbmRleE9mKEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5UGFpclBhcnQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCkpO1xuICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlQYWlyUGFydC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCkpO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICBpZiAodmFsdWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1ldGFkYXRhID0gYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nKHZhbHVlUHJvcHMuam9pbihCQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIG1ldGFkYXRhOiBtZXRhZGF0YSB9O1xufVxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBzZXJpYWxpemVkIGluIHRoZSBiYWdnYWdlIEhUVFAgRm9ybWF0ICh3aXRob3V0IG1ldGFkYXRhKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYmFnZ2FnZS9ibG9iL21hc3Rlci9iYWdnYWdlL0hUVFBfSEVBREVSX0ZPUk1BVC5tZFxuICovXG5mdW5jdGlvbiBwYXJzZUtleVBhaXJzSW50b1JlY29yZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5UGFpcikgeyByZXR1cm4ga2V5UGFpciAhPT0gdW5kZWZpbmVkICYmIGtleVBhaXIudmFsdWUubGVuZ3RoID4gMDsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoaGVhZGVycywga2V5UGFpcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBoZWFkZXJzW2tleVBhaXIua2V5XSA9IGtleVBhaXIudmFsdWU7XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH0sIHt9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvcGFnYXRlcyB7QGxpbmsgQmFnZ2FnZX0gdGhyb3VnaCBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFnZ2FnZSBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JhZ2dhZ2UvXG4gKi9cbnZhciBXM0NCYWdnYWdlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXM0NCYWdnYWdlUHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDQmFnZ2FnZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGJhZ2dhZ2UgPSBwcm9wYWdhdGlvbi5nZXRCYWdnYWdlKGNvbnRleHQpO1xuICAgICAgICBpZiAoIWJhZ2dhZ2UgfHwgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGtleVBhaXJzID0gZ2V0S2V5UGFpcnMoYmFnZ2FnZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyLmxlbmd0aCA8PSBCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zbGljZSgwLCBCQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTKTtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gc2VyaWFsaXplS2V5UGFpcnMoa2V5UGFpcnMpO1xuICAgICAgICBpZiAoaGVhZGVyVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUiwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0dGVyLmdldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUik7XG4gICAgICAgIHZhciBiYWdnYWdlU3RyaW5nID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSlcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWUuam9pbihCQUdHQUdFX0lURU1TX1NFUEFSQVRPUilcbiAgICAgICAgICAgIDogaGVhZGVyVmFsdWU7XG4gICAgICAgIGlmICghYmFnZ2FnZVN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgYmFnZ2FnZSA9IHt9O1xuICAgICAgICBpZiAoYmFnZ2FnZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IGJhZ2dhZ2VTdHJpbmcuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGtleVBhaXIgPSBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICAgICAgICAgIHZhciBiYWdnYWdlRW50cnkgPSB7IHZhbHVlOiBrZXlQYWlyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgaWYgKGtleVBhaXIubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFnZ2FnZUVudHJ5Lm1ldGFkYXRhID0ga2V5UGFpci5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFnZ2FnZVtrZXlQYWlyLmtleV0gPSBiYWdnYWdlRW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmVudHJpZXMoYmFnZ2FnZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRpb24uc2V0QmFnZ2FnZShjb250ZXh0LCBwcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKGJhZ2dhZ2UpKTtcbiAgICB9O1xuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbQkFHR0FHRV9IRUFERVJdO1xuICAgIH07XG4gICAgcmV0dXJuIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB1dGlsaXR5IGZvciByZXR1cm5pbmcgd2FsbCB0aW1lcyBhbmNob3JlZCB0byBhIGdpdmVuIHBvaW50IGluIHRpbWUuIFdhbGwgdGltZSBtZWFzdXJlbWVudHMgd2lsbFxuICogbm90IGJlIHRha2VuIGZyb20gdGhlIHN5c3RlbSwgYnV0IGluc3RlYWQgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyBhIG1vbm90b25pYyBjbG9jayB0aW1lXG4gKiB0byB0aGUgYW5jaG9yIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lIGNhbiBjaGFuZ2UgYW5kIHJlc3VsdCBpbiB1bmV4cGVjdGVkIHNpdHVhdGlvbnMgbGlrZVxuICogc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGV5IGFyZSBzdGFydGVkLiBDcmVhdGluZyBhbiBhbmNob3JlZCBjbG9jayBmb3IgZWFjaCBsb2NhbCByb290IHNwYW5cbiAqIGVuc3VyZXMgdGhhdCBzcGFuIHRpbWluZ3MgYW5kIGR1cmF0aW9ucyBhcmUgYWNjdXJhdGUgd2hpbGUgcHJldmVudGluZyBzcGFuIHRpbWVzIGZyb20gZHJpZnRpbmdcbiAqIHRvbyBmYXIgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLlxuICpcbiAqIE9ubHkgY3JlYXRpbmcgYW4gYW5jaG9yZWQgY2xvY2sgb25jZSBwZXIgbG9jYWwgdHJhY2UgZW5zdXJlcyBzcGFuIHRpbWVzIGFyZSBjb3JyZWN0IHJlbGF0aXZlXG4gKiB0byBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgYSBjaGlsZCBzcGFuIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YXJ0IHRpbWUgYmVmb3JlIGl0cyBwYXJlbnQgZXZlblxuICogaWYgdGhlIHN5c3RlbSBjbG9jayBpcyBjb3JyZWN0ZWQgZHVyaW5nIHRoZSBsb2NhbCB0cmFjZS5cbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBPVGVsIEphdmEgYW5jaG9yZWQgY2xvY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWphdmEvYmxvYi9tYWluL3Nkay90cmFjZS9zcmMvbWFpbi9qYXZhL2lvL29wZW50ZWxlbWV0cnkvc2RrL3RyYWNlL0FuY2hvcmVkQ2xvY2suamF2YVxuICovXG52YXIgQW5jaG9yZWRDbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQW5jaG9yZWRDbG9jayBhbmNob3JlZCB0byB0aGUgY3VycmVudCB0aW1lIHJldHVybmVkIGJ5IHN5c3RlbUNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN5c3RlbUNsb2NrIHNob3VsZCBiZSBhIGNsb2NrIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEgMTk3MCBzdWNoIGFzIERhdGVcbiAgICAgKiBAcGFyYW0gbW9ub3RvbmljQ2xvY2sgc2hvdWxkIGJlIGEgY2xvY2sgdGhhdCBjb3VudHMgbWlsbGlzZWNvbmRzIG1vbm90b25pY2FsbHkgc3VjaCBhcyB3aW5kb3cucGVyZm9ybWFuY2Ugb3IgcGVyZl9ob29rcy5wZXJmb3JtYW5jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFuY2hvcmVkQ2xvY2soc3lzdGVtQ2xvY2ssIG1vbm90b25pY0Nsb2NrKSB7XG4gICAgICAgIHRoaXMuX21vbm90b25pY0Nsb2NrID0gbW9ub3RvbmljQ2xvY2s7XG4gICAgICAgIHRoaXMuX2Vwb2NoTWlsbGlzID0gc3lzdGVtQ2xvY2subm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzID0gbW9ub3RvbmljQ2xvY2subm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlXG4gICAgICogQW5jaG9yZWRDbG9jayB3YXMgY3JlYXRlZCB0byB0aGUgY3JlYXRpb24gZXBvY2ggdGltZVxuICAgICAqL1xuICAgIEFuY2hvcmVkQ2xvY2sucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fbW9ub3RvbmljQ2xvY2subm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vwb2NoTWlsbGlzICsgZGVsdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQW5jaG9yZWRDbG9jaztcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciBvdXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQkMihfYy52YWx1ZSwgMiksIGtleSA9IF9kWzBdLCB2YWwgPSBfZFsxXTtcbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWUodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKHZhbCk7XG59XG5mdW5jdGlvbiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheShhcnIpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdHlwZTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBhcnJfMSA9IF9fdmFsdWVzJDEoYXJyKSwgYXJyXzFfMSA9IGFycl8xLm5leHQoKTsgIWFycl8xXzEuZG9uZTsgYXJyXzFfMSA9IGFycl8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWQgZWxlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuY291bnRlcmVkIGFuIGludmFsaWQgcHJpbWl0aXZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcnJfMV8xICYmICFhcnJfMV8xLmRvbmUgJiYgKF9hID0gYXJyXzEucmV0dXJuKSkgX2EuY2FsbChhcnJfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQcmltaXRpdmVBdHRyaWJ1dGVWYWx1ZSh2YWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBsb2dzIGFuIGVycm9yIHVzaW5nIHRoZSBwcm92aWRlZCBsb2dnZXIsIG9yIGFcbiAqIGNvbnNvbGUgbG9nZ2VyIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBsb2dnaW5nRXJyb3JIYW5kbGVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXgpIHtcbiAgICAgICAgZGlhZy5lcnJvcihzdHJpbmdpZnlFeGNlcHRpb24oZXgpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleGNlcHRpb24gaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUV4Y2VwdGlvbihleCkge1xuICAgIGlmICh0eXBlb2YgZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBleDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmbGF0dGVuRXhjZXB0aW9uKGV4KSk7XG4gICAgfVxufVxuLyoqXG4gKiBGbGF0dGVucyBhbiBleGNlcHRpb24gaW50byBrZXktdmFsdWUgcGFpcnMgYnkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluXG4gKiBhbmQgY29lcmNpbmcgdmFsdWVzIHRvIHN0cmluZ3MuIER1cGxpY2F0ZSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuO1xuICogdGhlIGZpcnN0IGluc2VydCB3aW5zLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuRXhjZXB0aW9uKGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJyZW50ID0gZXg7XG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY3VycmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBUaGUgZ2xvYmFsIGVycm9yIGhhbmRsZXIgZGVsZWdhdGUgKi9cbnZhciBkZWxlZ2F0ZUhhbmRsZXIgPSBsb2dnaW5nRXJyb3JIYW5kbGVyKCk7XG4vKipcbiAqIFNldCB0aGUgZ2xvYmFsIGVycm9yIGhhbmRsZXJcbiAqIEBwYXJhbSB7RXJyb3JIYW5kbGVyfSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHNldEdsb2JhbEVycm9ySGFuZGxlcihoYW5kbGVyKSB7XG4gICAgZGVsZWdhdGVIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIGdsb2JhbEVycm9ySGFuZGxlcihleCkge1xuICAgIHRyeSB7XG4gICAgICAgIGRlbGVnYXRlSGFuZGxlcihleCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkgeyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBUcmFjZXNTYW1wbGVyVmFsdWVzO1xuKGZ1bmN0aW9uIChUcmFjZXNTYW1wbGVyVmFsdWVzKSB7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIkFsd2F5c09mZlwiXSA9IFwiYWx3YXlzX29mZlwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJBbHdheXNPblwiXSA9IFwiYWx3YXlzX29uXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT2ZmXCJdID0gXCJwYXJlbnRiYXNlZF9hbHdheXNfb2ZmXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT25cIl0gPSBcInBhcmVudGJhc2VkX2Fsd2F5c19vblwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJQYXJlbnRCYXNlZFRyYWNlSWRSYXRpb1wiXSA9IFwicGFyZW50YmFzZWRfdHJhY2VpZHJhdGlvXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlRyYWNlSWRSYXRpb1wiXSA9IFwidHJhY2VpZHJhdGlvXCI7XG59KShUcmFjZXNTYW1wbGVyVmFsdWVzIHx8IChUcmFjZXNTYW1wbGVyVmFsdWVzID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBERUZBVUxUX0xJU1RfU0VQQVJBVE9SID0gJywnO1xuLyoqXG4gKiBFbnZpcm9ubWVudCBpbnRlcmZhY2UgdG8gZGVmaW5lIGFsbCBuYW1lc1xuICovXG52YXIgRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTID0gWydPVEVMX1NES19ESVNBQkxFRCddO1xuZnVuY3Rpb24gaXNFbnZWYXJBQm9vbGVhbihrZXkpIHtcbiAgICByZXR1cm4gKEVOVklST05NRU5UX0JPT0xFQU5fS0VZUy5pbmRleE9mKGtleSkgPiAtMSk7XG59XG52YXIgRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTID0gW1xuICAgICdPVEVMX0JTUF9FWFBPUlRfVElNRU9VVCcsXG4gICAgJ09URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRScsXG4gICAgJ09URUxfQlNQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CU1BfU0NIRURVTEVfREVMQVknLFxuICAgICdPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQnLFxuICAgICdPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX1NDSEVEVUxFX0RFTEFZJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19USU1FT1VUJyxcbiAgICAnT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfUE9SVCcsXG5dO1xuZnVuY3Rpb24gaXNFbnZWYXJBTnVtYmVyKGtleSkge1xuICAgIHJldHVybiAoRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTLmluZGV4T2Yoa2V5KSA+IC0xKTtcbn1cbnZhciBFTlZJUk9OTUVOVF9MSVNUU19LRVlTID0gW1xuICAgICdPVEVMX05PX1BBVENIX01PRFVMRVMnLFxuICAgICdPVEVMX1BST1BBR0FUT1JTJyxcbiAgICAnT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4nLFxuXTtcbmZ1bmN0aW9uIGlzRW52VmFyQUxpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIEVOVklST05NRU5UX0xJU1RTX0tFWVMuaW5kZXhPZihrZXkpID4gLTE7XG59XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUID0gSW5maW5pdHk7XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCA9IDEyODtcbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqL1xudmFyIERFRkFVTFRfRU5WSVJPTk1FTlQgPSB7XG4gICAgT1RFTF9TREtfRElTQUJMRUQ6IGZhbHNlLFxuICAgIENPTlRBSU5FUl9OQU1FOiAnJyxcbiAgICBFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSV9WNDogJycsXG4gICAgRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUkk6ICcnLFxuICAgIEhPU1ROQU1FOiAnJyxcbiAgICBLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVDogJycsXG4gICAgTkFNRVNQQUNFOiAnJyxcbiAgICBPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDogMzAwMDAsXG4gICAgT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU6IDIwNDgsXG4gICAgT1RFTF9CU1BfU0NIRURVTEVfREVMQVk6IDUwMDAsXG4gICAgT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUOiAzMDAwMCxcbiAgICBPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFOiAyMDQ4LFxuICAgIE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTogNTAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9IT1NUOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9QT1JUOiA2ODMyLFxuICAgIE9URUxfRVhQT1JURVJfSkFFR0VSX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9QQVNTV09SRDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfRU5EUE9JTlQ6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOiAxMDAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOiAnaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFucycsXG4gICAgT1RFTF9MT0dfTEVWRUw6IERpYWdMb2dMZXZlbC5JTkZPLFxuICAgIE9URUxfTk9fUEFUQ0hfTU9EVUxFUzogW10sXG4gICAgT1RFTF9QUk9QQUdBVE9SUzogWyd0cmFjZWNvbnRleHQnLCAnYmFnZ2FnZSddLFxuICAgIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUzogJycsXG4gICAgT1RFTF9TRVJWSUNFX05BTUU6ICcnLFxuICAgIE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUOiBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICBPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDogMTI4LFxuICAgIE9URUxfU1BBTl9MSU5LX0NPVU5UX0xJTUlUOiAxMjgsXG4gICAgT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsXG4gICAgT1RFTF9UUkFDRVNfRVhQT1JURVI6ICcnLFxuICAgIE9URUxfVFJBQ0VTX1NBTVBMRVI6IFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixcbiAgICBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzogJycsXG4gICAgT1RFTF9MT0dTX0VYUE9SVEVSOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0lOU0VDVVJFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19JTlNFQ1VSRTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NPTVBSRVNTSU9OOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0tFWTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NMSUVOVF9DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfUFJPVE9DT0w6ICdodHRwL3Byb3RvYnVmJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1BST1RPQ09MOiAnaHR0cC9wcm90b2J1ZicsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfVEVNUE9SQUxJVFlfUFJFRkVSRU5DRTogJ2N1bXVsYXRpdmUnLFxuICAgIE9URUxfU0VNQ09OVl9TVEFCSUxJVFlfT1BUX0lOOiBbXSxcbn07XG4vKipcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZXNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSBTdHJpbmcodmFsdWVzW2tleV0pO1xuICAgIC8vIHN1cHBvcnQgY2FzZS1pbnNlbnNpdGl2ZSBcInRydWVcIlxuICAgIGVudmlyb25tZW50W2tleV0gPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4vKipcbiAqIFBhcnNlcyBhIHZhcmlhYmxlIGFzIG51bWJlciB3aXRoIG51bWJlciB2YWxpZGF0aW9uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIGVudmlyb25tZW50XG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG5hbWUsIGVudmlyb25tZW50LCB2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gICAgaWYgKG1pbiA9PT0gdm9pZCAwKSB7IG1pbiA9IC1JbmZpbml0eTsgfVxuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSBJbmZpbml0eTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVzW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIodmFsdWVzW25hbWVdKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gbWluO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudFtuYW1lXSA9IG1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBsaXN0LWxpa2Ugc3RyaW5ncyBmcm9tIGlucHV0IGludG8gb3V0cHV0LlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIHNlcGFyYXRvclxuICovXG5mdW5jdGlvbiBwYXJzZVN0cmluZ0xpc3QobmFtZSwgb3V0cHV0LCBpbnB1dCwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IERFRkFVTFRfTElTVF9TRVBBUkFUT1I7IH1cbiAgICB2YXIgZ2l2ZW5WYWx1ZSA9IGlucHV0W25hbWVdO1xuICAgIGlmICh0eXBlb2YgZ2l2ZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3V0cHV0W25hbWVdID0gZ2l2ZW5WYWx1ZS5zcGxpdChzZXBhcmF0b3IpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi50cmltKCk7IH0pO1xuICAgIH1cbn1cbi8vIFRoZSBzdXBwb3J0IHN0cmluZyAtPiBEaWFnTG9nTGV2ZWwgbWFwcGluZ3NcbnZhciBsb2dMZXZlbE1hcCA9IHtcbiAgICBBTEw6IERpYWdMb2dMZXZlbC5BTEwsXG4gICAgVkVSQk9TRTogRGlhZ0xvZ0xldmVsLlZFUkJPU0UsXG4gICAgREVCVUc6IERpYWdMb2dMZXZlbC5ERUJVRyxcbiAgICBJTkZPOiBEaWFnTG9nTGV2ZWwuSU5GTyxcbiAgICBXQVJOOiBEaWFnTG9nTGV2ZWwuV0FSTixcbiAgICBFUlJPUjogRGlhZ0xvZ0xldmVsLkVSUk9SLFxuICAgIE5PTkU6IERpYWdMb2dMZXZlbC5OT05FLFxufTtcbi8qKlxuICogRW52aXJvbm1lbnRhbGx5IHNldHMgbG9nIGxldmVsIGlmIHZhbGlkIGxvZyBsZXZlbCBzdHJpbmcgaXMgcHJvdmlkZWRcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBzZXRMb2dMZXZlbEZyb21FbnYoa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRoZUxldmVsID0gbG9nTGV2ZWxNYXBbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0aGVMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudFtrZXldID0gdGhlTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBlbnZpcm9ubWVudCB2YWx1ZXNcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VFbnZpcm9ubWVudCh2YWx1ZXMpIHtcbiAgICB2YXIgZW52aXJvbm1lbnQgPSB7fTtcbiAgICBmb3IgKHZhciBlbnYgaW4gREVGQVVMVF9FTlZJUk9OTUVOVCkge1xuICAgICAgICB2YXIga2V5ID0gZW52O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnT1RFTF9MT0dfTEVWRUwnOlxuICAgICAgICAgICAgICAgIHNldExvZ0xldmVsRnJvbUVudihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNFbnZWYXJBQm9vbGVhbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQm9vbGVhbihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU51bWJlcihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFMaXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdHJpbmdMaXN0KGtleSwgZW52aXJvbm1lbnQsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50W2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldEVudigpIHtcbiAgICB2YXIgZ2xvYmFsRW52ID0gcGFyc2VFbnZpcm9ubWVudChfZ2xvYmFsVGhpcyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfRU5WSVJPTk1FTlQsIGdsb2JhbEVudik7XG59XG5mdW5jdGlvbiBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHBhcnNlRW52aXJvbm1lbnQoX2dsb2JhbFRoaXMpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuZnVuY3Rpb24gaGV4VG9CYXNlNjQoaGV4U3RyKSB7XG4gICAgcmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoaGV4VG9CaW5hcnkoaGV4U3RyKSksIGZhbHNlKSkpO1xufVxuXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICovXG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiB1bnJlZlRpbWVyKF90aW1lcikgeyB9XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqIENvbWJpbmVzIG11bHRpcGxlIHByb3BhZ2F0b3JzIGludG8gYSBzaW5nbGUgcHJvcGFnYXRvci4gKi9cbnZhciBDb21wb3NpdGVQcm9wYWdhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbXBvc2l0ZSBwcm9wYWdhdG9yIGZyb20gYSBsaXN0IG9mIHByb3BhZ2F0b3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtjb25maWddIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjb21wb3NpdGUgcHJvcGFnYXRvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvc2l0ZVByb3BhZ2F0b3IoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0b3JzID0gKF9hID0gY29uZmlnLnByb3BhZ2F0b3JzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuX3Byb3BhZ2F0b3JzXG4gICAgICAgICAgICAvLyBvbGRlciBwcm9wYWdhdG9ycyBtYXkgbm90IGhhdmUgZmllbGRzIGZ1bmN0aW9uLCBudWxsIGNoZWNrIHRvIGJlIHN1cmVcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuICh0eXBlb2YgcC5maWVsZHMgPT09ICdmdW5jdGlvbicgPyBwLmZpZWxkcygpIDogW10pOyB9KVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geC5jb25jYXQoeSk7IH0sIFtdKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY2FycmllciBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBpbmplY3RcbiAgICAgKiBAcGFyYW0gY2FycmllciBDYXJyaWVyIGludG8gd2hpY2ggY29udGV4dCB3aWxsIGJlIGluamVjdGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5fcHJvcGFnYXRvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdG9yLmluamVjdChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byBpbmplY3Qgd2l0aCBcIiArIHByb3BhZ2F0b3IuY29uc3RydWN0b3IubmFtZSArIFwiLiBFcnI6IFwiICsgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY29udGV4dCBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBhZGQgdmFsdWVzIHRvXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgY29udGV4dFxuICAgICAqL1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgY2FycmllciwgZ2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wYWdhdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKGN0eCwgcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvci5leHRyYWN0KGN0eCwgY2FycmllciwgZ2V0dGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJGYWlsZWQgdG8gZXh0cmFjdCB3aXRoIFwiICsgcHJvcGFnYXRvci5jb25zdHJ1Y3Rvci5uYW1lICsgXCIuIEVycjogXCIgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3R4O1xuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcmV0dXJuIGEgbmV3IGFycmF5IHNvIG91ciBmaWVsZHMgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuc2xpY2UoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb3NpdGVQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBWQUxJRF9LRVlfQ0hBUl9SQU5HRSA9ICdbXzAtOWEtei0qL10nO1xudmFyIFZBTElEX0tFWSA9IFwiW2Etel1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNTV9XCI7XG52YXIgVkFMSURfVkVORE9SX0tFWSA9IFwiW2EtejAtOV1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNDB9QFthLXpdXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMTN9XCI7XG52YXIgVkFMSURfS0VZX1JFR0VYID0gbmV3IFJlZ0V4cChcIl4oPzpcIiArIFZBTElEX0tFWSArIFwifFwiICsgVkFMSURfVkVORE9SX0tFWSArIFwiKSRcIik7XG52YXIgVkFMSURfVkFMVUVfQkFTRV9SRUdFWCA9IC9eWyAtfl17MCwyNTV9WyEtfl0kLztcbnZhciBJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYID0gLyx8PS87XG4vKipcbiAqIEtleSBpcyBvcGFxdWUgc3RyaW5nIHVwIHRvIDI1NiBjaGFyYWN0ZXJzIHByaW50YWJsZS4gSXQgTVVTVCBiZWdpbiB3aXRoIGFcbiAqIGxvd2VyY2FzZSBsZXR0ZXIsIGFuZCBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBsZXR0ZXJzIGEteiwgZGlnaXRzIDAtOSxcbiAqIHVuZGVyc2NvcmVzIF8sIGRhc2hlcyAtLCBhc3Rlcmlza3MgKiwgYW5kIGZvcndhcmQgc2xhc2hlcyAvLlxuICogRm9yIG11bHRpLXRlbmFudCB2ZW5kb3Igc2NlbmFyaW9zLCBhbiBhdCBzaWduIChAKSBjYW4gYmUgdXNlZCB0byBwcmVmaXggdGhlXG4gKiB2ZW5kb3IgbmFtZS4gVmVuZG9ycyBTSE9VTEQgc2V0IHRoZSB0ZW5hbnQgSUQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5LlxuICogc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyNrZXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgcmV0dXJuIFZBTElEX0tFWV9SRUdFWC50ZXN0KGtleSk7XG59XG4vKipcbiAqIFZhbHVlIGlzIG9wYXF1ZSBzdHJpbmcgdXAgdG8gMjU2IGNoYXJhY3RlcnMgcHJpbnRhYmxlIEFTQ0lJIFJGQzAwMjBcbiAqIGNoYXJhY3RlcnMgKGkuZS4sIHRoZSByYW5nZSAweDIwIHRvIDB4N0UpIGV4Y2VwdCBjb21tYSAsIGFuZCA9LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMgPSAzMjtcbnZhciBNQVhfVFJBQ0VfU1RBVEVfTEVOID0gNTEyO1xudmFyIExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG52YXIgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSID0gJz0nO1xuLyoqXG4gKiBUcmFjZVN0YXRlIG11c3QgYmUgYSBjbGFzcyBhbmQgbm90IGEgc2ltcGxlIG9iamVjdCB0eXBlIGJlY2F1c2Ugb2YgdGhlIHNwZWNcbiAqIHJlcXVpcmVtZW50IChodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8jdHJhY2VzdGF0ZS1maWVsZCkuXG4gKlxuICogSGVyZSBpcyB0aGUgbGlzdCBvZiBhbGxvd2VkIG11dGF0aW9uczpcbiAqIC0gTmV3IGtleS12YWx1ZSBwYWlyIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcbiAqIC0gVGhlIHZhbHVlIG9mIGFueSBrZXkgY2FuIGJlIHVwZGF0ZWQuIE1vZGlmaWVkIGtleXMgTVVTVCBiZSBtb3ZlZCB0byB0aGVcbiAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAqL1xudmFyIFRyYWNlU3RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VTdGF0ZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlKVxuICAgICAgICAgICAgdGhpcy5fcGFyc2UocmF3VHJhY2VTdGF0ZSk7XG4gICAgfVxuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGUgZGlmZmVyZW50IGFwcHJvYWNoZXMobWFwIHZzIGxpc3QpIGFuZFxuICAgICAgICAvLyB1c2UgdGhlIGZhc3RlciBvbmUuXG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFN0YXRlLmdldChrZXkpO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5cygpXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIGtleSkge1xuICAgICAgICAgICAgYWdnLnB1c2goa2V5ICsgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSICsgX3RoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9wYXJzZSA9IGZ1bmN0aW9uIChyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gU3RvcmUgaW4gcmV2ZXJzZSBzbyBuZXcga2V5cyAoLnNldCguLi4pKSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIHBhcnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIHZhciBpID0gbGlzdE1lbWJlci5pbmRleE9mKExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUik7XG4gICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gbGlzdE1lbWJlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWdnO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSByZXZlcnNlKCkgcmVxdWlyZW1lbnQsIHRydW5jIG11c3QgYmUgZG9uZSBhZnRlciBtYXAgaXMgY3JlYXRlZFxuICAgICAgICBpZiAodGhpcy5faW50ZXJuYWxTdGF0ZS5zaXplID4gTUFYX1RSQUNFX1NUQVRFX0lURU1TKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcChBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gVXNlIHJldmVyc2Ugc2FtZSBhcyBvcmlnaW5hbCB0cmFjZXN0YXRlIHBhcnNlIGNoYWluXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIE1BWF9UUkFDRV9TVEFURV9JVEVNUykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fa2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcCh0aGlzLl9pbnRlcm5hbFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VTdGF0ZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgVFJBQ0VfUEFSRU5UX0hFQURFUiA9ICd0cmFjZXBhcmVudCc7XG52YXIgVFJBQ0VfU1RBVEVfSEVBREVSID0gJ3RyYWNlc3RhdGUnO1xudmFyIFZFUlNJT04gPSAnMDAnO1xudmFyIFZFUlNJT05fUEFSVCA9ICcoPyFmZilbXFxcXGRhLWZdezJ9JztcbnZhciBUUkFDRV9JRF9QQVJUID0gJyg/IVswXXszMn0pW1xcXFxkYS1mXXszMn0nO1xudmFyIFBBUkVOVF9JRF9QQVJUID0gJyg/IVswXXsxNn0pW1xcXFxkYS1mXXsxNn0nO1xudmFyIEZMQUdTX1BBUlQgPSAnW1xcXFxkYS1mXXsyfSc7XG52YXIgVFJBQ0VfUEFSRU5UX1JFR0VYID0gbmV3IFJlZ0V4cChcIl5cXFxccz8oXCIgKyBWRVJTSU9OX1BBUlQgKyBcIiktKFwiICsgVFJBQ0VfSURfUEFSVCArIFwiKS0oXCIgKyBQQVJFTlRfSURfUEFSVCArIFwiKS0oXCIgKyBGTEFHU19QQVJUICsgXCIpKC0uKik/XFxcXHM/JFwiKTtcbi8qKlxuICogUGFyc2VzIGluZm9ybWF0aW9uIGZyb20gdGhlIFt0cmFjZXBhcmVudF0gc3BhbiB0YWcgYW5kIGNvbnZlcnRzIGl0IGludG8ge0BsaW5rIFNwYW5Db250ZXh0fVxuICogQHBhcmFtIHRyYWNlUGFyZW50IC0gQSBtZXRhIHByb3BlcnR5IHRoYXQgY29tZXMgZnJvbSBzZXJ2ZXIuXG4gKiAgICAgSXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzZXJ2ZXIgc2lkZSB0byBoYXZlIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHRyYWNlIElkLFxuICogICAgIGEgcGFyZW50IHNwYW4gSWQgdGhhdCB3YXMgc2V0IG9uIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHNwYW4sXG4gKiAgICAgYW5kIHRoZSB0cmFjZSBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc2VydmVyJ3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAqICAgICAoMDEgPSBzYW1wbGVkLCAwMCA9IG5vdCBzYW1wbGVkKS5cbiAqICAgICBmb3IgZXhhbXBsZTogJ3t2ZXJzaW9ufS17dHJhY2VJZH0te3NwYW5JZH0te3NhbXBsZURlY2lzaW9ufSdcbiAqICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0L31cbiAqL1xuZnVuY3Rpb24gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCkge1xuICAgIHZhciBtYXRjaCA9IFRSQUNFX1BBUkVOVF9SRUdFWC5leGVjKHRyYWNlUGFyZW50KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMuIElmIHRoZXJlIGFyZSBtb3JlIHBhcnRzLCB3ZSBvbmx5IHJlamVjdCBpdCBpZiBpdCdzIHVzaW5nIHZlcnNpb24gMDBcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3ZlcnNpb25pbmctb2YtdHJhY2VwYXJlbnRcbiAgICBpZiAobWF0Y2hbMV0gPT09ICcwMCcgJiYgbWF0Y2hbNV0pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyYWNlSWQ6IG1hdGNoWzJdLFxuICAgICAgICBzcGFuSWQ6IG1hdGNoWzNdLFxuICAgICAgICB0cmFjZUZsYWdzOiBwYXJzZUludChtYXRjaFs0XSwgMTYpLFxuICAgIH07XG59XG4vKipcbiAqIFByb3BhZ2F0ZXMge0BsaW5rIFNwYW5Db250ZXh0fSB0aHJvdWdoIFRyYWNlIENvbnRleHQgZm9ybWF0IHByb3BhZ2F0aW9uLlxuICpcbiAqIEJhc2VkIG9uIHRoZSBUcmFjZSBDb250ZXh0IHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC9cbiAqL1xudmFyIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgc3BhbkNvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcGFuQ29udGV4dCB8fFxuICAgICAgICAgICAgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSB8fFxuICAgICAgICAgICAgIWlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB0cmFjZVBhcmVudCA9IFZFUlNJT04gKyBcIi1cIiArIHNwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHNwYW5Db250ZXh0LnNwYW5JZCArIFwiLTBcIiArIE51bWJlcihzcGFuQ29udGV4dC50cmFjZUZsYWdzIHx8IFRyYWNlRmxhZ3MuTk9ORSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBzZXR0ZXIuc2V0KGNhcnJpZXIsIFRSQUNFX1BBUkVOVF9IRUFERVIsIHRyYWNlUGFyZW50KTtcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlU3RhdGUpIHtcbiAgICAgICAgICAgIHNldHRlci5zZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSLCBzcGFuQ29udGV4dC50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIHRyYWNlUGFyZW50SGVhZGVyID0gZ2V0dGVyLmdldChjYXJyaWVyLCBUUkFDRV9QQVJFTlRfSEVBREVSKTtcbiAgICAgICAgaWYgKCF0cmFjZVBhcmVudEhlYWRlcilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgdHJhY2VQYXJlbnQgPSBBcnJheS5pc0FycmF5KHRyYWNlUGFyZW50SGVhZGVyKVxuICAgICAgICAgICAgPyB0cmFjZVBhcmVudEhlYWRlclswXVxuICAgICAgICAgICAgOiB0cmFjZVBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFjZVBhcmVudCAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCk7XG4gICAgICAgIGlmICghc3BhbkNvbnRleHQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgc3BhbkNvbnRleHQuaXNSZW1vdGUgPSB0cnVlO1xuICAgICAgICB2YXIgdHJhY2VTdGF0ZUhlYWRlciA9IGdldHRlci5nZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGVIZWFkZXIpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYHRyYWNlc3RhdGVgIGhlYWRlciBpcyBmb3VuZCwgd2UgbWVyZ2UgdGhlbSBpbnRvIGFcbiAgICAgICAgICAgIC8vIHNpbmdsZSBoZWFkZXIuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBBcnJheS5pc0FycmF5KHRyYWNlU3RhdGVIZWFkZXIpXG4gICAgICAgICAgICAgICAgPyB0cmFjZVN0YXRlSGVhZGVyLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIDogdHJhY2VTdGF0ZUhlYWRlcjtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0LnRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSh0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnID8gc3RhdGUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjZS5zZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCk7XG4gICAgfTtcbiAgICBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbVFJBQ0VfUEFSRU5UX0hFQURFUiwgVFJBQ0VfU1RBVEVfSEVBREVSXTtcbiAgICB9O1xuICAgIHJldHVybiBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBSUENfTUVUQURBVEFfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBTREsgQ29udGV4dCBLZXkgUlBDX01FVEFEQVRBJyk7XG52YXIgUlBDVHlwZTtcbihmdW5jdGlvbiAoUlBDVHlwZSkge1xuICAgIFJQQ1R5cGVbXCJIVFRQXCJdID0gXCJodHRwXCI7XG59KShSUENUeXBlIHx8IChSUENUeXBlID0ge30pKTtcbmZ1bmN0aW9uIHNldFJQQ01ldGFkYXRhKGNvbnRleHQsIG1ldGEpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZLCBtZXRhKTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cbmZ1bmN0aW9uIGdldFJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLlxuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuXG4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uZSBkZWZpbmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qKlxuICogYmFzZWQgb24gbG9kYXNoIGluIG9yZGVyIHRvIHN1cHBvcnQgZXNtIGJ1aWxkcyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbiAqIGxvZGFzaCBpcyB1c2luZyBNSVQgTGljZW5zZS5cbiAqKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nO1xudmFyIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICB9XG4gICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB2YXIgdW5tYXNrZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHVubWFza2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc2lsZW5jZVxuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIE1BWF9MRVZFTCA9IDIwO1xuLyoqXG4gKiBNZXJnZXMgb2JqZWN0cyB0b2dldGhlclxuICogQHBhcmFtIGFyZ3MgLSBvYmplY3RzIC8gdmFsdWVzIHRvIGJlIG1lcmdlZFxuICovXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGFyZ3Muc2hpZnQoKTtcbiAgICB2YXIgb2JqZWN0cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSBtZXJnZVR3b09iamVjdHMocmVzdWx0LCBhcmdzLnNoaWZ0KCksIDAsIG9iamVjdHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdGFrZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIE1lcmdlcyB0d28gb2JqZWN0c1xuICogQHBhcmFtIG9uZSAtIGZpcnN0IG9iamVjdFxuICogQHBhcmFtIHR3byAtIHNlY29uZCBvYmplY3RcbiAqIEBwYXJhbSBsZXZlbCAtIGN1cnJlbnQgZGVlcCBsZXZlbFxuICogQHBhcmFtIG9iamVjdHMgLSBvYmplY3RzIGhvbGRlciB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVmZXJlbmNlZCAtIHRvIHByZXZlbnRcbiAqIGN5Y2xpYyBkZXBlbmRlbmN5XG4gKi9cbmZ1bmN0aW9uIG1lcmdlVHdvT2JqZWN0cyhvbmUsIHR3bywgbGV2ZWwsIG9iamVjdHMpIHtcbiAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IDA7IH1cbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChsZXZlbCA+IE1BWF9MRVZFTCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXZlbCsrO1xuICAgIGlmIChpc1ByaW1pdGl2ZShvbmUpIHx8IGlzUHJpbWl0aXZlKHR3bykgfHwgaXNGdW5jdGlvbih0d28pKSB7XG4gICAgICAgIHJlc3VsdCA9IHRha2VWYWx1ZSh0d28pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KG9uZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gb25lLnNsaWNlKCk7XG4gICAgICAgIGlmIChpc0FycmF5KHR3bykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdHdvLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRha2VWYWx1ZSh0d29baV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCh0d28pKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9uZSkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHR3bykpIHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkTWVyZ2Uob25lLCB0d28pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9uZSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHR3b1ZhbHVlID0gdHdvW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHR3b1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR3b1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajEgPSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajIgPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc09iamVjdFJlZmVyZW5jZWQob25lLCBrZXksIG9iamVjdHMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNPYmplY3RSZWZlcmVuY2VkKHR3bywga2V5LCBvYmplY3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9iajEpICYmIGlzT2JqZWN0KG9iajIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjEgPSBvYmplY3RzLmdldChvYmoxKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyMiA9IG9iamVjdHMuZ2V0KG9iajIpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7IG9iajogb25lLCBrZXk6IGtleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIyLnB1c2goeyBvYmo6IHR3bywga2V5OiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMSwgYXJyMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMiwgYXJyMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlVHdvT2JqZWN0cyhyZXN1bHRba2V5XSwgdHdvVmFsdWUsIGxldmVsLCBvYmplY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHR3bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBvYmplY3QgaGFzIGJlZW4gYWxyZWFkeSByZWZlcmVuY2VcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIHdhc09iamVjdFJlZmVyZW5jZWQob2JqLCBrZXksIG9iamVjdHMpIHtcbiAgICB2YXIgYXJyID0gb2JqZWN0cy5nZXQob2JqW2tleV0pIHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICB2YXIgaW5mbyA9IGFycltpXTtcbiAgICAgICAgaWYgKGluZm8ua2V5ID09PSBrZXkgJiYgaW5mby5vYmogPT09IG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gKCFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc0Z1bmN0aW9uKHZhbHVlKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgdmFsdWUgPT09IG51bGwpO1xufVxuZnVuY3Rpb24gc2hvdWxkTWVyZ2Uob25lLCB0d28pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob25lKSB8fCAhaXNQbGFpbk9iamVjdCh0d28pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRXJyb3IgdGhhdCBpcyB0aHJvd24gb24gdGltZW91dHMuXG4gKi9cbnZhciBUaW1lb3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRpbWVvdXRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lb3V0RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICAvLyBtYW51YWxseSBhZGp1c3QgcHJvdG90eXBlIHRvIHJldGFpbiBgaW5zdGFuY2VvZmAgZnVuY3Rpb25hbGl0eSB3aGVuIHRhcmdldGluZyBFUzUsIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYWluL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVGltZW91dEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbi8qKlxuICogQWRkcyBhIHRpbWVvdXQgdG8gYSBwcm9taXNlIGFuZCByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgdGltZW91dCBoYXMgZWxhcHNlZC4gQWxzbyByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZVxuICogcmVqZWN0cywgYW5kIHJlc29sdmVzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZSByZXNvbHZlcy5cbiAqXG4gKiA8cD4gTk9URTogdGhpcyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGl0IHRocm93cyBhIHtAbGluayBUaW1lb3V0RXJyb3J9LlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIHByb21pc2UgdG8gdXNlIHdpdGggdGltZW91dC5cbiAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXQpIHtcbiAgICB2YXIgdGltZW91dEhhbmRsZTtcbiAgICB2YXIgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiB0aW1lb3V0RnVuY3Rpb24oX3Jlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0SGFuZGxlcigpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCdPcGVyYXRpb24gdGltZWQgb3V0LicpKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZW91dFByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENoZWNrcyBpZiBjZXJ0YWluIGZ1bmN0aW9uIGhhcyBiZWVuIGFscmVhZHkgd3JhcHBlZFxuICogQHBhcmFtIGZ1bmNcbiAqL1xuZnVuY3Rpb24gaXNXcmFwcGVkKGZ1bmMpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fb3JpZ2luYWwgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGZ1bmMuX191bndyYXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZnVuYy5fX3dyYXBwZWQgPT09IHRydWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIERlZmVycmVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgX3RoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZlcnJlZC5wcm90b3R5cGUsIFwicHJvbWlzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWwpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fcmVqZWN0KGVycik7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIEJpbmQgdGhlIGNhbGxiYWNrIGFuZCBvbmx5IGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSByZWdhcmRsZXNzIGhvdyBtYW55IHRpbWVzIGBCaW5kT25jZUZ1dHVyZS5jYWxsYCBpcyBpbnZva2VkLlxuICovXG52YXIgQmluZE9uY2VGdXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZE9uY2VGdXR1cmUoX2NhbGxiYWNrLCBfdGhhdCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IF9jYWxsYmFjaztcbiAgICAgICAgdGhpcy5fdGhhdCA9IF90aGF0O1xuICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcImlzQ2FsbGVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcInByb21pc2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgoX2EgPSB0aGlzLl9jYWxsYmFjaykuY2FsbC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbdGhpcy5fdGhhdF0sIF9fcmVhZChhcmdzKSwgZmFsc2UpKSkudGhlbihmdW5jdGlvbiAodmFsKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh2YWwpOyB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRPbmNlRnV0dXJlO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKiBTaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IEV4cG9ydGVycyB3aGlsZSBleHBvcnRpbmcgZGF0YSwgaW5jbHVkaW5nIHN1cHByZXNzaW9uIG9mIFRyYWNlcy5cbiAqL1xuZnVuY3Rpb24gX2V4cG9ydChleHBvcnRlciwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwb3J0ZXIuZXhwb3J0KGFyZywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBiYWdnYWdlVXRpbHMgPSB7XG4gICAgZ2V0S2V5UGFpcnM6IGdldEtleVBhaXJzLFxuICAgIHNlcmlhbGl6ZUtleVBhaXJzOiBzZXJpYWxpemVLZXlQYWlycyxcbiAgICBwYXJzZUtleVBhaXJzSW50b1JlY29yZDogcGFyc2VLZXlQYWlyc0ludG9SZWNvcmQsXG4gICAgcGFyc2VQYWlyS2V5VmFsdWU6IHBhcnNlUGFpcktleVZhbHVlLFxufTtcbnZhciBpbnRlcm5hbCA9IHtcbiAgICBfZXhwb3J0OiBfZXhwb3J0LFxufTtcblxuY29uc3QgZXNtID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoLyojX19QVVJFX18qL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIEFsd2F5c09mZlNhbXBsZXIsXG4gICAgQWx3YXlzT25TYW1wbGVyLFxuICAgIEFuY2hvcmVkQ2xvY2ssXG4gICAgQmluZE9uY2VGdXR1cmUsXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvcixcbiAgICBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgREVGQVVMVF9FTlZJUk9OTUVOVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgIGdldCBFeHBvcnRSZXN1bHRDb2RlICgpIHsgcmV0dXJuIEV4cG9ydFJlc3VsdENvZGU7IH0sXG4gICAgUGFyZW50QmFzZWRTYW1wbGVyLFxuICAgIGdldCBSUENUeXBlICgpIHsgcmV0dXJuIFJQQ1R5cGU7IH0sXG4gICAgUmFuZG9tSWRHZW5lcmF0b3IsXG4gICAgU0RLX0lORk8sXG4gICAgVFJBQ0VfUEFSRU5UX0hFQURFUixcbiAgICBUUkFDRV9TVEFURV9IRUFERVIsXG4gICAgVGltZW91dEVycm9yLFxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcixcbiAgICBUcmFjZVN0YXRlLFxuICAgIGdldCBUcmFjZXNTYW1wbGVyVmFsdWVzICgpIHsgcmV0dXJuIFRyYWNlc1NhbXBsZXJWYWx1ZXM7IH0sXG4gICAgVkVSU0lPTjogVkVSU0lPTiQxLFxuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLFxuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsXG4gICAgX2dsb2JhbFRoaXMsXG4gICAgYWRkSHJUaW1lcyxcbiAgICBiYWdnYWdlVXRpbHMsXG4gICAgY2FsbFdpdGhUaW1lb3V0LFxuICAgIGRlbGV0ZVJQQ01ldGFkYXRhLFxuICAgIGdldEVudixcbiAgICBnZXRFbnZXaXRob3V0RGVmYXVsdHMsXG4gICAgZ2V0UlBDTWV0YWRhdGEsXG4gICAgZ2V0VGltZU9yaWdpbixcbiAgICBnbG9iYWxFcnJvckhhbmRsZXIsXG4gICAgaGV4VG9CYXNlNjQsXG4gICAgaGV4VG9CaW5hcnksXG4gICAgaHJUaW1lLFxuICAgIGhyVGltZUR1cmF0aW9uLFxuICAgIGhyVGltZVRvTWljcm9zZWNvbmRzLFxuICAgIGhyVGltZVRvTWlsbGlzZWNvbmRzLFxuICAgIGhyVGltZVRvTmFub3NlY29uZHMsXG4gICAgaHJUaW1lVG9UaW1lU3RhbXAsXG4gICAgaW50ZXJuYWwsXG4gICAgaXNBdHRyaWJ1dGVLZXksXG4gICAgaXNBdHRyaWJ1dGVWYWx1ZSxcbiAgICBpc1RpbWVJbnB1dCxcbiAgICBpc1RpbWVJbnB1dEhyVGltZSxcbiAgICBpc1RyYWNpbmdTdXBwcmVzc2VkLFxuICAgIGlzVXJsSWdub3JlZCxcbiAgICBpc1dyYXBwZWQsXG4gICAgbG9nZ2luZ0Vycm9ySGFuZGxlcixcbiAgICBtZXJnZSxcbiAgICBtaWxsaXNUb0hyVGltZSxcbiAgICBvdHBlcmZvcm1hbmNlLFxuICAgIHBhcnNlRW52aXJvbm1lbnQsXG4gICAgcGFyc2VUcmFjZVBhcmVudCxcbiAgICBzYW5pdGl6ZUF0dHJpYnV0ZXMsXG4gICAgc2V0R2xvYmFsRXJyb3JIYW5kbGVyLFxuICAgIHNldFJQQ01ldGFkYXRhLFxuICAgIHN1cHByZXNzVHJhY2luZyxcbiAgICB0aW1lSW5wdXRUb0hyVGltZSxcbiAgICB1bnJlZlRpbWVyLFxuICAgIHVuc3VwcHJlc3NUcmFjaW5nLFxuICAgIHVybE1hdGNoZXNcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSkpO1xuXG5leHBvcnQgeyBCaW5kT25jZUZ1dHVyZSBhcyBCLCBDb21wb3NpdGVQcm9wYWdhdG9yIGFzIEMsIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIGFzIEQsIFNhbXBsaW5nRGVjaXNpb24gYXMgUywgVHJhY2VzU2FtcGxlclZhbHVlcyBhcyBULCBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yIGFzIFcsIGdldEVudiBhcyBhLCBnZXRFbnZXaXRob3V0RGVmYXVsdHMgYXMgYiwgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIGFzIGMsIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yIGFzIGQsIGludGVybmFsIGFzIGUsIGVzbSBhcyBmLCBnbG9iYWxFcnJvckhhbmRsZXIgYXMgZywgaXNBdHRyaWJ1dGVWYWx1ZSBhcyBpLCBtZXJnZSBhcyBtLCBzYW5pdGl6ZUF0dHJpYnV0ZXMgYXMgcywgdW5yZWZUaW1lciBhcyB1IH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQyxLQUFLQyxHQUFhLEtBQUtDLEdBQWEsS0FBS0MsSUFBWSxLQUFLQyxJQUFlLEtBQUtDLElBQVEsS0FBS0MsSUFBZ0IsS0FBS0MsSUFBc0IsTUFBTUMsSUFBc0IsS0FBS0MsSUFBcUIsTUFBTUMsSUFBbUIsS0FBS0MsSUFBYSxLQUFLQyxJQUFtQixLQUFLQyxJQUFjLEtBQUtDLElBQWdCLEtBQUtDLElBQWUsS0FBS0MsSUFBbUIsS0FBS0MsVUFBa0I7QUFDeFosU0FBUyxLQUFLQyxHQUFxQixLQUFLQyxHQUFpQixLQUFLQyxVQUF5QjtBQUN2RixTQUFTLEtBQUtDLFNBQVk7QUFDMUIsU0FBUyxLQUFLQyxHQUFhLEtBQUtDLFVBQXdCO0FBQ3hELFNBQVMsS0FBS0MsR0FBYyxLQUFLQyxHQUFPLEtBQUtDLEdBQW9CLEtBQUtDLEdBQVksS0FBS0MsSUFBa0IsS0FBS0MsSUFBZ0IsS0FBS0MsU0FBZTtBQUNsSixTQUFTLEtBQUtDLElBQVUsTUFBTUMsVUFBaUI7QUFzQi9DLElBQUlDO0FBQUEsQ0FDSCxTQUFVQSxHQUFrQjtBQUt6QixFQUFBQSxFQUFpQkEsRUFBaUIsYUFBZ0IsQ0FBQyxJQUFJLGNBS3ZEQSxFQUFpQkEsRUFBaUIsU0FBWSxDQUFDLElBQUksVUFLbkRBLEVBQWlCQSxFQUFpQixxQkFBd0IsQ0FBQyxJQUFJO0FBQ25FLEdBQUdBLE1BQXFCQSxJQUFtQixDQUFDLEVBQUU7QUFpQjlDLElBQUlDLEtBQTZCLEtBQzdCQyxJQUErQixLQUMvQkMsSUFBMEIsS0FFMUJDLElBQWlCLFdBRWpCQyxLQUErQixLQUUvQkMsS0FBbUMsTUFFbkNDLEtBQTJCLE1BRTNCQyxLQUE4QyxTQUFVQyxHQUFHQyxHQUFHO0FBQzlELE1BQUlDLElBQUksT0FBTyxVQUFXLGNBQWNGLEVBQUUsT0FBTyxRQUFRO0FBQ3pELE1BQUksQ0FBQ0UsRUFBRyxRQUFPRjtBQUNmLE1BQUlHLElBQUlELEVBQUUsS0FBS0YsQ0FBQyxHQUFHSSxHQUFHQyxJQUFLLENBQUMsR0FBR0M7QUFDL0IsTUFBSTtBQUNBLFlBQVFMLE1BQU0sVUFBVUEsTUFBTSxNQUFNLEVBQUVHLElBQUlELEVBQUUsS0FBSyxHQUFHLE9BQU0sQ0FBQUUsRUFBRyxLQUFLRCxFQUFFLEtBQUs7QUFBQSxFQUM3RSxTQUNPRyxHQUFPO0FBQUUsSUFBQUQsSUFBSSxFQUFFLE9BQU9DLEVBQU07QUFBQSxFQUFHLFVBQ3RDO0FBQ0ksUUFBSTtBQUNBLE1BQUlILEtBQUssQ0FBQ0EsRUFBRSxTQUFTRixJQUFJQyxFQUFFLFdBQVlELEVBQUUsS0FBS0MsQ0FBQztBQUFBLElBQ25ELFVBQ0E7QUFBVSxVQUFJRyxFQUFHLE9BQU1BLEVBQUU7QUFBQSxJQUFPO0FBQUEsRUFDcEM7QUFDQSxTQUFPRDtBQUNYO0FBQ0EsU0FBU0csR0FBa0JDLEdBQVU7QUFDakMsU0FBT0EsRUFBUyxPQUFPLFNBQVVDLEdBQVFDLEdBQVM7QUFDOUMsUUFBSUMsSUFBUSxLQUFLRixLQUFVQSxNQUFXLEtBQUtoQixJQUEwQixNQUFNaUI7QUFDM0UsV0FBT0MsRUFBTSxTQUFTZCxLQUEyQlksSUFBU0U7QUFBQSxFQUM5RCxHQUFHLEVBQUU7QUFDVDtBQUNBLFNBQVNDLEdBQVlDLEdBQVM7QUFDMUIsU0FBT0EsRUFBUSxjQUFjLEVBQUUsSUFBSSxTQUFVQyxHQUFJO0FBQzdDLFFBQUlDLElBQUtqQixHQUFTZ0IsR0FBSSxDQUFDLEdBQUdFLElBQU1ELEVBQUcsQ0FBQyxHQUFHSixJQUFRSSxFQUFHLENBQUMsR0FDL0NFLElBQVEsbUJBQW1CRCxDQUFHLElBQUksTUFBTSxtQkFBbUJMLEVBQU0sS0FBSztBQUcxRSxXQUFJQSxFQUFNLGFBQWEsV0FDbkJNLEtBQVN6QixJQUErQm1CLEVBQU0sU0FBUyxTQUFTLElBRTdETTtBQUFBLEVBQ1gsQ0FBQztBQUNMO0FBQ0EsU0FBU0MsRUFBa0JELEdBQU87QUFDOUIsTUFBSUUsSUFBYUYsRUFBTSxNQUFNekIsQ0FBNEI7QUFDekQsTUFBSSxFQUFBMkIsRUFBVyxVQUFVLElBRXpCO0FBQUEsUUFBSUMsSUFBY0QsRUFBVyxNQUFNO0FBQ25DLFFBQUtDLEdBRUw7QUFBQSxVQUFJQyxJQUFpQkQsRUFBWSxRQUFRN0IsRUFBMEI7QUFDbkUsVUFBSSxFQUFBOEIsS0FBa0IsSUFFdEI7QUFBQSxZQUFJTCxJQUFNLG1CQUFtQkksRUFBWSxVQUFVLEdBQUdDLENBQWMsRUFBRSxLQUFLLENBQUMsR0FDeEVWLElBQVEsbUJBQW1CUyxFQUFZLFVBQVVDLElBQWlCLENBQUMsRUFBRSxLQUFLLENBQUMsR0FDM0VDO0FBQ0osZUFBSUgsRUFBVyxTQUFTLE1BQ3BCRyxJQUFXakUsR0FBK0I4RCxFQUFXLEtBQUszQixDQUE0QixDQUFDLElBRXBGLEVBQUUsS0FBS3dCLEdBQUssT0FBT0wsR0FBTyxVQUFVVyxFQUFTO0FBQUE7QUFBQTtBQUFBO0FBQ3hEO0FBS0EsU0FBU0MsR0FBd0JaLEdBQU87QUFDcEMsU0FBSSxPQUFPQSxLQUFVLFlBQVlBLEVBQU0sV0FBVyxJQUN2QyxDQUFDLElBQ0xBLEVBQ0YsTUFBTWxCLENBQXVCLEVBQzdCLElBQUksU0FBVXdCLEdBQU87QUFDdEIsV0FBT0MsRUFBa0JELENBQUs7QUFBQSxFQUNsQyxDQUFDLEVBQ0ksT0FBTyxTQUFVTyxHQUFTO0FBQUUsV0FBT0EsTUFBWSxVQUFhQSxFQUFRLE1BQU0sU0FBUztBQUFBLEVBQUcsQ0FBQyxFQUN2RixPQUFPLFNBQVVDLEdBQVNELEdBQVM7QUFFcEMsV0FBQUMsRUFBUUQsRUFBUSxHQUFHLElBQUlBLEVBQVEsT0FDeEJDO0FBQUEsRUFDWCxHQUFHLENBQUMsQ0FBQztBQUNUO0FBdUJBLElBQUlDO0FBQUE7QUFBQSxHQUFzQyxXQUFZO0FBQ2xELGFBQVNBLElBQXVCO0FBQUEsSUFDaEM7QUFDQSxXQUFBQSxFQUFxQixVQUFVLFNBQVMsU0FBVXZDLEdBQVN3QyxHQUFTQyxHQUFRO0FBQ3hFLFVBQUlmLElBQVV2RCxFQUFZLFdBQVc2QixDQUFPO0FBQzVDLFVBQUksR0FBQzBCLEtBQVd0QyxFQUFvQlksQ0FBTyxJQUUzQztBQUFBLFlBQUlxQixJQUFXSSxHQUFZQyxDQUFPLEVBQzdCLE9BQU8sU0FBVWdCLEdBQU07QUFDeEIsaUJBQU9BLEVBQUssVUFBVWpDO0FBQUEsUUFDMUIsQ0FBQyxFQUNJLE1BQU0sR0FBR0QsRUFBNEIsR0FDdENtQyxJQUFjdkIsR0FBa0JDLENBQVE7QUFDNUMsUUFBSXNCLEVBQVksU0FBUyxLQUNyQkYsRUFBTyxJQUFJRCxHQUFTakMsR0FBZ0JvQyxDQUFXO0FBQUE7QUFBQSxJQUV2RCxHQUNBSixFQUFxQixVQUFVLFVBQVUsU0FBVXZDLEdBQVN3QyxHQUFTSSxHQUFRO0FBQ3pFLFVBQUlELElBQWNDLEVBQU8sSUFBSUosR0FBU2pDLENBQWMsR0FDaERzQyxJQUFnQixNQUFNLFFBQVFGLENBQVcsSUFDdkNBLEVBQVksS0FBS3JDLENBQXVCLElBQ3hDcUM7QUFDTixVQUFJLENBQUNFO0FBQ0QsZUFBTzdDO0FBQ1gsVUFBSTBCLElBQVUsQ0FBQztBQUNmLFVBQUltQixFQUFjLFdBQVc7QUFDekIsZUFBTzdDO0FBRVgsVUFBSThDLElBQVFELEVBQWMsTUFBTXZDLENBQXVCO0FBV3ZELGFBVkF3QyxFQUFNLFFBQVEsU0FBVWhCLEdBQU87QUFDM0IsWUFBSU8sSUFBVU4sRUFBa0JELENBQUs7QUFDckMsWUFBSU8sR0FBUztBQUNULGNBQUlVLElBQWUsRUFBRSxPQUFPVixFQUFRLE1BQU07QUFDMUMsVUFBSUEsRUFBUSxhQUNSVSxFQUFhLFdBQVdWLEVBQVEsV0FFcENYLEVBQVFXLEVBQVEsR0FBRyxJQUFJVTtBQUFBLFFBQzNCO0FBQUEsTUFDSixDQUFDLEdBQ0csT0FBTyxRQUFRckIsQ0FBTyxFQUFFLFdBQVcsSUFDNUIxQixJQUVKN0IsRUFBWSxXQUFXNkIsR0FBUzdCLEVBQVksY0FBY3VELENBQU8sQ0FBQztBQUFBLElBQzdFLEdBQ0FhLEVBQXFCLFVBQVUsU0FBUyxXQUFZO0FBQ2hELGFBQU8sQ0FBQ2hDLENBQWM7QUFBQSxJQUMxQixHQUNPZ0M7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWtDRVM7QUFBQTtBQUFBLEdBQStCLFdBQVk7QUFPM0MsYUFBU0EsRUFBY0MsR0FBYUMsR0FBZ0I7QUFDaEQsV0FBSyxrQkFBa0JBLEdBQ3ZCLEtBQUssZUFBZUQsRUFBWSxJQUFJLEdBQ3BDLEtBQUsscUJBQXFCQyxFQUFlLElBQUk7QUFBQSxJQUNqRDtBQUtBLFdBQUFGLEVBQWMsVUFBVSxNQUFNLFdBQVk7QUFDdEMsVUFBSUcsSUFBUSxLQUFLLGdCQUFnQixJQUFJLElBQUksS0FBSztBQUM5QyxhQUFPLEtBQUssZUFBZUE7QUFBQSxJQUMvQixHQUNPSDtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBaUJFSSxLQUFrRCxTQUFTeEMsR0FBRztBQUM5RCxNQUFJeUMsSUFBSSxPQUFPLFVBQVcsY0FBYyxPQUFPLFVBQVV2QyxJQUFJdUMsS0FBS3pDLEVBQUV5QyxDQUFDLEdBQUd0QyxJQUFJO0FBQzVFLE1BQUlELEVBQUcsUUFBT0EsRUFBRSxLQUFLRixDQUFDO0FBQ3RCLE1BQUlBLEtBQUssT0FBT0EsRUFBRSxVQUFXLFNBQVUsUUFBTztBQUFBLElBQzFDLE1BQU0sV0FBWTtBQUNkLGFBQUlBLEtBQUtHLEtBQUtILEVBQUUsV0FBUUEsSUFBSSxTQUNyQixFQUFFLE9BQU9BLEtBQUtBLEVBQUVHLEdBQUcsR0FBRyxNQUFNLENBQUNILEVBQUU7QUFBQSxJQUMxQztBQUFBLEVBQ0o7QUFDQSxRQUFNLElBQUksVUFBVXlDLElBQUksNEJBQTRCLGlDQUFpQztBQUN6RixHQUNJQyxLQUE4QyxTQUFVMUMsR0FBR0MsR0FBRztBQUM5RCxNQUFJQyxJQUFJLE9BQU8sVUFBVyxjQUFjRixFQUFFLE9BQU8sUUFBUTtBQUN6RCxNQUFJLENBQUNFLEVBQUcsUUFBT0Y7QUFDZixNQUFJRyxJQUFJRCxFQUFFLEtBQUtGLENBQUMsR0FBR0ksR0FBR0MsSUFBSyxDQUFDLEdBQUdDO0FBQy9CLE1BQUk7QUFDQSxZQUFRTCxNQUFNLFVBQVVBLE1BQU0sTUFBTSxFQUFFRyxJQUFJRCxFQUFFLEtBQUssR0FBRyxPQUFNLENBQUFFLEVBQUcsS0FBS0QsRUFBRSxLQUFLO0FBQUEsRUFDN0UsU0FDT0csR0FBTztBQUFFLElBQUFELElBQUksRUFBRSxPQUFPQyxFQUFNO0FBQUEsRUFBRyxVQUN0QztBQUNJLFFBQUk7QUFDQSxNQUFJSCxLQUFLLENBQUNBLEVBQUUsU0FBU0YsSUFBSUMsRUFBRSxXQUFZRCxFQUFFLEtBQUtDLENBQUM7QUFBQSxJQUNuRCxVQUNBO0FBQVUsVUFBSUcsRUFBRyxPQUFNQSxFQUFFO0FBQUEsSUFBTztBQUFBLEVBQ3BDO0FBQ0EsU0FBT0Q7QUFDWDtBQUNBLFNBQVNzQyxHQUFtQkMsR0FBWTtBQUNwQyxNQUFJQyxHQUFLOUIsR0FDTCtCLElBQU0sQ0FBQztBQUNYLE1BQUksT0FBT0YsS0FBZSxZQUFZQSxLQUFjO0FBQ2hELFdBQU9FO0FBRVgsTUFBSTtBQUNBLGFBQVM5QixJQUFLd0IsR0FBVyxPQUFPLFFBQVFJLENBQVUsQ0FBQyxHQUFHRyxJQUFLL0IsRUFBRyxLQUFLLEdBQUcsQ0FBQytCLEVBQUcsTUFBTUEsSUFBSy9CLEVBQUcsS0FBSyxHQUFHO0FBQzVGLFVBQUlnQyxJQUFLTixHQUFTSyxFQUFHLE9BQU8sQ0FBQyxHQUFHOUIsSUFBTStCLEVBQUcsQ0FBQyxHQUFHQyxJQUFNRCxFQUFHLENBQUM7QUFDdkQsVUFBSSxDQUFDRSxHQUFlakMsQ0FBRyxHQUFHO0FBQ3RCLFFBQUF0QyxFQUFLLEtBQUssNEJBQTRCc0MsQ0FBRztBQUN6QztBQUFBLE1BQ0o7QUFDQSxVQUFJLENBQUNrQyxHQUFpQkYsQ0FBRyxHQUFHO0FBQ3hCLFFBQUF0RSxFQUFLLEtBQUssMENBQTBDc0MsQ0FBRztBQUN2RDtBQUFBLE1BQ0o7QUFDQSxNQUFJLE1BQU0sUUFBUWdDLENBQUcsSUFDakJILEVBQUk3QixDQUFHLElBQUlnQyxFQUFJLE1BQU0sSUFHckJILEVBQUk3QixDQUFHLElBQUlnQztBQUFBLElBRW5CO0FBQUEsRUFDSixTQUNPRyxHQUFPO0FBQUUsSUFBQVAsSUFBTSxFQUFFLE9BQU9PLEVBQU07QUFBQSxFQUFHLFVBQ3hDO0FBQ0ksUUFBSTtBQUNBLE1BQUlMLEtBQU0sQ0FBQ0EsRUFBRyxTQUFTaEMsSUFBS0MsRUFBRyxXQUFTRCxFQUFHLEtBQUtDLENBQUU7QUFBQSxJQUN0RCxVQUNBO0FBQVUsVUFBSTZCLEVBQUssT0FBTUEsRUFBSTtBQUFBLElBQU87QUFBQSxFQUN4QztBQUNBLFNBQU9DO0FBQ1g7QUFDQSxTQUFTSSxHQUFlakMsR0FBSztBQUN6QixTQUFPLE9BQU9BLEtBQVEsWUFBWUEsRUFBSSxTQUFTO0FBQ25EO0FBQ0EsU0FBU2tDLEdBQWlCRixHQUFLO0FBQzNCLFNBQUlBLEtBQU8sT0FDQSxLQUVQLE1BQU0sUUFBUUEsQ0FBRyxJQUNWSSxHQUFpQ0osQ0FBRyxJQUV4Q0ssR0FBK0JMLENBQUc7QUFDN0M7QUFDQSxTQUFTSSxHQUFpQ0UsR0FBSztBQUMzQyxNQUFJQyxHQUFLekMsR0FDTDBDO0FBQ0osTUFBSTtBQUNBLGFBQVNDLElBQVFsQixHQUFXZSxDQUFHLEdBQUdJLElBQVVELEVBQU0sS0FBSyxHQUFHLENBQUNDLEVBQVEsTUFBTUEsSUFBVUQsRUFBTSxLQUFLLEdBQUc7QUFDN0YsVUFBSUUsSUFBVUQsRUFBUTtBQUV0QixVQUFJQyxLQUFXLE1BRWY7QUFBQSxZQUFJLENBQUNILEdBQU07QUFDUCxjQUFJSCxHQUErQk0sQ0FBTyxHQUFHO0FBQ3pDLFlBQUFILElBQU8sT0FBT0c7QUFDZDtBQUFBLFVBQ0o7QUFFQSxpQkFBTztBQUFBLFFBQ1g7QUFDQSxZQUFJLE9BQU9BLE1BQVlIO0FBR3ZCLGlCQUFPO0FBQUE7QUFBQSxJQUNYO0FBQUEsRUFDSixTQUNPSSxHQUFPO0FBQUUsSUFBQUwsSUFBTSxFQUFFLE9BQU9LLEVBQU07QUFBQSxFQUFHLFVBQ3hDO0FBQ0ksUUFBSTtBQUNBLE1BQUlGLEtBQVcsQ0FBQ0EsRUFBUSxTQUFTNUMsSUFBSzJDLEVBQU0sV0FBUzNDLEVBQUcsS0FBSzJDLENBQUs7QUFBQSxJQUN0RSxVQUNBO0FBQVUsVUFBSUYsRUFBSyxPQUFNQSxFQUFJO0FBQUEsSUFBTztBQUFBLEVBQ3hDO0FBQ0EsU0FBTztBQUNYO0FBQ0EsU0FBU0YsR0FBK0JMLEdBQUs7QUFDekMsVUFBUSxPQUFPQSxHQUFLO0FBQUEsSUFDaEIsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLElBQ0wsS0FBSztBQUNELGFBQU87QUFBQSxFQUNmO0FBQ0EsU0FBTztBQUNYO0FBcUJBLFNBQVNhLEtBQXNCO0FBQzNCLFNBQU8sU0FBVUMsR0FBSTtBQUNqQixJQUFBcEYsRUFBSyxNQUFNcUYsR0FBbUJELENBQUUsQ0FBQztBQUFBLEVBQ3JDO0FBQ0o7QUFLQSxTQUFTQyxHQUFtQkQsR0FBSTtBQUM1QixTQUFJLE9BQU9BLEtBQU8sV0FDUEEsSUFHQSxLQUFLLFVBQVVFLEdBQWlCRixDQUFFLENBQUM7QUFFbEQ7QUFNQSxTQUFTRSxHQUFpQkYsR0FBSTtBQUcxQixXQUZJRyxJQUFTLENBQUMsR0FDVnZELElBQVVvRCxHQUNQcEQsTUFBWTtBQUNmLFdBQU8sb0JBQW9CQSxDQUFPLEVBQUUsUUFBUSxTQUFVd0QsR0FBYztBQUNoRSxVQUFJLENBQUFELEVBQU9DLENBQVksR0FFdkI7QUFBQSxZQUFJdkQsSUFBUUQsRUFBUXdELENBQVk7QUFDaEMsUUFBSXZELE1BQ0FzRCxFQUFPQyxDQUFZLElBQUksT0FBT3ZELENBQUs7QUFBQTtBQUFBLElBRTNDLENBQUMsR0FDREQsSUFBVSxPQUFPLGVBQWVBLENBQU87QUFFM0MsU0FBT3VEO0FBQ1g7QUFrQkEsSUFBSUUsS0FBa0JOLEdBQW9CO0FBSzFDLFNBQVNPLEdBQXNCQyxHQUFTO0FBQ3BDLEVBQUFGLEtBQWtCRTtBQUN0QjtBQUtBLFNBQVNDLEdBQW1CUixHQUFJO0FBQzVCLE1BQUk7QUFDQSxJQUFBSyxHQUFnQkwsQ0FBRTtBQUFBLEVBQ3RCLFFBQ1c7QUFBQSxFQUFFO0FBQ2pCO0FBaUJBLElBQUlTO0FBQUEsQ0FDSCxTQUFVQSxHQUFxQjtBQUM1QixFQUFBQSxFQUFvQixZQUFlLGNBQ25DQSxFQUFvQixXQUFjLGFBQ2xDQSxFQUFvQix1QkFBMEIsMEJBQzlDQSxFQUFvQixzQkFBeUIseUJBQzdDQSxFQUFvQiwwQkFBNkIsNEJBQ2pEQSxFQUFvQixlQUFrQjtBQUMxQyxHQUFHQSxNQUF3QkEsSUFBc0IsQ0FBQyxFQUFFO0FBaUJwRCxJQUFJQyxLQUF5QixLQUl6QkMsS0FBMkIsQ0FBQyxtQkFBbUI7QUFDbkQsU0FBU0MsR0FBaUIxRCxHQUFLO0FBQzNCLFNBQVF5RCxHQUF5QixRQUFRekQsQ0FBRyxJQUFJO0FBQ3BEO0FBQ0EsSUFBSTJELEtBQTJCO0FBQUEsRUFDM0I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0o7QUFDQSxTQUFTQyxHQUFnQjVELEdBQUs7QUFDMUIsU0FBUTJELEdBQXlCLFFBQVEzRCxDQUFHLElBQUk7QUFDcEQ7QUFDQSxJQUFJNkQsS0FBeUI7QUFBQSxFQUN6QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0o7QUFDQSxTQUFTQyxHQUFjOUQsR0FBSztBQUN4QixTQUFPNkQsR0FBdUIsUUFBUTdELENBQUcsSUFBSTtBQUNqRDtBQUNBLElBQUkrRCxJQUF1QyxPQUN2Q0MsSUFBZ0MsS0FDaENDLEtBQStDLEtBQy9DQyxLQUE4QyxLQUk5Q0MsSUFBc0I7QUFBQSxFQUN0QixtQkFBbUI7QUFBQSxFQUNuQixnQkFBZ0I7QUFBQSxFQUNoQiwrQkFBK0I7QUFBQSxFQUMvQiw0QkFBNEI7QUFBQSxFQUM1QixVQUFVO0FBQUEsRUFDVix5QkFBeUI7QUFBQSxFQUN6QixXQUFXO0FBQUEsRUFDWCx5QkFBeUI7QUFBQSxFQUN6QixnQ0FBZ0M7QUFBQSxFQUNoQyx5QkFBeUI7QUFBQSxFQUN6Qix5QkFBeUI7QUFBQSxFQUN6QiwwQkFBMEI7QUFBQSxFQUMxQixpQ0FBaUM7QUFBQSxFQUNqQywwQkFBMEI7QUFBQSxFQUMxQiwwQkFBMEI7QUFBQSxFQUMxQixpQ0FBaUM7QUFBQSxFQUNqQyxpQ0FBaUM7QUFBQSxFQUNqQywrQkFBK0I7QUFBQSxFQUMvQiwrQkFBK0I7QUFBQSxFQUMvQiwyQkFBMkI7QUFBQSxFQUMzQiw2QkFBNkI7QUFBQSxFQUM3QixvQ0FBb0M7QUFBQSxFQUNwQyxxQ0FBcUM7QUFBQSxFQUNyQyxrQ0FBa0M7QUFBQSxFQUNsQyw0QkFBNEI7QUFBQSxFQUM1QixtQ0FBbUM7QUFBQSxFQUNuQyxvQ0FBb0M7QUFBQSxFQUNwQyxpQ0FBaUM7QUFBQSxFQUNqQyw0QkFBNEI7QUFBQSxFQUM1QixtQ0FBbUM7QUFBQSxFQUNuQyxvQ0FBb0M7QUFBQSxFQUNwQyxpQ0FBaUM7QUFBQSxFQUNqQywrQkFBK0I7QUFBQSxFQUMvQixnQkFBZ0J0RyxFQUFhO0FBQUEsRUFDN0IsdUJBQXVCLENBQUM7QUFBQSxFQUN4QixrQkFBa0IsQ0FBQyxnQkFBZ0IsU0FBUztBQUFBLEVBQzVDLDBCQUEwQjtBQUFBLEVBQzFCLG1CQUFtQjtBQUFBLEVBQ25CLG1DQUFtQ2tHO0FBQUEsRUFDbkMsNEJBQTRCQztBQUFBLEVBQzVCLHdDQUF3Q0Q7QUFBQSxFQUN4QyxpQ0FBaUNDO0FBQUEsRUFDakMsNkNBQTZDRDtBQUFBLEVBQzdDLHNDQUFzQ0M7QUFBQSxFQUN0Qyw2QkFBNkI7QUFBQSxFQUM3Qiw0QkFBNEI7QUFBQSxFQUM1QiwyQ0FBMkNDO0FBQUEsRUFDM0MsMENBQTBDQztBQUFBLEVBQzFDLHNCQUFzQjtBQUFBLEVBQ3RCLHFCQUFxQlgsRUFBb0I7QUFBQSxFQUN6Qyx5QkFBeUI7QUFBQSxFQUN6QixvQkFBb0I7QUFBQSxFQUNwQiw2QkFBNkI7QUFBQSxFQUM3QixvQ0FBb0M7QUFBQSxFQUNwQyxxQ0FBcUM7QUFBQSxFQUNyQyxrQ0FBa0M7QUFBQSxFQUNsQyxnQ0FBZ0M7QUFBQSxFQUNoQyx1Q0FBdUM7QUFBQSxFQUN2Qyx3Q0FBd0M7QUFBQSxFQUN4QyxxQ0FBcUM7QUFBQSxFQUNyQyxnQ0FBZ0M7QUFBQSxFQUNoQyx1Q0FBdUM7QUFBQSxFQUN2Qyx3Q0FBd0M7QUFBQSxFQUN4QyxxQ0FBcUM7QUFBQSxFQUNyQywrQkFBK0I7QUFBQSxFQUMvQixzQ0FBc0M7QUFBQSxFQUN0Qyx1Q0FBdUM7QUFBQSxFQUN2QyxvQ0FBb0M7QUFBQSxFQUNwQyx1Q0FBdUM7QUFBQSxFQUN2Qyw4Q0FBOEM7QUFBQSxFQUM5QywrQ0FBK0M7QUFBQSxFQUMvQyw0Q0FBNEM7QUFBQSxFQUM1Qyw2QkFBNkI7QUFBQSxFQUM3QixvQ0FBb0M7QUFBQSxFQUNwQyxxQ0FBcUM7QUFBQSxFQUNyQyxrQ0FBa0M7QUFBQSxFQUNsQyxtREFBbUQ7QUFBQSxFQUNuRCwrQkFBK0IsQ0FBQztBQUNwQztBQU1BLFNBQVNhLEdBQWFwRSxHQUFLcUUsR0FBYUMsR0FBUTtBQUM1QyxNQUFJLFNBQU9BLEVBQU90RSxDQUFHLElBQU0sTUFHM0I7QUFBQSxRQUFJTCxJQUFRLE9BQU8yRSxFQUFPdEUsQ0FBRyxDQUFDO0FBRTlCLElBQUFxRSxFQUFZckUsQ0FBRyxJQUFJTCxFQUFNLFlBQVksTUFBTTtBQUFBO0FBQy9DO0FBU0EsU0FBUzRFLEdBQVlDLEdBQU1ILEdBQWFDLEdBQVFHLEdBQUtDLEdBQUs7QUFHdEQsTUFGSUQsTUFBUSxXQUFVQSxJQUFNLFNBQ3hCQyxNQUFRLFdBQVVBLElBQU0sUUFDeEIsT0FBT0osRUFBT0UsQ0FBSSxJQUFNLEtBQWE7QUFDckMsUUFBSTdFLElBQVEsT0FBTzJFLEVBQU9FLENBQUksQ0FBQztBQUMvQixJQUFLLE1BQU03RSxDQUFLLE1BQ1JBLElBQVE4RSxJQUNSSixFQUFZRyxDQUFJLElBQUlDLElBRWY5RSxJQUFRK0UsSUFDYkwsRUFBWUcsQ0FBSSxJQUFJRSxJQUdwQkwsRUFBWUcsQ0FBSSxJQUFJN0U7QUFBQSxFQUdoQztBQUNKO0FBUUEsU0FBU2dGLEdBQWdCSCxHQUFNSSxHQUFRQyxHQUFPQyxHQUFXO0FBQ3JELEVBQUlBLE1BQWMsV0FBVUEsSUFBWXRCO0FBQ3hDLE1BQUl1QixJQUFhRixFQUFNTCxDQUFJO0FBQzNCLEVBQUksT0FBT08sS0FBZSxhQUN0QkgsRUFBT0osQ0FBSSxJQUFJTyxFQUFXLE1BQU1ELENBQVMsRUFBRSxJQUFJLFNBQVVFLEdBQUc7QUFBRSxXQUFPQSxFQUFFLEtBQUs7QUFBQSxFQUFHLENBQUM7QUFFeEY7QUFFQSxJQUFJQyxLQUFjO0FBQUEsRUFDZCxLQUFLcEgsRUFBYTtBQUFBLEVBQ2xCLFNBQVNBLEVBQWE7QUFBQSxFQUN0QixPQUFPQSxFQUFhO0FBQUEsRUFDcEIsTUFBTUEsRUFBYTtBQUFBLEVBQ25CLE1BQU1BLEVBQWE7QUFBQSxFQUNuQixPQUFPQSxFQUFhO0FBQUEsRUFDcEIsTUFBTUEsRUFBYTtBQUN2QjtBQU9BLFNBQVNxSCxHQUFtQmxGLEdBQUtxRSxHQUFhQyxHQUFRO0FBQ2xELE1BQUkzRSxJQUFRMkUsRUFBT3RFLENBQUc7QUFDdEIsTUFBSSxPQUFPTCxLQUFVLFVBQVU7QUFDM0IsUUFBSXdGLElBQVdGLEdBQVl0RixFQUFNLFlBQVksQ0FBQztBQUM5QyxJQUFJd0YsS0FBWSxTQUNaZCxFQUFZckUsQ0FBRyxJQUFJbUY7QUFBQSxFQUUzQjtBQUNKO0FBS0EsU0FBU0MsRUFBaUJkLEdBQVE7QUFDOUIsTUFBSUQsSUFBYyxDQUFDO0FBQ25CLFdBQVNnQixLQUFPbEIsR0FBcUI7QUFDakMsUUFBSW5FLElBQU1xRjtBQUNWLFlBQVFyRixHQUFLO0FBQUEsTUFDVCxLQUFLO0FBQ0QsUUFBQWtGLEdBQW1CbEYsR0FBS3FFLEdBQWFDLENBQU07QUFDM0M7QUFBQSxNQUNKO0FBQ0ksWUFBSVosR0FBaUIxRCxDQUFHO0FBQ3BCLFVBQUFvRSxHQUFhcEUsR0FBS3FFLEdBQWFDLENBQU07QUFBQSxpQkFFaENWLEdBQWdCNUQsQ0FBRztBQUN4QixVQUFBdUUsR0FBWXZFLEdBQUtxRSxHQUFhQyxDQUFNO0FBQUEsaUJBRS9CUixHQUFjOUQsQ0FBRztBQUN0QixVQUFBMkUsR0FBZ0IzRSxHQUFLcUUsR0FBYUMsQ0FBTTtBQUFBLGFBRXZDO0FBQ0QsY0FBSTNFLElBQVEyRSxFQUFPdEUsQ0FBRztBQUN0QixVQUFJLE9BQU9MLElBQVUsT0FBZUEsTUFBVSxTQUMxQzBFLEVBQVlyRSxDQUFHLElBQUksT0FBT0wsQ0FBSztBQUFBLFFBRXZDO0FBQUEsSUFDUjtBQUFBLEVBQ0o7QUFDQSxTQUFPMEU7QUFDWDtBQW9CQSxTQUFTaUIsS0FBUztBQUNkLE1BQUlDLElBQVlILEVBQWlCN0ksQ0FBVztBQUM1QyxTQUFPLE9BQU8sT0FBTyxDQUFDLEdBQUc0SCxHQUFxQm9CLENBQVM7QUFDM0Q7QUFDQSxTQUFTQyxLQUF3QjtBQUM3QixTQUFPSixFQUFpQjdJLENBQVc7QUFDdkM7QUFpQkEsSUFBSWtKLEtBQThDLFNBQVUxRyxHQUFHQyxHQUFHO0FBQzlELE1BQUlDLElBQUksT0FBTyxVQUFXLGNBQWNGLEVBQUUsT0FBTyxRQUFRO0FBQ3pELE1BQUksQ0FBQ0UsRUFBRyxRQUFPRjtBQUNmLE1BQUlHLElBQUlELEVBQUUsS0FBS0YsQ0FBQyxHQUFHSSxHQUFHQyxJQUFLLENBQUMsR0FBR0M7QUFDL0IsTUFBSTtBQUNBLFlBQVFMLE1BQU0sVUFBVUEsTUFBTSxNQUFNLEVBQUVHLElBQUlELEVBQUUsS0FBSyxHQUFHLE9BQU0sQ0FBQUUsRUFBRyxLQUFLRCxFQUFFLEtBQUs7QUFBQSxFQUM3RSxTQUNPRyxHQUFPO0FBQUUsSUFBQUQsSUFBSSxFQUFFLE9BQU9DLEVBQU07QUFBQSxFQUFHLFVBQ3RDO0FBQ0ksUUFBSTtBQUNBLE1BQUlILEtBQUssQ0FBQ0EsRUFBRSxTQUFTRixJQUFJQyxFQUFFLFdBQVlELEVBQUUsS0FBS0MsQ0FBQztBQUFBLElBQ25ELFVBQ0E7QUFBVSxVQUFJRyxFQUFHLE9BQU1BLEVBQUU7QUFBQSxJQUFPO0FBQUEsRUFDcEM7QUFDQSxTQUFPRDtBQUNYLEdBQ0lzRyxLQUE0RCxTQUFVQyxHQUFJQyxHQUFNQyxHQUFNO0FBQ3RGLE1BQUlBLEtBQVEsVUFBVSxXQUFXLEVBQUcsVUFBUzNHLElBQUksR0FBRzRHLElBQUlGLEVBQUssUUFBUXhHLEdBQUlGLElBQUk0RyxHQUFHNUc7QUFDNUUsS0FBSUUsS0FBTSxFQUFFRixLQUFLMEcsUUFDUnhHLE1BQUlBLElBQUssTUFBTSxVQUFVLE1BQU0sS0FBS3dHLEdBQU0sR0FBRzFHLENBQUMsSUFDbkRFLEVBQUdGLENBQUMsSUFBSTBHLEVBQUsxRyxDQUFDO0FBR3RCLFNBQU95RyxFQUFHLE9BQU92RyxLQUFNLE1BQU0sVUFBVSxNQUFNLEtBQUt3RyxDQUFJLENBQUM7QUFDM0Q7QUFDQSxTQUFTRyxHQUFZQyxHQUFRO0FBQ3pCLFNBQU8sS0FBSyxPQUFPLGFBQWEsTUFBTSxRQUFRTixHQUFnQixDQUFDLEdBQUdELEdBQVM5SCxFQUFZcUksQ0FBTSxDQUFDLEdBQUcsRUFBSyxDQUFDLENBQUM7QUFDNUc7QUFFQSxJQUFJQyxLQUFnQixHQUNoQkMsS0FBaUIsSUFJakJDO0FBQUE7QUFBQSxFQUFtQyw0QkFBWTtBQUMvQyxhQUFTQSxJQUFvQjtBQUt6QixXQUFLLGtCQUFrQkMsRUFBZUYsRUFBYyxHQUtwRCxLQUFLLGlCQUFpQkUsRUFBZUgsRUFBYTtBQUFBLElBQ3REO0FBQ0EsV0FBT0U7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQUNFRSxJQUEwQixNQUFNLEVBQUU7QUFDdEMsU0FBU0QsRUFBZUUsR0FBTztBQUMzQixTQUFPLFdBQXNCO0FBQ3pCLGFBQVNwSCxJQUFJLEdBQUdBLElBQUlvSCxJQUFRLEdBQUdwSDtBQUMzQixNQUFBbUgsRUFBd0JuSCxDQUFDLElBQUksS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLEVBQUUsSUFBSSxJQUUxRG1ILEVBQXdCbkgsQ0FBQyxLQUFLLE9BQzlCbUgsRUFBd0JuSCxDQUFDLEtBQUs7QUFHdEMsV0FBTyxPQUFPLGFBQWEsTUFBTSxNQUFNbUgsRUFBd0IsTUFBTSxHQUFHQyxJQUFRLENBQUMsQ0FBQztBQUFBLEVBQ3RGO0FBQ0o7QUFpQkEsU0FBU0MsR0FBV0MsR0FBUTtBQUFFO0FBaUI5QixJQUFJQyxLQUFnRCxTQUFTMUgsR0FBRztBQUM1RCxNQUFJeUMsSUFBSSxPQUFPLFVBQVcsY0FBYyxPQUFPLFVBQVV2QyxJQUFJdUMsS0FBS3pDLEVBQUV5QyxDQUFDLEdBQUd0QyxJQUFJO0FBQzVFLE1BQUlELEVBQUcsUUFBT0EsRUFBRSxLQUFLRixDQUFDO0FBQ3RCLE1BQUlBLEtBQUssT0FBT0EsRUFBRSxVQUFXLFNBQVUsUUFBTztBQUFBLElBQzFDLE1BQU0sV0FBWTtBQUNkLGFBQUlBLEtBQUtHLEtBQUtILEVBQUUsV0FBUUEsSUFBSSxTQUNyQixFQUFFLE9BQU9BLEtBQUtBLEVBQUVHLEdBQUcsR0FBRyxNQUFNLENBQUNILEVBQUU7QUFBQSxJQUMxQztBQUFBLEVBQ0o7QUFDQSxRQUFNLElBQUksVUFBVXlDLElBQUksNEJBQTRCLGlDQUFpQztBQUN6RixHQUVJa0Y7QUFBQTtBQUFBLEdBQXFDLFdBQVk7QUFNakQsYUFBU0EsRUFBb0JDLEdBQVE7QUFDakMsTUFBSUEsTUFBVyxXQUFVQSxJQUFTLENBQUM7QUFDbkMsVUFBSTdHO0FBQ0osV0FBSyxnQkFBZ0JBLElBQUs2RyxFQUFPLGlCQUFpQixRQUFRN0csTUFBTyxTQUFTQSxJQUFLLENBQUMsR0FDaEYsS0FBSyxVQUFVLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxhQUVsQyxJQUFJLFNBQVU4RyxHQUFHO0FBQUUsZUFBUSxPQUFPQSxFQUFFLFVBQVcsYUFBYUEsRUFBRSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQUksQ0FBQyxFQUMvRSxPQUFPLFNBQVVDLEdBQUdDLEdBQUc7QUFBRSxlQUFPRCxFQUFFLE9BQU9DLENBQUM7QUFBQSxNQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUFBLElBQzdEO0FBVUEsV0FBQUosRUFBb0IsVUFBVSxTQUFTLFNBQVV2SSxHQUFTd0MsR0FBU0MsR0FBUTtBQUN2RSxVQUFJZ0IsR0FBSzlCO0FBQ1QsVUFBSTtBQUNBLGlCQUFTQyxJQUFLMEcsR0FBUyxLQUFLLFlBQVksR0FBRzNFLElBQUsvQixFQUFHLEtBQUssR0FBRyxDQUFDK0IsRUFBRyxNQUFNQSxJQUFLL0IsRUFBRyxLQUFLLEdBQUc7QUFDakYsY0FBSWdILElBQWFqRixFQUFHO0FBQ3BCLGNBQUk7QUFDQSxZQUFBaUYsRUFBVyxPQUFPNUksR0FBU3dDLEdBQVNDLENBQU07QUFBQSxVQUM5QyxTQUNPb0csR0FBSztBQUNSLFlBQUF0SixFQUFLLEtBQUssMkJBQTJCcUosRUFBVyxZQUFZLE9BQU8sWUFBWUMsRUFBSSxPQUFPO0FBQUEsVUFDOUY7QUFBQSxRQUNKO0FBQUEsTUFDSixTQUNPN0UsR0FBTztBQUFFLFFBQUFQLElBQU0sRUFBRSxPQUFPTyxFQUFNO0FBQUEsTUFBRyxVQUN4QztBQUNJLFlBQUk7QUFDQSxVQUFJTCxLQUFNLENBQUNBLEVBQUcsU0FBU2hDLElBQUtDLEVBQUcsV0FBU0QsRUFBRyxLQUFLQyxDQUFFO0FBQUEsUUFDdEQsVUFDQTtBQUFVLGNBQUk2QixFQUFLLE9BQU1BLEVBQUk7QUFBQSxRQUFPO0FBQUEsTUFDeEM7QUFBQSxJQUNKLEdBVUE4RSxFQUFvQixVQUFVLFVBQVUsU0FBVXZJLEdBQVN3QyxHQUFTSSxHQUFRO0FBQ3hFLGFBQU8sS0FBSyxhQUFhLE9BQU8sU0FBVWtHLEdBQUtGLEdBQVk7QUFDdkQsWUFBSTtBQUNBLGlCQUFPQSxFQUFXLFFBQVFFLEdBQUt0RyxHQUFTSSxDQUFNO0FBQUEsUUFDbEQsU0FDT2lHLEdBQUs7QUFDUixVQUFBdEosRUFBSyxLQUFLLDRCQUE0QnFKLEVBQVcsWUFBWSxPQUFPLFlBQVlDLEVBQUksT0FBTztBQUFBLFFBQy9GO0FBQ0EsZUFBT0M7QUFBQSxNQUNYLEdBQUc5SSxDQUFPO0FBQUEsSUFDZCxHQUNBdUksRUFBb0IsVUFBVSxTQUFTLFdBQVk7QUFFL0MsYUFBTyxLQUFLLFFBQVEsTUFBTTtBQUFBLElBQzlCLEdBQ09BO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FpQkVRLElBQXVCLGdCQUN2QkMsS0FBWSxVQUFVRCxJQUF1QixXQUM3Q0UsS0FBbUIsYUFBYUYsSUFBdUIsa0JBQWtCQSxJQUF1QixVQUNoR0csS0FBa0IsSUFBSSxPQUFPLFNBQVNGLEtBQVksTUFBTUMsS0FBbUIsSUFBSSxHQUMvRUUsS0FBeUIsdUJBQ3pCQyxLQUFrQztBQVN0QyxTQUFTQyxHQUFZeEgsR0FBSztBQUN0QixTQUFPcUgsR0FBZ0IsS0FBS3JILENBQUc7QUFDbkM7QUFLQSxTQUFTeUgsR0FBYzlILEdBQU87QUFDMUIsU0FBUTJILEdBQXVCLEtBQUszSCxDQUFLLEtBQ3JDLENBQUM0SCxHQUFnQyxLQUFLNUgsQ0FBSztBQUNuRDtBQWlCQSxJQUFJK0gsSUFBd0IsSUFDeEJDLEtBQXNCLEtBQ3RCQyxJQUF5QixLQUN6QkMsSUFBaUMsS0FVakNDO0FBQUE7QUFBQSxHQUE0QixXQUFZO0FBQ3hDLGFBQVNBLEVBQVdDLEdBQWU7QUFDL0IsV0FBSyxpQkFBaUIsb0JBQUksSUFBSSxHQUMxQkEsS0FDQSxLQUFLLE9BQU9BLENBQWE7QUFBQSxJQUNqQztBQUNBLFdBQUFELEVBQVcsVUFBVSxNQUFNLFNBQVU5SCxHQUFLTCxHQUFPO0FBRzdDLFVBQUlxSSxJQUFhLEtBQUssT0FBTztBQUM3QixhQUFJQSxFQUFXLGVBQWUsSUFBSWhJLENBQUcsS0FDakNnSSxFQUFXLGVBQWUsT0FBT2hJLENBQUcsR0FFeENnSSxFQUFXLGVBQWUsSUFBSWhJLEdBQUtMLENBQUssR0FDakNxSTtBQUFBLElBQ1gsR0FDQUYsRUFBVyxVQUFVLFFBQVEsU0FBVTlILEdBQUs7QUFDeEMsVUFBSWdJLElBQWEsS0FBSyxPQUFPO0FBQzdCLGFBQUFBLEVBQVcsZUFBZSxPQUFPaEksQ0FBRyxHQUM3QmdJO0FBQUEsSUFDWCxHQUNBRixFQUFXLFVBQVUsTUFBTSxTQUFVOUgsR0FBSztBQUN0QyxhQUFPLEtBQUssZUFBZSxJQUFJQSxDQUFHO0FBQUEsSUFDdEMsR0FDQThILEVBQVcsVUFBVSxZQUFZLFdBQVk7QUFDekMsVUFBSUcsSUFBUTtBQUNaLGFBQU8sS0FBSyxNQUFNLEVBQ2IsT0FBTyxTQUFVQyxHQUFLbEksR0FBSztBQUM1QixlQUFBa0ksRUFBSSxLQUFLbEksSUFBTTZILElBQWlDSSxFQUFNLElBQUlqSSxDQUFHLENBQUMsR0FDdkRrSTtBQUFBLE1BQ1gsR0FBRyxDQUFDLENBQUMsRUFDQSxLQUFLTixDQUFzQjtBQUFBLElBQ3BDLEdBQ0FFLEVBQVcsVUFBVSxTQUFTLFNBQVVDLEdBQWU7QUFDbkQsTUFBSUEsRUFBYyxTQUFTSixPQUUzQixLQUFLLGlCQUFpQkksRUFDakIsTUFBTUgsQ0FBc0IsRUFDNUIsUUFBUSxFQUNSLE9BQU8sU0FBVU0sR0FBS0MsR0FBTTtBQUM3QixZQUFJQyxJQUFhRCxFQUFLLEtBQUssR0FDdkIsSUFBSUMsRUFBVyxRQUFRUCxDQUE4QjtBQUN6RCxZQUFJLE1BQU0sSUFBSTtBQUNWLGNBQUk3SCxJQUFNb0ksRUFBVyxNQUFNLEdBQUcsQ0FBQyxHQUMzQnpJLElBQVF5SSxFQUFXLE1BQU0sSUFBSSxHQUFHRCxFQUFLLE1BQU07QUFDL0MsVUFBSVgsR0FBWXhILENBQUcsS0FBS3lILEdBQWM5SCxDQUFLLEtBQ3ZDdUksRUFBSSxJQUFJbEksR0FBS0wsQ0FBSztBQUFBLFFBRTFCO0FBQ0EsZUFBT3VJO0FBQUEsTUFDWCxHQUFHLG9CQUFJLElBQUksQ0FBQyxHQUVSLEtBQUssZUFBZSxPQUFPUixNQUMzQixLQUFLLGlCQUFpQixJQUFJLElBQUksTUFBTSxLQUFLLEtBQUssZUFBZSxRQUFRLENBQUMsRUFDakUsUUFBUSxFQUNSLE1BQU0sR0FBR0EsQ0FBcUIsQ0FBQztBQUFBLElBRTVDLEdBQ0FJLEVBQVcsVUFBVSxRQUFRLFdBQVk7QUFDckMsYUFBTyxNQUFNLEtBQUssS0FBSyxlQUFlLEtBQUssQ0FBQyxFQUFFLFFBQVE7QUFBQSxJQUMxRCxHQUNBQSxFQUFXLFVBQVUsU0FBUyxXQUFZO0FBQ3RDLFVBQUlFLElBQWEsSUFBSUYsRUFBVztBQUNoQyxhQUFBRSxFQUFXLGlCQUFpQixJQUFJLElBQUksS0FBSyxjQUFjLEdBQ2hEQTtBQUFBLElBQ1gsR0FDT0Y7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRU8sSUFBc0IsZUFDdEJDLElBQXFCLGNBQ3JCQyxLQUFVLE1BQ1ZDLEtBQWUscUJBQ2ZDLEtBQWdCLDJCQUNoQkMsS0FBaUIsMkJBQ2pCQyxLQUFhLGVBQ2JDLEtBQXFCLElBQUksT0FBTyxXQUFXSixLQUFlLFFBQVFDLEtBQWdCLFFBQVFDLEtBQWlCLFFBQVFDLEtBQWEsY0FBYztBQVdsSixTQUFTRSxHQUFpQkMsR0FBYTtBQUNuQyxNQUFJQyxJQUFRSCxHQUFtQixLQUFLRSxDQUFXO0FBTS9DLFNBTEksQ0FBQ0MsS0FLREEsRUFBTSxDQUFDLE1BQU0sUUFBUUEsRUFBTSxDQUFDLElBQ3JCLE9BQ0o7QUFBQSxJQUNILFNBQVNBLEVBQU0sQ0FBQztBQUFBLElBQ2hCLFFBQVFBLEVBQU0sQ0FBQztBQUFBLElBQ2YsWUFBWSxTQUFTQSxFQUFNLENBQUMsR0FBRyxFQUFFO0FBQUEsRUFDckM7QUFDSjtBQU9BLElBQUlDO0FBQUE7QUFBQSxHQUEyQyxXQUFZO0FBQ3ZELGFBQVNBLElBQTRCO0FBQUEsSUFDckM7QUFDQSxXQUFBQSxFQUEwQixVQUFVLFNBQVMsU0FBVTdLLEdBQVN3QyxHQUFTQyxHQUFRO0FBQzdFLFVBQUlxSSxJQUFjbkwsRUFBTSxlQUFlSyxDQUFPO0FBQzlDLFVBQUksR0FBQzhLLEtBQ0QxTCxFQUFvQlksQ0FBTyxLQUMzQixDQUFDSixFQUFtQmtMLENBQVcsSUFFbkM7QUFBQSxZQUFJSCxJQUFjUCxLQUFVLE1BQU1VLEVBQVksVUFBVSxNQUFNQSxFQUFZLFNBQVMsT0FBTyxPQUFPQSxFQUFZLGNBQWNqTCxFQUFXLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDdkosUUFBQTRDLEVBQU8sSUFBSUQsR0FBUzBILEdBQXFCUyxDQUFXLEdBQ2hERyxFQUFZLGNBQ1pySSxFQUFPLElBQUlELEdBQVMySCxHQUFvQlcsRUFBWSxXQUFXLFVBQVUsQ0FBQztBQUFBO0FBQUEsSUFFbEYsR0FDQUQsRUFBMEIsVUFBVSxVQUFVLFNBQVU3SyxHQUFTd0MsR0FBU0ksR0FBUTtBQUM5RSxVQUFJbUksSUFBb0JuSSxFQUFPLElBQUlKLEdBQVMwSCxDQUFtQjtBQUMvRCxVQUFJLENBQUNhO0FBQ0QsZUFBTy9LO0FBQ1gsVUFBSTJLLElBQWMsTUFBTSxRQUFRSSxDQUFpQixJQUMzQ0EsRUFBa0IsQ0FBQyxJQUNuQkE7QUFDTixVQUFJLE9BQU9KLEtBQWdCO0FBQ3ZCLGVBQU8zSztBQUNYLFVBQUk4SyxJQUFjSixHQUFpQkMsQ0FBVztBQUM5QyxVQUFJLENBQUNHO0FBQ0QsZUFBTzlLO0FBQ1gsTUFBQThLLEVBQVksV0FBVztBQUN2QixVQUFJRSxJQUFtQnBJLEVBQU8sSUFBSUosR0FBUzJILENBQWtCO0FBQzdELFVBQUlhLEdBQWtCO0FBR2xCLFlBQUlDLElBQVEsTUFBTSxRQUFRRCxDQUFnQixJQUNwQ0EsRUFBaUIsS0FBSyxHQUFHLElBQ3pCQTtBQUNOLFFBQUFGLEVBQVksYUFBYSxJQUFJbkIsR0FBVyxPQUFPc0IsS0FBVSxXQUFXQSxJQUFRLE1BQVM7QUFBQSxNQUN6RjtBQUNBLGFBQU90TCxFQUFNLGVBQWVLLEdBQVM4SyxDQUFXO0FBQUEsSUFDcEQsR0FDQUQsRUFBMEIsVUFBVSxTQUFTLFdBQVk7QUFDckQsYUFBTyxDQUFDWCxHQUFxQkMsQ0FBa0I7QUFBQSxJQUNuRCxHQUNPVTtBQUFBLEVBQ1gsR0FBRTtBQUFBLEdBaUJFSyxJQUFtQnBMLEdBQWlCLDRDQUE0QyxHQUNoRnFMO0FBQUEsQ0FDSCxTQUFVQSxHQUFTO0FBQ2hCLEVBQUFBLEVBQVEsT0FBVTtBQUN0QixHQUFHQSxNQUFZQSxJQUFVLENBQUMsRUFBRTtBQUM1QixTQUFTQyxHQUFlcEwsR0FBU3FMLEdBQU07QUFDbkMsU0FBT3JMLEVBQVEsU0FBU2tMLEdBQWtCRyxDQUFJO0FBQ2xEO0FBQ0EsU0FBU0MsR0FBa0J0TCxHQUFTO0FBQ2hDLFNBQU9BLEVBQVEsWUFBWWtMLENBQWdCO0FBQy9DO0FBQ0EsU0FBU0ssR0FBZXZMLEdBQVM7QUFDN0IsU0FBT0EsRUFBUSxTQUFTa0wsQ0FBZ0I7QUFDNUM7QUFxQkEsSUFBSU07QUFBQTtBQUFBLEdBQWtDLFdBQVk7QUFDOUMsYUFBU0EsSUFBbUI7QUFBQSxJQUM1QjtBQUNBLFdBQUFBLEVBQWlCLFVBQVUsZUFBZSxXQUFZO0FBQ2xELGFBQU87QUFBQSxRQUNILFVBQVVyTCxFQUFpQjtBQUFBLE1BQy9CO0FBQUEsSUFDSixHQUNBcUwsRUFBaUIsVUFBVSxXQUFXLFdBQVk7QUFDOUMsYUFBTztBQUFBLElBQ1gsR0FDT0E7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQXFCRUM7QUFBQTtBQUFBLEdBQWlDLFdBQVk7QUFDN0MsYUFBU0EsSUFBa0I7QUFBQSxJQUMzQjtBQUNBLFdBQUFBLEVBQWdCLFVBQVUsZUFBZSxXQUFZO0FBQ2pELGFBQU87QUFBQSxRQUNILFVBQVV0TCxFQUFpQjtBQUFBLE1BQy9CO0FBQUEsSUFDSixHQUNBc0wsRUFBZ0IsVUFBVSxXQUFXLFdBQVk7QUFDN0MsYUFBTztBQUFBLElBQ1gsR0FDT0E7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQXNCRUM7QUFBQTtBQUFBLEdBQW9DLFdBQVk7QUFDaEQsYUFBU0EsRUFBbUJsRCxHQUFRO0FBQ2hDLFVBQUk3RyxHQUFJQyxHQUFJK0IsR0FBSUM7QUFDaEIsV0FBSyxRQUFRNEUsRUFBTyxNQUNmLEtBQUssVUFDTnJELEdBQW1CLElBQUksTUFBTSx3REFBd0QsQ0FBQyxHQUN0RixLQUFLLFFBQVEsSUFBSXNHLEVBQWdCLElBRXJDLEtBQUssd0JBQ0E5SixJQUFLNkcsRUFBTyx5QkFBeUIsUUFBUTdHLE1BQU8sU0FBU0EsSUFBSyxJQUFJOEosRUFBZ0IsR0FDM0YsS0FBSywyQkFDQTdKLElBQUs0RyxFQUFPLDRCQUE0QixRQUFRNUcsTUFBTyxTQUFTQSxJQUFLLElBQUk0SixFQUFpQixHQUMvRixLQUFLLHVCQUNBN0gsSUFBSzZFLEVBQU8sd0JBQXdCLFFBQVE3RSxNQUFPLFNBQVNBLElBQUssSUFBSThILEVBQWdCLEdBQzFGLEtBQUssMEJBQ0E3SCxJQUFLNEUsRUFBTywyQkFBMkIsUUFBUTVFLE1BQU8sU0FBU0EsSUFBSyxJQUFJNEgsRUFBaUI7QUFBQSxJQUNsRztBQUNBLFdBQUFFLEVBQW1CLFVBQVUsZUFBZSxTQUFVMUwsR0FBUzJMLEdBQVNDLEdBQVVDLEdBQVVySSxHQUFZc0ksR0FBTztBQUMzRyxVQUFJQyxJQUFnQnBNLEVBQU0sZUFBZUssQ0FBTztBQUNoRCxhQUFJLENBQUMrTCxLQUFpQixDQUFDbk0sRUFBbUJtTSxDQUFhLElBQzVDLEtBQUssTUFBTSxhQUFhL0wsR0FBUzJMLEdBQVNDLEdBQVVDLEdBQVVySSxHQUFZc0ksQ0FBSyxJQUV0RkMsRUFBYyxXQUNWQSxFQUFjLGFBQWFsTSxFQUFXLFVBQy9CLEtBQUsscUJBQXFCLGFBQWFHLEdBQVMyTCxHQUFTQyxHQUFVQyxHQUFVckksR0FBWXNJLENBQUssSUFFbEcsS0FBSyx3QkFBd0IsYUFBYTlMLEdBQVMyTCxHQUFTQyxHQUFVQyxHQUFVckksR0FBWXNJLENBQUssSUFFeEdDLEVBQWMsYUFBYWxNLEVBQVcsVUFDL0IsS0FBSyxvQkFBb0IsYUFBYUcsR0FBUzJMLEdBQVNDLEdBQVVDLEdBQVVySSxHQUFZc0ksQ0FBSyxJQUVqRyxLQUFLLHVCQUF1QixhQUFhOUwsR0FBUzJMLEdBQVNDLEdBQVVDLEdBQVVySSxHQUFZc0ksQ0FBSztBQUFBLElBQzNHLEdBQ0FKLEVBQW1CLFVBQVUsV0FBVyxXQUFZO0FBQ2hELGFBQU8sc0JBQXNCLEtBQUssTUFBTSxTQUFTLElBQUksMkJBQTJCLEtBQUsscUJBQXFCLFNBQVMsSUFBSSw4QkFBOEIsS0FBSyx3QkFBd0IsU0FBUyxJQUFJLDBCQUEwQixLQUFLLG9CQUFvQixTQUFTLElBQUksNkJBQTZCLEtBQUssdUJBQXVCLFNBQVMsSUFBSTtBQUFBLElBQ3pVLEdBQ09BO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FxQkVNO0FBQUE7QUFBQSxHQUEwQyxXQUFZO0FBQ3RELGFBQVNBLEVBQXlCQyxHQUFRO0FBQ3RDLE1BQUlBLE1BQVcsV0FBVUEsSUFBUyxJQUNsQyxLQUFLLFNBQVNBLEdBQ2QsS0FBSyxTQUFTLEtBQUssV0FBV0EsQ0FBTSxHQUNwQyxLQUFLLGNBQWMsS0FBSyxNQUFNLEtBQUssU0FBUyxVQUFVO0FBQUEsSUFDMUQ7QUFDQSxXQUFBRCxFQUF5QixVQUFVLGVBQWUsU0FBVWhNLEdBQVMyTCxHQUFTO0FBQzFFLGFBQU87QUFBQSxRQUNILFVBQVU1TCxHQUFlNEwsQ0FBTyxLQUFLLEtBQUssWUFBWUEsQ0FBTyxJQUFJLEtBQUssY0FDaEV4TCxFQUFpQixxQkFDakJBLEVBQWlCO0FBQUEsTUFDM0I7QUFBQSxJQUNKLEdBQ0E2TCxFQUF5QixVQUFVLFdBQVcsV0FBWTtBQUN0RCxhQUFPLHVCQUF1QixLQUFLLFNBQVM7QUFBQSxJQUNoRCxHQUNBQSxFQUF5QixVQUFVLGFBQWEsU0FBVUUsR0FBTztBQUM3RCxhQUFJLE9BQU9BLEtBQVUsWUFBWSxNQUFNQSxDQUFLLElBQ2pDLElBQ0pBLEtBQVMsSUFBSSxJQUFJQSxLQUFTLElBQUksSUFBSUE7QUFBQSxJQUM3QyxHQUNBRixFQUF5QixVQUFVLGNBQWMsU0FBVUwsR0FBUztBQUVoRSxlQURJUSxJQUFlLEdBQ1ZwTCxJQUFJLEdBQUdBLElBQUk0SyxFQUFRLFNBQVMsR0FBRzVLLEtBQUs7QUFDekMsWUFBSXFMLElBQU1yTCxJQUFJLEdBQ1ZpSixJQUFPLFNBQVMyQixFQUFRLE1BQU1TLEdBQUtBLElBQU0sQ0FBQyxHQUFHLEVBQUU7QUFDbkQsUUFBQUQsS0FBZ0JBLElBQWVuQyxPQUFVO0FBQUEsTUFDN0M7QUFDQSxhQUFPbUM7QUFBQSxJQUNYLEdBQ09IO0FBQUEsRUFDWCxHQUFFO0FBQUEsR0FzQkVLLEtBQVksbUJBQ1pDLEtBQVUsaUJBQ1ZDLEtBQWUsc0JBQ2ZDLEtBQVksU0FBUyxXQUNyQkMsS0FBZUQsR0FBVSxVQUN6QkUsS0FBbUJELEdBQWEsS0FBSyxNQUFNLEdBQzNDRSxLQUFlQyxHQUFRLE9BQU8sZ0JBQWdCLE1BQU0sR0FDcERDLEtBQWMsT0FBTyxXQUNyQkMsS0FBaUJELEdBQVksZ0JBQzdCRSxJQUFpQixTQUFTLE9BQU8sY0FBYyxRQUMvQ0MsS0FBdUJILEdBQVk7QUFTdkMsU0FBU0QsR0FBUUssR0FBTUMsR0FBVztBQUM5QixTQUFPLFNBQVVDLEdBQUs7QUFDbEIsV0FBT0YsRUFBS0MsRUFBVUMsQ0FBRyxDQUFDO0FBQUEsRUFDOUI7QUFDSjtBQTZCQSxTQUFTQyxFQUFjNUwsR0FBTztBQUMxQixNQUFJLENBQUM2TCxHQUFhN0wsQ0FBSyxLQUFLOEwsR0FBVzlMLENBQUssTUFBTTZLO0FBQzlDLFdBQU87QUFFWCxNQUFJa0IsSUFBUVosR0FBYW5MLENBQUs7QUFDOUIsTUFBSStMLE1BQVU7QUFDVixXQUFPO0FBRVgsTUFBSUMsSUFBT1YsR0FBZSxLQUFLUyxHQUFPLGFBQWEsS0FBS0EsRUFBTTtBQUM5RCxTQUFRLE9BQU9DLEtBQVEsY0FDbkJBLGFBQWdCQSxLQUNoQmYsR0FBYSxLQUFLZSxDQUFJLE1BQU1kO0FBQ3BDO0FBeUJBLFNBQVNXLEdBQWE3TCxHQUFPO0FBQ3pCLFNBQU9BLEtBQVMsUUFBUSxPQUFPQSxLQUFTO0FBQzVDO0FBUUEsU0FBUzhMLEdBQVc5TCxHQUFPO0FBQ3ZCLFNBQUlBLEtBQVMsT0FDRkEsTUFBVSxTQUFZK0ssS0FBZUQsS0FFekNTLEtBQWtCQSxLQUFrQixPQUFPdkwsQ0FBSyxJQUNqRGlNLEdBQVVqTSxDQUFLLElBQ2ZrTSxHQUFlbE0sQ0FBSztBQUM5QjtBQVFBLFNBQVNpTSxHQUFVak0sR0FBTztBQUN0QixNQUFJbU0sSUFBUWIsR0FBZSxLQUFLdEwsR0FBT3VMLENBQWMsR0FBR2EsSUFBTXBNLEVBQU11TCxDQUFjLEdBQzlFYyxJQUFXO0FBQ2YsTUFBSTtBQUNBLElBQUFyTSxFQUFNdUwsQ0FBYyxJQUFJLFFBQ3hCYyxJQUFXO0FBQUEsRUFDZixRQUNVO0FBQUEsRUFFVjtBQUNBLE1BQUkvSSxJQUFTa0ksR0FBcUIsS0FBS3hMLENBQUs7QUFDNUMsU0FBSXFNLE1BQ0lGLElBQ0FuTSxFQUFNdUwsQ0FBYyxJQUFJYSxJQUd4QixPQUFPcE0sRUFBTXVMLENBQWMsSUFHNUJqSTtBQUNYO0FBUUEsU0FBUzRJLEdBQWVsTSxHQUFPO0FBQzNCLFNBQU93TCxHQUFxQixLQUFLeEwsQ0FBSztBQUMxQztBQWtCQSxJQUFJc00sS0FBWTtBQUtoQixTQUFTQyxLQUFRO0FBRWIsV0FESUMsSUFBTyxDQUFDLEdBQ0hDLElBQUssR0FBR0EsSUFBSyxVQUFVLFFBQVFBO0FBQ3BDLElBQUFELEVBQUtDLENBQUUsSUFBSSxVQUFVQSxDQUFFO0FBSTNCLFdBRkluSixJQUFTa0osRUFBSyxNQUFNLEdBQ3BCRSxJQUFVLG9CQUFJLFFBQVEsR0FDbkJGLEVBQUssU0FBUztBQUNqQixJQUFBbEosSUFBU3FKLEdBQWdCckosR0FBUWtKLEVBQUssTUFBTSxHQUFHLEdBQUdFLENBQU87QUFFN0QsU0FBT3BKO0FBQ1g7QUFDQSxTQUFTc0osRUFBVTVNLEdBQU87QUFDdEIsU0FBSTZNLEVBQVE3TSxDQUFLLElBQ05BLEVBQU0sTUFBTSxJQUVoQkE7QUFDWDtBQVNBLFNBQVMyTSxHQUFnQkcsR0FBS0MsR0FBS0MsR0FBT04sR0FBUztBQUMvQyxFQUFJTSxNQUFVLFdBQVVBLElBQVE7QUFDaEMsTUFBSTFKO0FBQ0osTUFBSSxFQUFBMEosSUFBUVYsS0FJWjtBQUFBLFFBREFVLEtBQ0lDLEVBQVlILENBQUcsS0FBS0csRUFBWUYsQ0FBRyxLQUFLRyxHQUFXSCxDQUFHO0FBQ3RELE1BQUF6SixJQUFTc0osRUFBVUcsQ0FBRztBQUFBLGFBRWpCRixFQUFRQyxDQUFHO0FBRWhCLFVBREF4SixJQUFTd0osRUFBSSxNQUFNLEdBQ2ZELEVBQVFFLENBQUc7QUFDWCxpQkFBUyxJQUFJLEdBQUdJLElBQUlKLEVBQUksUUFBUSxJQUFJSSxHQUFHO0FBQ25DLFVBQUE3SixFQUFPLEtBQUtzSixFQUFVRyxFQUFJLENBQUMsQ0FBQyxDQUFDO0FBQUEsZUFHNUJLLEVBQVNMLENBQUc7QUFFakIsaUJBRElNLElBQU8sT0FBTyxLQUFLTixDQUFHLEdBQ2pCLElBQUksR0FBR0ksSUFBSUUsRUFBSyxRQUFRLElBQUlGLEdBQUcsS0FBSztBQUN6QyxjQUFJOU0sSUFBTWdOLEVBQUssQ0FBQztBQUNoQixVQUFBL0osRUFBT2pELENBQUcsSUFBSXVNLEVBQVVHLEVBQUkxTSxDQUFHLENBQUM7QUFBQSxRQUNwQztBQUFBLGVBR0MrTSxFQUFTTixDQUFHO0FBQ2pCLFVBQUlNLEVBQVNMLENBQUcsR0FBRztBQUNmLFlBQUksQ0FBQ08sR0FBWVIsR0FBS0MsQ0FBRztBQUNyQixpQkFBT0E7QUFFWCxRQUFBekosSUFBUyxPQUFPLE9BQU8sQ0FBQyxHQUFHd0osQ0FBRztBQUU5QixpQkFESU8sSUFBTyxPQUFPLEtBQUtOLENBQUcsR0FDakIsSUFBSSxHQUFHSSxJQUFJRSxFQUFLLFFBQVEsSUFBSUYsR0FBRyxLQUFLO0FBQ3pDLGNBQUk5TSxJQUFNZ04sRUFBSyxDQUFDLEdBQ1pFLElBQVdSLEVBQUkxTSxDQUFHO0FBQ3RCLGNBQUk0TSxFQUFZTSxDQUFRO0FBQ3BCLFlBQUksT0FBT0EsSUFBYSxNQUNwQixPQUFPakssRUFBT2pELENBQUcsSUFJakJpRCxFQUFPakQsQ0FBRyxJQUFJa047QUFBQSxlQUdqQjtBQUNELGdCQUFJQyxJQUFPbEssRUFBT2pELENBQUcsR0FDakJvTixJQUFPRjtBQUNYLGdCQUFJRyxFQUFvQlosR0FBS3pNLEdBQUtxTSxDQUFPLEtBQ3JDZ0IsRUFBb0JYLEdBQUsxTSxHQUFLcU0sQ0FBTztBQUNyQyxxQkFBT3BKLEVBQU9qRCxDQUFHO0FBQUEsaUJBRWhCO0FBQ0Qsa0JBQUkrTSxFQUFTSSxDQUFJLEtBQUtKLEVBQVNLLENBQUksR0FBRztBQUNsQyxvQkFBSUUsSUFBT2pCLEVBQVEsSUFBSWMsQ0FBSSxLQUFLLENBQUMsR0FDN0JJLElBQU9sQixFQUFRLElBQUllLENBQUksS0FBSyxDQUFDO0FBQ2pDLGdCQUFBRSxFQUFLLEtBQUssRUFBRSxLQUFLYixHQUFLLEtBQUt6TSxFQUFJLENBQUMsR0FDaEN1TixFQUFLLEtBQUssRUFBRSxLQUFLYixHQUFLLEtBQUsxTSxFQUFJLENBQUMsR0FDaENxTSxFQUFRLElBQUljLEdBQU1HLENBQUksR0FDdEJqQixFQUFRLElBQUllLEdBQU1HLENBQUk7QUFBQSxjQUMxQjtBQUNBLGNBQUF0SyxFQUFPakQsQ0FBRyxJQUFJc00sR0FBZ0JySixFQUFPakQsQ0FBRyxHQUFHa04sR0FBVVAsR0FBT04sQ0FBTztBQUFBLFlBQ3ZFO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBRUksUUFBQXBKLElBQVN5SjtBQUdqQixXQUFPeko7QUFBQTtBQUNYO0FBT0EsU0FBU29LLEVBQW9CRyxHQUFLeE4sR0FBS3FNLEdBQVM7QUFFNUMsV0FESS9KLElBQU0rSixFQUFRLElBQUltQixFQUFJeE4sQ0FBRyxDQUFDLEtBQUssQ0FBQyxHQUMzQmQsSUFBSSxHQUFHNE4sSUFBSXhLLEVBQUksUUFBUXBELElBQUk0TixHQUFHNU4sS0FBSztBQUN4QyxRQUFJdU8sSUFBT25MLEVBQUlwRCxDQUFDO0FBQ2hCLFFBQUl1TyxFQUFLLFFBQVF6TixLQUFPeU4sRUFBSyxRQUFRRDtBQUNqQyxhQUFPO0FBQUEsRUFFZjtBQUNBLFNBQU87QUFDWDtBQUNBLFNBQVNoQixFQUFRN00sR0FBTztBQUNwQixTQUFPLE1BQU0sUUFBUUEsQ0FBSztBQUM5QjtBQUNBLFNBQVNrTixHQUFXbE4sR0FBTztBQUN2QixTQUFPLE9BQU9BLEtBQVU7QUFDNUI7QUFDQSxTQUFTb04sRUFBU3BOLEdBQU87QUFDckIsU0FBUSxDQUFDaU4sRUFBWWpOLENBQUssS0FDdEIsQ0FBQzZNLEVBQVE3TSxDQUFLLEtBQ2QsQ0FBQ2tOLEdBQVdsTixDQUFLLEtBQ2pCLE9BQU9BLEtBQVU7QUFDekI7QUFDQSxTQUFTaU4sRUFBWWpOLEdBQU87QUFDeEIsU0FBUSxPQUFPQSxLQUFVLFlBQ3JCLE9BQU9BLEtBQVUsWUFDakIsT0FBT0EsS0FBVSxhQUNqQixPQUFPQSxJQUFVLE9BQ2pCQSxhQUFpQixRQUNqQkEsYUFBaUIsVUFDakJBLE1BQVU7QUFDbEI7QUFDQSxTQUFTc04sR0FBWVIsR0FBS0MsR0FBSztBQUMzQixTQUFJLEdBQUNuQixFQUFja0IsQ0FBRyxLQUFLLENBQUNsQixFQUFjbUIsQ0FBRztBQUlqRDtBQWlCQSxJQUFJZ0IsS0FBbUQsNEJBQVk7QUFDL0QsTUFBSUMsSUFBZ0IsU0FBVUMsR0FBR0MsR0FBRztBQUNoQyxXQUFBRixJQUFnQixPQUFPLGtCQUNsQixFQUFFLFdBQVcsQ0FBQyxFQUFFLGFBQWEsU0FBUyxTQUFVQyxHQUFHQyxHQUFHO0FBQUUsTUFBQUQsRUFBRSxZQUFZQztBQUFBLElBQUcsS0FDMUUsU0FBVUQsR0FBR0MsR0FBRztBQUFFLGVBQVNqSCxLQUFLaUgsRUFBRyxDQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUtBLEdBQUdqSCxDQUFDLE1BQUdnSCxFQUFFaEgsQ0FBQyxJQUFJaUgsRUFBRWpILENBQUM7QUFBQSxJQUFHLEdBQzdGK0csRUFBY0MsR0FBR0MsQ0FBQztBQUFBLEVBQzdCO0FBQ0EsU0FBTyxTQUFVRCxHQUFHQyxHQUFHO0FBQ25CLFFBQUksT0FBT0EsS0FBTSxjQUFjQSxNQUFNO0FBQ2pDLFlBQU0sSUFBSSxVQUFVLHlCQUF5QixPQUFPQSxDQUFDLElBQUksK0JBQStCO0FBQzVGLElBQUFGLEVBQWNDLEdBQUdDLENBQUM7QUFDbEIsYUFBU0MsSUFBSztBQUFFLFdBQUssY0FBY0Y7QUFBQSxJQUFHO0FBQ3RDLElBQUFBLEVBQUUsWUFBWUMsTUFBTSxPQUFPLE9BQU8sT0FBT0EsQ0FBQyxLQUFLQyxFQUFHLFlBQVlELEVBQUUsV0FBVyxJQUFJQyxFQUFHO0FBQUEsRUFDdEY7QUFDSixHQUFHLEdBSUNDO0FBQUE7QUFBQSxHQUE4QixTQUFVQyxHQUFRO0FBQ2hELElBQUFOLEdBQVVLLEdBQWNDLENBQU07QUFDOUIsYUFBU0QsRUFBYUUsR0FBUztBQUMzQixVQUFJaEcsSUFBUStGLEVBQU8sS0FBSyxNQUFNQyxDQUFPLEtBQUs7QUFHMUMsb0JBQU8sZUFBZWhHLEdBQU84RixFQUFhLFNBQVMsR0FDNUM5RjtBQUFBLElBQ1g7QUFDQSxXQUFPOEY7QUFBQSxFQUNYLEdBQUUsS0FBSztBQUFBO0FBVVAsU0FBU0csR0FBZ0JDLEdBQVNDLEdBQVM7QUFDdkMsTUFBSUMsR0FDQUMsSUFBaUIsSUFBSSxRQUFRLFNBQXlCQyxHQUFVQyxHQUFRO0FBQ3hFLElBQUFILElBQWdCLFdBQVcsV0FBMEI7QUFDakQsTUFBQUcsRUFBTyxJQUFJVCxHQUFhLHNCQUFzQixDQUFDO0FBQUEsSUFDbkQsR0FBR0ssQ0FBTztBQUFBLEVBQ2QsQ0FBQztBQUNELFNBQU8sUUFBUSxLQUFLLENBQUNELEdBQVNHLENBQWMsQ0FBQyxFQUFFLEtBQUssU0FBVXJMLEdBQVE7QUFDbEUsd0JBQWFvTCxDQUFhLEdBQ25CcEw7QUFBQSxFQUNYLEdBQUcsU0FBVXdMLEdBQVE7QUFDakIsdUJBQWFKLENBQWEsR0FDcEJJO0FBQUEsRUFDVixDQUFDO0FBQ0w7QUFxQkEsU0FBU0MsR0FBVXRELEdBQU07QUFDckIsU0FBUSxPQUFPQSxLQUFTLGNBQ3BCLE9BQU9BLEVBQUssY0FBZSxjQUMzQixPQUFPQSxFQUFLLFlBQWEsY0FDekJBLEVBQUssY0FBYztBQUMzQjtBQWlCQSxJQUFJdUQ7QUFBQTtBQUFBLEdBQTBCLFdBQVk7QUFDdEMsYUFBU0EsSUFBVztBQUNoQixVQUFJMUcsSUFBUTtBQUNaLFdBQUssV0FBVyxJQUFJLFFBQVEsU0FBVTJHLEdBQVNKLEdBQVE7QUFDbkQsUUFBQXZHLEVBQU0sV0FBVzJHLEdBQ2pCM0csRUFBTSxVQUFVdUc7QUFBQSxNQUNwQixDQUFDO0FBQUEsSUFDTDtBQUNBLGtCQUFPLGVBQWVHLEVBQVMsV0FBVyxXQUFXO0FBQUEsTUFDakQsS0FBSyxXQUFZO0FBQ2IsZUFBTyxLQUFLO0FBQUEsTUFDaEI7QUFBQSxNQUNBLFlBQVk7QUFBQSxNQUNaLGNBQWM7QUFBQSxJQUNsQixDQUFDLEdBQ0RBLEVBQVMsVUFBVSxVQUFVLFNBQVUzTSxHQUFLO0FBQ3hDLFdBQUssU0FBU0EsQ0FBRztBQUFBLElBQ3JCLEdBQ0EyTSxFQUFTLFVBQVUsU0FBUyxTQUFVM0gsR0FBSztBQUN2QyxXQUFLLFFBQVFBLENBQUc7QUFBQSxJQUNwQixHQUNPMkg7QUFBQSxFQUNYLEdBQUU7QUFBQSxHQWlCRUUsS0FBNEMsU0FBVTlQLEdBQUdDLEdBQUc7QUFDNUQsTUFBSUMsSUFBSSxPQUFPLFVBQVcsY0FBY0YsRUFBRSxPQUFPLFFBQVE7QUFDekQsTUFBSSxDQUFDRSxFQUFHLFFBQU9GO0FBQ2YsTUFBSUcsSUFBSUQsRUFBRSxLQUFLRixDQUFDLEdBQUdJLEdBQUdDLElBQUssQ0FBQyxHQUFHQztBQUMvQixNQUFJO0FBQ0EsWUFBUUwsTUFBTSxVQUFVQSxNQUFNLE1BQU0sRUFBRUcsSUFBSUQsRUFBRSxLQUFLLEdBQUcsT0FBTSxDQUFBRSxFQUFHLEtBQUtELEVBQUUsS0FBSztBQUFBLEVBQzdFLFNBQ09HLEdBQU87QUFBRSxJQUFBRCxJQUFJLEVBQUUsT0FBT0MsRUFBTTtBQUFBLEVBQUcsVUFDdEM7QUFDSSxRQUFJO0FBQ0EsTUFBSUgsS0FBSyxDQUFDQSxFQUFFLFNBQVNGLElBQUlDLEVBQUUsV0FBWUQsRUFBRSxLQUFLQyxDQUFDO0FBQUEsSUFDbkQsVUFDQTtBQUFVLFVBQUlHLEVBQUcsT0FBTUEsRUFBRTtBQUFBLElBQU87QUFBQSxFQUNwQztBQUNBLFNBQU9EO0FBQ1gsR0FDSTBQLEtBQTBELFNBQVVuSixHQUFJQyxHQUFNQyxHQUFNO0FBQ3BGLE1BQUlBLEtBQVEsVUFBVSxXQUFXLEVBQUcsVUFBUzNHLElBQUksR0FBRzRHLElBQUlGLEVBQUssUUFBUXhHLEdBQUlGLElBQUk0RyxHQUFHNUc7QUFDNUUsS0FBSUUsS0FBTSxFQUFFRixLQUFLMEcsUUFDUnhHLE1BQUlBLElBQUssTUFBTSxVQUFVLE1BQU0sS0FBS3dHLEdBQU0sR0FBRzFHLENBQUMsSUFDbkRFLEVBQUdGLENBQUMsSUFBSTBHLEVBQUsxRyxDQUFDO0FBR3RCLFNBQU95RyxFQUFHLE9BQU92RyxLQUFNLE1BQU0sVUFBVSxNQUFNLEtBQUt3RyxDQUFJLENBQUM7QUFDM0QsR0FJSW1KO0FBQUE7QUFBQSxHQUFnQyxXQUFZO0FBQzVDLGFBQVNBLEVBQWVDLEdBQVdDLEdBQU87QUFDdEMsV0FBSyxZQUFZRCxHQUNqQixLQUFLLFFBQVFDLEdBQ2IsS0FBSyxZQUFZLElBQ2pCLEtBQUssWUFBWSxJQUFJTixHQUFTO0FBQUEsSUFDbEM7QUFDQSxrQkFBTyxlQUFlSSxFQUFlLFdBQVcsWUFBWTtBQUFBLE1BQ3hELEtBQUssV0FBWTtBQUNiLGVBQU8sS0FBSztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNELE9BQU8sZUFBZUEsRUFBZSxXQUFXLFdBQVc7QUFBQSxNQUN2RCxLQUFLLFdBQVk7QUFDYixlQUFPLEtBQUssVUFBVTtBQUFBLE1BQzFCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixjQUFjO0FBQUEsSUFDbEIsQ0FBQyxHQUNEQSxFQUFlLFVBQVUsT0FBTyxXQUFZO0FBSXhDLGVBSElqUCxHQUNBbUksSUFBUSxNQUNSa0UsSUFBTyxDQUFDLEdBQ0hDLElBQUssR0FBR0EsSUFBSyxVQUFVLFFBQVFBO0FBQ3BDLFFBQUFELEVBQUtDLENBQUUsSUFBSSxVQUFVQSxDQUFFO0FBRTNCLFVBQUksQ0FBQyxLQUFLLFdBQVc7QUFDakIsYUFBSyxZQUFZO0FBQ2pCLFlBQUk7QUFDQSxrQkFBUSxTQUFTdE0sSUFBSyxLQUFLLFdBQVcsS0FBSyxNQUFNQSxHQUFJZ1AsR0FBYyxDQUFDLEtBQUssS0FBSyxHQUFHRCxHQUFPMUMsQ0FBSSxHQUFHLEVBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxTQUFVbkssR0FBSztBQUFFLG1CQUFPaUcsRUFBTSxVQUFVLFFBQVFqRyxDQUFHO0FBQUEsVUFBRyxHQUFHLFNBQVVnRixHQUFLO0FBQUUsbUJBQU9pQixFQUFNLFVBQVUsT0FBT2pCLENBQUc7QUFBQSxVQUFHLENBQUM7QUFBQSxRQUNoTyxTQUNPQSxHQUFLO0FBQ1IsZUFBSyxVQUFVLE9BQU9BLENBQUc7QUFBQSxRQUM3QjtBQUFBLE1BQ0o7QUFDQSxhQUFPLEtBQUssVUFBVTtBQUFBLElBQzFCLEdBQ08rSDtBQUFBLEVBQ1gsR0FBRTtBQUFBO0FBcUJGLFNBQVNHLEdBQVFDLEdBQVU3RCxHQUFLO0FBQzVCLFNBQU8sSUFBSSxRQUFRLFNBQVVzRCxHQUFTO0FBRWxDLElBQUF6USxFQUFRLEtBQUtYLEVBQWdCVyxFQUFRLE9BQU8sQ0FBQyxHQUFHLFdBQVk7QUFDeEQsTUFBQWdSLEVBQVMsT0FBTzdELEdBQUssU0FBVXJJLEdBQVE7QUFDbkMsUUFBQTJMLEVBQVEzTCxDQUFNO0FBQUEsTUFDbEIsQ0FBQztBQUFBLElBQ0wsQ0FBQztBQUFBLEVBQ0wsQ0FBQztBQUNMO0FBaUJBLElBQUltTSxLQUFlO0FBQUEsRUFDZixhQUFheFA7QUFBQSxFQUNiLG1CQUFtQkw7QUFBQSxFQUNuQix5QkFBeUJnQjtBQUFBLEVBQ3pCLG1CQUFtQkw7QUFDdkIsR0FDSW1QLEtBQVc7QUFBQSxFQUNYLFNBQVNIO0FBQ2I7QUFFQSxNQUFNSSxLQUFtQix1QkFBTyxPQUFvQix1QkFBTyxlQUFlO0FBQUEsRUFDdEUsV0FBVztBQUFBLEVBQ1gsa0JBQUEzRjtBQUFBLEVBQ0EsaUJBQUFDO0FBQUEsRUFDQSxlQUFBekk7QUFBQSxFQUNBLGdCQUFBNE47QUFBQSxFQUNBLHFCQUFBckk7QUFBQSxFQUNBLCtCQUFBMUM7QUFBQSxFQUNBLHNDQUFBRDtBQUFBLEVBQ0EscUJBQUFJO0FBQUEsRUFDQSw4Q0FBQUY7QUFBQSxFQUNBLDZDQUFBQztBQUFBLEVBQ0EsSUFBSSxtQkFBb0I7QUFBRSxXQUFPdEc7QUFBQSxFQUFrQjtBQUFBLEVBQ25ELG9CQUFBaU07QUFBQSxFQUNBLElBQUksVUFBVztBQUFFLFdBQU9QO0FBQUEsRUFBUztBQUFBLEVBQ2pDLG1CQUFBbkQ7QUFBQSxFQUNBLFVBQUEvSDtBQUFBLEVBQ0EscUJBQUFpSztBQUFBLEVBQ0Esb0JBQUFDO0FBQUEsRUFDQSxjQUFBeUY7QUFBQSxFQUNBLDBCQUFBNUQ7QUFBQSxFQUNBLFlBQUFyQztBQUFBLEVBQ0EsSUFBSSxzQkFBdUI7QUFBRSxXQUFPdkU7QUFBQSxFQUFxQjtBQUFBLEVBQ3pELFNBQVNsRjtBQUFBLEVBQ1Qsc0JBQUFxQztBQUFBLEVBQ0EsMkJBQUFzSTtBQUFBLEVBQ0EsYUFBQXpNO0FBQUEsRUFDQSxZQUFBQztBQUFBLEVBQ0EsY0FBQTRTO0FBQUEsRUFDQSxpQkFBQWxCO0FBQUEsRUFDQSxtQkFBQXpFO0FBQUEsRUFDQSxRQUFBbkU7QUFBQSxFQUNBLHVCQUFBRTtBQUFBLEVBQ0EsZ0JBQUFrRTtBQUFBLEVBQ0EsZUFBQWpOO0FBQUEsRUFDQSxvQkFBQTZHO0FBQUEsRUFDQSxhQUFBeUM7QUFBQSxFQUNBLGFBQUFwSTtBQUFBLEVBQ0EsUUFBQWpCO0FBQUEsRUFDQSxnQkFBQUM7QUFBQSxFQUNBLHNCQUFBQztBQUFBLEVBQ0Esc0JBQUFDO0FBQUEsRUFDQSxxQkFBQUM7QUFBQSxFQUNBLG1CQUFBQztBQUFBLEVBQ0EsVUFBQXNTO0FBQUEsRUFDQSxnQkFBQXBOO0FBQUEsRUFDQSxrQkFBQUM7QUFBQSxFQUNBLGFBQUFsRjtBQUFBLEVBQ0EsbUJBQUFDO0FBQUEsRUFDQSxxQkFBQU07QUFBQSxFQUNBLGNBQUFMO0FBQUEsRUFDQSxXQUFBd1I7QUFBQSxFQUNBLHFCQUFBN0w7QUFBQSxFQUNBLE9BQUFxSjtBQUFBLEVBQ0EsZ0JBQUEvTztBQUFBLEVBQ0EsZUFBQUM7QUFBQSxFQUNBLGtCQUFBZ0k7QUFBQSxFQUNBLGtCQUFBeUQ7QUFBQSxFQUNBLG9CQUFBbkg7QUFBQSxFQUNBLHVCQUFBMEI7QUFBQSxFQUNBLGdCQUFBbUc7QUFBQSxFQUNBLGlCQUFBL0w7QUFBQSxFQUNBLG1CQUFBSDtBQUFBLEVBQ0EsWUFBQWtKO0FBQUEsRUFDQSxtQkFBQTlJO0FBQUEsRUFDQSxZQUFBSDtBQUNKLEdBQUcsT0FBTyxhQUFhLEVBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQzsiLAogICJuYW1lcyI6IFsiYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIiwgInByb3BhZ2F0aW9uIiwgIl9nbG9iYWxUaGlzIiwgImFkZEhyVGltZXMiLCAiZ2V0VGltZU9yaWdpbiIsICJoclRpbWUiLCAiaHJUaW1lRHVyYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaHJUaW1lVG9NaWxsaXNlY29uZHMiLCAiaHJUaW1lVG9OYW5vc2Vjb25kcyIsICJoclRpbWVUb1RpbWVTdGFtcCIsICJpc1RpbWVJbnB1dCIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJpc1VybElnbm9yZWQiLCAibWlsbGlzVG9IclRpbWUiLCAib3RwZXJmb3JtYW5jZSIsICJ0aW1lSW5wdXRUb0hyVGltZSIsICJ1cmxNYXRjaGVzIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAic3VwcHJlc3NUcmFjaW5nIiwgInVuc3VwcHJlc3NUcmFjaW5nIiwgImRpYWciLCAiaGV4VG9CaW5hcnkiLCAiRXhwb3J0UmVzdWx0Q29kZSIsICJEaWFnTG9nTGV2ZWwiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiY3JlYXRlQ29udGV4dEtleSIsICJpc1ZhbGlkVHJhY2VJZCIsICJjb250ZXh0IiwgIlNES19JTkZPIiwgIlZFUlNJT04kMSIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SIiwgIkJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9IRUFERVIiLCAiQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEgiLCAiX19yZWFkJDMiLCAibyIsICJuIiwgIm0iLCAiaSIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAic2VyaWFsaXplS2V5UGFpcnMiLCAia2V5UGFpcnMiLCAiaFZhbHVlIiwgImN1cnJlbnQiLCAidmFsdWUiLCAiZ2V0S2V5UGFpcnMiLCAiYmFnZ2FnZSIsICJfYSIsICJfYiIsICJrZXkiLCAiZW50cnkiLCAicGFyc2VQYWlyS2V5VmFsdWUiLCAidmFsdWVQcm9wcyIsICJrZXlQYWlyUGFydCIsICJzZXBhcmF0b3JJbmRleCIsICJtZXRhZGF0YSIsICJwYXJzZUtleVBhaXJzSW50b1JlY29yZCIsICJrZXlQYWlyIiwgImhlYWRlcnMiLCAiVzNDQmFnZ2FnZVByb3BhZ2F0b3IiLCAiY2FycmllciIsICJzZXR0ZXIiLCAicGFpciIsICJoZWFkZXJWYWx1ZSIsICJnZXR0ZXIiLCAiYmFnZ2FnZVN0cmluZyIsICJwYWlycyIsICJiYWdnYWdlRW50cnkiLCAiQW5jaG9yZWRDbG9jayIsICJzeXN0ZW1DbG9jayIsICJtb25vdG9uaWNDbG9jayIsICJkZWx0YSIsICJfX3ZhbHVlcyQxIiwgInMiLCAiX19yZWFkJDIiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXMiLCAiZV8xIiwgIm91dCIsICJfYyIsICJfZCIsICJ2YWwiLCAiaXNBdHRyaWJ1dGVLZXkiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJlXzFfMSIsICJpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSIsICJpc1ZhbGlkUHJpbWl0aXZlQXR0cmlidXRlVmFsdWUiLCAiYXJyIiwgImVfMiIsICJ0eXBlIiwgImFycl8xIiwgImFycl8xXzEiLCAiZWxlbWVudCIsICJlXzJfMSIsICJsb2dnaW5nRXJyb3JIYW5kbGVyIiwgImV4IiwgInN0cmluZ2lmeUV4Y2VwdGlvbiIsICJmbGF0dGVuRXhjZXB0aW9uIiwgInJlc3VsdCIsICJwcm9wZXJ0eU5hbWUiLCAiZGVsZWdhdGVIYW5kbGVyIiwgInNldEdsb2JhbEVycm9ySGFuZGxlciIsICJoYW5kbGVyIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgIkRFRkFVTFRfTElTVF9TRVBBUkFUT1IiLCAiRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTIiwgImlzRW52VmFyQUJvb2xlYW4iLCAiRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTIiwgImlzRW52VmFyQU51bWJlciIsICJFTlZJUk9OTUVOVF9MSVNUU19LRVlTIiwgImlzRW52VmFyQUxpc3QiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9FTlZJUk9OTUVOVCIsICJwYXJzZUJvb2xlYW4iLCAiZW52aXJvbm1lbnQiLCAidmFsdWVzIiwgInBhcnNlTnVtYmVyIiwgIm5hbWUiLCAibWluIiwgIm1heCIsICJwYXJzZVN0cmluZ0xpc3QiLCAib3V0cHV0IiwgImlucHV0IiwgInNlcGFyYXRvciIsICJnaXZlblZhbHVlIiwgInYiLCAibG9nTGV2ZWxNYXAiLCAic2V0TG9nTGV2ZWxGcm9tRW52IiwgInRoZUxldmVsIiwgInBhcnNlRW52aXJvbm1lbnQiLCAiZW52IiwgImdldEVudiIsICJnbG9iYWxFbnYiLCAiZ2V0RW52V2l0aG91dERlZmF1bHRzIiwgIl9fcmVhZCQxIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJoZXhUb0Jhc2U2NCIsICJoZXhTdHIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJ1bnJlZlRpbWVyIiwgIl90aW1lciIsICJfX3ZhbHVlcyIsICJDb21wb3NpdGVQcm9wYWdhdG9yIiwgImNvbmZpZyIsICJwIiwgIngiLCAieSIsICJwcm9wYWdhdG9yIiwgImVyciIsICJjdHgiLCAiVkFMSURfS0VZX0NIQVJfUkFOR0UiLCAiVkFMSURfS0VZIiwgIlZBTElEX1ZFTkRPUl9LRVkiLCAiVkFMSURfS0VZX1JFR0VYIiwgIlZBTElEX1ZBTFVFX0JBU0VfUkVHRVgiLCAiSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCIsICJ2YWxpZGF0ZUtleSIsICJ2YWxpZGF0ZVZhbHVlIiwgIk1BWF9UUkFDRV9TVEFURV9JVEVNUyIsICJNQVhfVFJBQ0VfU1RBVEVfTEVOIiwgIkxJU1RfTUVNQkVSU19TRVBBUkFUT1IiLCAiTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSIiwgIlRyYWNlU3RhdGUiLCAicmF3VHJhY2VTdGF0ZSIsICJ0cmFjZVN0YXRlIiwgIl90aGlzIiwgImFnZyIsICJwYXJ0IiwgImxpc3RNZW1iZXIiLCAiVFJBQ0VfUEFSRU5UX0hFQURFUiIsICJUUkFDRV9TVEFURV9IRUFERVIiLCAiVkVSU0lPTiIsICJWRVJTSU9OX1BBUlQiLCAiVFJBQ0VfSURfUEFSVCIsICJQQVJFTlRfSURfUEFSVCIsICJGTEFHU19QQVJUIiwgIlRSQUNFX1BBUkVOVF9SRUdFWCIsICJwYXJzZVRyYWNlUGFyZW50IiwgInRyYWNlUGFyZW50IiwgIm1hdGNoIiwgIlczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IiLCAic3BhbkNvbnRleHQiLCAidHJhY2VQYXJlbnRIZWFkZXIiLCAidHJhY2VTdGF0ZUhlYWRlciIsICJzdGF0ZSIsICJSUENfTUVUQURBVEFfS0VZIiwgIlJQQ1R5cGUiLCAic2V0UlBDTWV0YWRhdGEiLCAibWV0YSIsICJkZWxldGVSUENNZXRhZGF0YSIsICJnZXRSUENNZXRhZGF0YSIsICJBbHdheXNPZmZTYW1wbGVyIiwgIkFsd2F5c09uU2FtcGxlciIsICJQYXJlbnRCYXNlZFNhbXBsZXIiLCAidHJhY2VJZCIsICJzcGFuTmFtZSIsICJzcGFuS2luZCIsICJsaW5rcyIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJvYmplY3RUYWciLCAibnVsbFRhZyIsICJ1bmRlZmluZWRUYWciLCAiZnVuY1Byb3RvIiwgImZ1bmNUb1N0cmluZyIsICJvYmplY3RDdG9yU3RyaW5nIiwgImdldFByb3RvdHlwZSIsICJvdmVyQXJnIiwgIm9iamVjdFByb3RvIiwgImhhc093blByb3BlcnR5IiwgInN5bVRvU3RyaW5nVGFnIiwgIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwgImZ1bmMiLCAidHJhbnNmb3JtIiwgImFyZyIsICJpc1BsYWluT2JqZWN0IiwgImlzT2JqZWN0TGlrZSIsICJiYXNlR2V0VGFnIiwgInByb3RvIiwgIkN0b3IiLCAiZ2V0UmF3VGFnIiwgIm9iamVjdFRvU3RyaW5nIiwgImlzT3duIiwgInRhZyIsICJ1bm1hc2tlZCIsICJNQVhfTEVWRUwiLCAibWVyZ2UiLCAiYXJncyIsICJfaSIsICJvYmplY3RzIiwgIm1lcmdlVHdvT2JqZWN0cyIsICJ0YWtlVmFsdWUiLCAiaXNBcnJheSIsICJvbmUiLCAidHdvIiwgImxldmVsIiwgImlzUHJpbWl0aXZlIiwgImlzRnVuY3Rpb24iLCAiaiIsICJpc09iamVjdCIsICJrZXlzIiwgInNob3VsZE1lcmdlIiwgInR3b1ZhbHVlIiwgIm9iajEiLCAib2JqMiIsICJ3YXNPYmplY3RSZWZlcmVuY2VkIiwgImFycjEiLCAiYXJyMiIsICJvYmoiLCAiaW5mbyIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiVGltZW91dEVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgImNhbGxXaXRoVGltZW91dCIsICJwcm9taXNlIiwgInRpbWVvdXQiLCAidGltZW91dEhhbmRsZSIsICJ0aW1lb3V0UHJvbWlzZSIsICJfcmVzb2x2ZSIsICJyZWplY3QiLCAicmVhc29uIiwgImlzV3JhcHBlZCIsICJEZWZlcnJlZCIsICJyZXNvbHZlIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkJpbmRPbmNlRnV0dXJlIiwgIl9jYWxsYmFjayIsICJfdGhhdCIsICJfZXhwb3J0IiwgImV4cG9ydGVyIiwgImJhZ2dhZ2VVdGlscyIsICJpbnRlcm5hbCIsICJlc20iXQp9Cg==