@bluedynamics/cdk8s-plone 0.1.29 → 0.1.30

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,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
3
+ exports.VinylCacheSpecBackendsDirectorShardHealthy = exports.VinylCacheSpecBackendsDirectorShardBy = exports.VinylCacheSpecDirectorShardHealthy = exports.VinylCacheSpecDirectorShardBy = exports.VinylCacheSpecClusterPeerRoutingType = exports.VinylCacheSpecBackendsDirectorType = exports.VinylCacheSpecStorageType = exports.VinylCacheSpecStorageSize = exports.VinylCacheSpecServiceType = exports.VinylCacheSpecResourcesRequests = exports.VinylCacheSpecResourcesLimits = exports.VinylCacheSpecDirectorType = exports.VinylCache = void 0;
4
4
  exports.toJson_VinylCacheProps = toJson_VinylCacheProps;
5
5
  exports.toJson_VinylCacheSpec = toJson_VinylCacheSpec;
6
6
  exports.toJson_VinylCacheSpecBackends = toJson_VinylCacheSpecBackends;
@@ -17,6 +17,7 @@ exports.toJson_VinylCacheSpecService = toJson_VinylCacheSpecService;
17
17
  exports.toJson_VinylCacheSpecStorage = toJson_VinylCacheSpecStorage;
18
18
  exports.toJson_VinylCacheSpecVcl = toJson_VinylCacheSpecVcl;
19
19
  exports.toJson_VinylCacheSpecBackendsConnectionParameters = toJson_VinylCacheSpecBackendsConnectionParameters;
20
+ exports.toJson_VinylCacheSpecBackendsDirector = toJson_VinylCacheSpecBackendsDirector;
20
21
  exports.toJson_VinylCacheSpecBackendsProbe = toJson_VinylCacheSpecBackendsProbe;
21
22
  exports.toJson_VinylCacheSpecBackendsServiceRef = toJson_VinylCacheSpecBackendsServiceRef;
22
23
  exports.toJson_VinylCacheSpecClusterPeerRouting = toJson_VinylCacheSpecClusterPeerRouting;
@@ -31,6 +32,8 @@ exports.toJson_VinylCacheSpecPodAffinity = toJson_VinylCacheSpecPodAffinity;
31
32
  exports.toJson_VinylCacheSpecPodTolerations = toJson_VinylCacheSpecPodTolerations;
32
33
  exports.toJson_VinylCacheSpecResourcesClaims = toJson_VinylCacheSpecResourcesClaims;
33
34
  exports.toJson_VinylCacheSpecVclSnippets = toJson_VinylCacheSpecVclSnippets;
35
+ exports.toJson_VinylCacheSpecBackendsDirectorHash = toJson_VinylCacheSpecBackendsDirectorHash;
36
+ exports.toJson_VinylCacheSpecBackendsDirectorShard = toJson_VinylCacheSpecBackendsDirectorShard;
34
37
  exports.toJson_VinylCacheSpecPodAffinityNodeAffinity = toJson_VinylCacheSpecPodAffinityNodeAffinity;
35
38
  exports.toJson_VinylCacheSpecPodAffinityPodAffinity = toJson_VinylCacheSpecPodAffinityPodAffinity;
36
39
  exports.toJson_VinylCacheSpecPodAffinityPodAntiAffinity = toJson_VinylCacheSpecPodAffinityPodAntiAffinity;
@@ -172,6 +175,7 @@ function toJson_VinylCacheSpecBackends(obj) {
172
175
  }
173
176
  const result = {
174
177
  'connectionParameters': toJson_VinylCacheSpecBackendsConnectionParameters(obj.connectionParameters),
178
+ 'director': toJson_VinylCacheSpecBackendsDirector(obj.director),
175
179
  'name': obj.name,
176
180
  'port': obj.port,
177
181
  'probe': toJson_VinylCacheSpecBackendsProbe(obj.probe),
@@ -389,6 +393,22 @@ function toJson_VinylCacheSpecBackendsConnectionParameters(obj) {
389
393
  // filter undefined values
390
394
  return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
391
395
  }
396
+ /**
397
+ * Converts an object of type 'VinylCacheSpecBackendsDirector' to JSON representation.
398
+ */
399
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
400
+ function toJson_VinylCacheSpecBackendsDirector(obj) {
401
+ if (obj === undefined) {
402
+ return undefined;
403
+ }
404
+ const result = {
405
+ 'hash': toJson_VinylCacheSpecBackendsDirectorHash(obj.hash),
406
+ 'shard': toJson_VinylCacheSpecBackendsDirectorShard(obj.shard),
407
+ 'type': obj.type,
408
+ };
409
+ // filter undefined values
410
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
411
+ }
392
412
  /**
393
413
  * Converts an object of type 'VinylCacheSpecBackendsProbe' to JSON representation.
394
414
  */
@@ -486,6 +506,8 @@ var VinylCacheSpecDirectorType;
486
506
  VinylCacheSpecDirectorType["RANDOM"] = "random";
487
507
  /** hash */
488
508
  VinylCacheSpecDirectorType["HASH"] = "hash";
509
+ /** fallback */
510
+ VinylCacheSpecDirectorType["FALLBACK"] = "fallback";
489
511
  })(VinylCacheSpecDirectorType || (exports.VinylCacheSpecDirectorType = VinylCacheSpecDirectorType = {}));
490
512
  /**
491
513
  * Converts an object of type 'VinylCacheSpecInvalidationBan' to JSON representation.
@@ -717,7 +739,59 @@ function toJson_VinylCacheSpecVclSnippets(obj) {
717
739
  // filter undefined values
718
740
  return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
719
741
  }
742
+ /**
743
+ * Converts an object of type 'VinylCacheSpecBackendsDirectorHash' to JSON representation.
744
+ */
745
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
746
+ function toJson_VinylCacheSpecBackendsDirectorHash(obj) {
747
+ if (obj === undefined) {
748
+ return undefined;
749
+ }
750
+ const result = {
751
+ 'header': obj.header,
752
+ };
753
+ // filter undefined values
754
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
755
+ }
756
+ /**
757
+ * Converts an object of type 'VinylCacheSpecBackendsDirectorShard' to JSON representation.
758
+ */
759
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
760
+ function toJson_VinylCacheSpecBackendsDirectorShard(obj) {
761
+ if (obj === undefined) {
762
+ return undefined;
763
+ }
764
+ const result = {
765
+ 'by': obj.by,
766
+ 'healthy': obj.healthy,
767
+ 'rampup': obj.rampup,
768
+ 'replicas': obj.replicas,
769
+ 'warmup': obj.warmup,
770
+ };
771
+ // filter undefined values
772
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
773
+ }
720
774
  /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
775
+ /**
776
+ * type selects the Varnish director algorithm.
777
+ * "shard" (default) provides consistent hashing; "round_robin", "random", and "hash"
778
+ * are also supported.
779
+ *
780
+ * @schema VinylCacheSpecBackendsDirectorType
781
+ */
782
+ var VinylCacheSpecBackendsDirectorType;
783
+ (function (VinylCacheSpecBackendsDirectorType) {
784
+ /** shard */
785
+ VinylCacheSpecBackendsDirectorType["SHARD"] = "shard";
786
+ /** round_robin */
787
+ VinylCacheSpecBackendsDirectorType["ROUND_UNDERSCORE_ROBIN"] = "round_robin";
788
+ /** random */
789
+ VinylCacheSpecBackendsDirectorType["RANDOM"] = "random";
790
+ /** hash */
791
+ VinylCacheSpecBackendsDirectorType["HASH"] = "hash";
792
+ /** fallback */
793
+ VinylCacheSpecBackendsDirectorType["FALLBACK"] = "fallback";
794
+ })(VinylCacheSpecBackendsDirectorType || (exports.VinylCacheSpecBackendsDirectorType = VinylCacheSpecBackendsDirectorType = {}));
721
795
  /**
722
796
  * type is the routing strategy between Varnish pods. Only "shard" is supported.
723
797
  *
@@ -800,6 +874,34 @@ function toJson_VinylCacheSpecPodAffinityPodAntiAffinity(obj) {
800
874
  // filter undefined values
801
875
  return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
802
876
  }
877
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
878
+ /**
879
+ * by determines what value is hashed for shard selection. "HASH" uses the Varnish
880
+ * hash (default); "URL" uses the request URL.
881
+ *
882
+ * @schema VinylCacheSpecBackendsDirectorShardBy
883
+ */
884
+ var VinylCacheSpecBackendsDirectorShardBy;
885
+ (function (VinylCacheSpecBackendsDirectorShardBy) {
886
+ /** HASH */
887
+ VinylCacheSpecBackendsDirectorShardBy["HASH"] = "HASH";
888
+ /** URL */
889
+ VinylCacheSpecBackendsDirectorShardBy["URL"] = "URL";
890
+ })(VinylCacheSpecBackendsDirectorShardBy || (exports.VinylCacheSpecBackendsDirectorShardBy = VinylCacheSpecBackendsDirectorShardBy = {}));
891
+ /**
892
+ * healthy controls which backends the director considers when selecting a shard.
893
+ * "CHOSEN" (default) only considers the chosen backend healthy; "ALL" requires all
894
+ * backends to be healthy.
895
+ *
896
+ * @schema VinylCacheSpecBackendsDirectorShardHealthy
897
+ */
898
+ var VinylCacheSpecBackendsDirectorShardHealthy;
899
+ (function (VinylCacheSpecBackendsDirectorShardHealthy) {
900
+ /** CHOSEN */
901
+ VinylCacheSpecBackendsDirectorShardHealthy["CHOSEN"] = "CHOSEN";
902
+ /** ALL */
903
+ VinylCacheSpecBackendsDirectorShardHealthy["ALL"] = "ALL";
904
+ })(VinylCacheSpecBackendsDirectorShardHealthy || (exports.VinylCacheSpecBackendsDirectorShardHealthy = VinylCacheSpecBackendsDirectorShardHealthy = {}));
803
905
  /**
804
906
  * Converts an object of type 'VinylCacheSpecPodAffinityNodeAffinityPreferredDuringSchedulingIgnoredDuringExecution' to JSON representation.
805
907
  */
@@ -1278,4 +1380,4 @@ function toJson_VinylCacheSpecPodAffinityPodAntiAffinityPreferredDuringSchedulin
1278
1380
  return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
1279
1381
  }
1280
1382
  /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
1281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQWtJRCxzREFzQkM7QUF3REQsc0VBWUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUFtQ0QsMEVBU0M7QUF3REQsNERBWUM7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUFrREQsOEdBV0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUFxREQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUFnQ0Qsb0ZBUUM7QUFnTUQsNEVBcUJDO0FBNkVELG9HQVFDO0FBMENELGtHQVFDO0FBMENELDBHQVFDO0FBNkJELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBd0NELHdSQVNDO0FBd0NELGdTQVNDO0FBd0NELGdTQVNDO0FBd0NELHdT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QUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNKLGNBQWMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVks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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhJQUE4SSxDQUFDLEdBQXdKO0lBQ3JULElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iajogVmlueWxDYWNoZVNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrZW5kcyc6IG9iai5iYWNrZW5kcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMoeSkpLFxuICAgICdjbHVzdGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmouY2x1c3RlciksXG4gICAgJ2RlYm91bmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqLmRlYm91bmNlKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAnaW52YWxpZGF0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iai5pbnZhbGlkYXRpb24pLFxuICAgICdtb25pdG9yaW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmoubW9uaXRvcmluZyksXG4gICAgJ3BvZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZChvYmoucG9kKSxcbiAgICAncHJveHlQcm90b2NvbCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wob2JqLnByb3h5UHJvdG9jb2wpLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdyZXRyeSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1JldHJ5KG9iai5yZXRyeSksXG4gICAgJ3NlcnZpY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNTZXJ2aWNlKG9iai5zZXJ2aWNlKSxcbiAgICAnc3RvcmFnZSc6IG9iai5zdG9yYWdlPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKHkpKSxcbiAgICAndmFybmlzaFBhcmFtZXRlcnMnOiAoKG9iai52YXJuaXNoUGFyYW1ldGVycykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAndmNsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsKG9iai52Y2wpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQmFja2VuZFNwZWMgZGVzY3JpYmVzIGFuIHVwc3RyZWFtIEt1YmVybmV0ZXMgc2VydmljZSB1c2VkIGFzIGEgVmFybmlzaCBiYWNrZW5kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMge1xuICAvKipcbiAgICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjY29ubmVjdGlvblBhcmFtZXRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25QYXJhbWV0ZXJzPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBWQ0wgaWRlbnRpZmllciBmb3IgdGhpcyBiYWNrZW5kLiBNdXN0IG1hdGNoIF5bYS16QS1aXVthLXpBLVowLTlfXSokLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IG92ZXJyaWRlcyB0aGUgc2VydmljZSBwb3J0IHVzZWQgZm9yIHRoaXMgYmFja2VuZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3BvcnRcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHByb2JlIGNvbmZpZ3VyZXMgdGhlIFZhcm5pc2ggYmFja2VuZCBoZWFsdGggcHJvYmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNwcm9iZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmU/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmU7XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3NlcnZpY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VSZWY6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgaXMgdGhlIHJlbGF0aXZlIHdlaWdodCBmb3IgdGhlIGRpcmVjdG9yLiAwIG1lYW5zIHN0YW5kYnkgKGZhbGxiYWNrIGRpcmVjdG9yKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdGlvblBhcmFtZXRlcnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKG9iai5jb25uZWN0aW9uUGFyYW1ldGVycyksXG4gICAgJ25hbWUnOiBvYmoubmFtZSxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICAgICdwcm9iZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUob2JqLnByb2JlKSxcbiAgICAnc2VydmljZVJlZic6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmouc2VydmljZVJlZiksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB7XG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyBpbnRlci1wb2QgY2x1c3RlcmluZyB2aWEgYSBzaGFyZCBkaXJlY3Rvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBlZXJSb3V0aW5nIGNvbmZpZ3VyZXMgaG93IHJlcXVlc3RzIGFyZSByb3V0ZWQgYmV0d2VlbiBWYXJuaXNoIHBlZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciNwZWVyUm91dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgcGVlclJvdXRpbmc/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNDbHVzdGVyJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncGVlclJvdXRpbmcnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcob2JqLnBlZXJSb3V0aW5nKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRlYm91bmNlIGNvbmZpZ3VyZXMgYSBncmFjZSBwZXJpb2QgYmVmb3JlIGFwcGx5aW5nIGVuZHBvaW50IGNoYW5nZXMgdG8gVmFybmlzaCxcbiAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uge1xuICAvKipcbiAgICogZHVyYXRpb24gaXMgdGhlIHRpbWUgdG8gd2FpdCBhZnRlciB0aGUgbGFzdCBlbmRwb2ludCBjaGFuZ2UgYmVmb3JlIHB1c2hpbmcgYSBWQ0wgdXBkYXRlLlxuICAgKiBUaGlzIHByZXZlbnRzIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi4gRGVmYXVsdDogNXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEZWJvdW5jZSNkdXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEZWJvdW5jZShvYmo6IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkdXJhdGlvbic6IG9iai5kdXJhdGlvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjaGFzaFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaD86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoO1xuXG4gIC8qKlxuICAgKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQ7XG5cbiAgLyoqXG4gICAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gICAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICAgKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvciN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iai5oYXNoKSxcbiAgICAnc2hhcmQnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iai5zaGFyZCksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24ge1xuICAvKipcbiAgICogYmFuIGNvbmZpZ3VyZXMgQkFOLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNiYW5cbiAgICovXG4gIHJlYWRvbmx5IGJhbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuO1xuXG4gIC8qKlxuICAgKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3B1cmdlXG4gICAqL1xuICByZWFkb25seSBwdXJnZT86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2U7XG5cbiAgLyoqXG4gICAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uI3hrZXlcbiAgICovXG4gIHJlYWRvbmx5IHhrZXk/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYW4nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4ob2JqLmJhbiksXG4gICAgJ3B1cmdlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqLnB1cmdlKSxcbiAgICAneGtleSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqLnhrZXkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogbW9uaXRvcmluZyBjb25maWd1cmVzIFByb21ldGhldXMgbWV0cmljcyBhbmQgYWxlcnRpbmcgcnVsZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3Jpbmcge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUHJvbWV0aGV1cyBtZXRyaWNzIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3Byb21ldGhldXNSdWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgcHJvbWV0aGV1c1J1bGVzPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzO1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nI3NlcnZpY2VNb25pdG9yXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTW9uaXRvcj86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY01vbml0b3JpbmcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwcm9tZXRoZXVzUnVsZXMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzKG9iai5wcm9tZXRoZXVzUnVsZXMpLFxuICAgICdzZXJ2aWNlTW9uaXRvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcihvYmouc2VydmljZU1vbml0b3IpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcG9kIGNvbmZpZ3VyZXMgcG9kLWxldmVsIHNjaGVkdWxpbmcgYW5kIG1ldGFkYXRhLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZCB7XG4gIC8qKlxuICAgKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2FmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBhZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIGFubm90YXRpb25zIGFyZSBhZGRlZCB0byBlYWNoIFZhcm5pc2ggcG9kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2Fubm90YXRpb25zXG4gICAqL1xuICByZWFkb25seSBhbm5vdGF0aW9ucz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIGxhYmVscyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZCAobWVyZ2VkIHdpdGggb3BlcmF0b3ItbWFuYWdlZCBsYWJlbHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI2xhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogbm9kZVNlbGVjdG9yIGNvbnN0cmFpbnMgcG9kcyB0byBub2RlcyBtYXRjaGluZyBhbGwgc3BlY2lmaWVkIGxhYmVscy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNub2RlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVTZWxlY3Rvcj86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIHByaW9yaXR5Q2xhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQcmlvcml0eUNsYXNzIGZvciBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2QjcHJpb3JpdHlDbGFzc05hbWVcbiAgICovXG4gIHJlYWRvbmx5IHByaW9yaXR5Q2xhc3NOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB0b2xlcmF0aW9ucyBhbGxvdyBwb2RzIHRvIGJlIHNjaGVkdWxlZCBvbiB0YWludGVkIG5vZGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3RvbGVyYXRpb25zXG4gICAqL1xuICByZWFkb25seSB0b2xlcmF0aW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2QnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2Qob2JqOiBWaW55bENhY2hlU3BlY1BvZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkob2JqLmFmZmluaXR5KSxcbiAgICAnYW5ub3RhdGlvbnMnOiAoKG9iai5hbm5vdGF0aW9ucykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmFubm90YXRpb25zKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbGFiZWxzJzogKChvYmoubGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAnbm9kZVNlbGVjdG9yJzogKChvYmoubm9kZVNlbGVjdG9yKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubm9kZVNlbGVjdG9yKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAncHJpb3JpdHlDbGFzc05hbWUnOiBvYmoucHJpb3JpdHlDbGFzc05hbWUsXG4gICAgJ3RvbGVyYXRpb25zJzogb2JqLnRvbGVyYXRpb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyh5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm94eVByb3RvY29sIGVuYWJsZXMgUFJPWFkgcHJvdG9jb2wgb24gYSBkZWRpY2F0ZWQgcG9ydCBmb3IgcGFzc2luZyBjbGllbnQgSVAuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgUFJPWFkgcHJvdG9jb2wgc3VwcG9ydC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHBvcnQgaXMgdGhlIHBvcnQgb24gd2hpY2ggUFJPWFkgcHJvdG9jb2wgY29ubmVjdGlvbnMgYXJlIGFjY2VwdGVkLiBEZWZhdWx0OiA4MDgxLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCNwb3J0XG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sKG9iajogVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwb3J0Jzogb2JqLnBvcnQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiByZXNvdXJjZXMgc2V0cyBDUFUgYW5kIG1lbW9yeSByZXF1ZXN0cy9saW1pdHMgZm9yIHRoZSBWYXJuaXNoIGNvbnRhaW5lci5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMge1xuICAvKipcbiAgICogQ2xhaW1zIGxpc3RzIHRoZSBuYW1lcyBvZiByZXNvdXJjZXMsIGRlZmluZWQgaW4gc3BlYy5yZXNvdXJjZUNsYWltcyxcbiAgICogdGhhdCBhcmUgdXNlZCBieSB0aGlzIGNvbnRhaW5lci5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBkZXBlbmRzIG9uIHRoZVxuICAgKiBEeW5hbWljUmVzb3VyY2VBbGxvY2F0aW9uIGZlYXR1cmUgZ2F0ZS5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBpbW11dGFibGUuIEl0IGNhbiBvbmx5IGJlIHNldCBmb3IgY29udGFpbmVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNjbGFpbXNcbiAgICovXG4gIHJlYWRvbmx5IGNsYWltcz86IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zW107XG5cbiAgLyoqXG4gICAqIExpbWl0cyBkZXNjcmliZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIGFsbG93ZWQuXG4gICAqIE1vcmUgaW5mbzogaHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvY29uY2VwdHMvY29uZmlndXJhdGlvbi9tYW5hZ2UtcmVzb3VyY2VzLWNvbnRhaW5lcnMvXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjbGltaXRzXG4gICAqL1xuICByZWFkb25seSBsaW1pdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIGRlc2NyaWJlcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tcHV0ZSByZXNvdXJjZXMgcmVxdWlyZWQuXG4gICAqIElmIFJlcXVlc3RzIGlzIG9taXR0ZWQgZm9yIGEgY29udGFpbmVyLCBpdCBkZWZhdWx0cyB0byBMaW1pdHMgaWYgdGhhdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCxcbiAgICogb3RoZXJ3aXNlIHRvIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdmFsdWUuIFJlcXVlc3RzIGNhbm5vdCBleGNlZWQgTGltaXRzLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI3JlcXVlc3RzXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0cz86IHsgW2tleTogc3RyaW5nXTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY2xhaW1zJzogb2JqLmNsYWltcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKHkpKSxcbiAgICAnbGltaXRzJzogKChvYmoubGltaXRzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubGltaXRzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXT8udmFsdWUgfSksIHt9KSksXG4gICAgJ3JlcXVlc3RzJzogKChvYmoucmVxdWVzdHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5yZXF1ZXN0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmV0cnkgY29uZmlndXJlcyByZXRyeSBiZWhhdmlvdXIgd2hlbiBWQ0wgdXBkYXRlcyBmYWlsIHRvIGFwcGx5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmV0cnkge1xuICAvKipcbiAgICogYmFja29mZkJhc2UgaXMgdGhlIGluaXRpYWwgYmFja29mZiBkdXJhdGlvbiBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLiBEZWZhdWx0OiA1cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZCYXNlXG4gICAqL1xuICByZWFkb25seSBiYWNrb2ZmQmFzZT86IHN0cmluZztcblxuICAvKipcbiAgICogYmFja29mZk1heCBpcyB0aGUgbWF4aW11bSBiYWNrb2ZmIGR1cmF0aW9uIChleHBvbmVudGlhbCBiYWNrb2ZmIGNhcCkuIERlZmF1bHQ6IDVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjYmFja29mZk1heFxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZk1heD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4QXR0ZW1wdHMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFZDTCBwdXNoIGF0dGVtcHRzIGJlZm9yZSB0aGUgb3BlcmF0b3JcbiAgICogdHJhbnNpdGlvbnMgdG8gRXJyb3IgcGhhc2UuIERlZmF1bHQ6IDMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNtYXhBdHRlbXB0c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4QXR0ZW1wdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmV0cnknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXRyeShvYmo6IFZpbnlsQ2FjaGVTcGVjUmV0cnkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrb2ZmQmFzZSc6IG9iai5iYWNrb2ZmQmFzZSxcbiAgICAnYmFja29mZk1heCc6IG9iai5iYWNrb2ZmTWF4LFxuICAgICdtYXhBdHRlbXB0cyc6IG9iai5tYXhBdHRlbXB0cyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2UgY29uZmlndXJlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGNyZWF0ZWQgZm9yIHRyYWZmaWMgaW5ncmVzcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU2VydmljZSB7XG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIFNlcnZpY2Ugb2JqZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNTZXJ2aWNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjU2VydmljZShvYmo6IFZpbnlsQ2FjaGVTcGVjU2VydmljZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFN0b3JhZ2VTcGVjIGNvbmZpZ3VyZXMgYSBWYXJuaXNoIHN0b3JhZ2UgYmFja2VuZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBpbnRlcm5hbCBzdG9yYWdlIGlkZW50aWZpZXIgdXNlZCBpbiB2YXJuaXNoZCAtcyBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogcGF0aCBpcyB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBmaWxlLXR5cGUgc3RvcmFnZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2UjcGF0aFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAgICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2Ujc2l6ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2l6ZT86IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemU7XG5cbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gICAqIFwicGVyc2lzdGVudFwiLCBcInVtZW1cIiwgYW5kIFwiZGVmYXVsdFwiIGFyZSByZWplY3RlZCBieSB0aGUgYWRtaXNzaW9uIHdlYmhvb2suXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU3RvcmFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1N0b3JhZ2Uob2JqOiBWaW55bENhY2hlU3BlY1N0b3JhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BhdGgnOiBvYmoucGF0aCxcbiAgICAnc2l6ZSc6IG9iai5zaXplPy52YWx1ZSxcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdmNsIGNvbmZpZ3VyZXMgVkNMIGdlbmVyYXRpb246IHNuaXBwZXRzIGluamVjdGVkIGludG8gZ2VuZXJhdGVkIFZDTCBzdWJyb3V0aW5lcyxcbiAqIG9yIGEgZnVsbCBWQ0wgb3ZlcnJpZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsIHtcbiAgLyoqXG4gICAqIGZ1bGxPdmVycmlkZSByZXBsYWNlcyB0aGUgZW50aXJlIGdlbmVyYXRlZCBWQ0wgd2l0aCBhIGN1c3RvbSBWQ0wgc3RyaW5nLlxuICAgKiBVc2Ugd2l0aCBjYXV0aW9uIOKAlCB0aGlzIGRpc2FibGVzIGFsbCBzdHJ1Y3R1cmVkIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjZnVsbE92ZXJyaWRlXG4gICAqL1xuICByZWFkb25seSBmdWxsT3ZlcnJpZGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbCNzbmlwcGV0c1xuICAgKi9cbiAgcmVhZG9ubHkgc25pcHBldHM/OiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1ZjbChvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZnVsbE92ZXJyaWRlJzogb2JqLmZ1bGxPdmVycmlkZSxcbiAgICAnc25pcHBldHMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmouc25pcHBldHMpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIGJldHdlZW5CeXRlc1RpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGJldHdlZW4gYnl0ZXMgb2YgdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2JldHdlZW5CeXRlc1RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGJldHdlZW5CeXRlc1RpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGNvbm5lY3RUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gZXN0YWJsaXNoIGEgVENQIGNvbm5lY3Rpb24gdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2Nvbm5lY3RUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBjb25uZWN0VGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogZmlyc3RCeXRlVGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMjZmlyc3RCeXRlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgZmlyc3RCeXRlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogaWRsZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSBhbiBpZGxlIGNvbm5lY3Rpb24gbWF5IGJlIHJldXNlZC4gU2hvdWxkIGJlIGxlc3NcbiAgICogdGhhbiB0aGUgYmFja2VuZCdzIGtlZXAtYWxpdmUgdGltZW91dCB0byBhdm9pZCA1MDMgcmFjZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2lkbGVUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBpZGxlVGltZW91dD86IHN0cmluZztcblxuICAvKipcbiAgICogbWF4Q29ubmVjdGlvbnMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgdG8gdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI21heENvbm5lY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhDb25uZWN0aW9ucz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyhvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2JldHdlZW5CeXRlc1RpbWVvdXQnOiBvYmouYmV0d2VlbkJ5dGVzVGltZW91dCxcbiAgICAnY29ubmVjdFRpbWVvdXQnOiBvYmouY29ubmVjdFRpbWVvdXQsXG4gICAgJ2ZpcnN0Qnl0ZVRpbWVvdXQnOiBvYmouZmlyc3RCeXRlVGltZW91dCxcbiAgICAnaWRsZVRpbWVvdXQnOiBvYmouaWRsZVRpbWVvdXQsXG4gICAgJ21heENvbm5lY3Rpb25zJzogb2JqLm1heENvbm5lY3Rpb25zLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvYmUgY29uZmlndXJlcyB0aGUgVmFybmlzaCBiYWNrZW5kIGhlYWx0aCBwcm9iZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB7XG4gIC8qKlxuICAgKiBleHBlY3RlZFJlc3BvbnNlIGlzIHRoZSBleHBlY3RlZCBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLiBEZWZhdWx0cyB0byAyMDAuXG4gICAqXG4gICAqIEBkZWZhdWx0IDIwMC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjZXhwZWN0ZWRSZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0ZWRSZXNwb25zZT86IG51bWJlcjtcblxuICAvKipcbiAgICogaW50ZXJ2YWwgaXMgaG93IG9mdGVuIHRvIHByb2JlIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRocmVzaG9sZCBpcyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBwcm9iZXMgd2l0aGluIHRoZSB3aW5kb3cgZm9yIHRoZSBiYWNrZW5kXG4gICAqIHRvIGJlIGNvbnNpZGVyZWQgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdGhyZXNob2xkXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciBhIHByb2JlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aW1lb3V0XG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1cmwgaXMgdGhlIFVSTCB0byBwcm9iZS4gSWYgZW1wdHksIHRoZSBiYWNrZW5kJ3Mgcm9vdCBwYXRoIGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3VybFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB3aW5kb3cgaXMgdGhlIG51bWJlciBvZiBtb3N0IHJlY2VudCBwcm9iZXMgdG8gY29uc2lkZXIgZm9yIHRocmVzaG9sZCBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN3aW5kb3dcbiAgICovXG4gIHJlYWRvbmx5IHdpbmRvdz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZShvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2V4cGVjdGVkUmVzcG9uc2UnOiBvYmouZXhwZWN0ZWRSZXNwb25zZSxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gICAgJ3RocmVzaG9sZCc6IG9iai50aHJlc2hvbGQsXG4gICAgJ3RpbWVvdXQnOiBvYmoudGltZW91dCxcbiAgICAndXJsJzogb2JqLnVybCxcbiAgICAnd2luZG93Jzogb2JqLndpbmRvdyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYge1xuICAvKipcbiAgICogbmFtZSBpcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIG5hbWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZihvYmo6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcGVlclJvdXRpbmcgY29uZmlndXJlcyBob3cgcmVxdWVzdHMgYXJlIHJvdXRlZCBiZXR3ZWVuIFZhcm5pc2ggcGVlcnMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHtcbiAgLyoqXG4gICAqIHR5cGUgaXMgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgYmV0d2VlbiBWYXJuaXNoIHBvZHMuIE9ubHkgXCJzaGFyZFwiIGlzIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZyhvYmo6IFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAndHlwZSc6IG9iai50eXBlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB7XG4gIC8qKlxuICAgKiBoZWFkZXIgaXMgdGhlIHJlcXVlc3QgaGVhZGVyIG5hbWUgdXNlZCBhcyB0aGUgaGFzaCBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2ggfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHtcbiAgLyoqXG4gICAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICAgKiBoYXNoIChkZWZhdWx0KTsgXCJVUkxcIiB1c2VzIHRoZSByZXF1ZXN0IFVSTC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjYnlcbiAgICovXG4gIHJlYWRvbmx5IGJ5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnk7XG5cbiAgLyoqXG4gICAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICAgKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAgICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjaGVhbHRoeVxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoeT86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHk7XG5cbiAgLyoqXG4gICAqIHJhbXB1cCBpcyB0aGUgdGltZSBhZnRlciBhZGRpbmcgYSBiYWNrZW5kIGJlZm9yZSBpdCByZWNlaXZlcyBpdHMgZnVsbCBzaGFyZSBvZiB0cmFmZmljLFxuICAgKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZC4gRGVmYXVsdDogMzBzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNyYW1wdXBcbiAgICovXG4gIHJlYWRvbmx5IHJhbXB1cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGljYXMgaXMgdGhlIG51bWJlciBvZiBLZXRhbWEgcmVwbGljYXMgcGVyIGJhY2tlbmQgaW4gdGhlIGhhc2ggcmluZy4gRGVmYXVsdDogNjcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JlcGxpY2FzXG4gICAqL1xuICByZWFkb25seSByZXBsaWNhcz86IG51bWJlcjtcblxuICAvKipcbiAgICogd2FybXVwIGlzIHRoZSBwcm9wb3J0aW9uIG9mIHJlcXVlc3RzICgwLjDigJMxLjApIHNlbnQgdG8gdGhlIGFsdGVybmF0aXZlIGJhY2tlbmRcbiAgICogdG8gcHJlLXBvcHVsYXRlIGl0cyBjYWNoZS4gRGVmYXVsdDogMC4xLiBNdXN0IGJlIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3dhcm11cFxuICAgKi9cbiAgcmVhZG9ubHkgd2FybXVwPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkKG9iajogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnknOiBvYmouYnksXG4gICAgJ2hlYWx0aHknOiBvYmouaGVhbHRoeSxcbiAgICAncmFtcHVwJzogb2JqLnJhbXB1cCxcbiAgICAncmVwbGljYXMnOiBvYmoucmVwbGljYXMsXG4gICAgJ3dhcm11cCc6IG9iai53YXJtdXAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gKiBhcmUgYWxzbyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbiAgLyoqIHJvdW5kX3JvYmluICovXG4gIFJPVU5EX1VOREVSU0NPUkVfUk9CSU4gPSBcInJvdW5kX3JvYmluXCIsXG4gIC8qKiByYW5kb20gKi9cbiAgUkFORE9NID0gXCJyYW5kb21cIixcbiAgLyoqIGhhc2ggKi9cbiAgSEFTSCA9IFwiaGFzaFwiLFxufVxuXG4vKipcbiAqIGJhbiBjb25maWd1cmVzIEJBTi1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCBCQU4gcmVxdWVzdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHRoZSBCQU4gaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHJhdGVMaW1pdFBlck1pbnV0ZSBsaW1pdHMgQkFOIHJlcXVlc3RzIHBlciBtaW51dGUuIDAgbWVhbnMgbm8gbGltaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4jcmF0ZUxpbWl0UGVyTWludXRlXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXRQZXJNaW51dGU/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuKG9iajogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW4gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncmF0ZUxpbWl0UGVyTWludXRlJzogb2JqLnJhdGVMaW1pdFBlck1pbnV0ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHB1cmdlIGNvbmZpZ3VyZXMgSFRUUCBQVVJHRS1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgUFVSR0UgcmVxdWVzdHMuXG4gICAqIElmIGVtcHR5LCBubyBzb3VyY2UgcmVzdHJpY3Rpb24gaXMgYXBwbGllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgUFVSR0UgaW52YWxpZGF0aW9uIGhhbmRsZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdCBlbmFibGVzIHNvZnQgcHVyZ2VzLCB3aGljaCBtYXJrIG9iamVjdHMgYXMgZXhwaXJlZCByYXRoZXIgdGhhbiByZW1vdmluZyB0aGVtLlxuICAgKiBUaGlzIGFsbG93cyBWYXJuaXNoIHRvIHNlcnZlIHN0YWxlIGNvbnRlbnQgd2hpbGUgcmV2YWxpZGF0aW5nLiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Ujc29mdFxuICAgKi9cbiAgcmVhZG9ubHkgc29mdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdCc6IG9iai5zb2Z0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogeGtleSBjb25maWd1cmVzIHhrZXktYmFzZWQgc3Vycm9nYXRlIGtleSBpbnZhbGlkYXRpb24gKHJlcXVpcmVzIHZtb2RfeGtleSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIHhrZXkgaW52YWxpZGF0aW9uIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgeGtleS1iYXNlZCBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBzb2Z0UHVyZ2UgZW5hYmxlcyBzb2Z0IHB1cmdpbmcgdmlhIHhrZXkuIERlZmF1bHQ6IHRydWUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5I3NvZnRQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgc29mdFB1cmdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleShvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbG93ZWRTb3VyY2VzJzogb2JqLmFsbG93ZWRTb3VyY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdzb2Z0UHVyZ2UnOiBvYmouc29mdFB1cmdlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJvbWV0aGV1c1J1bGVzIGNvbmZpZ3VyZXMgUHJvbWV0aGV1c1J1bGUgb2JqZWN0cyBmb3IgYWxlcnRpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMge1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgUHJvbWV0aGV1c1J1bGUgd2l0aCBkZWZhdWx0IGFsZXJ0aW5nIHJ1bGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyhvYmo6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNlcnZpY2VNb25pdG9yIGNvbmZpZ3VyZXMgYSBTZXJ2aWNlTW9uaXRvciBmb3IgUHJvbWV0aGV1cyBPcGVyYXRvciBzY3JhcGluZy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Ige1xuICAvKipcbiAgICogZW5hYmxlZCBjcmVhdGVzIGEgU2VydmljZU1vbml0b3IgdGFyZ2V0aW5nIHRoZSBWYXJuaXNoIG1ldHJpY3MgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGludGVydmFsIGlzIHRoZSBzY3JhcGUgaW50ZXJ2YWwgKGUuZy4gXCIzMHNcIikuIERlZmF1bHRzIHRvIHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIFByb21ldGhldXMgZ2xvYmFsIGludGVydmFsLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Iob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnaW50ZXJ2YWwnOiBvYmouaW50ZXJ2YWwsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBhZmZpbml0eSBjb25maWd1cmVzIHBvZCBhZmZpbml0eSBhbmQgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkge1xuICAvKipcbiAgICogRGVzY3JpYmVzIG5vZGUgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyBmb3IgdGhlIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I25vZGVBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgbm9kZUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGNvLWxvY2F0ZSB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFmZmluaXR5XG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eTtcblxuICAvKipcbiAgICogRGVzY3JpYmVzIHBvZCBhbnRpLWFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gYXZvaWQgcHV0dGluZyB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5I3BvZEFudGlBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQW50aUFmZmluaXR5PzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ25vZGVBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iai5ub2RlQWZmaW5pdHkpLFxuICAgICdwb2RBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkob2JqLnBvZEFmZmluaXR5KSxcbiAgICAncG9kQW50aUFmZmluaXR5JzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqLnBvZEFudGlBZmZpbml0eSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBUaGUgcG9kIHRoaXMgVG9sZXJhdGlvbiBpcyBhdHRhY2hlZCB0byB0b2xlcmF0ZXMgYW55IHRhaW50IHRoYXQgbWF0Y2hlc1xuICogdGhlIHRyaXBsZSA8a2V5LHZhbHVlLGVmZmVjdD4gdXNpbmcgdGhlIG1hdGNoaW5nIG9wZXJhdG9yIDxvcGVyYXRvcj4uXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB7XG4gIC8qKlxuICAgKiBFZmZlY3QgaW5kaWNhdGVzIHRoZSB0YWludCBlZmZlY3QgdG8gbWF0Y2guIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBlZmZlY3RzLlxuICAgKiBXaGVuIHNwZWNpZmllZCwgYWxsb3dlZCB2YWx1ZXMgYXJlIE5vU2NoZWR1bGUsIFByZWZlck5vU2NoZWR1bGUgYW5kIE5vRXhlY3V0ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2VmZmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBLZXkgaXMgdGhlIHRhaW50IGtleSB0aGF0IHRoZSB0b2xlcmF0aW9uIGFwcGxpZXMgdG8uIEVtcHR5IG1lYW5zIG1hdGNoIGFsbCB0YWludCBrZXlzLlxuICAgKiBJZiB0aGUga2V5IGlzIGVtcHR5LCBvcGVyYXRvciBtdXN0IGJlIEV4aXN0czsgdGhpcyBjb21iaW5hdGlvbiBtZWFucyB0byBtYXRjaCBhbGwgdmFsdWVzIGFuZCBhbGwga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIHRoZSB2YWx1ZS5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBFeGlzdHMsIEVxdWFsLCBMdCwgYW5kIEd0LiBEZWZhdWx0cyB0byBFcXVhbC5cbiAgICogRXhpc3RzIGlzIGVxdWl2YWxlbnQgdG8gd2lsZGNhcmQgZm9yIHZhbHVlLCBzbyB0aGF0IGEgcG9kIGNhblxuICAgKiB0b2xlcmF0ZSBhbGwgdGFpbnRzIG9mIGEgcGFydGljdWxhciBjYXRlZ29yeS5cbiAgICogTHQgYW5kIEd0IHBlcmZvcm0gbnVtZXJpYyBjb21wYXJpc29ucyAocmVxdWlyZXMgZmVhdHVyZSBnYXRlIFRhaW50VG9sZXJhdGlvbkNvbXBhcmlzb25PcGVyYXRvcnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBFcXVhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IHN0cmluZztcblxuICAvKipcbiAgICogVG9sZXJhdGlvblNlY29uZHMgcmVwcmVzZW50cyB0aGUgcGVyaW9kIG9mIHRpbWUgdGhlIHRvbGVyYXRpb24gKHdoaWNoIG11c3QgYmVcbiAgICogb2YgZWZmZWN0IE5vRXhlY3V0ZSwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgaWdub3JlZCkgdG9sZXJhdGVzIHRoZSB0YWludC4gQnkgZGVmYXVsdCxcbiAgICogaXQgaXMgbm90IHNldCwgd2hpY2ggbWVhbnMgdG9sZXJhdGUgdGhlIHRhaW50IGZvcmV2ZXIgKGRvIG5vdCBldmljdCkuIFplcm8gYW5kXG4gICAqIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgMCAoZXZpY3QgaW1tZWRpYXRlbHkpIGJ5IHRoZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyN0b2xlcmF0aW9uU2Vjb25kc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvblNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZhbHVlIGlzIHRoZSB0YWludCB2YWx1ZSB0aGUgdG9sZXJhdGlvbiBtYXRjaGVzIHRvLlxuICAgKiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGVtcHR5LCBvdGhlcndpc2UganVzdCBhIHJlZ3VsYXIgc3RyaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdmFsdWVcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZWZmZWN0Jzogb2JqLmVmZmVjdCxcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3RvbGVyYXRpb25TZWNvbmRzJzogb2JqLnRvbGVyYXRpb25TZWNvbmRzLFxuICAgICd2YWx1ZSc6IG9iai52YWx1ZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlc291cmNlQ2xhaW0gcmVmZXJlbmNlcyBvbmUgZW50cnkgaW4gUG9kU3BlYy5SZXNvdXJjZUNsYWltcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMge1xuICAvKipcbiAgICogTmFtZSBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIG9uZSBlbnRyeSBpbiBwb2Quc3BlYy5yZXNvdXJjZUNsYWltcyBvZlxuICAgKiB0aGUgUG9kIHdoZXJlIHRoaXMgZmllbGQgaXMgdXNlZC4gSXQgbWFrZXMgdGhhdCByZXNvdXJjZSBhdmFpbGFibGVcbiAgICogaW5zaWRlIGEgY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI25hbWVcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmVxdWVzdCBpcyB0aGUgbmFtZSBjaG9zZW4gZm9yIGEgcmVxdWVzdCBpbiB0aGUgcmVmZXJlbmNlZCBjbGFpbS5cbiAgICogSWYgZW1wdHksIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2xhaW0gaXMgbWFkZSBhdmFpbGFibGUsIG90aGVyd2lzZVxuICAgKiBvbmx5IHRoZSByZXN1bHQgb2YgdGhpcyByZXF1ZXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zI3JlcXVlc3RcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zKG9iajogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNDbGFpbXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3JlcXVlc3QnOiBvYmoucmVxdWVzdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0eXBlIHNldHMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSB0eXBlIChDbHVzdGVySVAsIE5vZGVQb3J0LCBMb2FkQmFsYW5jZXIpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1NlcnZpY2VUeXBlIHtcbiAgLyoqIENsdXN0ZXJJUCAqL1xuICBDTFVTVEVSX0lQID0gXCJDbHVzdGVySVBcIixcbiAgLyoqIE5vZGVQb3J0ICovXG4gIE5PREVfUE9SVCA9IFwiTm9kZVBvcnRcIixcbiAgLyoqIExvYWRCYWxhbmNlciAqL1xuICBMT0FEX0JBTEFOQ0VSID0gXCJMb2FkQmFsYW5jZXJcIixcbn1cblxuLyoqXG4gKiBzaXplIGlzIHRoZSBzdG9yYWdlIGFsbG9jYXRpb24gYXMgYSBLdWJlcm5ldGVzIHJlc291cmNlIHF1YW50aXR5IChlLmcuIFwiMUdpXCIpLlxuICogVGhlIG9wZXJhdG9yIGNvbnZlcnRzIHRvIGJ5dGVzIGZvciB2YXJuaXNoZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemVcbiAqL1xuZXhwb3J0IGNsYXNzIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICBwdWJsaWMgc3RhdGljIGZyb21OdW1iZXIodmFsdWU6IG51bWJlcik6IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSh2YWx1ZSk7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUodmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIHR5cGUgaXMgdGhlIHN0b3JhZ2UgYmFja2VuZCB0eXBlLiBPbmx5IFwibWFsbG9jXCIgYW5kIFwiZmlsZVwiIGFyZSBwZXJtaXR0ZWQuXG4gKiBcInBlcnNpc3RlbnRcIiwgXCJ1bWVtXCIsIGFuZCBcImRlZmF1bHRcIiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlIHtcbiAgLyoqIG1hbGxvYyAqL1xuICBNQUxMT0MgPSBcIm1hbGxvY1wiLFxuICAvKiogZmlsZSAqL1xuICBGSUxFID0gXCJmaWxlXCIsXG59XG5cbi8qKlxuICogc25pcHBldHMgcHJvdmlkZXMgVkNMIGNvZGUgaW5qZWN0ZWQgaW50byBlYWNoIGdlbmVyYXRlZCBzdWJyb3V0aW5lLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMge1xuICAvKipcbiAgICogaGVhZGVyIGlzIGluc2VydGVkIGF0IHRoZSB0b3Agb2YgdGhlIFZDTCBmaWxlLCBiZWZvcmUgYW55IHN1YnJvdXRpbmVzLlxuICAgKiBVc2UgZm9yIGltcG9ydCBzdGF0ZW1lbnRzIGFuZCBnbG9iYWwgZGVjbGFyYXRpb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjaGVhZGVyXG4gICAqL1xuICByZWFkb25seSBoZWFkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRFcnJvciBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2Vycm9yLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEVycm9yXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRXJyb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRGZXRjaCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX2ZldGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZEZldGNoXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kRmV0Y2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEJhY2tlbmRSZXNwb25zZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9iYWNrZW5kX3Jlc3BvbnNlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsQmFja2VuZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSB2Y2xCYWNrZW5kUmVzcG9uc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbERlbGl2ZXIgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZGVsaXZlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbERlbGl2ZXJcbiAgICovXG4gIHJlYWRvbmx5IHZjbERlbGl2ZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEZpbmkgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfZmluaS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEZpbmlcbiAgICovXG4gIHJlYWRvbmx5IHZjbEZpbmk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhhc2ggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfaGFzaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEhhc2hcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhhc2g/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEhpdCBpcyBpbnNlcnRlZCBpbnRvIHZjbF9oaXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xIaXRcbiAgICovXG4gIHJlYWRvbmx5IHZjbEhpdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsSW5pdCBpcyBpbnNlcnRlZCBpbnRvIHRoZSB2Y2xfaW5pdCBzdWJyb3V0aW5lIGFmdGVyIGRpcmVjdG9yIGluaXRpYWxpc2F0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSW5pdFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsSW5pdD86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsTWlzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9taXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsTWlzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsTWlzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGFzcyBpcyBpbnNlcnRlZCBpbnRvIHZjbF9wYXNzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGFzc1xuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUGlwZSBpcyBpbnNlcnRlZCBpbnRvIHZjbF9waXBlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUGlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUGlwZT86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsUHVyZ2UgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcHVyZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xQdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUHVyZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFJlY3YgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcmVjdiBhZnRlciBnZW5lcmF0ZWQgcm91dGluZyBsb2dpYywgYmVmb3JlIHJldHVybigpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUmVjdlxuICAgKi9cbiAgcmVhZG9ubHkgdmNsUmVjdj86IHN0cmluZztcblxuICAvKipcbiAgICogdmNsU3ludGggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfc3ludGguXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xTeW50aFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsU3ludGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyhvYmo6IFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoZWFkZXInOiBvYmouaGVhZGVyLFxuICAgICd2Y2xCYWNrZW5kRXJyb3InOiBvYmoudmNsQmFja2VuZEVycm9yLFxuICAgICd2Y2xCYWNrZW5kRmV0Y2gnOiBvYmoudmNsQmFja2VuZEZldGNoLFxuICAgICd2Y2xCYWNrZW5kUmVzcG9uc2UnOiBvYmoudmNsQmFja2VuZFJlc3BvbnNlLFxuICAgICd2Y2xEZWxpdmVyJzogb2JqLnZjbERlbGl2ZXIsXG4gICAgJ3ZjbEZpbmknOiBvYmoudmNsRmluaSxcbiAgICAndmNsSGFzaCc6IG9iai52Y2xIYXNoLFxuICAgICd2Y2xIaXQnOiBvYmoudmNsSGl0LFxuICAgICd2Y2xJbml0Jzogb2JqLnZjbEluaXQsXG4gICAgJ3ZjbE1pc3MnOiBvYmoudmNsTWlzcyxcbiAgICAndmNsUGFzcyc6IG9iai52Y2xQYXNzLFxuICAgICd2Y2xQaXBlJzogb2JqLnZjbFBpcGUsXG4gICAgJ3ZjbFB1cmdlJzogb2JqLnZjbFB1cmdlLFxuICAgICd2Y2xSZWN2Jzogb2JqLnZjbFJlY3YsXG4gICAgJ3ZjbFN5bnRoJzogb2JqLnZjbFN5bnRoLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nVHlwZSB7XG4gIC8qKiBzaGFyZCAqL1xuICBTSEFSRCA9IFwic2hhcmRcIixcbn1cblxuLyoqXG4gKiBieSBkZXRlcm1pbmVzIHdoYXQgdmFsdWUgaXMgaGFzaGVkIGZvciBzaGFyZCBzZWxlY3Rpb24uIFwiSEFTSFwiIHVzZXMgdGhlIFZhcm5pc2hcbiAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkQnkge1xuICAvKiogSEFTSCAqL1xuICBIQVNIID0gXCJIQVNIXCIsXG4gIC8qKiBVUkwgKi9cbiAgVVJMID0gXCJVUkxcIixcbn1cblxuLyoqXG4gKiBoZWFsdGh5IGNvbnRyb2xzIHdoaWNoIGJhY2tlbmRzIHRoZSBkaXJlY3RvciBjb25zaWRlcnMgd2hlbiBzZWxlY3RpbmcgYSBzaGFyZC5cbiAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZEhlYWx0aHlcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeSB7XG4gIC8qKiBDSE9TRU4gKi9cbiAgQ0hPU0VOID0gXCJDSE9TRU5cIixcbiAgLyoqIEFMTCAqL1xuICBBTEwgPSBcIkFMTFwiLFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhZmZpbml0eSBleHByZXNzaW9ucyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCwgYnV0IGl0IG1heSBjaG9vc2VcbiAgICogYSBub2RlIHRoYXQgdmlvbGF0ZXMgb25lIG9yIG1vcmUgb2YgdGhlIGV4cHJlc3Npb25zLiBUaGUgbm9kZSB0aGF0IGlzXG4gICAqIG1vc3QgcHJlZmVycmVkIGlzIHRoZSBvbmUgd2l0aCB0aGUgZ3JlYXRlc3Qgc3VtIG9mIHdlaWdodHMsIGkuZS5cbiAgICogZm9yIGVhY2ggbm9kZSB0aGF0IG1lZXRzIGFsbCBvZiB0aGUgc2NoZWR1bGluZyByZXF1aXJlbWVudHMgKHJlc291cmNlXG4gICAqIHJlcXVlc3QsIHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZyBhZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIGFkZGluZ1xuICAgKiBcIndlaWdodFwiIHRvIHRoZSBzdW0gaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY29ycmVzcG9uZGluZyBtYXRjaEV4cHJlc3Npb25zOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGNlYXNlIHRvIGJlIG1ldFxuICAgKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gICAqIG1heSBvciBtYXkgbm90IHRyeSB0byBldmVudHVhbGx5IGV2aWN0IHRoZSBwb2QgZnJvbSBpdHMgbm9kZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgICAncmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZXNjcmliZXMgcG9kIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gY28tbG9jYXRlIHRoaXMgcG9kIGluIHRoZSBzYW1lIG5vZGUsIHpvbmUsIGV0Yy4gYXMgc29tZSBvdGhlciBwb2QocykpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eSB7XG4gIC8qKlxuICAgKiBUaGUgc2NoZWR1bGVyIHdpbGwgcHJlZmVyIHRvIHNjaGVkdWxlIHBvZHMgdG8gbm9kZXMgdGhhdCBzYXRpc2Z5XG4gICAqIHRoZSBhbnRpLWFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBzdWJ0cmFjdGluZ1xuICAgKiBcIndlaWdodFwiIGZyb20gdGhlIHN1bSBpZiB0aGUgbm9kZSBoYXMgcG9kcyB3aGljaCBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybTsgdGhlXG4gICAqIG5vZGUocykgd2l0aCB0aGUgaGlnaGVzdCBzdW0gYXJlIHRoZSBtb3N0IHByZWZlcnJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3ByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSBwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAgICogc2NoZWR1bGluZyB0aW1lLCB0aGUgcG9kIHdpbGwgbm90IGJlIHNjaGVkdWxlZCBvbnRvIHRoZSBub2RlLlxuICAgKiBJZiB0aGUgYW50aS1hZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGEgcG9kIGxhYmVsIHVwZGF0ZSksIHRoZVxuICAgKiBzeXN0ZW0gbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cywgdGhlIGxpc3RzIG9mIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaFxuICAgKiBwb2RBZmZpbml0eVRlcm0gYXJlIGludGVyc2VjdGVkLCBpLmUuIGFsbCB0ZXJtcyBtdXN0IGJlIHNhdGlzZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5I3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogb2JqLnJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBbiBlbXB0eSBwcmVmZXJyZWQgc2NoZWR1bGluZyB0ZXJtIG1hdGNoZXMgYWxsIG9iamVjdHMgd2l0aCBpbXBsaWNpdCB3ZWlnaHQgMFxuICogKGkuZS4gaXQncyBhIG5vLW9wKS4gQSBudWxsIHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBubyBvYmplY3RzIChpLmUuIGlzIGFsc28gYSBuby1vcCkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3ByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcmVuY2U6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZVNlbGVjdG9yVGVybSwgaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVyZW5jZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iai5wcmVmZXJlbmNlKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gKiBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciB0ZXJtcy4gVGhlIHRlcm1zIGFyZSBPUmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25vZGVTZWxlY3RvclRlcm1zXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3JUZXJtczogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9kZVNlbGVjdG9yVGVybXMnOiBvYmoubm9kZVNlbGVjdG9yVGVybXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwb2RBZmZpbml0eVRlcm0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gICAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1pc21hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IG5vdGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtaXNtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWlzbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lc3BhY2VzIHNwZWNpZmllcyBhIHN0YXRpYyBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBzZWxlY3RlZCBieSBuYW1lc3BhY2VTZWxlY3Rvci5cbiAgICogbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgYW5kIG51bGwgbmFtZXNwYWNlU2VsZWN0b3IgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iai5sYWJlbFNlbGVjdG9yKSxcbiAgICAnbWF0Y2hMYWJlbEtleXMnOiBvYmoubWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtaXNtYXRjaExhYmVsS2V5cyc6IG9iai5taXNtYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ25hbWVzcGFjZVNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybTtcblxuICAvKipcbiAgICogd2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBwb2RBZmZpbml0eVRlcm0sXG4gICAqIGluIHRoZSByYW5nZSAxLTEwMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbm9kZSBzZWxlY3RvciB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBudWxsIG9yIGVtcHR5IG5vZGUgc2VsZWN0b3IgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMuIFRoZSByZXF1aXJlbWVudHMgb2ZcbiAqIHRoZW0gYXJlIEFORGVkLlxuICogVGhlIFRvcG9sb2d5U2VsZWN0b3JUZXJtIHR5cGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgTm9kZVNlbGVjdG9yVGVybS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgZmllbGRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRmllbGRzPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoRmllbGRzJzogb2JqLm1hdGNoRmllbGRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbGFiZWxTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21pc21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtaXNtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICAgKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZXNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBwb2Qgc2hvdWxkIGJlIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCB0aGUgcG9kcyBtYXRjaGluZ1xuICAgKiB0aGUgbGFiZWxTZWxlY3RvciBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZXMsIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZVxuICAgKiB3aG9zZSB2YWx1ZSBvZiB0aGUgbGFiZWwgd2l0aCBrZXkgdG9wb2xvZ3lLZXkgbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoIGFueSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgcG9kcyBpcyBydW5uaW5nLlxuICAgKiBFbXB0eSB0b3BvbG9neUtleSBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmFtZXNwYWNlcyc6IG9iai5uYW1lc3BhY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAndG9wb2xvZ3lLZXknOiBvYmoudG9wb2xvZ3lLZXksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuIl19
1383
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlueWwuYmx1ZWR5bmFtaWNzLmV1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ltcG9ydHMvdmlueWwuYmx1ZWR5bmFtaWNzLmV1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNGQSx3REFRQztBQWtJRCxzREFzQkM7QUFrRUQsc0VBYUM7QUE0QkQsb0VBUUM7QUF1QkQsc0VBT0M7QUFxQ0Qsc0VBU0M7QUFtQ0QsOEVBU0M7QUFtQ0QsMEVBU0M7QUF3REQsNERBWUM7QUE0QkQsZ0ZBUUM7QUE2Q0Qsd0VBU0M7QUFvQ0QsZ0VBU0M7QUE0QkQsb0VBUUM7QUE0Q0Qsb0VBVUM7QUE4QkQsNERBUUM7QUFrREQsOEdBV0M7QUF3Q0Qsc0ZBU0M7QUEwREQsZ0ZBWUM7QUFxQkQsMEZBT0M7QUFxQkQsMEZBT0M7QUFxQkQsOEVBT0M7QUFzREQsZ0ZBV0M7QUF1REQsb0ZBU0M7QUFxQ0Qsd0ZBU0M7QUFtQ0Qsc0ZBU0M7QUFxQkQsd0dBT0M7QUE2QkQsc0dBUUM7QUFtQ0QsNEVBU0M7QUE2REQsa0ZBV0M7QUFnQ0Qsb0ZBUUM7QUFnTUQsNEVBcUJDO0FBcUJELDhGQU9DO0FBc0RELGdHQVdDO0FBaUdELG9HQVFDO0FBMENELGtHQVFDO0FBMENELDBHQVFDO0FBd0RELGtNQVFDO0FBeUJELGdNQU9DO0FBNkJELGdNQVFDO0FBdUZELDhMQVlDO0FBNkJELHdNQVFDO0FBdUZELHNNQVlDO0FBNEJELHNOQVFDO0FBOEJELGtPQVFDO0FBa0ZELDhOQVlDO0FBK0JELHdOQVFDO0FBa0NELGdPQVFDO0FBa0ZELHNPQVlDO0FBK0JELGdPQVFDO0FBa0NELHdPQVFDO0FBeUNELHNQQVNDO0FBeUNELDRPQVNDO0FBeUNELGtRQVNDO0FBeUNELHdQQVNDO0FBK0JELHdQQVFDO0FBa0NELGdRQVFDO0FBd0NELHdQQVNDO0FBd0NELGdRQVNDO0FBK0JELGdRQVFDO0FBa0NELHdRQVFDO0FBd0NELGdRQVNDO0FBd0NELHdRQVNDO0FBd0NELHdSQVNDO0FBd0NELGdTQVNDO0FBd0NELGdTQVNDO0FBd0NELHdTQVNDO0FBamlIRCxxQkFBcUI7QUFDckIsaUNBQXVFO0FBSXZFOzs7Ozs7R0FNRztBQUNILE1BQWEsVUFBVyxTQUFRLGlCQUFTO0lBU3ZDOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBeUIsRUFBRTtRQUNoRCxPQUFPO1lBQ0wsR0FBRyxVQUFVLENBQUMsR0FBRztZQUNqQixHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQztTQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsUUFBeUIsRUFBRTtRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLEdBQUcsVUFBVSxDQUFDLEdBQUc7WUFDakIsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ2EsTUFBTTtRQUNwQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFaEMsT0FBTztZQUNMLEdBQUcsVUFBVSxDQUFDLEdBQUc7WUFDakIsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUM7U0FDcEMsQ0FBQztJQUNKLENBQUM7O0FBOUNILGdDQStDQztBQTlDQzs7R0FFRztBQUNvQixjQUFHLEdBQXFCO0lBQzdDLFVBQVUsRUFBRSxnQ0FBZ0M7SUFDNUMsSUFBSSxFQUFFLFlBQVk7Q0FDbkIsQ0FBQTtBQStESDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixzQkFBc0IsQ0FBQyxHQUFnQztJQUNyRSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixNQUFNLEVBQUUscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUN4QyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE4SEQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IscUJBQXFCLENBQUMsR0FBK0I7SUFDbkUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxTQUFTLEVBQUUsNEJBQTRCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztRQUNwRCxVQUFVLEVBQUUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN2RCxVQUFVLEVBQUUsNkJBQTZCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN2RCxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDbEIsY0FBYyxFQUFFLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDbkUsWUFBWSxFQUFFLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7UUFDN0QsS0FBSyxFQUFFLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDeEMsZUFBZSxFQUFFLGtDQUFrQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDdEUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFdBQVcsRUFBRSw4QkFBOEIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQzFELE9BQU8sRUFBRSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlDLFNBQVMsRUFBRSw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ3BELFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM1TCxLQUFLLEVBQUUsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztLQUN6QyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUE4REQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNkJBQTZCLENBQUMsR0FBdUM7SUFDbkYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixzQkFBc0IsRUFBRSxpREFBaUQsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7UUFDbkcsVUFBVSxFQUFFLHFDQUFxQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDL0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSTtRQUNoQixPQUFPLEVBQUUsa0NBQWtDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN0RCxZQUFZLEVBQUUsdUNBQXVDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNyRSxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBd0JEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLGFBQWEsRUFBRSx1Q0FBdUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO0tBQ3hFLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQW1CRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw2QkFBNkIsQ0FBQyxHQUF1QztJQUNuRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtLQUN6QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNkJBQTZCLENBQUMsR0FBdUM7SUFDbkYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixNQUFNLEVBQUUsaUNBQWlDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUNuRCxPQUFPLEVBQUUsa0NBQWtDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUN0RCxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7S0FDakIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBK0JEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGlDQUFpQyxDQUFDLEdBQTJDO0lBQzNGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLG9DQUFvQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDcEQsT0FBTyxFQUFFLHNDQUFzQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDMUQsTUFBTSxFQUFFLHFDQUFxQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7S0FDeEQsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBK0JEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLCtCQUErQixDQUFDLEdBQXlDO0lBQ3ZGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLGlCQUFpQixFQUFFLDhDQUE4QyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFDdEYsZ0JBQWdCLEVBQUUsNkNBQTZDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztLQUNwRixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvREQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixVQUFVLEVBQUUsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMxRCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUssUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENB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QUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsSyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3pLLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWdDRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwwQkFBMEIsQ0FBQyxHQUFvQztJQUM3RSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO0tBQy9CLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXdCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw0QkFBNEIsQ0FBQyxHQUFzQztJQUNqRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxSyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7S0FDakIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBd0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSTtRQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLO1FBQ3ZCLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSTtLQUNqQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUEwQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isd0JBQXdCLENBQUMsR0FBa0M7SUFDekUsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixjQUFjLEVBQUUsR0FBRyxDQUFDLFlBQVk7UUFDaEMsVUFBVSxFQUFFLGdDQUFnQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7S0FDM0QsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBOENEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGlEQUFpRCxDQUFDLEdBQTJEO0lBQzNILElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IscUJBQXFCLEVBQUUsR0FBRyxDQUFDLG1CQUFtQjtRQUM5QyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsY0FBYztRQUNwQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCO1FBQ3hDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztRQUM5QixnQkFBZ0IsRUFBRSxHQUFHLENBQUMsY0FBYztLQUNyQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IscUNBQXFDLENBQUMsR0FBK0M7SUFDbkcsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixNQUFNLEVBQUUseUNBQXlDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUMzRCxPQUFPLEVBQUUsMENBQTBDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUM5RCxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7S0FDakIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBc0REOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGtDQUFrQyxDQUFDLEdBQTRDO0lBQzdGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2Isa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN4QyxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxTQUFTO1FBQzFCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBaUJEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHVDQUF1QyxDQUFDLEdBQWlEO0lBQ3ZHLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO0tBQ2pCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQix1Q0FBdUMsQ0FBQyxHQUFpRDtJQUN2RyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSTtLQUNqQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsaUNBQWlDLENBQUMsR0FBMkM7SUFDM0YsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBa0REOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLGtDQUFrQyxDQUFDLEdBQTRDO0lBQzdGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ1osU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNwQixVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO0tBQ3JCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7Ozs7O0dBTUc7QUFDSCxJQUFZLDBCQVdYO0FBWEQsV0FBWSwwQkFBMEI7SUFDcEMsWUFBWTtJQUNaLDZDQUFlLENBQUE7SUFDZixrQkFBa0I7SUFDbEIsb0VBQXNDLENBQUE7SUFDdEMsYUFBYTtJQUNiLCtDQUFpQixDQUFBO0lBQ2pCLFdBQVc7SUFDWCwyQ0FBYSxDQUFBO0lBQ2IsZUFBZTtJQUNmLG1EQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFYVywwQkFBMEIsMENBQTFCLDBCQUEwQixRQVdyQztBQThCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixvQ0FBb0MsQ0FBQyxHQUE4QztJQUNqRyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixvQkFBb0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO0tBQzdDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlDRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixzQ0FBc0MsQ0FBQyxHQUFnRDtJQUNyRyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUk7S0FDakIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBK0JEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHFDQUFxQyxDQUFDLEdBQStDO0lBQ25HLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUztLQUMzQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFpQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOENBQThDLENBQUMsR0FBd0Q7SUFDckgsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87S0FDdkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBeUJEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDZDQUE2QyxDQUFDLEdBQXVEO0lBQ25ILElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtLQUN6QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUErQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsZ0NBQWdDLENBQUMsR0FBMEM7SUFDekYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixjQUFjLEVBQUUsNENBQTRDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUM5RSxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUMzRSxpQkFBaUIsRUFBRSwrQ0FBK0MsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0tBQ3hGLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXlERDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixtQ0FBbUMsQ0FBQyxHQUE2QztJQUMvRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQjtRQUMxQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUs7S0FDbkIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBNEJEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLG9DQUFvQyxDQUFDLEdBQThDO0lBQ2pHLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2hCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztLQUN2QixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0Y7QUFFcEY7O0dBRUc7QUFDSCxNQUFhLDZCQUE2QjtJQUNqQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWE7UUFDcEMsT0FBTyxJQUFJLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDTSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQWE7UUFDcEMsT0FBTyxJQUFJLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxZQUFvQyxLQUFzQjtRQUF0QixVQUFLLEdBQUwsS0FBSyxDQUFpQjtJQUMxRCxDQUFDO0NBQ0Y7QUFURCxzRUFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSwrQkFBK0I7SUFDbkMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ00sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsWUFBb0MsS0FBc0I7UUFBdEIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7SUFDMUQsQ0FBQztDQUNGO0FBVEQsMEVBU0M7QUFFRDs7OztHQUlHO0FBQ0gsSUFBWSx5QkFPWDtBQVBELFdBQVkseUJBQXlCO0lBQ25DLGdCQUFnQjtJQUNoQixxREFBd0IsQ0FBQTtJQUN4QixlQUFlO0lBQ2YsbURBQXNCLENBQUE7SUFDdEIsbUJBQW1CO0lBQ25CLDJEQUE4QixDQUFBO0FBQ2hDLENBQUMsRUFQVyx5QkFBeUIseUNBQXpCLHlCQUF5QixRQU9wQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSx5QkFBeUI7SUFDN0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ00sTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQ3BDLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsWUFBb0MsS0FBc0I7UUFBdEIsVUFBSyxHQUFMLEtBQUssQ0FBaUI7SUFDMUQsQ0FBQztDQUNGO0FBVEQsOERBU0M7QUFFRDs7Ozs7R0FLRztBQUNILElBQVkseUJBS1g7QUFMRCxXQUFZLHlCQUF5QjtJQUNuQyxhQUFhO0lBQ2IsOENBQWlCLENBQUE7SUFDakIsV0FBVztJQUNYLDBDQUFhLENBQUE7QUFDZixDQUFDLEVBTFcseUJBQXlCLHlDQUF6Qix5QkFBeUIsUUFLcEM7QUFtSEQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsZ0NBQWdDLENBQUMsR0FBMEM7SUFDekYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07UUFDcEIsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDdEMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDdEMsb0JBQW9CLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtRQUM1QyxZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVU7UUFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07UUFDcEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFNBQVMsRUFBRSxHQUFHLENBQUMsT0FBTztRQUN0QixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO1FBQ3RCLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO0tBQ3pCLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQWlCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQix5Q0FBeUMsQ0FBQyxHQUFtRDtJQUMzRyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtLQUNyQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFrREQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMENBQTBDLENBQUMsR0FBb0Q7SUFDN0csSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDWixTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDdEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1FBQ3BCLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBQ0Qsb0ZBQW9GO0FBRXBGOzs7Ozs7R0FNRztBQUNILElBQVksa0NBV1g7QUFYRCxXQUFZLGtDQUFrQztJQUM1QyxZQUFZO0lBQ1oscURBQWUsQ0FBQTtJQUNmLGtCQUFrQjtJQUNsQiw0RUFBc0MsQ0FBQTtJQUN0QyxhQUFhO0lBQ2IsdURBQWlCLENBQUE7SUFDakIsV0FBVztJQUNYLG1EQUFhLENBQUE7SUFDYixlQUFlO0lBQ2YsMkRBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVhXLGtDQUFrQyxrREFBbEMsa0NBQWtDLFFBVzdDO0FBRUQ7Ozs7R0FJRztBQUNILElBQVksb0NBR1g7QUFIRCxXQUFZLG9DQUFvQztJQUM5QyxZQUFZO0lBQ1osdURBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcsb0NBQW9DLG9EQUFwQyxvQ0FBb0MsUUFHL0M7QUFFRDs7Ozs7R0FLRztBQUNILElBQVksNkJBS1g7QUFMRCxXQUFZLDZCQUE2QjtJQUN2QyxXQUFXO0lBQ1gsOENBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDViw0Q0FBVyxDQUFBO0FBQ2IsQ0FBQyxFQUxXLDZCQUE2Qiw2Q0FBN0IsNkJBQTZCLFFBS3hDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSxrQ0FLWDtBQUxELFdBQVksa0NBQWtDO0lBQzVDLGFBQWE7SUFDYix1REFBaUIsQ0FBQTtJQUNqQixVQUFVO0lBQ1YsaURBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVyxrQ0FBa0Msa0RBQWxDLGtDQUFrQyxRQUs3QztBQW1DRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw0Q0FBNEMsQ0FBQyxHQUFzRDtJQUNqSCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGlEQUFpRCxFQUFFLEdBQUcsQ0FBQywrQ0FBK0MsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywyRkFBMkYsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoTixnREFBZ0QsRUFBRSwwRkFBMEYsQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUM7S0FDak0sQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBc0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDJDQUEyQyxDQUFDLEdBQXFEO0lBQy9HLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsaURBQWlELEVBQUUsR0FBRyxDQUFDLCtDQUErQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLDBGQUEwRixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9NLGdEQUFnRCxFQUFFLEdBQUcsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx5RkFBeUYsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3TSxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFzQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsK0NBQStDLENBQUMsR0FBeUQ7SUFDdkgsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixpREFBaUQsRUFBRSxHQUFHLENBQUMsK0NBQStDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsOEZBQThGLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbk4sZ0RBQWdELEVBQUUsR0FBRyxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLDZGQUE2RixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2pOLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQUNELG9GQUFvRjtBQUVwRjs7Ozs7R0FLRztBQUNILElBQVkscUNBS1g7QUFMRCxXQUFZLHFDQUFxQztJQUMvQyxXQUFXO0lBQ1gsc0RBQWEsQ0FBQTtJQUNiLFVBQVU7SUFDVixvREFBVyxDQUFBO0FBQ2IsQ0FBQyxFQUxXLHFDQUFxQyxxREFBckMscUNBQXFDLFFBS2hEO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsSUFBWSwwQ0FLWDtBQUxELFdBQVksMENBQTBDO0lBQ3BELGFBQWE7SUFDYiwrREFBaUIsQ0FBQTtJQUNqQixVQUFVO0lBQ1YseURBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVywwQ0FBMEMsMERBQTFDLDBDQUEwQyxRQUtyRDtBQXdCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwyRkFBMkYsQ0FBQyxHQUFxRztJQUMvTSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFlBQVksRUFBRSxxR0FBcUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ25JLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtLQUNyQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFxQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMEZBQTBGLENBQUMsR0FBb0c7SUFDN00sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixtQkFBbUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsMkdBQTJHLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDckssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBeUJEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDBGQUEwRixDQUFDLEdBQW9HO0lBQzdNLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsaUJBQWlCLEVBQUUseUdBQXlHLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUNqSixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBbUZEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHlGQUF5RixDQUFDLEdBQW1HO0lBQzNNLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZUFBZSxFQUFFLHNHQUFzRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDMUksZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxtQkFBbUIsRUFBRSwwR0FBMEcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDdEosWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztLQUMvQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUF5QkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsOEZBQThGLENBQUMsR0FBd0c7SUFDck4sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixpQkFBaUIsRUFBRSw2R0FBNkcsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO1FBQ3JKLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTTtLQUNyQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFtRkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsNkZBQTZGLENBQUMsR0FBdUc7SUFDbk4sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixlQUFlLEVBQUUsMEdBQTBHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztRQUM5SSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNqRCxtQkFBbUIsRUFBRSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELG1CQUFtQixFQUFFLDhHQUE4RyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUMxSixZQUFZLEVBQUUsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXO0tBQy9CLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXdCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQixxR0FBcUcsQ0FBQyxHQUErRztJQUNuTyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxSEFBcUgsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1SyxhQUFhLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnSEFBZ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5SixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUEwQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMkdBQTJHLENBQUMsR0FBcUg7SUFDL08sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsMkhBQTJILENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEwsYUFBYSxFQUFFLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0hBQXNILENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBOEVEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHlHQUF5RyxDQUFDLEdBQW1IO0lBQzNPLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZUFBZSxFQUFFLHNIQUFzSCxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDMUosZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxtQkFBbUIsRUFBRSwwSEFBMEgsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDdEssWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztLQUMvQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUEyQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isc0dBQXNHLENBQUMsR0FBZ0g7SUFDck8sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0hBQXNILENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0ssYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzNLLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQThCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwwR0FBMEcsQ0FBQyxHQUFvSDtJQUM3TyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywwSEFBMEgsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqTCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDM0ssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBOEVEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDZHQUE2RyxDQUFDLEdBQXVIO0lBQ25QLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsZUFBZSxFQUFFLDBIQUEwSCxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDOUosZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakQsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxtQkFBbUIsRUFBRSw4SEFBOEgsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDMUssWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLGFBQWEsRUFBRSxHQUFHLENBQUMsV0FBVztLQUMvQixDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUEyQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMEdBQTBHLENBQUMsR0FBb0g7SUFDN08sSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsMEhBQTBILENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakwsYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzNLLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQThCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4R0FBOEcsQ0FBQyxHQUF3SDtJQUNyUCxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyw4SEFBOEgsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyTCxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDM0ssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBcUNEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHFIQUFxSCxDQUFDLEdBQStIO0lBQ25RLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFxQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsZ0hBQWdILENBQUMsR0FBMEg7SUFDelAsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQXFDRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwySEFBMkgsQ0FBQyxHQUFxSTtJQUMvUSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRztRQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBcUNEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHNIQUFzSCxDQUFDLEdBQWdJO0lBQ3JRLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUEyQkQ7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0Isc0hBQXNILENBQUMsR0FBZ0k7SUFDclEsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixrQkFBa0IsRUFBRSxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0lBQXNJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0wsYUFBYSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzNLLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQThCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwwSEFBMEgsQ0FBQyxHQUFvSTtJQUM3USxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywwSUFBMEksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqTSxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDM0ssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHNIQUFzSCxDQUFDLEdBQWdJO0lBQ3JRLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMEhBQTBILENBQUMsR0FBb0k7SUFDN1EsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQTJCRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwwSEFBMEgsQ0FBQyxHQUFvSTtJQUM3USxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywwSUFBMEksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqTSxhQUFhLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDM0ssQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBOEJEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhIQUE4SCxDQUFDLEdBQXdJO0lBQ3JSLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2Isa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLDhJQUE4SSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JNLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUMzSyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMEhBQTBILENBQUMsR0FBb0k7SUFDN1EsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQW9DRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4SEFBOEgsQ0FBQyxHQUF3STtJQUNyUixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRztRQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLHNJQUFzSSxDQUFDLEdBQWdKO0lBQ3JTLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFvQ0Q7O0dBRUc7QUFDSCxxRkFBcUY7QUFDckYsU0FBZ0IsMElBQTBJLENBQUMsR0FBb0o7SUFDN1MsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFBQyxPQUFPLFNBQVMsQ0FBQztJQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUc7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7UUFDZCxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDeEIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2xDLENBQUM7SUFDRiwwQkFBMEI7SUFDMUIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDMUcsQ0FBQztBQW9DRDs7R0FFRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiwwSUFBMEksQ0FBQyxHQUFvSjtJQUM3UyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRztRQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbEMsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBb0NEOztHQUVHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDhJQUE4SSxDQUFDLEdBQXdKO0lBQ3JULElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ2QsVUFBVSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3hCLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQyxDQUFDO0lBQ0YsMEJBQTBCO0lBQzFCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFHLENBQUM7QUFDRCxvRkFBb0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgY2RrOHNcbmltcG9ydCB7IEFwaU9iamVjdCwgQXBpT2JqZWN0TWV0YWRhdGEsIEdyb3VwVmVyc2lvbktpbmQgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuXG4vKipcbiAqIFZpbnlsQ2FjaGUgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHZpbnlsY2FjaGVzIEFQSS5cbkl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIFZhcm5pc2ggY2FjaGUgY2x1c3RlcjogcmVwbGljYXMsIGJhY2tlbmRzLCBWQ0wgY29uZmlndXJhdGlvbixcbmNsdXN0ZXJpbmcsIGFuZCBjYWNoZSBpbnZhbGlkYXRpb24gc3RyYXRlZ3kuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlIGV4dGVuZHMgQXBpT2JqZWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFwaVZlcnNpb24gYW5kIGtpbmQgZm9yIFwiVmlueWxDYWNoZVwiXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdWSzogR3JvdXBWZXJzaW9uS2luZCA9IHtcbiAgICBhcGlWZXJzaW9uOiAndmlueWwuYmx1ZWR5bmFtaWNzLmV1L3YxYWxwaGExJyxcbiAgICBraW5kOiAnVmlueWxDYWNoZScsXG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIEt1YmVybmV0ZXMgbWFuaWZlc3QgZm9yIFwiVmlueWxDYWNoZVwiLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlubGluZSByZXNvdXJjZSBtYW5pZmVzdHMgaW5zaWRlIG90aGVyIG9iamVjdHMgKGUuZy4gYXMgdGVtcGxhdGVzKS5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIGluaXRpYWxpemF0aW9uIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmlmZXN0KHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLlZpbnlsQ2FjaGUuR1ZLLFxuICAgICAgLi4udG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhwcm9wcyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgXCJWaW55bENhY2hlXCIgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0gc2NvcGUgdGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIG9iamVjdFxuICAgKiBAcGFyYW0gaWQgYSBzY29wZS1sb2NhbCBuYW1lIGZvciB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSBwcm9wcyBpbml0aWFsaXphdGlvbiBwcm9wc1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWaW55bENhY2hlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBvYmplY3QgdG8gS3ViZXJuZXRlcyBKU09OLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRvSnNvbigpOiBhbnkge1xuICAgIGNvbnN0IHJlc29sdmVkID0gc3VwZXIudG9Kc29uKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uVmlueWxDYWNoZS5HVkssXG4gICAgICAuLi50b0pzb25fVmlueWxDYWNoZVByb3BzKHJlc29sdmVkKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogVmlueWxDYWNoZSBpcyB0aGUgU2NoZW1hIGZvciB0aGUgdmlueWxjYWNoZXMgQVBJLlxuICogSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgVmFybmlzaCBjYWNoZSBjbHVzdGVyOiByZXBsaWNhcywgYmFja2VuZHMsIFZDTCBjb25maWd1cmF0aW9uLFxuICogY2x1c3RlcmluZywgYW5kIGNhY2hlIGludmFsaWRhdGlvbiBzdHJhdGVneS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlUHJvcHMge1xuICAvKipcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI21ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IEFwaU9iamVjdE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBzcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgdGhlIFZpbnlsQ2FjaGUgY2x1c3Rlci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlI3NwZWNcbiAgICovXG4gIHJlYWRvbmx5IHNwZWM/OiBWaW55bENhY2hlU3BlYztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVByb3BzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVQcm9wcyhvYmo6IFZpbnlsQ2FjaGVQcm9wcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21ldGFkYXRhJzogb2JqLm1ldGFkYXRhLFxuICAgICdzcGVjJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iai5zcGVjKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNwZWMgZGVmaW5lcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiB0aGUgVmlueWxDYWNoZSBjbHVzdGVyLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlYyB7XG4gIC8qKlxuICAgKiBiYWNrZW5kcyBkZWZpbmVzIHRoZSB1cHN0cmVhbSBzZXJ2aWNlcyBWYXJuaXNoIHdpbGwgcHJveHkgdG8uXG4gICAqIEF0IGxlYXN0IG9uZSBiYWNrZW5kIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2JhY2tlbmRzXG4gICAqL1xuICByZWFkb25seSBiYWNrZW5kczogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1tdO1xuXG4gIC8qKlxuICAgKiBjbHVzdGVyIGNvbmZpZ3VyZXMgVmFybmlzaCBjbHVzdGVyaW5nIGJldHdlZW4gcG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNjbHVzdGVyXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyO1xuXG4gIC8qKlxuICAgKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkIG9uIHJhcGlkIGVuZHBvaW50IGNodXJuLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RlYm91bmNlXG4gICAqL1xuICByZWFkb25seSBkZWJvdW5jZT86IFZpbnlsQ2FjaGVTcGVjRGVib3VuY2U7XG5cbiAgLyoqXG4gICAqIGRpcmVjdG9yIGNvbmZpZ3VyZXMgaG93IFZhcm5pc2ggZGlzdHJpYnV0ZXMgcmVxdWVzdHMgYWNyb3NzIGJhY2tlbmQgZW5kcG9pbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI2RpcmVjdG9yXG4gICAqL1xuICByZWFkb25seSBkaXJlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3I7XG5cbiAgLyoqXG4gICAqIGltYWdlIGlzIHRoZSBjb250YWluZXIgaW1hZ2UgZm9yIHRoZSBWYXJuaXNoIHBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjaW1hZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGludmFsaWRhdGlvbiBjb25maWd1cmVzIGNhY2hlIGludmFsaWRhdGlvbiBtZXRob2RzIChQVVJHRSwgQkFOLCB4a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNpbnZhbGlkYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWRhdGlvbj86IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uO1xuXG4gIC8qKlxuICAgKiBtb25pdG9yaW5nIGNvbmZpZ3VyZXMgUHJvbWV0aGV1cyBtZXRyaWNzIGFuZCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNtb25pdG9yaW5nXG4gICAqL1xuICByZWFkb25seSBtb25pdG9yaW5nPzogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nO1xuXG4gIC8qKlxuICAgKiBwb2QgY29uZmlndXJlcyBwb2QtbGV2ZWwgc2NoZWR1bGluZyBhbmQgbWV0YWRhdGEuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcG9kXG4gICAqL1xuICByZWFkb25seSBwb2Q/OiBWaW55bENhY2hlU3BlY1BvZDtcblxuICAvKipcbiAgICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Byb3h5UHJvdG9jb2xcbiAgICovXG4gIHJlYWRvbmx5IHByb3h5UHJvdG9jb2w/OiBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2w7XG5cbiAgLyoqXG4gICAqIHJlcGxpY2FzIGlzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBWYXJuaXNoIHBvZHMgaW4gdGhlIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHJlc291cmNlcyBzZXRzIENQVSBhbmQgbWVtb3J5IHJlcXVlc3RzL2xpbWl0cyBmb3IgdGhlIFZhcm5pc2ggY29udGFpbmVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3Jlc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VzPzogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXM7XG5cbiAgLyoqXG4gICAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyNyZXRyeVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0cnk/OiBWaW55bENhY2hlU3BlY1JldHJ5O1xuXG4gIC8qKlxuICAgKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWMjc2VydmljZVxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZTtcblxuICAvKipcbiAgICogc3RvcmFnZSBjb25maWd1cmVzIG9uZSBvciBtb3JlIFZhcm5pc2ggc3RvcmFnZSBiYWNrZW5kcyAobWFsbG9jIG9yIGZpbGUpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3N0b3JhZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VbXTtcblxuICAvKipcbiAgICogdmFybmlzaFBhcmFtZXRlcnMgYXJlIHJ1bnRpbWUgcGFyYW1ldGVycyBwYXNzZWQgdG8gdmFybmlzaGQgdmlhIC1wIGZsYWdzLlxuICAgKiBDZXJ0YWluIHNlY3VyaXR5LXNlbnNpdGl2ZSBwYXJhbWV0ZXJzIGFyZSBibG9ja2VkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlYyN2YXJuaXNoUGFyYW1ldGVyc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFybmlzaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiB2Y2wgY29uZmlndXJlcyBWQ0wgZ2VuZXJhdGlvbjogc25pcHBldHMgaW5qZWN0ZWQgaW50byBnZW5lcmF0ZWQgVkNMIHN1YnJvdXRpbmVzLFxuICAgKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjI3ZjbFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsPzogVmlueWxDYWNoZVNwZWNWY2w7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjKG9iajogVmlueWxDYWNoZVNwZWMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiYWNrZW5kcyc6IG9iai5iYWNrZW5kcz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMoeSkpLFxuICAgICdjbHVzdGVyJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcihvYmouY2x1c3RlciksXG4gICAgJ2RlYm91bmNlJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqLmRlYm91bmNlKSxcbiAgICAnZGlyZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICdpbWFnZSc6IG9iai5pbWFnZSxcbiAgICAnaW52YWxpZGF0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uKG9iai5pbnZhbGlkYXRpb24pLFxuICAgICdtb25pdG9yaW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmoubW9uaXRvcmluZyksXG4gICAgJ3BvZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZChvYmoucG9kKSxcbiAgICAncHJveHlQcm90b2NvbCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wob2JqLnByb3h5UHJvdG9jb2wpLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAncmVzb3VyY2VzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzKG9iai5yZXNvdXJjZXMpLFxuICAgICdyZXRyeSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1JldHJ5KG9iai5yZXRyeSksXG4gICAgJ3NlcnZpY2UnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNTZXJ2aWNlKG9iai5zZXJ2aWNlKSxcbiAgICAnc3RvcmFnZSc6IG9iai5zdG9yYWdlPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKHkpKSxcbiAgICAndmFybmlzaFBhcmFtZXRlcnMnOiAoKG9iai52YXJuaXNoUGFyYW1ldGVycykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLnZhcm5pc2hQYXJhbWV0ZXJzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgICAndmNsJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsKG9iai52Y2wpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQmFja2VuZFNwZWMgZGVzY3JpYmVzIGFuIHVwc3RyZWFtIEt1YmVybmV0ZXMgc2VydmljZSB1c2VkIGFzIGEgVmFybmlzaCBiYWNrZW5kLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMge1xuICAvKipcbiAgICogY29ubmVjdGlvblBhcmFtZXRlcnMgY29uZmlndXJlcyBiYWNrZW5kIGNvbm5lY3Rpb24gcG9vbCB0aW1lb3V0cyBhbmQgbGltaXRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjY29ubmVjdGlvblBhcmFtZXRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25QYXJhbWV0ZXJzPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzO1xuXG4gIC8qKlxuICAgKiBkaXJlY3RvciBvdmVycmlkZXMgdGhlIGNsdXN0ZXItd2lkZSBkaXJlY3RvciBmb3IgdGhpcyBiYWNrZW5kIG9ubHkuXG4gICAqIElmIG5pbCwgYSBzaGFyZCBkaXJlY3RvciB3aXRoIGRlZmF1bHRzIGlzIGdlbmVyYXRlZCwgZ3JvdXBpbmcgYWxsIHJlc29sdmVkXG4gICAqIHBlci1wb2QgYmFja2VuZHMgZm9yIHRoaXMgc2VydmljZVJlZi4gVXNlIFwicm91bmRfcm9iaW5cIiBvciBcInJhbmRvbVwiIGlmXG4gICAqIGNvbnNpc3RlbnQgaGFzaGluZyBpcyB1bmRlc2lyYWJsZSAoZS5nLiBzdGF0ZWxlc3MgYmFja2VuZHMpLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjZGlyZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IGRpcmVjdG9yPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBWQ0wgaWRlbnRpZmllciBmb3IgdGhpcyBiYWNrZW5kLiBNdXN0IG1hdGNoIF5bYS16QS1aXVthLXpBLVowLTlfXSokLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHMjbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBwb3J0IG92ZXJyaWRlcyB0aGUgc2VydmljZSBwb3J0IHVzZWQgZm9yIHRoaXMgYmFja2VuZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3BvcnRcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIHByb2JlIGNvbmZpZ3VyZXMgdGhlIFZhcm5pc2ggYmFja2VuZCBoZWFsdGggcHJvYmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kcyNwcm9iZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmU/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmU7XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VSZWYgcmVmZXJlbmNlcyB0aGUgS3ViZXJuZXRlcyBTZXJ2aWNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3NlcnZpY2VSZWZcbiAgICovXG4gIHJlYWRvbmx5IHNlcnZpY2VSZWY6IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgaXMgdGhlIHJlbGF0aXZlIHdlaWdodCBmb3IgdGhlIGRpcmVjdG9yLiAwIG1lYW5zIHN0YW5kYnkgKGZhbGxiYWNrIGRpcmVjdG9yKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdGlvblBhcmFtZXRlcnMnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzKG9iai5jb25uZWN0aW9uUGFyYW1ldGVycyksXG4gICAgJ2RpcmVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvcihvYmouZGlyZWN0b3IpLFxuICAgICduYW1lJzogb2JqLm5hbWUsXG4gICAgJ3BvcnQnOiBvYmoucG9ydCxcbiAgICAncHJvYmUnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlKG9iai5wcm9iZSksXG4gICAgJ3NlcnZpY2VSZWYnOiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYob2JqLnNlcnZpY2VSZWYpLFxuICAgICd3ZWlnaHQnOiBvYmoud2VpZ2h0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogY2x1c3RlciBjb25maWd1cmVzIFZhcm5pc2ggY2x1c3RlcmluZyBiZXR3ZWVuIHBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0NsdXN0ZXIge1xuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgaW50ZXItcG9kIGNsdXN0ZXJpbmcgdmlhIGEgc2hhcmQgZGlyZWN0b3IuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNDbHVzdGVyI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwZWVyUm91dGluZyBjb25maWd1cmVzIGhvdyByZXF1ZXN0cyBhcmUgcm91dGVkIGJldHdlZW4gVmFybmlzaCBwZWVycy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXIjcGVlclJvdXRpbmdcbiAgICovXG4gIHJlYWRvbmx5IHBlZXJSb3V0aW5nPzogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0NsdXN0ZXIob2JqOiBWaW55bENhY2hlU3BlY0NsdXN0ZXIgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3BlZXJSb3V0aW5nJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nKG9iai5wZWVyUm91dGluZyksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBkZWJvdW5jZSBjb25maWd1cmVzIGEgZ3JhY2UgcGVyaW9kIGJlZm9yZSBhcHBseWluZyBlbmRwb2ludCBjaGFuZ2VzIHRvIFZhcm5pc2gsXG4gKiBwcmV2ZW50aW5nIHRodW5kZXJpbmctaGVyZCBvbiByYXBpZCBlbmRwb2ludCBjaHVybi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RlYm91bmNlIHtcbiAgLyoqXG4gICAqIGR1cmF0aW9uIGlzIHRoZSB0aW1lIHRvIHdhaXQgYWZ0ZXIgdGhlIGxhc3QgZW5kcG9pbnQgY2hhbmdlIGJlZm9yZSBwdXNoaW5nIGEgVkNMIHVwZGF0ZS5cbiAgICogVGhpcyBwcmV2ZW50cyB0aHVuZGVyaW5nLWhlcmQgb24gcmFwaWQgZW5kcG9pbnQgY2h1cm4uIERlZmF1bHQ6IDFzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGVib3VuY2UjZHVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RlYm91bmNlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGVib3VuY2Uob2JqOiBWaW55bENhY2hlU3BlY0RlYm91bmNlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZHVyYXRpb24nOiBvYmouZHVyYXRpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBkaXJlY3RvciBjb25maWd1cmVzIGhvdyBWYXJuaXNoIGRpc3RyaWJ1dGVzIHJlcXVlc3RzIGFjcm9zcyBiYWNrZW5kIGVuZHBvaW50cy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9yIHtcbiAgLyoqXG4gICAqIGhhc2ggY29uZmlndXJlcyB0aGUgaGFzaCBkaXJlY3Rvci4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcImhhc2hcIi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yI2hhc2hcbiAgICovXG4gIHJlYWRvbmx5IGhhc2g/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaDtcblxuICAvKipcbiAgICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Ijc2hhcmRcbiAgICovXG4gIHJlYWRvbmx5IHNoYXJkPzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkO1xuXG4gIC8qKlxuICAgKiB0eXBlIHNlbGVjdHMgdGhlIFZhcm5pc2ggZGlyZWN0b3IgYWxnb3JpdGhtLlxuICAgKiBcInNoYXJkXCIgKGRlZmF1bHQpIHByb3ZpZGVzIGNvbnNpc3RlbnQgaGFzaGluZzsgXCJyb3VuZF9yb2JpblwiLCBcInJhbmRvbVwiLCBhbmQgXCJoYXNoXCJcbiAgICogYXJlIGFsc28gc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3IjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0RpcmVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGFzaCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaChvYmouaGFzaCksXG4gICAgJ3NoYXJkJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZChvYmouc2hhcmQpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBpbnZhbGlkYXRpb24gY29uZmlndXJlcyBjYWNoZSBpbnZhbGlkYXRpb24gbWV0aG9kcyAoUFVSR0UsIEJBTiwgeGtleSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uIHtcbiAgLyoqXG4gICAqIGJhbiBjb25maWd1cmVzIEJBTi1iYXNlZCBjYWNoZSBpbnZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb24jYmFuXG4gICAqL1xuICByZWFkb25seSBiYW4/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbjtcblxuICAvKipcbiAgICogcHVyZ2UgY29uZmlndXJlcyBIVFRQIFBVUkdFLWJhc2VkIGNhY2hlIGludmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiNwdXJnZVxuICAgKi9cbiAgcmVhZG9ubHkgcHVyZ2U/OiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlO1xuXG4gIC8qKlxuICAgKiB4a2V5IGNvbmZpZ3VyZXMgeGtleS1iYXNlZCBzdXJyb2dhdGUga2V5IGludmFsaWRhdGlvbiAocmVxdWlyZXMgdm1vZF94a2V5KS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbiN4a2V5XG4gICAqL1xuICByZWFkb25seSB4a2V5PzogVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmFuJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuKG9iai5iYW4pLFxuICAgICdwdXJnZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlKG9iai5wdXJnZSksXG4gICAgJ3hrZXknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5KG9iai54a2V5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIG1vbml0b3JpbmcgY29uZmlndXJlcyBQcm9tZXRoZXVzIG1ldHJpY3MgYW5kIGFsZXJ0aW5nIHJ1bGVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIFByb21ldGhldXMgbWV0cmljcyBzY3JhcGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmcjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHByb21ldGhldXNSdWxlcyBjb25maWd1cmVzIFByb21ldGhldXNSdWxlIG9iamVjdHMgZm9yIGFsZXJ0aW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNwcm9tZXRoZXVzUnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IHByb21ldGhldXNSdWxlcz86IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcztcblxuICAvKipcbiAgICogc2VydmljZU1vbml0b3IgY29uZmlndXJlcyBhIFNlcnZpY2VNb25pdG9yIGZvciBQcm9tZXRoZXVzIE9wZXJhdG9yIHNjcmFwaW5nLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyNzZXJ2aWNlTW9uaXRvclxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU1vbml0b3I/OiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyhvYmo6IFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncHJvbWV0aGV1c1J1bGVzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcyhvYmoucHJvbWV0aGV1c1J1bGVzKSxcbiAgICAnc2VydmljZU1vbml0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3Iob2JqLnNlcnZpY2VNb25pdG9yKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHBvZCBjb25maWd1cmVzIHBvZC1sZXZlbCBzY2hlZHVsaW5nIGFuZCBtZXRhZGF0YS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2Qge1xuICAvKipcbiAgICogYWZmaW5pdHkgY29uZmlndXJlcyBwb2QgYWZmaW5pdHkgYW5kIGFudGktYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNhZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgYWZmaW5pdHk/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5O1xuXG4gIC8qKlxuICAgKiBhbm5vdGF0aW9ucyBhcmUgYWRkZWQgdG8gZWFjaCBWYXJuaXNoIHBvZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNhbm5vdGF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYW5ub3RhdGlvbnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBsYWJlbHMgYXJlIGFkZGVkIHRvIGVhY2ggVmFybmlzaCBwb2QgKG1lcmdlZCB3aXRoIG9wZXJhdG9yLW1hbmFnZWQgbGFiZWxzKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCNsYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIG5vZGVTZWxlY3RvciBjb25zdHJhaW5zIHBvZHMgdG8gbm9kZXMgbWF0Y2hpbmcgYWxsIHNwZWNpZmllZCBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2Qjbm9kZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3I/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBwcmlvcml0eUNsYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHJpb3JpdHlDbGFzcyBmb3IgVmFybmlzaCBwb2RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kI3ByaW9yaXR5Q2xhc3NOYW1lXG4gICAqL1xuICByZWFkb25seSBwcmlvcml0eUNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogdG9sZXJhdGlvbnMgYWxsb3cgcG9kcyB0byBiZSBzY2hlZHVsZWQgb24gdGFpbnRlZCBub2Rlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZCN0b2xlcmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgdG9sZXJhdGlvbnM/OiBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kKG9iajogVmlueWxDYWNoZVNwZWNQb2QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5KG9iai5hZmZpbml0eSksXG4gICAgJ2Fubm90YXRpb25zJzogKChvYmouYW5ub3RhdGlvbnMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5hbm5vdGF0aW9ucykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ2xhYmVscyc6ICgob2JqLmxhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmxhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ25vZGVTZWxlY3Rvcic6ICgob2JqLm5vZGVTZWxlY3RvcikgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm5vZGVTZWxlY3RvcikucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gICAgJ3ByaW9yaXR5Q2xhc3NOYW1lJzogb2JqLnByaW9yaXR5Q2xhc3NOYW1lLFxuICAgICd0b2xlcmF0aW9ucyc6IG9iai50b2xlcmF0aW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcHJveHlQcm90b2NvbCBlbmFibGVzIFBST1hZIHByb3RvY29sIG9uIGEgZGVkaWNhdGVkIHBvcnQgZm9yIHBhc3NpbmcgY2xpZW50IElQLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIFBST1hZIHByb3RvY29sIHN1cHBvcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBwb3J0IGlzIHRoZSBwb3J0IG9uIHdoaWNoIFBST1hZIHByb3RvY29sIGNvbm5lY3Rpb25zIGFyZSBhY2NlcHRlZC4gRGVmYXVsdDogODA4MS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Byb3h5UHJvdG9jb2wjcG9ydFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQcm94eVByb3RvY29sJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbChvYmo6IFZpbnlsQ2FjaGVTcGVjUHJveHlQcm90b2NvbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAncG9ydCc6IG9iai5wb3J0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogcmVzb3VyY2VzIHNldHMgQ1BVIGFuZCBtZW1vcnkgcmVxdWVzdHMvbGltaXRzIGZvciB0aGUgVmFybmlzaCBjb250YWluZXIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzIHtcbiAgLyoqXG4gICAqIENsYWltcyBsaXN0cyB0aGUgbmFtZXMgb2YgcmVzb3VyY2VzLCBkZWZpbmVkIGluIHNwZWMucmVzb3VyY2VDbGFpbXMsXG4gICAqIHRoYXQgYXJlIHVzZWQgYnkgdGhpcyBjb250YWluZXIuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGVcbiAgICogRHluYW1pY1Jlc291cmNlQWxsb2NhdGlvbiBmZWF0dXJlIGdhdGUuXG4gICAqXG4gICAqIFRoaXMgZmllbGQgaXMgaW1tdXRhYmxlLiBJdCBjYW4gb25seSBiZSBzZXQgZm9yIGNvbnRhaW5lcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMjY2xhaW1zXG4gICAqL1xuICByZWFkb25seSBjbGFpbXM/OiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltc1tdO1xuXG4gIC8qKlxuICAgKiBMaW1pdHMgZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBjb21wdXRlIHJlc291cmNlcyBhbGxvd2VkLlxuICAgKiBNb3JlIGluZm86IGh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2NvbmNlcHRzL2NvbmZpZ3VyYXRpb24vbWFuYWdlLXJlc291cmNlcy1jb250YWluZXJzL1xuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzI2xpbWl0c1xuICAgKi9cbiAgcmVhZG9ubHkgbGltaXRzPzogeyBba2V5OiBzdHJpbmddOiBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0cyBkZXNjcmliZXMgdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbXB1dGUgcmVzb3VyY2VzIHJlcXVpcmVkLlxuICAgKiBJZiBSZXF1ZXN0cyBpcyBvbWl0dGVkIGZvciBhIGNvbnRhaW5lciwgaXQgZGVmYXVsdHMgdG8gTGltaXRzIGlmIHRoYXQgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsXG4gICAqIG90aGVyd2lzZSB0byBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHZhbHVlLiBSZXF1ZXN0cyBjYW5ub3QgZXhjZWVkIExpbWl0cy5cbiAgICogTW9yZSBpbmZvOiBodHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9jb25jZXB0cy9jb25maWd1cmF0aW9uL21hbmFnZS1yZXNvdXJjZXMtY29udGFpbmVycy9cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlcyNyZXF1ZXN0c1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdHM/OiB7IFtrZXk6IHN0cmluZ106IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNSZXNvdXJjZXMob2JqOiBWaW55bENhY2hlU3BlY1Jlc291cmNlcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NsYWltcyc6IG9iai5jbGFpbXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyh5KSksXG4gICAgJ2xpbWl0cyc6ICgob2JqLmxpbWl0cykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLmxpbWl0cykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0/LnZhbHVlIH0pLCB7fSkpLFxuICAgICdyZXF1ZXN0cyc6ICgob2JqLnJlcXVlc3RzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoucmVxdWVzdHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdPy52YWx1ZSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHJldHJ5IGNvbmZpZ3VyZXMgcmV0cnkgYmVoYXZpb3VyIHdoZW4gVkNMIHVwZGF0ZXMgZmFpbCB0byBhcHBseS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1JldHJ5IHtcbiAgLyoqXG4gICAqIGJhY2tvZmZCYXNlIGlzIHRoZSBpbml0aWFsIGJhY2tvZmYgZHVyYXRpb24gYmV0d2VlbiByZXRyeSBhdHRlbXB0cy4gRGVmYXVsdDogNXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXRyeSNiYWNrb2ZmQmFzZVxuICAgKi9cbiAgcmVhZG9ubHkgYmFja29mZkJhc2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGJhY2tvZmZNYXggaXMgdGhlIG1heGltdW0gYmFja29mZiBkdXJhdGlvbiAoZXhwb25lbnRpYWwgYmFja29mZiBjYXApLiBEZWZhdWx0OiA1bS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1JldHJ5I2JhY2tvZmZNYXhcbiAgICovXG4gIHJlYWRvbmx5IGJhY2tvZmZNYXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heEF0dGVtcHRzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBWQ0wgcHVzaCBhdHRlbXB0cyBiZWZvcmUgdGhlIG9wZXJhdG9yXG4gICAqIHRyYW5zaXRpb25zIHRvIEVycm9yIHBoYXNlLiBEZWZhdWx0OiAzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmV0cnkjbWF4QXR0ZW1wdHNcbiAgICovXG4gIHJlYWRvbmx5IG1heEF0dGVtcHRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1JldHJ5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUmV0cnkob2JqOiBWaW55bENhY2hlU3BlY1JldHJ5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYmFja29mZkJhc2UnOiBvYmouYmFja29mZkJhc2UsXG4gICAgJ2JhY2tvZmZNYXgnOiBvYmouYmFja29mZk1heCxcbiAgICAnbWF4QXR0ZW1wdHMnOiBvYmoubWF4QXR0ZW1wdHMsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZXJ2aWNlIGNvbmZpZ3VyZXMgdGhlIEt1YmVybmV0ZXMgU2VydmljZSBjcmVhdGVkIGZvciB0cmFmZmljIGluZ3Jlc3MuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1NlcnZpY2Uge1xuICAvKipcbiAgICogYW5ub3RhdGlvbnMgYXJlIGFkZGVkIHRvIHRoZSBTZXJ2aWNlIG9iamVjdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2UjYW5ub3RhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGFubm90YXRpb25zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogdHlwZSBzZXRzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgdHlwZSAoQ2x1c3RlcklQLCBOb2RlUG9ydCwgTG9hZEJhbGFuY2VyKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1NlcnZpY2UjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjU2VydmljZVR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjU2VydmljZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1NlcnZpY2Uob2JqOiBWaW55bENhY2hlU3BlY1NlcnZpY2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbm5vdGF0aW9ucyc6ICgob2JqLmFubm90YXRpb25zKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmouYW5ub3RhdGlvbnMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTdG9yYWdlU3BlYyBjb25maWd1cmVzIGEgVmFybmlzaCBzdG9yYWdlIGJhY2tlbmQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1N0b3JhZ2Uge1xuICAvKipcbiAgICogbmFtZSBpcyB0aGUgaW50ZXJuYWwgc3RvcmFnZSBpZGVudGlmaWVyIHVzZWQgaW4gdmFybmlzaGQgLXMgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHBhdGggaXMgdGhlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgZmlsZS10eXBlIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHNpemUgaXMgdGhlIHN0b3JhZ2UgYWxsb2NhdGlvbiBhcyBhIEt1YmVybmV0ZXMgcmVzb3VyY2UgcXVhbnRpdHkgKGUuZy4gXCIxR2lcIikuXG4gICAqIFRoZSBvcGVyYXRvciBjb252ZXJ0cyB0byBieXRlcyBmb3IgdmFybmlzaGQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNTdG9yYWdlI3NpemVcbiAgICovXG4gIHJlYWRvbmx5IHNpemU/OiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplO1xuXG4gIC8qKlxuICAgKiB0eXBlIGlzIHRoZSBzdG9yYWdlIGJhY2tlbmQgdHlwZS4gT25seSBcIm1hbGxvY1wiIGFuZCBcImZpbGVcIiBhcmUgcGVybWl0dGVkLlxuICAgKiBcInBlcnNpc3RlbnRcIiwgXCJ1bWVtXCIsIGFuZCBcImRlZmF1bHRcIiBhcmUgcmVqZWN0ZWQgYnkgdGhlIGFkbWlzc2lvbiB3ZWJob29rLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZSN0eXBlXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VUeXBlO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1N0b3JhZ2UnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNTdG9yYWdlKG9iajogVmlueWxDYWNoZVNwZWNTdG9yYWdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdwYXRoJzogb2JqLnBhdGgsXG4gICAgJ3NpemUnOiBvYmouc2l6ZT8udmFsdWUsXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHZjbCBjb25maWd1cmVzIFZDTCBnZW5lcmF0aW9uOiBzbmlwcGV0cyBpbmplY3RlZCBpbnRvIGdlbmVyYXRlZCBWQ0wgc3Vicm91dGluZXMsXG4gKiBvciBhIGZ1bGwgVkNMIG92ZXJyaWRlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZjbCB7XG4gIC8qKlxuICAgKiBmdWxsT3ZlcnJpZGUgcmVwbGFjZXMgdGhlIGVudGlyZSBnZW5lcmF0ZWQgVkNMIHdpdGggYSBjdXN0b20gVkNMIHN0cmluZy5cbiAgICogVXNlIHdpdGggY2F1dGlvbiDigJQgdGhpcyBkaXNhYmxlcyBhbGwgc3RydWN0dXJlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsI2Z1bGxPdmVycmlkZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVsbE92ZXJyaWRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBzbmlwcGV0cyBwcm92aWRlcyBWQ0wgY29kZSBpbmplY3RlZCBpbnRvIGVhY2ggZ2VuZXJhdGVkIHN1YnJvdXRpbmUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2wjc25pcHBldHNcbiAgICovXG4gIHJlYWRvbmx5IHNuaXBwZXRzPzogVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNWY2wnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNWY2wob2JqOiBWaW55bENhY2hlU3BlY1ZjbCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2Z1bGxPdmVycmlkZSc6IG9iai5mdWxsT3ZlcnJpZGUsXG4gICAgJ3NuaXBwZXRzJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMob2JqLnNuaXBwZXRzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGNvbm5lY3Rpb25QYXJhbWV0ZXJzIGNvbmZpZ3VyZXMgYmFja2VuZCBjb25uZWN0aW9uIHBvb2wgdGltZW91dHMgYW5kIGxpbWl0cy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBiZXR3ZWVuQnl0ZXNUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGJ5dGVzIG9mIHRoZSByZXNwb25zZSBib2R5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNiZXR3ZWVuQnl0ZXNUaW1lb3V0XG4gICAqL1xuICByZWFkb25seSBiZXR3ZWVuQnl0ZXNUaW1lb3V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjb25uZWN0VGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIGVzdGFibGlzaCBhIFRDUCBjb25uZWN0aW9uIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNjb25uZWN0VGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdFRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGZpcnN0Qnl0ZVRpbWVvdXQgaXMgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0Nvbm5lY3Rpb25QYXJhbWV0ZXJzI2ZpcnN0Qnl0ZVRpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IGZpcnN0Qnl0ZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGlkbGVUaW1lb3V0IGlzIHRoZSBtYXhpbXVtIHRpbWUgYW4gaWRsZSBjb25uZWN0aW9uIG1heSBiZSByZXVzZWQuIFNob3VsZCBiZSBsZXNzXG4gICAqIHRoYW4gdGhlIGJhY2tlbmQncyBrZWVwLWFsaXZlIHRpbWVvdXQgdG8gYXZvaWQgNTAzIHJhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNpZGxlVGltZW91dFxuICAgKi9cbiAgcmVhZG9ubHkgaWRsZVRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG1heENvbm5lY3Rpb25zIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IGNvbm5lY3Rpb25zIHRvIHRoZSBiYWNrZW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycyNtYXhDb25uZWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29ubmVjdGlvbnM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNDb25uZWN0aW9uUGFyYW1ldGVycycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzQ29ubmVjdGlvblBhcmFtZXRlcnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdiZXR3ZWVuQnl0ZXNUaW1lb3V0Jzogb2JqLmJldHdlZW5CeXRlc1RpbWVvdXQsXG4gICAgJ2Nvbm5lY3RUaW1lb3V0Jzogb2JqLmNvbm5lY3RUaW1lb3V0LFxuICAgICdmaXJzdEJ5dGVUaW1lb3V0Jzogb2JqLmZpcnN0Qnl0ZVRpbWVvdXQsXG4gICAgJ2lkbGVUaW1lb3V0Jzogb2JqLmlkbGVUaW1lb3V0LFxuICAgICdtYXhDb25uZWN0aW9ucyc6IG9iai5tYXhDb25uZWN0aW9ucyxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGRpcmVjdG9yIG92ZXJyaWRlcyB0aGUgY2x1c3Rlci13aWRlIGRpcmVjdG9yIGZvciB0aGlzIGJhY2tlbmQgb25seS5cbiAqIElmIG5pbCwgYSBzaGFyZCBkaXJlY3RvciB3aXRoIGRlZmF1bHRzIGlzIGdlbmVyYXRlZCwgZ3JvdXBpbmcgYWxsIHJlc29sdmVkXG4gKiBwZXItcG9kIGJhY2tlbmRzIGZvciB0aGlzIHNlcnZpY2VSZWYuIFVzZSBcInJvdW5kX3JvYmluXCIgb3IgXCJyYW5kb21cIiBpZlxuICogY29uc2lzdGVudCBoYXNoaW5nIGlzIHVuZGVzaXJhYmxlIChlLmcuIHN0YXRlbGVzcyBiYWNrZW5kcykuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Ige1xuICAvKipcbiAgICogaGFzaCBjb25maWd1cmVzIHRoZSBoYXNoIGRpcmVjdG9yLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwiaGFzaFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNoYXNoXG4gICAqL1xuICByZWFkb25seSBoYXNoPzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9ySGFzaDtcblxuICAvKipcbiAgICogc2hhcmQgY29uZmlndXJlcyB0aGUgc2hhcmQgZGlyZWN0b3IgKGNvbnNpc3RlbnQtaGFzaCkuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJzaGFyZFwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvciNzaGFyZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmQ/OiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZDtcblxuICAvKipcbiAgICogdHlwZSBzZWxlY3RzIHRoZSBWYXJuaXNoIGRpcmVjdG9yIGFsZ29yaXRobS5cbiAgICogXCJzaGFyZFwiIChkZWZhdWx0KSBwcm92aWRlcyBjb25zaXN0ZW50IGhhc2hpbmc7IFwicm91bmRfcm9iaW5cIiwgXCJyYW5kb21cIiwgYW5kIFwiaGFzaFwiXG4gICAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdoYXNoJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gob2JqLmhhc2gpLFxuICAgICdzaGFyZCc6IHRvSnNvbl9WaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZChvYmouc2hhcmQpLFxuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwcm9iZSBjb25maWd1cmVzIHRoZSBWYXJuaXNoIGJhY2tlbmQgaGVhbHRoIHByb2JlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHtcbiAgLyoqXG4gICAqIGV4cGVjdGVkUmVzcG9uc2UgaXMgdGhlIGV4cGVjdGVkIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIERlZmF1bHRzIHRvIDIwMC5cbiAgICpcbiAgICogQGRlZmF1bHQgMjAwLlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSNleHBlY3RlZFJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZFJlc3BvbnNlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyBob3cgb2Z0ZW4gdG8gcHJvYmUgdGhlIGJhY2tlbmQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI2ludGVydmFsXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbD86IHN0cmluZztcblxuICAvKipcbiAgICogdGhyZXNob2xkIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBzdWNjZXNzZnVsIHByb2JlcyB3aXRoaW4gdGhlIHdpbmRvdyBmb3IgdGhlIGJhY2tlbmRcbiAgICogdG8gYmUgY29uc2lkZXJlZCBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNQcm9iZSN0aHJlc2hvbGRcbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogdGltZW91dCBpcyB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgZm9yIGEgcHJvYmUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3RpbWVvdXRcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHVybCBpcyB0aGUgVVJMIHRvIHByb2JlLiBJZiBlbXB0eSwgdGhlIGJhY2tlbmQncyByb290IHBhdGggaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUjdXJsXG4gICAqL1xuICByZWFkb25seSB1cmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHdpbmRvdyBpcyB0aGUgbnVtYmVyIG9mIG1vc3QgcmVjZW50IHByb2JlcyB0byBjb25zaWRlciBmb3IgdGhyZXNob2xkIGV2YWx1YXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlI3dpbmRvd1xuICAgKi9cbiAgcmVhZG9ubHkgd2luZG93PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzUHJvYmUnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1Byb2JlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZXhwZWN0ZWRSZXNwb25zZSc6IG9iai5leHBlY3RlZFJlc3BvbnNlLFxuICAgICdpbnRlcnZhbCc6IG9iai5pbnRlcnZhbCxcbiAgICAndGhyZXNob2xkJzogb2JqLnRocmVzaG9sZCxcbiAgICAndGltZW91dCc6IG9iai50aW1lb3V0LFxuICAgICd1cmwnOiBvYmoudXJsLFxuICAgICd3aW5kb3cnOiBvYmoud2luZG93LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogc2VydmljZVJlZiByZWZlcmVuY2VzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgaW4gdGhlIHNhbWUgbmFtZXNwYWNlLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiB7XG4gIC8qKlxuICAgKiBuYW1lIGlzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgbmFtZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzU2VydmljZVJlZiNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNTZXJ2aWNlUmVmKG9iajogVmlueWxDYWNoZVNwZWNCYWNrZW5kc1NlcnZpY2VSZWYgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduYW1lJzogb2JqLm5hbWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwZWVyUm91dGluZyBjb25maWd1cmVzIGhvdyByZXF1ZXN0cyBhcmUgcm91dGVkIGJldHdlZW4gVmFybmlzaCBwZWVycy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcge1xuICAvKipcbiAgICogdHlwZSBpcyB0aGUgcm91dGluZyBzdHJhdGVneSBiZXR3ZWVuIFZhcm5pc2ggcG9kcy4gT25seSBcInNoYXJkXCIgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nI3R5cGVcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU/OiBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGU7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQ2x1c3RlclBlZXJSb3V0aW5nKG9iajogVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmcgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICd0eXBlJzogb2JqLnR5cGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBoYXNoIGNvbmZpZ3VyZXMgdGhlIGhhc2ggZGlyZWN0b3IuIE9ubHkgdXNlZCB3aGVuIHR5cGUgaXMgXCJoYXNoXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JIYXNoIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyB0aGUgcmVxdWVzdCBoZWFkZXIgbmFtZSB1c2VkIGFzIHRoZSBoYXNoIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCNoZWFkZXJcbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNEaXJlY3Rvckhhc2gob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9ySGFzaCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2hlYWRlcic6IG9iai5oZWFkZXIsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzaGFyZCBjb25maWd1cmVzIHRoZSBzaGFyZCBkaXJlY3RvciAoY29uc2lzdGVudC1oYXNoKS4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcInNoYXJkXCIuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQge1xuICAvKipcbiAgICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gICAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNieVxuICAgKi9cbiAgcmVhZG9ubHkgYnk/OiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeTtcblxuICAvKipcbiAgICogaGVhbHRoeSBjb250cm9scyB3aGljaCBiYWNrZW5kcyB0aGUgZGlyZWN0b3IgY29uc2lkZXJzIHdoZW4gc2VsZWN0aW5nIGEgc2hhcmQuXG4gICAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICAgKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCNoZWFsdGh5XG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5PzogVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeTtcblxuICAvKipcbiAgICogcmFtcHVwIGlzIHRoZSB0aW1lIGFmdGVyIGFkZGluZyBhIGJhY2tlbmQgYmVmb3JlIGl0IHJlY2VpdmVzIGl0cyBmdWxsIHNoYXJlIG9mIHRyYWZmaWMsXG4gICAqIHByZXZlbnRpbmcgdGh1bmRlcmluZy1oZXJkLiBEZWZhdWx0OiAzMHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkI3JhbXB1cFxuICAgKi9cbiAgcmVhZG9ubHkgcmFtcHVwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiByZXBsaWNhcyBpcyB0aGUgbnVtYmVyIG9mIEtldGFtYSByZXBsaWNhcyBwZXIgYmFja2VuZCBpbiB0aGUgaGFzaCByaW5nLiBEZWZhdWx0OiA2Ny5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB3YXJtdXAgaXMgdGhlIHByb3BvcnRpb24gb2YgcmVxdWVzdHMgKDAuMOKAkzEuMCkgc2VudCB0byB0aGUgYWx0ZXJuYXRpdmUgYmFja2VuZFxuICAgKiB0byBwcmUtcG9wdWxhdGUgaXRzIGNhY2hlLiBEZWZhdWx0OiAwLjEuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQjd2FybXVwXG4gICAqL1xuICByZWFkb25seSB3YXJtdXA/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JTaGFyZCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQob2JqOiBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmQgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdieSc6IG9iai5ieSxcbiAgICAnaGVhbHRoeSc6IG9iai5oZWFsdGh5LFxuICAgICdyYW1wdXAnOiBvYmoucmFtcHVwLFxuICAgICdyZXBsaWNhcyc6IG9iai5yZXBsaWNhcyxcbiAgICAnd2FybXVwJzogb2JqLndhcm11cCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHR5cGUgc2VsZWN0cyB0aGUgVmFybmlzaCBkaXJlY3RvciBhbGdvcml0aG0uXG4gKiBcInNoYXJkXCIgKGRlZmF1bHQpIHByb3ZpZGVzIGNvbnNpc3RlbnQgaGFzaGluZzsgXCJyb3VuZF9yb2JpblwiLCBcInJhbmRvbVwiLCBhbmQgXCJoYXNoXCJcbiAqIGFyZSBhbHNvIHN1cHBvcnRlZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlXG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjRGlyZWN0b3JUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxuICAvKiogcm91bmRfcm9iaW4gKi9cbiAgUk9VTkRfVU5ERVJTQ09SRV9ST0JJTiA9IFwicm91bmRfcm9iaW5cIixcbiAgLyoqIHJhbmRvbSAqL1xuICBSQU5ET00gPSBcInJhbmRvbVwiLFxuICAvKiogaGFzaCAqL1xuICBIQVNIID0gXCJoYXNoXCIsXG4gIC8qKiBmYWxsYmFjayAqL1xuICBGQUxMQkFDSyA9IFwiZmFsbGJhY2tcIixcbn1cblxuLyoqXG4gKiBiYW4gY29uZmlndXJlcyBCQU4tYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25CYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbiB7XG4gIC8qKlxuICAgKiBhbGxvd2VkU291cmNlcyBpcyBhIGxpc3Qgb2YgQ0lEUiByYW5nZXMgcGVybWl0dGVkIHRvIHNlbmQgQkFOIHJlcXVlc3RzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2FsbG93ZWRTb3VyY2VzXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkU291cmNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBlbmFibGVkIGFjdGl2YXRlcyB0aGUgQkFOIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiByYXRlTGltaXRQZXJNaW51dGUgbGltaXRzIEJBTiByZXF1ZXN0cyBwZXIgbWludXRlLiAwIG1lYW5zIG5vIGxpbWl0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuI3JhdGVMaW1pdFBlck1pbnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmF0ZUxpbWl0UGVyTWludXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvbkJhbihvYmo6IFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uQmFuIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3JhdGVMaW1pdFBlck1pbnV0ZSc6IG9iai5yYXRlTGltaXRQZXJNaW51dGUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBwdXJnZSBjb25maWd1cmVzIEhUVFAgUFVSR0UtYmFzZWQgY2FjaGUgaW52YWxpZGF0aW9uLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uge1xuICAvKipcbiAgICogYWxsb3dlZFNvdXJjZXMgaXMgYSBsaXN0IG9mIENJRFIgcmFuZ2VzIHBlcm1pdHRlZCB0byBzZW5kIFBVUkdFIHJlcXVlc3RzLlxuICAgKiBJZiBlbXB0eSwgbm8gc291cmNlIHJlc3RyaWN0aW9uIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25QdXJnZSNhbGxvd2VkU291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogZW5hYmxlZCBhY3RpdmF0ZXMgdGhlIFBVUkdFIGludmFsaWRhdGlvbiBoYW5kbGVyLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2UjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIHNvZnQgZW5hYmxlcyBzb2Z0IHB1cmdlcywgd2hpY2ggbWFyayBvYmplY3RzIGFzIGV4cGlyZWQgcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbS5cbiAgICogVGhpcyBhbGxvd3MgVmFybmlzaCB0byBzZXJ2ZSBzdGFsZSBjb250ZW50IHdoaWxlIHJldmFsaWRhdGluZy4gRGVmYXVsdDogdHJ1ZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlI3NvZnRcbiAgICovXG4gIHJlYWRvbmx5IHNvZnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uUHVyZ2Uob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblB1cmdlIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWxsb3dlZFNvdXJjZXMnOiBvYmouYWxsb3dlZFNvdXJjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ3NvZnQnOiBvYmouc29mdCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHhrZXkgY29uZmlndXJlcyB4a2V5LWJhc2VkIHN1cnJvZ2F0ZSBrZXkgaW52YWxpZGF0aW9uIChyZXF1aXJlcyB2bW9kX3hrZXkpLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNJbnZhbGlkYXRpb25Ya2V5IHtcbiAgLyoqXG4gICAqIGFsbG93ZWRTb3VyY2VzIGlzIGEgbGlzdCBvZiBDSURSIHJhbmdlcyBwZXJtaXR0ZWQgdG8gc2VuZCB4a2V5IGludmFsaWRhdGlvbiByZXF1ZXN0cy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkjYWxsb3dlZFNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRTb3VyY2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIGVuYWJsZWQgYWN0aXZhdGVzIHhrZXktYmFzZWQgaW52YWxpZGF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogc29mdFB1cmdlIGVuYWJsZXMgc29mdCBwdXJnaW5nIHZpYSB4a2V5LiBEZWZhdWx0OiB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleSNzb2Z0UHVyZ2VcbiAgICovXG4gIHJlYWRvbmx5IHNvZnRQdXJnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjSW52YWxpZGF0aW9uWGtleScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkob2JqOiBWaW55bENhY2hlU3BlY0ludmFsaWRhdGlvblhrZXkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhbGxvd2VkU291cmNlcyc6IG9iai5hbGxvd2VkU291cmNlcz8ubWFwKHkgPT4geSksXG4gICAgJ2VuYWJsZWQnOiBvYmouZW5hYmxlZCxcbiAgICAnc29mdFB1cmdlJzogb2JqLnNvZnRQdXJnZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHByb21ldGhldXNSdWxlcyBjb25maWd1cmVzIFByb21ldGhldXNSdWxlIG9iamVjdHMgZm9yIGFsZXJ0aW5nLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nUHJvbWV0aGV1c1J1bGVzIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFByb21ldGhldXNSdWxlIHdpdGggZGVmYXVsdCBhbGVydGluZyBydWxlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMjZW5hYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1Byb21ldGhldXNSdWxlcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMob2JqOiBWaW55bENhY2hlU3BlY01vbml0b3JpbmdQcm9tZXRoZXVzUnVsZXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBzZXJ2aWNlTW9uaXRvciBjb25maWd1cmVzIGEgU2VydmljZU1vbml0b3IgZm9yIFByb21ldGhldXMgT3BlcmF0b3Igc2NyYXBpbmcuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yIHtcbiAgLyoqXG4gICAqIGVuYWJsZWQgY3JlYXRlcyBhIFNlcnZpY2VNb25pdG9yIHRhcmdldGluZyB0aGUgVmFybmlzaCBtZXRyaWNzIGVuZHBvaW50LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yI2VuYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBpbnRlcnZhbCBpcyB0aGUgc2NyYXBlIGludGVydmFsIChlLmcuIFwiMzBzXCIpLiBEZWZhdWx0cyB0byB0aGUgUHJvbWV0aGV1cyBnbG9iYWwgaW50ZXJ2YWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBQcm9tZXRoZXVzIGdsb2JhbCBpbnRlcnZhbC5cbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY01vbml0b3JpbmdTZXJ2aWNlTW9uaXRvciNpbnRlcnZhbFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjTW9uaXRvcmluZ1NlcnZpY2VNb25pdG9yKG9iajogVmlueWxDYWNoZVNwZWNNb25pdG9yaW5nU2VydmljZU1vbml0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdlbmFibGVkJzogb2JqLmVuYWJsZWQsXG4gICAgJ2ludGVydmFsJzogb2JqLmludGVydmFsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogYWZmaW5pdHkgY29uZmlndXJlcyBwb2QgYWZmaW5pdHkgYW5kIGFudGktYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5IHtcbiAgLyoqXG4gICAqIERlc2NyaWJlcyBub2RlIGFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgZm9yIHRoZSBwb2QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNub2RlQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IG5vZGVBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyAoZS5nLiBjby1sb2NhdGUgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBZmZpbml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcG9kQWZmaW5pdHk/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHk7XG5cbiAgLyoqXG4gICAqIERlc2NyaWJlcyBwb2QgYW50aS1hZmZpbml0eSBzY2hlZHVsaW5nIHJ1bGVzIChlLmcuIGF2b2lkIHB1dHRpbmcgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eSNwb2RBbnRpQWZmaW5pdHlcbiAgICovXG4gIHJlYWRvbmx5IHBvZEFudGlBZmZpbml0eT86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdub2RlQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eShvYmoubm9kZUFmZmluaXR5KSxcbiAgICAncG9kQWZmaW5pdHknOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5KG9iai5wb2RBZmZpbml0eSksXG4gICAgJ3BvZEFudGlBZmZpbml0eSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5KG9iai5wb2RBbnRpQWZmaW5pdHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogVGhlIHBvZCB0aGlzIFRvbGVyYXRpb24gaXMgYXR0YWNoZWQgdG8gdG9sZXJhdGVzIGFueSB0YWludCB0aGF0IG1hdGNoZXNcbiAqIHRoZSB0cmlwbGUgPGtleSx2YWx1ZSxlZmZlY3Q+IHVzaW5nIHRoZSBtYXRjaGluZyBvcGVyYXRvciA8b3BlcmF0b3I+LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMge1xuICAvKipcbiAgICogRWZmZWN0IGluZGljYXRlcyB0aGUgdGFpbnQgZWZmZWN0IHRvIG1hdGNoLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQgZWZmZWN0cy5cbiAgICogV2hlbiBzcGVjaWZpZWQsIGFsbG93ZWQgdmFsdWVzIGFyZSBOb1NjaGVkdWxlLCBQcmVmZXJOb1NjaGVkdWxlIGFuZCBOb0V4ZWN1dGUuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNlZmZlY3RcbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogS2V5IGlzIHRoZSB0YWludCBrZXkgdGhhdCB0aGUgdG9sZXJhdGlvbiBhcHBsaWVzIHRvLiBFbXB0eSBtZWFucyBtYXRjaCBhbGwgdGFpbnQga2V5cy5cbiAgICogSWYgdGhlIGtleSBpcyBlbXB0eSwgb3BlcmF0b3IgbXVzdCBiZSBFeGlzdHM7IHRoaXMgY29tYmluYXRpb24gbWVhbnMgdG8gbWF0Y2ggYWxsIHZhbHVlcyBhbmQgYWxsIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcblxuICAvKipcbiAgICogT3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byB0aGUgdmFsdWUuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgRXhpc3RzLCBFcXVhbCwgTHQsIGFuZCBHdC4gRGVmYXVsdHMgdG8gRXF1YWwuXG4gICAqIEV4aXN0cyBpcyBlcXVpdmFsZW50IHRvIHdpbGRjYXJkIGZvciB2YWx1ZSwgc28gdGhhdCBhIHBvZCBjYW5cbiAgICogdG9sZXJhdGUgYWxsIHRhaW50cyBvZiBhIHBhcnRpY3VsYXIgY2F0ZWdvcnkuXG4gICAqIEx0IGFuZCBHdCBwZXJmb3JtIG51bWVyaWMgY29tcGFyaXNvbnMgKHJlcXVpcmVzIGZlYXR1cmUgZ2F0ZSBUYWludFRvbGVyYXRpb25Db21wYXJpc29uT3BlcmF0b3JzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgRXF1YWwuXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvbGVyYXRpb25TZWNvbmRzIHJlcHJlc2VudHMgdGhlIHBlcmlvZCBvZiB0aW1lIHRoZSB0b2xlcmF0aW9uICh3aGljaCBtdXN0IGJlXG4gICAqIG9mIGVmZmVjdCBOb0V4ZWN1dGUsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQpIHRvbGVyYXRlcyB0aGUgdGFpbnQuIEJ5IGRlZmF1bHQsXG4gICAqIGl0IGlzIG5vdCBzZXQsIHdoaWNoIG1lYW5zIHRvbGVyYXRlIHRoZSB0YWludCBmb3JldmVyIChkbyBub3QgZXZpY3QpLiBaZXJvIGFuZFxuICAgKiBuZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIDAgKGV2aWN0IGltbWVkaWF0ZWx5KSBieSB0aGUgc3lzdGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kVG9sZXJhdGlvbnMjdG9sZXJhdGlvblNlY29uZHNcbiAgICovXG4gIHJlYWRvbmx5IHRvbGVyYXRpb25TZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBpcyB0aGUgdGFpbnQgdmFsdWUgdGhlIHRvbGVyYXRpb24gbWF0Y2hlcyB0by5cbiAgICogSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cywgdGhlIHZhbHVlIHNob3VsZCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGp1c3QgYSByZWd1bGFyIHN0cmluZy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zI3ZhbHVlXG4gICAqL1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZFRvbGVyYXRpb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RUb2xlcmF0aW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2VmZmVjdCc6IG9iai5lZmZlY3QsXG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd0b2xlcmF0aW9uU2Vjb25kcyc6IG9iai50b2xlcmF0aW9uU2Vjb25kcyxcbiAgICAndmFsdWUnOiBvYmoudmFsdWUsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXNvdXJjZUNsYWltIHJlZmVyZW5jZXMgb25lIGVudHJ5IGluIFBvZFNwZWMuUmVzb3VyY2VDbGFpbXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zIHtcbiAgLyoqXG4gICAqIE5hbWUgbXVzdCBtYXRjaCB0aGUgbmFtZSBvZiBvbmUgZW50cnkgaW4gcG9kLnNwZWMucmVzb3VyY2VDbGFpbXMgb2ZcbiAgICogdGhlIFBvZCB3aGVyZSB0aGlzIGZpZWxkIGlzIHVzZWQuIEl0IG1ha2VzIHRoYXQgcmVzb3VyY2UgYXZhaWxhYmxlXG4gICAqIGluc2lkZSBhIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyNuYW1lXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgaXMgdGhlIG5hbWUgY2hvc2VuIGZvciBhIHJlcXVlc3QgaW4gdGhlIHJlZmVyZW5jZWQgY2xhaW0uXG4gICAqIElmIGVtcHR5LCBldmVyeXRoaW5nIGZyb20gdGhlIGNsYWltIGlzIG1hZGUgYXZhaWxhYmxlLCBvdGhlcndpc2VcbiAgICogb25seSB0aGUgcmVzdWx0IG9mIHRoaXMgcmVxdWVzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyNyZXF1ZXN0XG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1Jlc291cmNlc0NsYWltcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzQ2xhaW1zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbmFtZSc6IG9iai5uYW1lLFxuICAgICdyZXF1ZXN0Jzogb2JqLnJlcXVlc3QsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzTGltaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1Jlc291cmNlc0xpbWl0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNMaW1pdHModmFsdWUpO1xuICB9XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0c1xuICovXG5leHBvcnQgY2xhc3MgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gIHB1YmxpYyBzdGF0aWMgZnJvbU51bWJlcih2YWx1ZTogbnVtYmVyKTogVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1Jlc291cmNlc1JlcXVlc3RzKHZhbHVlKTtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodmFsdWU6IHN0cmluZyk6IFZpbnlsQ2FjaGVTcGVjUmVzb3VyY2VzUmVxdWVzdHMge1xuICAgIHJldHVybiBuZXcgVmlueWxDYWNoZVNwZWNSZXNvdXJjZXNSZXF1ZXN0cyh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICB9XG59XG5cbi8qKlxuICogdHlwZSBzZXRzIHRoZSBLdWJlcm5ldGVzIFNlcnZpY2UgdHlwZSAoQ2x1c3RlcklQLCBOb2RlUG9ydCwgTG9hZEJhbGFuY2VyKS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU2VydmljZVR5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNTZXJ2aWNlVHlwZSB7XG4gIC8qKiBDbHVzdGVySVAgKi9cbiAgQ0xVU1RFUl9JUCA9IFwiQ2x1c3RlcklQXCIsXG4gIC8qKiBOb2RlUG9ydCAqL1xuICBOT0RFX1BPUlQgPSBcIk5vZGVQb3J0XCIsXG4gIC8qKiBMb2FkQmFsYW5jZXIgKi9cbiAgTE9BRF9CQUxBTkNFUiA9IFwiTG9hZEJhbGFuY2VyXCIsXG59XG5cbi8qKlxuICogc2l6ZSBpcyB0aGUgc3RvcmFnZSBhbGxvY2F0aW9uIGFzIGEgS3ViZXJuZXRlcyByZXNvdXJjZSBxdWFudGl0eSAoZS5nLiBcIjFHaVwiKS5cbiAqIFRoZSBvcGVyYXRvciBjb252ZXJ0cyB0byBieXRlcyBmb3IgdmFybmlzaGQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplXG4gKi9cbmV4cG9ydCBjbGFzcyBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgcHVibGljIHN0YXRpYyBmcm9tTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplIHtcbiAgICByZXR1cm4gbmV3IFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVNpemUodmFsdWUpO1xuICB9XG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZTogc3RyaW5nKTogVmlueWxDYWNoZVNwZWNTdG9yYWdlU2l6ZSB7XG4gICAgcmV0dXJuIG5ldyBWaW55bENhY2hlU3BlY1N0b3JhZ2VTaXplKHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiB0eXBlIGlzIHRoZSBzdG9yYWdlIGJhY2tlbmQgdHlwZS4gT25seSBcIm1hbGxvY1wiIGFuZCBcImZpbGVcIiBhcmUgcGVybWl0dGVkLlxuICogXCJwZXJzaXN0ZW50XCIsIFwidW1lbVwiLCBhbmQgXCJkZWZhdWx0XCIgYXJlIHJlamVjdGVkIGJ5IHRoZSBhZG1pc3Npb24gd2ViaG9vay5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjU3RvcmFnZVR5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNTdG9yYWdlVHlwZSB7XG4gIC8qKiBtYWxsb2MgKi9cbiAgTUFMTE9DID0gXCJtYWxsb2NcIixcbiAgLyoqIGZpbGUgKi9cbiAgRklMRSA9IFwiZmlsZVwiLFxufVxuXG4vKipcbiAqIHNuaXBwZXRzIHByb3ZpZGVzIFZDTCBjb2RlIGluamVjdGVkIGludG8gZWFjaCBnZW5lcmF0ZWQgc3Vicm91dGluZS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyBpbnNlcnRlZCBhdCB0aGUgdG9wIG9mIHRoZSBWQ0wgZmlsZSwgYmVmb3JlIGFueSBzdWJyb3V0aW5lcy5cbiAgICogVXNlIGZvciBpbXBvcnQgc3RhdGVtZW50cyBhbmQgZ2xvYmFsIGRlY2xhcmF0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI2hlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kRXJyb3IgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9lcnJvci5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRFcnJvclxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZEVycm9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kRmV0Y2ggaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9mZXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRGZXRjaFxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZEZldGNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xCYWNrZW5kUmVzcG9uc2UgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfYmFja2VuZF9yZXNwb25zZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEJhY2tlbmRSZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgdmNsQmFja2VuZFJlc3BvbnNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xEZWxpdmVyIGlzIGluc2VydGVkIGludG8gdmNsX2RlbGl2ZXIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xEZWxpdmVyXG4gICAqL1xuICByZWFkb25seSB2Y2xEZWxpdmVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xGaW5pIGlzIGluc2VydGVkIGludG8gdmNsX2ZpbmkuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xGaW5pXG4gICAqL1xuICByZWFkb25seSB2Y2xGaW5pPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xIYXNoIGlzIGluc2VydGVkIGludG8gdmNsX2hhc2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNWY2xTbmlwcGV0cyN2Y2xIYXNoXG4gICAqL1xuICByZWFkb25seSB2Y2xIYXNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xIaXQgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfaGl0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsSGl0XG4gICAqL1xuICByZWFkb25seSB2Y2xIaXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbEluaXQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdmNsX2luaXQgc3Vicm91dGluZSBhZnRlciBkaXJlY3RvciBpbml0aWFsaXNhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbEluaXRcbiAgICovXG4gIHJlYWRvbmx5IHZjbEluaXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbE1pc3MgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfbWlzcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbE1pc3NcbiAgICovXG4gIHJlYWRvbmx5IHZjbE1pc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFBhc3MgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcGFzcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFBhc3NcbiAgICovXG4gIHJlYWRvbmx5IHZjbFBhc3M/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFBpcGUgaXMgaW5zZXJ0ZWQgaW50byB2Y2xfcGlwZS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFBpcGVcbiAgICovXG4gIHJlYWRvbmx5IHZjbFBpcGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFB1cmdlIGlzIGluc2VydGVkIGludG8gdmNsX3B1cmdlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsUHVyZ2VcbiAgICovXG4gIHJlYWRvbmx5IHZjbFB1cmdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2Y2xSZWN2IGlzIGluc2VydGVkIGludG8gdmNsX3JlY3YgYWZ0ZXIgZ2VuZXJhdGVkIHJvdXRpbmcgbG9naWMsIGJlZm9yZSByZXR1cm4oKS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzI3ZjbFJlY3ZcbiAgICovXG4gIHJlYWRvbmx5IHZjbFJlY3Y/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZjbFN5bnRoIGlzIGluc2VydGVkIGludG8gdmNsX3N5bnRoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMjdmNsU3ludGhcbiAgICovXG4gIHJlYWRvbmx5IHZjbFN5bnRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjVmNsU25pcHBldHMob2JqOiBWaW55bENhY2hlU3BlY1ZjbFNuaXBwZXRzIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGVhZGVyJzogb2JqLmhlYWRlcixcbiAgICAndmNsQmFja2VuZEVycm9yJzogb2JqLnZjbEJhY2tlbmRFcnJvcixcbiAgICAndmNsQmFja2VuZEZldGNoJzogb2JqLnZjbEJhY2tlbmRGZXRjaCxcbiAgICAndmNsQmFja2VuZFJlc3BvbnNlJzogb2JqLnZjbEJhY2tlbmRSZXNwb25zZSxcbiAgICAndmNsRGVsaXZlcic6IG9iai52Y2xEZWxpdmVyLFxuICAgICd2Y2xGaW5pJzogb2JqLnZjbEZpbmksXG4gICAgJ3ZjbEhhc2gnOiBvYmoudmNsSGFzaCxcbiAgICAndmNsSGl0Jzogb2JqLnZjbEhpdCxcbiAgICAndmNsSW5pdCc6IG9iai52Y2xJbml0LFxuICAgICd2Y2xNaXNzJzogb2JqLnZjbE1pc3MsXG4gICAgJ3ZjbFBhc3MnOiBvYmoudmNsUGFzcyxcbiAgICAndmNsUGlwZSc6IG9iai52Y2xQaXBlLFxuICAgICd2Y2xQdXJnZSc6IG9iai52Y2xQdXJnZSxcbiAgICAndmNsUmVjdic6IG9iai52Y2xSZWN2LFxuICAgICd2Y2xTeW50aCc6IG9iai52Y2xTeW50aCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGhhc2ggY29uZmlndXJlcyB0aGUgaGFzaCBkaXJlY3Rvci4gT25seSB1c2VkIHdoZW4gdHlwZSBpcyBcImhhc2hcIi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoIHtcbiAgLyoqXG4gICAqIGhlYWRlciBpcyB0aGUgcmVxdWVzdCBoZWFkZXIgbmFtZSB1c2VkIGFzIHRoZSBoYXNoIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoI2hlYWRlclxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3Rvckhhc2gob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JIYXNoIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnaGVhZGVyJzogb2JqLmhlYWRlcixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIHNoYXJkIGNvbmZpZ3VyZXMgdGhlIHNoYXJkIGRpcmVjdG9yIChjb25zaXN0ZW50LWhhc2gpLiBPbmx5IHVzZWQgd2hlbiB0eXBlIGlzIFwic2hhcmRcIi5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQge1xuICAvKipcbiAgICogYnkgZGV0ZXJtaW5lcyB3aGF0IHZhbHVlIGlzIGhhc2hlZCBmb3Igc2hhcmQgc2VsZWN0aW9uLiBcIkhBU0hcIiB1c2VzIHRoZSBWYXJuaXNoXG4gICAqIGhhc2ggKGRlZmF1bHQpOyBcIlVSTFwiIHVzZXMgdGhlIHJlcXVlc3QgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkI2J5XG4gICAqL1xuICByZWFkb25seSBieT86IFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkQnk7XG5cbiAgLyoqXG4gICAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICAgKiBcIkNIT1NFTlwiIChkZWZhdWx0KSBvbmx5IGNvbnNpZGVycyB0aGUgY2hvc2VuIGJhY2tlbmQgaGVhbHRoeTsgXCJBTExcIiByZXF1aXJlcyBhbGxcbiAgICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCNoZWFsdGh5XG4gICAqL1xuICByZWFkb25seSBoZWFsdGh5PzogVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmRIZWFsdGh5O1xuXG4gIC8qKlxuICAgKiByYW1wdXAgaXMgdGhlIHRpbWUgYWZ0ZXIgYWRkaW5nIGEgYmFja2VuZCBiZWZvcmUgaXQgcmVjZWl2ZXMgaXRzIGZ1bGwgc2hhcmUgb2YgdHJhZmZpYyxcbiAgICogcHJldmVudGluZyB0aHVuZGVyaW5nLWhlcmQuIERlZmF1bHQ6IDMwcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCNyYW1wdXBcbiAgICovXG4gIHJlYWRvbmx5IHJhbXB1cD86IHN0cmluZztcblxuICAvKipcbiAgICogcmVwbGljYXMgaXMgdGhlIG51bWJlciBvZiBLZXRhbWEgcmVwbGljYXMgcGVyIGJhY2tlbmQgaW4gdGhlIGhhc2ggcmluZy4gRGVmYXVsdDogNjcuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQjcmVwbGljYXNcbiAgICovXG4gIHJlYWRvbmx5IHJlcGxpY2FzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiB3YXJtdXAgaXMgdGhlIHByb3BvcnRpb24gb2YgcmVxdWVzdHMgKDAuMOKAkzEuMCkgc2VudCB0byB0aGUgYWx0ZXJuYXRpdmUgYmFja2VuZFxuICAgKiB0byBwcmUtcG9wdWxhdGUgaXRzIGNhY2hlLiBEZWZhdWx0OiAwLjEuIE11c3QgYmUgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCN3YXJtdXBcbiAgICovXG4gIHJlYWRvbmx5IHdhcm11cD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yU2hhcmQob2JqOiBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2J5Jzogb2JqLmJ5LFxuICAgICdoZWFsdGh5Jzogb2JqLmhlYWx0aHksXG4gICAgJ3JhbXB1cCc6IG9iai5yYW1wdXAsXG4gICAgJ3JlcGxpY2FzJzogb2JqLnJlcGxpY2FzLFxuICAgICd3YXJtdXAnOiBvYmoud2FybXVwLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogdHlwZSBzZWxlY3RzIHRoZSBWYXJuaXNoIGRpcmVjdG9yIGFsZ29yaXRobS5cbiAqIFwic2hhcmRcIiAoZGVmYXVsdCkgcHJvdmlkZXMgY29uc2lzdGVudCBoYXNoaW5nOyBcInJvdW5kX3JvYmluXCIsIFwicmFuZG9tXCIsIGFuZCBcImhhc2hcIlxuICogYXJlIGFsc28gc3VwcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNCYWNrZW5kc0RpcmVjdG9yVHlwZVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxuICAvKiogcm91bmRfcm9iaW4gKi9cbiAgUk9VTkRfVU5ERVJTQ09SRV9ST0JJTiA9IFwicm91bmRfcm9iaW5cIixcbiAgLyoqIHJhbmRvbSAqL1xuICBSQU5ET00gPSBcInJhbmRvbVwiLFxuICAvKiogaGFzaCAqL1xuICBIQVNIID0gXCJoYXNoXCIsXG4gIC8qKiBmYWxsYmFjayAqL1xuICBGQUxMQkFDSyA9IFwiZmFsbGJhY2tcIixcbn1cblxuLyoqXG4gKiB0eXBlIGlzIHRoZSByb3V0aW5nIHN0cmF0ZWd5IGJldHdlZW4gVmFybmlzaCBwb2RzLiBPbmx5IFwic2hhcmRcIiBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0NsdXN0ZXJQZWVyUm91dGluZ1R5cGVcbiAqL1xuZXhwb3J0IGVudW0gVmlueWxDYWNoZVNwZWNDbHVzdGVyUGVlclJvdXRpbmdUeXBlIHtcbiAgLyoqIHNoYXJkICovXG4gIFNIQVJEID0gXCJzaGFyZFwiLFxufVxuXG4vKipcbiAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICogaGFzaCAoZGVmYXVsdCk7IFwiVVJMXCIgdXNlcyB0aGUgcmVxdWVzdCBVUkwuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRCeSB7XG4gIC8qKiBIQVNIICovXG4gIEhBU0ggPSBcIkhBU0hcIixcbiAgLyoqIFVSTCAqL1xuICBVUkwgPSBcIlVSTFwiLFxufVxuXG4vKipcbiAqIGhlYWx0aHkgY29udHJvbHMgd2hpY2ggYmFja2VuZHMgdGhlIGRpcmVjdG9yIGNvbnNpZGVycyB3aGVuIHNlbGVjdGluZyBhIHNoYXJkLlxuICogXCJDSE9TRU5cIiAoZGVmYXVsdCkgb25seSBjb25zaWRlcnMgdGhlIGNob3NlbiBiYWNrZW5kIGhlYWx0aHk7IFwiQUxMXCIgcmVxdWlyZXMgYWxsXG4gKiBiYWNrZW5kcyB0byBiZSBoZWFsdGh5LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNEaXJlY3RvclNoYXJkSGVhbHRoeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0RpcmVjdG9yU2hhcmRIZWFsdGh5IHtcbiAgLyoqIENIT1NFTiAqL1xuICBDSE9TRU4gPSBcIkNIT1NFTlwiLFxuICAvKiogQUxMICovXG4gIEFMTCA9IFwiQUxMXCIsXG59XG5cbi8qKlxuICogRGVzY3JpYmVzIG5vZGUgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyBmb3IgdGhlIHBvZC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFmZmluaXR5IGV4cHJlc3Npb25zIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkLCBidXQgaXQgbWF5IGNob29zZVxuICAgKiBhIG5vZGUgdGhhdCB2aW9sYXRlcyBvbmUgb3IgbW9yZSBvZiB0aGUgZXhwcmVzc2lvbnMuIFRoZSBub2RlIHRoYXQgaXNcbiAgICogbW9zdCBwcmVmZXJyZWQgaXMgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVzdCBzdW0gb2Ygd2VpZ2h0cywgaS5lLlxuICAgKiBmb3IgZWFjaCBub2RlIHRoYXQgbWVldHMgYWxsIG9mIHRoZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cyAocmVzb3VyY2VcbiAgICogcmVxdWVzdCwgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nIGFmZmluaXR5IGV4cHJlc3Npb25zLCBldGMuKSxcbiAgICogY29tcHV0ZSBhIHN1bSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBmaWVsZCBhbmQgYWRkaW5nXG4gICAqIFwid2VpZ2h0XCIgdG8gdGhlIHN1bSBpZiB0aGUgbm9kZSBtYXRjaGVzIHRoZSBjb3JyZXNwb25kaW5nIG1hdGNoRXhwcmVzc2lvbnM7IHRoZVxuICAgKiBub2RlKHMpIHdpdGggdGhlIGhpZ2hlc3Qgc3VtIGFyZSB0aGUgbW9zdCBwcmVmZXJyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eSNwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25bXTtcblxuICAvKipcbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gICAqIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHBvZCBleGVjdXRpb24gKGUuZy4gZHVlIHRvIGFuIHVwZGF0ZSksIHRoZSBzeXN0ZW1cbiAgICogbWF5IG9yIG1heSBub3QgdHJ5IHRvIGV2ZW50dWFsbHkgZXZpY3QgdGhlIHBvZCBmcm9tIGl0cyBub2RlLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5JyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHkob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICAgICdyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iai5yZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIERlc2NyaWJlcyBwb2QgYWZmaW5pdHkgc2NoZWR1bGluZyBydWxlcyAoZS5nLiBjby1sb2NhdGUgdGhpcyBwb2QgaW4gdGhlIHNhbWUgbm9kZSwgem9uZSwgZXRjLiBhcyBzb21lIG90aGVyIHBvZChzKSkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHkge1xuICAvKipcbiAgICogVGhlIHNjaGVkdWxlciB3aWxsIHByZWZlciB0byBzY2hlZHVsZSBwb2RzIHRvIG5vZGVzIHRoYXQgc2F0aXNmeVxuICAgKiB0aGUgYWZmaW5pdHkgZXhwcmVzc2lvbnMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQsIGJ1dCBpdCBtYXkgY2hvb3NlXG4gICAqIGEgbm9kZSB0aGF0IHZpb2xhdGVzIG9uZSBvciBtb3JlIG9mIHRoZSBleHByZXNzaW9ucy4gVGhlIG5vZGUgdGhhdCBpc1xuICAgKiBtb3N0IHByZWZlcnJlZCBpcyB0aGUgb25lIHdpdGggdGhlIGdyZWF0ZXN0IHN1bSBvZiB3ZWlnaHRzLCBpLmUuXG4gICAqIGZvciBlYWNoIG5vZGUgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzIChyZXNvdXJjZVxuICAgKiByZXF1ZXN0LCByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmcgYWZmaW5pdHkgZXhwcmVzc2lvbnMsIGV0Yy4pLFxuICAgKiBjb21wdXRlIGEgc3VtIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbGVtZW50cyBvZiB0aGlzIGZpZWxkIGFuZCBhZGRpbmdcbiAgICogXCJ3ZWlnaHRcIiB0byB0aGUgc3VtIGlmIHRoZSBub2RlIGhhcyBwb2RzIHdoaWNoIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG9kQWZmaW5pdHlUZXJtOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSNwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgYWZmaW5pdHkgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCBieSB0aGlzIGZpZWxkIGFyZSBub3QgbWV0IGF0XG4gICAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAgICogSWYgdGhlIGFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBjZWFzZSB0byBiZSBtZXRcbiAgICogYXQgc29tZSBwb2ludCBkdXJpbmcgcG9kIGV4ZWN1dGlvbiAoZS5nLiBkdWUgdG8gYSBwb2QgbGFiZWwgdXBkYXRlKSwgdGhlXG4gICAqIHN5c3RlbSBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gICAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzLCB0aGUgbGlzdHMgb2Ygbm9kZXMgY29ycmVzcG9uZGluZyB0byBlYWNoXG4gICAqIHBvZEFmZmluaXR5VGVybSBhcmUgaW50ZXJzZWN0ZWQsIGkuZS4gYWxsIHRlcm1zIG11c3QgYmUgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eSNyZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbltdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5KG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gICAgJ3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24oeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogRGVzY3JpYmVzIHBvZCBhbnRpLWFmZmluaXR5IHNjaGVkdWxpbmcgcnVsZXMgKGUuZy4gYXZvaWQgcHV0dGluZyB0aGlzIHBvZCBpbiB0aGUgc2FtZSBub2RlLCB6b25lLCBldGMuIGFzIHNvbWUgb3RoZXIgcG9kKHMpKS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBzY2hlZHVsZXIgd2lsbCBwcmVmZXIgdG8gc2NoZWR1bGUgcG9kcyB0byBub2RlcyB0aGF0IHNhdGlzZnlcbiAgICogdGhlIGFudGktYWZmaW5pdHkgZXhwcmVzc2lvbnMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQsIGJ1dCBpdCBtYXkgY2hvb3NlXG4gICAqIGEgbm9kZSB0aGF0IHZpb2xhdGVzIG9uZSBvciBtb3JlIG9mIHRoZSBleHByZXNzaW9ucy4gVGhlIG5vZGUgdGhhdCBpc1xuICAgKiBtb3N0IHByZWZlcnJlZCBpcyB0aGUgb25lIHdpdGggdGhlIGdyZWF0ZXN0IHN1bSBvZiB3ZWlnaHRzLCBpLmUuXG4gICAqIGZvciBlYWNoIG5vZGUgdGhhdCBtZWV0cyBhbGwgb2YgdGhlIHNjaGVkdWxpbmcgcmVxdWlyZW1lbnRzIChyZXNvdXJjZVxuICAgKiByZXF1ZXN0LCByZXF1aXJlZER1cmluZ1NjaGVkdWxpbmcgYW50aS1hZmZpbml0eSBleHByZXNzaW9ucywgZXRjLiksXG4gICAqIGNvbXB1dGUgYSBzdW0gYnkgaXRlcmF0aW5nIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIHRoaXMgZmllbGQgYW5kIHN1YnRyYWN0aW5nXG4gICAqIFwid2VpZ2h0XCIgZnJvbSB0aGUgc3VtIGlmIHRoZSBub2RlIGhhcyBwb2RzIHdoaWNoIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG9kQWZmaW5pdHlUZXJtOyB0aGVcbiAgICogbm9kZShzKSB3aXRoIHRoZSBoaWdoZXN0IHN1bSBhcmUgdGhlIG1vc3QgcHJlZmVycmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkjcHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG5cbiAgLyoqXG4gICAqIElmIHRoZSBhbnRpLWFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBhcmUgbm90IG1ldCBhdFxuICAgKiBzY2hlZHVsaW5nIHRpbWUsIHRoZSBwb2Qgd2lsbCBub3QgYmUgc2NoZWR1bGVkIG9udG8gdGhlIG5vZGUuXG4gICAqIElmIHRoZSBhbnRpLWFmZmluaXR5IHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgYnkgdGhpcyBmaWVsZCBjZWFzZSB0byBiZSBtZXRcbiAgICogYXQgc29tZSBwb2ludCBkdXJpbmcgcG9kIGV4ZWN1dGlvbiAoZS5nLiBkdWUgdG8gYSBwb2QgbGFiZWwgdXBkYXRlKSwgdGhlXG4gICAqIHN5c3RlbSBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gICAqIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzLCB0aGUgbGlzdHMgb2Ygbm9kZXMgY29ycmVzcG9uZGluZyB0byBlYWNoXG4gICAqIHBvZEFmZmluaXR5VGVybSBhcmUgaW50ZXJzZWN0ZWQsIGkuZS4gYWxsIHRlcm1zIG11c3QgYmUgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkjcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHknIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHkgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbic6IG9iai5wcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbih5KSksXG4gICAgJ3JlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nOiBvYmoucmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbj8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIGJ5IGRldGVybWluZXMgd2hhdCB2YWx1ZSBpcyBoYXNoZWQgZm9yIHNoYXJkIHNlbGVjdGlvbi4gXCJIQVNIXCIgdXNlcyB0aGUgVmFybmlzaFxuICogaGFzaCAoZGVmYXVsdCk7IFwiVVJMXCIgdXNlcyB0aGUgcmVxdWVzdCBVUkwuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEJ5XG4gKi9cbmV4cG9ydCBlbnVtIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkQnkge1xuICAvKiogSEFTSCAqL1xuICBIQVNIID0gXCJIQVNIXCIsXG4gIC8qKiBVUkwgKi9cbiAgVVJMID0gXCJVUkxcIixcbn1cblxuLyoqXG4gKiBoZWFsdGh5IGNvbnRyb2xzIHdoaWNoIGJhY2tlbmRzIHRoZSBkaXJlY3RvciBjb25zaWRlcnMgd2hlbiBzZWxlY3RpbmcgYSBzaGFyZC5cbiAqIFwiQ0hPU0VOXCIgKGRlZmF1bHQpIG9ubHkgY29uc2lkZXJzIHRoZSBjaG9zZW4gYmFja2VuZCBoZWFsdGh5OyBcIkFMTFwiIHJlcXVpcmVzIGFsbFxuICogYmFja2VuZHMgdG8gYmUgaGVhbHRoeS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjQmFja2VuZHNEaXJlY3RvclNoYXJkSGVhbHRoeVxuICovXG5leHBvcnQgZW51bSBWaW55bENhY2hlU3BlY0JhY2tlbmRzRGlyZWN0b3JTaGFyZEhlYWx0aHkge1xuICAvKiogQ0hPU0VOICovXG4gIENIT1NFTiA9IFwiQ0hPU0VOXCIsXG4gIC8qKiBBTEwgKi9cbiAgQUxMID0gXCJBTExcIixcbn1cblxuLyoqXG4gKiBBbiBlbXB0eSBwcmVmZXJyZWQgc2NoZWR1bGluZyB0ZXJtIG1hdGNoZXMgYWxsIG9iamVjdHMgd2l0aCBpbXBsaWNpdCB3ZWlnaHQgMFxuICogKGkuZS4gaXQncyBhIG5vLW9wKS4gQSBudWxsIHByZWZlcnJlZCBzY2hlZHVsaW5nIHRlcm0gbWF0Y2hlcyBubyBvYmplY3RzIChpLmUuIGlzIGFsc28gYSBuby1vcCkuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBub2RlIHNlbGVjdG9yIHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3ByZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHByZWZlcmVuY2U6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdlaWdodCBhc3NvY2lhdGVkIHdpdGggbWF0Y2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbm9kZVNlbGVjdG9yVGVybSwgaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiN3ZWlnaHRcbiAgICovXG4gIHJlYWRvbmx5IHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncHJlZmVyZW5jZSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iai5wcmVmZXJlbmNlKSxcbiAgICAnd2VpZ2h0Jzogb2JqLndlaWdodCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgYXJlIG5vdCBtZXQgYXRcbiAqIHNjaGVkdWxpbmcgdGltZSwgdGhlIHBvZCB3aWxsIG5vdCBiZSBzY2hlZHVsZWQgb250byB0aGUgbm9kZS5cbiAqIElmIHRoZSBhZmZpbml0eSByZXF1aXJlbWVudHMgc3BlY2lmaWVkIGJ5IHRoaXMgZmllbGQgY2Vhc2UgdG8gYmUgbWV0XG4gKiBhdCBzb21lIHBvaW50IGR1cmluZyBwb2QgZXhlY3V0aW9uIChlLmcuIGR1ZSB0byBhbiB1cGRhdGUpLCB0aGUgc3lzdGVtXG4gKiBtYXkgb3IgbWF5IG5vdCB0cnkgdG8gZXZlbnR1YWxseSBldmljdCB0aGUgcG9kIGZyb20gaXRzIG5vZGUuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHtcbiAgLyoqXG4gICAqIFJlcXVpcmVkLiBBIGxpc3Qgb2Ygbm9kZSBzZWxlY3RvciB0ZXJtcy4gVGhlIHRlcm1zIGFyZSBPUmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25vZGVTZWxlY3RvclRlcm1zXG4gICAqL1xuICByZWFkb25seSBub2RlU2VsZWN0b3JUZXJtczogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbm9kZVNlbGVjdG9yVGVybXMnOiBvYmoubm9kZVNlbGVjdG9yVGVybXM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogUmVxdWlyZWQuIEEgcG9kIGFmZmluaXR5IHRlcm0sIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyB3ZWlnaHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtO1xuXG4gIC8qKlxuICAgKiB3ZWlnaHQgYXNzb2NpYXRlZCB3aXRoIG1hdGNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIHBvZEFmZmluaXR5VGVybSxcbiAgICogaW4gdGhlIHJhbmdlIDEtMTAwLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3dlaWdodFxuICAgKi9cbiAgcmVhZG9ubHkgd2VpZ2h0OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdwb2RBZmZpbml0eVRlcm0nOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24ge1xuICAvKipcbiAgICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gICAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE1pc21hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IG5vdGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtaXNtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWlzbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBuYW1lc3BhY2VzIHNwZWNpZmllcyBhIHN0YXRpYyBsaXN0IG9mIG5hbWVzcGFjZSBuYW1lcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gICAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIGxpc3RlZCBpbiB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBzZWxlY3RlZCBieSBuYW1lc3BhY2VTZWxlY3Rvci5cbiAgICogbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgYW5kIG51bGwgbmFtZXNwYWNlU2VsZWN0b3IgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iai5sYWJlbFNlbGVjdG9yKSxcbiAgICAnbWF0Y2hMYWJlbEtleXMnOiBvYmoubWF0Y2hMYWJlbEtleXM/Lm1hcCh5ID0+IHkpLFxuICAgICdtaXNtYXRjaExhYmVsS2V5cyc6IG9iai5taXNtYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ25hbWVzcGFjZVNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFRoZSB3ZWlnaHRzIG9mIGFsbCBvZiB0aGUgbWF0Y2hlZCBXZWlnaHRlZFBvZEFmZmluaXR5VGVybSBmaWVsZHMgYXJlIGFkZGVkIHBlci1ub2RlIHRvIGZpbmQgdGhlIG1vc3QgcHJlZmVycmVkIG5vZGUocylcbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jcG9kQWZmaW5pdHlUZXJtXG4gICAqL1xuICByZWFkb25seSBwb2RBZmZpbml0eVRlcm06IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybTtcblxuICAvKipcbiAgICogd2VpZ2h0IGFzc29jaWF0ZWQgd2l0aCBtYXRjaGluZyB0aGUgY29ycmVzcG9uZGluZyBwb2RBZmZpbml0eVRlcm0sXG4gICAqIGluIHRoZSByYW5nZSAxLTEwMC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jd2VpZ2h0XG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ3BvZEFmZmluaXR5VGVybSc6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqLnBvZEFmZmluaXR5VGVybSksXG4gICAgJ3dlaWdodCc6IG9iai53ZWlnaHQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIGEgc2V0IG9mIHBvZHMgKG5hbWVseSB0aG9zZSBtYXRjaGluZyB0aGUgbGFiZWxTZWxlY3RvclxuICogcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG5hbWVzcGFjZShzKSkgdGhhdCB0aGlzIHBvZCBzaG91bGQgYmVcbiAqIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCxcbiAqIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZSB3aG9zZSB2YWx1ZSBvZlxuICogdGhlIGxhYmVsIHdpdGgga2V5IDx0b3BvbG9neUtleT4gbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoXG4gKiBhIHBvZCBvZiB0aGUgc2V0IG9mIHBvZHMgaXMgcnVubmluZ1xuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbiNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb24jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbm9kZSBzZWxlY3RvciB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBsYWJlbHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnRzIGJ5IG5vZGUncyBmaWVsZHMuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSNtYXRjaEZpZWxkc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hGaWVsZHM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZSB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hGaWVsZHMnOiBvYmoubWF0Y2hGaWVsZHM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMoeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBudWxsIG9yIGVtcHR5IG5vZGUgc2VsZWN0b3IgdGVybSBtYXRjaGVzIG5vIG9iamVjdHMuIFRoZSByZXF1aXJlbWVudHMgb2ZcbiAqIHRoZW0gYXJlIEFORGVkLlxuICogVGhlIFRvcG9sb2d5U2VsZWN0b3JUZXJtIHR5cGUgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgTm9kZVNlbGVjdG9yVGVybS5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zIHtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgbGFiZWxzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50cyBieSBub2RlJ3MgZmllbGRzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMjbWF0Y2hGaWVsZHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRmllbGRzPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoRmllbGRzJzogb2JqLm1hdGNoRmllbGRzPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzKHkpKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFJlcXVpcmVkLiBBIHBvZCBhZmZpbml0eSB0ZXJtLCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgd2VpZ2h0LlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNsYWJlbFNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBsYWJlbFNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yO1xuXG4gIC8qKlxuICAgKiBNYXRjaExhYmVsS2V5cyBpcyBhIHNldCBvZiBwb2QgbGFiZWwga2V5cyB0byBzZWxlY3Qgd2hpY2ggcG9kcyB3aWxsXG4gICAqIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gVGhlIGtleXMgYXJlIHVzZWQgdG8gbG9va3VwIHZhbHVlcyBmcm9tIHRoZVxuICAgKiBpbmNvbWluZyBwb2QgbGFiZWxzLCB0aG9zZSBrZXktdmFsdWUgbGFiZWxzIGFyZSBtZXJnZWQgd2l0aCBgbGFiZWxTZWxlY3RvcmAgYXMgYGtleSBpbiAodmFsdWUpYFxuICAgKiB0byBzZWxlY3QgdGhlIGdyb3VwIG9mIGV4aXN0aW5nIHBvZHMgd2hpY2ggcG9kcyB3aWxsIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvblxuICAgKiBmb3IgdGhlIGluY29taW5nIHBvZCdzIHBvZCAoYW50aSkgYWZmaW5pdHkuIEtleXMgdGhhdCBkb24ndCBleGlzdCBpbiB0aGUgaW5jb21pbmdcbiAgICogcG9kIGxhYmVscyB3aWxsIGJlIGlnbm9yZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBUaGUgc2FtZSBrZXkgaXMgZm9yYmlkZGVuIHRvIGV4aXN0IGluIGJvdGggbWF0Y2hMYWJlbEtleXMgYW5kIGxhYmVsU2VsZWN0b3IuXG4gICAqIEFsc28sIG1hdGNoTGFiZWxLZXlzIGNhbm5vdCBiZSBzZXQgd2hlbiBsYWJlbFNlbGVjdG9yIGlzbid0IHNldC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbWlzbWF0Y2hMYWJlbEtleXNcbiAgICovXG4gIHJlYWRvbmx5IG1pc21hdGNoTGFiZWxLZXlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICAgKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gICAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gICAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAgICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZVNlbGVjdG9yXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2VTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlc1xuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHBvZCBzaG91bGQgYmUgY28tbG9jYXRlZCAoYWZmaW5pdHkpIG9yIG5vdCBjby1sb2NhdGVkIChhbnRpLWFmZmluaXR5KSB3aXRoIHRoZSBwb2RzIG1hdGNoaW5nXG4gICAqIHRoZSBsYWJlbFNlbGVjdG9yIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlcywgd2hlcmUgY28tbG9jYXRlZCBpcyBkZWZpbmVkIGFzIHJ1bm5pbmcgb24gYSBub2RlXG4gICAqIHdob3NlIHZhbHVlIG9mIHRoZSBsYWJlbCB3aXRoIGtleSB0b3BvbG9neUtleSBtYXRjaGVzIHRoYXQgb2YgYW55IG5vZGUgb24gd2hpY2ggYW55IG9mIHRoZVxuICAgKiBzZWxlY3RlZCBwb2RzIGlzIHJ1bm5pbmcuXG4gICAqIEVtcHR5IHRvcG9sb2d5S2V5IGlzIG5vdCBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI3RvcG9sb2d5S2V5XG4gICAqL1xuICByZWFkb25seSB0b3BvbG9neUtleTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybShvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbGFiZWxTZWxlY3Rvcic6IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmoubmFtZXNwYWNlU2VsZWN0b3IpLFxuICAgICduYW1lc3BhY2VzJzogb2JqLm5hbWVzcGFjZXM/Lm1hcCh5ID0+IHkpLFxuICAgICd0b3BvbG9neUtleSc6IG9iai50b3BvbG9neUtleSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zW107XG5cbiAgLyoqXG4gICAqIG1hdGNoTGFiZWxzIGlzIGEgbWFwIG9mIHtrZXksdmFsdWV9IHBhaXJzLiBBIHNpbmdsZSB7a2V5LHZhbHVlfSBpbiB0aGUgbWF0Y2hMYWJlbHNcbiAgICogbWFwIGlzIGVxdWl2YWxlbnQgdG8gYW4gZWxlbWVudCBvZiBtYXRjaEV4cHJlc3Npb25zLCB3aG9zZSBrZXkgZmllbGQgaXMgXCJrZXlcIiwgdGhlXG4gICAqIG9wZXJhdG9yIGlzIFwiSW5cIiwgYW5kIHRoZSB2YWx1ZXMgYXJyYXkgY29udGFpbnMgb25seSBcInZhbHVlXCIuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBSZXF1aXJlZC4gQSBwb2QgYWZmaW5pdHkgdGVybSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHdlaWdodC5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSB7XG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAgICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbGFiZWxTZWxlY3RvclxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxTZWxlY3Rvcj86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIE1hdGNoTGFiZWxLZXlzIGlzIGEgc2V0IG9mIHBvZCBsYWJlbCBrZXlzIHRvIHNlbGVjdCB3aGljaCBwb2RzIHdpbGxcbiAgICogYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiBUaGUga2V5cyBhcmUgdXNlZCB0byBsb29rdXAgdmFsdWVzIGZyb20gdGhlXG4gICAqIGluY29taW5nIHBvZCBsYWJlbHMsIHRob3NlIGtleS12YWx1ZSBsYWJlbHMgYXJlIG1lcmdlZCB3aXRoIGBsYWJlbFNlbGVjdG9yYCBhcyBga2V5IGluICh2YWx1ZSlgXG4gICAqIHRvIHNlbGVjdCB0aGUgZ3JvdXAgb2YgZXhpc3RpbmcgcG9kcyB3aGljaCBwb2RzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uXG4gICAqIGZvciB0aGUgaW5jb21pbmcgcG9kJ3MgcG9kIChhbnRpKSBhZmZpbml0eS4gS2V5cyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBpbmNvbWluZ1xuICAgKiBwb2QgbGFiZWxzIHdpbGwgYmUgaWdub3JlZC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIFRoZSBzYW1lIGtleSBpcyBmb3JiaWRkZW4gdG8gZXhpc3QgaW4gYm90aCBtYXRjaExhYmVsS2V5cyBhbmQgbGFiZWxTZWxlY3Rvci5cbiAgICogQWxzbywgbWF0Y2hMYWJlbEtleXMgY2Fubm90IGJlIHNldCB3aGVuIGxhYmVsU2VsZWN0b3IgaXNuJ3Qgc2V0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybSNtYXRjaExhYmVsS2V5c1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbEtleXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTWlzbWF0Y2hMYWJlbEtleXMgaXMgYSBzZXQgb2YgcG9kIGxhYmVsIGtleXMgdG8gc2VsZWN0IHdoaWNoIHBvZHMgd2lsbFxuICAgKiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIFRoZSBrZXlzIGFyZSB1c2VkIHRvIGxvb2t1cCB2YWx1ZXMgZnJvbSB0aGVcbiAgICogaW5jb21pbmcgcG9kIGxhYmVscywgdGhvc2Uga2V5LXZhbHVlIGxhYmVscyBhcmUgbWVyZ2VkIHdpdGggYGxhYmVsU2VsZWN0b3JgIGFzIGBrZXkgbm90aW4gKHZhbHVlKWBcbiAgICogdG8gc2VsZWN0IHRoZSBncm91cCBvZiBleGlzdGluZyBwb2RzIHdoaWNoIHBvZHMgd2lsbCBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb25cbiAgICogZm9yIHRoZSBpbmNvbWluZyBwb2QncyBwb2QgKGFudGkpIGFmZmluaXR5LiBLZXlzIHRoYXQgZG9uJ3QgZXhpc3QgaW4gdGhlIGluY29taW5nXG4gICAqIHBvZCBsYWJlbHMgd2lsbCBiZSBpZ25vcmVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBlbXB0eS5cbiAgICogVGhlIHNhbWUga2V5IGlzIGZvcmJpZGRlbiB0byBleGlzdCBpbiBib3RoIG1pc21hdGNoTGFiZWxLZXlzIGFuZCBsYWJlbFNlbGVjdG9yLlxuICAgKiBBbHNvLCBtaXNtYXRjaExhYmVsS2V5cyBjYW5ub3QgYmUgc2V0IHdoZW4gbGFiZWxTZWxlY3RvciBpc24ndCBzZXQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI21pc21hdGNoTGFiZWxLZXlzXG4gICAqL1xuICByZWFkb25seSBtaXNtYXRjaExhYmVsS2V5cz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICAgKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICAgKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jbmFtZXNwYWNlU2VsZWN0b3JcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZVNlbGVjdG9yPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3I7XG5cbiAgLyoqXG4gICAqIG5hbWVzcGFjZXMgc3BlY2lmaWVzIGEgc3RhdGljIGxpc3Qgb2YgbmFtZXNwYWNlIG5hbWVzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAgICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgbGlzdGVkIGluIHRoaXMgZmllbGRcbiAgICogYW5kIHRoZSBvbmVzIHNlbGVjdGVkIGJ5IG5hbWVzcGFjZVNlbGVjdG9yLlxuICAgKiBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBhbmQgbnVsbCBuYW1lc3BhY2VTZWxlY3RvciBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtI25hbWVzcGFjZXNcbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhpcyBwb2Qgc2hvdWxkIGJlIGNvLWxvY2F0ZWQgKGFmZmluaXR5KSBvciBub3QgY28tbG9jYXRlZCAoYW50aS1hZmZpbml0eSkgd2l0aCB0aGUgcG9kcyBtYXRjaGluZ1xuICAgKiB0aGUgbGFiZWxTZWxlY3RvciBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZXMsIHdoZXJlIGNvLWxvY2F0ZWQgaXMgZGVmaW5lZCBhcyBydW5uaW5nIG9uIGEgbm9kZVxuICAgKiB3aG9zZSB2YWx1ZSBvZiB0aGUgbGFiZWwgd2l0aCBrZXkgdG9wb2xvZ3lLZXkgbWF0Y2hlcyB0aGF0IG9mIGFueSBub2RlIG9uIHdoaWNoIGFueSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgcG9kcyBpcyBydW5uaW5nLlxuICAgKiBFbXB0eSB0b3BvbG9neUtleSBpcyBub3QgYWxsb3dlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0jdG9wb2xvZ3lLZXlcbiAgICovXG4gIHJlYWRvbmx5IHRvcG9sb2d5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0ob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm0gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdsYWJlbFNlbGVjdG9yJzogdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Iob2JqLmxhYmVsU2VsZWN0b3IpLFxuICAgICdtYXRjaExhYmVsS2V5cyc6IG9iai5tYXRjaExhYmVsS2V5cz8ubWFwKHkgPT4geSksXG4gICAgJ21pc21hdGNoTGFiZWxLZXlzJzogb2JqLm1pc21hdGNoTGFiZWxLZXlzPy5tYXAoeSA9PiB5KSxcbiAgICAnbmFtZXNwYWNlU2VsZWN0b3InOiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Iob2JqLm5hbWVzcGFjZVNlbGVjdG9yKSxcbiAgICAnbmFtZXNwYWNlcyc6IG9iai5uYW1lc3BhY2VzPy5tYXAoeSA9PiB5KSxcbiAgICAndG9wb2xvZ3lLZXknOiBvYmoudG9wb2xvZ3lLZXksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgYSBzZXQgb2YgcmVzb3VyY2VzLCBpbiB0aGlzIGNhc2UgcG9kcy5cbiAqIElmIGl0J3MgbnVsbCwgdGhpcyBQb2RBZmZpbml0eVRlcm0gbWF0Y2hlcyB3aXRoIG5vIFBvZHMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciB0aGUgc2V0IG9mIG5hbWVzcGFjZXMgdGhhdCB0aGUgdGVybSBhcHBsaWVzIHRvLlxuICogVGhlIHRlcm0gaXMgYXBwbGllZCB0byB0aGUgdW5pb24gb2YgdGhlIG5hbWVzcGFjZXMgc2VsZWN0ZWQgYnkgdGhpcyBmaWVsZFxuICogYW5kIHRoZSBvbmVzIGxpc3RlZCBpbiB0aGUgbmFtZXNwYWNlcyBmaWVsZC5cbiAqIG51bGwgc2VsZWN0b3IgYW5kIG51bGwgb3IgZW1wdHkgbmFtZXNwYWNlcyBsaXN0IG1lYW5zIFwidGhpcyBwb2QncyBuYW1lc3BhY2VcIi5cbiAqIEFuIGVtcHR5IHNlbGVjdG9yICh7fSkgbWF0Y2hlcyBhbGwgbmFtZXNwYWNlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNbXTtcblxuICAvKipcbiAgICogbWF0Y2hMYWJlbHMgaXMgYSBtYXAgb2Yge2tleSx2YWx1ZX0gcGFpcnMuIEEgc2luZ2xlIHtrZXksdmFsdWV9IGluIHRoZSBtYXRjaExhYmVsc1xuICAgKiBtYXAgaXMgZXF1aXZhbGVudCB0byBhbiBlbGVtZW50IG9mIG1hdGNoRXhwcmVzc2lvbnMsIHdob3NlIGtleSBmaWVsZCBpcyBcImtleVwiLCB0aGVcbiAgICogb3BlcmF0b3IgaXMgXCJJblwiLCBhbmQgdGhlIHZhbHVlcyBhcnJheSBjb250YWlucyBvbmx5IFwidmFsdWVcIi4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3Iob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIFRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBub2RlIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3JcbiAqIHRoYXQgcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cywgRG9lc05vdEV4aXN0LiBHdCwgYW5kIEx0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgR3Qgb3IgTHQsIHRoZSB2YWx1ZXNcbiAgICogYXJyYXkgbXVzdCBoYXZlIGEgc2luZ2xlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW50ZWdlci5cbiAgICogVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWMgbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUHJlZmVyZW5jZU1hdGNoRmllbGRzI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblByZWZlcmVuY2VNYXRjaEZpZWxkcycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25QcmVmZXJlbmNlTWF0Y2hGaWVsZHMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICogVGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEd0IG9yIEx0LCB0aGUgdmFsdWVzXG4gICAqIGFycmF5IG11c3QgaGF2ZSBhIHNpbmdsZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzIGFuIGludGVnZXIuXG4gICAqIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIG5vZGUgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvclxuICogdGhhdCByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB7XG4gIC8qKlxuICAgKiBUaGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzLCBEb2VzTm90RXhpc3QuIEd0LCBhbmQgTHQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBHdCBvciBMdCwgdGhlIHZhbHVlc1xuICAgKiBhcnJheSBtdXN0IGhhdmUgYSBzaW5nbGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyLlxuICAgKiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpYyBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5Tm9kZUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5vZGVTZWxlY3RvclRlcm1zTWF0Y2hGaWVsZHMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eU5vZGVBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Ob2RlU2VsZWN0b3JUZXJtc01hdGNoRmllbGRzJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlOb2RlQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTm9kZVNlbGVjdG9yVGVybXNNYXRjaEZpZWxkcyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgcXVlcnkgb3ZlciBhIHNldCBvZiByZXNvdXJjZXMsIGluIHRoaXMgY2FzZSBwb2RzLlxuICogSWYgaXQncyBudWxsLCB0aGlzIFBvZEFmZmluaXR5VGVybSBtYXRjaGVzIHdpdGggbm8gUG9kcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB7XG4gIC8qKlxuICAgKiBtYXRjaEV4cHJlc3Npb25zIGlzIGEgbGlzdCBvZiBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudHMuIFRoZSByZXF1aXJlbWVudHMgYXJlIEFORGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciNtYXRjaEV4cHJlc3Npb25zXG4gICAqL1xuICByZWFkb25seSBtYXRjaEV4cHJlc3Npb25zPzogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IjbWF0Y2hMYWJlbHNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoTGFiZWxzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvciB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ21hdGNoRXhwcmVzc2lvbnMnOiBvYmoubWF0Y2hFeHByZXNzaW9ucz8ubWFwKHkgPT4gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMoeSkpLFxuICAgICdtYXRjaExhYmVscyc6ICgob2JqLm1hdGNoTGFiZWxzKSA9PT0gdW5kZWZpbmVkKSA/IHVuZGVmaW5lZCA6IChPYmplY3QuZW50cmllcyhvYmoubWF0Y2hMYWJlbHMpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIHRoZSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHRoZSB0ZXJtIGFwcGxpZXMgdG8uXG4gKiBUaGUgdGVybSBpcyBhcHBsaWVkIHRvIHRoZSB1bmlvbiBvZiB0aGUgbmFtZXNwYWNlcyBzZWxlY3RlZCBieSB0aGlzIGZpZWxkXG4gKiBhbmQgdGhlIG9uZXMgbGlzdGVkIGluIHRoZSBuYW1lc3BhY2VzIGZpZWxkLlxuICogbnVsbCBzZWxlY3RvciBhbmQgbnVsbCBvciBlbXB0eSBuYW1lc3BhY2VzIGxpc3QgbWVhbnMgXCJ0aGlzIHBvZCdzIG5hbWVzcGFjZVwiLlxuICogQW4gZW1wdHkgc2VsZWN0b3IgKHt9KSBtYXRjaGVzIGFsbCBuYW1lc3BhY2VzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBxdWVyeSBvdmVyIGEgc2V0IG9mIHJlc291cmNlcywgaW4gdGhpcyBjYXNlIHBvZHMuXG4gKiBJZiBpdCdzIG51bGwsIHRoaXMgUG9kQWZmaW5pdHlUZXJtIG1hdGNoZXMgd2l0aCBubyBQb2RzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3Ige1xuICAvKipcbiAgICogbWF0Y2hFeHByZXNzaW9ucyBpcyBhIGxpc3Qgb2YgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnRzLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoRXhwcmVzc2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoRXhwcmVzc2lvbnM/OiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yI21hdGNoTGFiZWxzXG4gICAqL1xuICByZWFkb25seSBtYXRjaExhYmVscz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3InIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3IgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdtYXRjaEV4cHJlc3Npb25zJzogb2JqLm1hdGNoRXhwcmVzc2lvbnM/Lm1hcCh5ID0+IHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyh5KSksXG4gICAgJ21hdGNoTGFiZWxzJzogKChvYmoubWF0Y2hMYWJlbHMpID09PSB1bmRlZmluZWQpID8gdW5kZWZpbmVkIDogKE9iamVjdC5lbnRyaWVzKG9iai5tYXRjaExhYmVscykucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHF1ZXJ5IG92ZXIgdGhlIHNldCBvZiBuYW1lc3BhY2VzIHRoYXQgdGhlIHRlcm0gYXBwbGllcyB0by5cbiAqIFRoZSB0ZXJtIGlzIGFwcGxpZWQgdG8gdGhlIHVuaW9uIG9mIHRoZSBuYW1lc3BhY2VzIHNlbGVjdGVkIGJ5IHRoaXMgZmllbGRcbiAqIGFuZCB0aGUgb25lcyBsaXN0ZWQgaW4gdGhlIG5hbWVzcGFjZXMgZmllbGQuXG4gKiBudWxsIHNlbGVjdG9yIGFuZCBudWxsIG9yIGVtcHR5IG5hbWVzcGFjZXMgbGlzdCBtZWFucyBcInRoaXMgcG9kJ3MgbmFtZXNwYWNlXCIuXG4gKiBBbiBlbXB0eSBzZWxlY3RvciAoe30pIG1hdGNoZXMgYWxsIG5hbWVzcGFjZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHtcbiAgLyoqXG4gICAqIG1hdGNoRXhwcmVzc2lvbnMgaXMgYSBsaXN0IG9mIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50cy4gVGhlIHJlcXVpcmVtZW50cyBhcmUgQU5EZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3IjbWF0Y2hFeHByZXNzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hFeHByZXNzaW9ucz86IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1tdO1xuXG4gIC8qKlxuICAgKiBtYXRjaExhYmVscyBpcyBhIG1hcCBvZiB7a2V5LHZhbHVlfSBwYWlycy4gQSBzaW5nbGUge2tleSx2YWx1ZX0gaW4gdGhlIG1hdGNoTGFiZWxzXG4gICAqIG1hcCBpcyBlcXVpdmFsZW50IHRvIGFuIGVsZW1lbnQgb2YgbWF0Y2hFeHByZXNzaW9ucywgd2hvc2Uga2V5IGZpZWxkIGlzIFwia2V5XCIsIHRoZVxuICAgKiBvcGVyYXRvciBpcyBcIkluXCIsIGFuZCB0aGUgdmFsdWVzIGFycmF5IGNvbnRhaW5zIG9ubHkgXCJ2YWx1ZVwiLiBUaGUgcmVxdWlyZW1lbnRzIGFyZSBBTkRlZC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvciNtYXRjaExhYmVsc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hMYWJlbHM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3RvcihvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnbWF0Y2hFeHByZXNzaW9ucyc6IG9iai5tYXRjaEV4cHJlc3Npb25zPy5tYXAoeSA9PiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKHkpKSxcbiAgICAnbWF0Y2hMYWJlbHMnOiAoKG9iai5tYXRjaExhYmVscykgPT09IHVuZGVmaW5lZCkgPyB1bmRlZmluZWQgOiAoT2JqZWN0LmVudHJpZXMob2JqLm1hdGNoTGFiZWxzKS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbkxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVJlcXVpcmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI29wZXJhdG9yXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB2YWx1ZXMgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHZhbHVlcy4gSWYgdGhlIG9wZXJhdG9yIGlzIEluIG9yIE5vdEluLFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LiBJZiB0aGUgb3BlcmF0b3IgaXMgRXhpc3RzIG9yIERvZXNOb3RFeGlzdCxcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIGVtcHR5LiBUaGlzIGFycmF5IGlzIHJlcGxhY2VkIGR1cmluZyBhIHN0cmF0ZWdpY1xuICAgKiBtZXJnZSBwYXRjaC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UmVxdWlyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvbk5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyhvYmo6IFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlSZXF1aXJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMge1xuICAvKipcbiAgICoga2V5IGlzIHRoZSBsYWJlbCBrZXkgdGhhdCB0aGUgc2VsZWN0b3IgYXBwbGllcyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyN2YWx1ZXNcbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlcz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAna2V5Jzogb2JqLmtleSxcbiAgICAnb3BlcmF0b3InOiBvYmoub3BlcmF0b3IsXG4gICAgJ3ZhbHVlcyc6IG9iai52YWx1ZXM/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQSBsYWJlbCBzZWxlY3RvciByZXF1aXJlbWVudCBpcyBhIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdmFsdWVzLCBhIGtleSwgYW5kIGFuIG9wZXJhdG9yIHRoYXRcbiAqIHJlbGF0ZXMgdGhlIGtleSBhbmQgdmFsdWVzLlxuICpcbiAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI2tleVxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIG9wZXJhdG9yIHJlcHJlc2VudHMgYSBrZXkncyByZWxhdGlvbnNoaXAgdG8gYSBzZXQgb2YgdmFsdWVzLlxuICAgKiBWYWxpZCBvcGVyYXRvcnMgYXJlIEluLCBOb3RJbiwgRXhpc3RzIGFuZCBEb2VzTm90RXhpc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjb3BlcmF0b3JcbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzLiBJZiB0aGUgb3BlcmF0b3IgaXMgSW4gb3IgTm90SW4sXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBub24tZW1wdHkuIElmIHRoZSBvcGVyYXRvciBpcyBFeGlzdHMgb3IgRG9lc05vdEV4aXN0LFxuICAgKiB0aGUgdmFsdWVzIGFycmF5IG11c3QgYmUgZW1wdHkuIFRoaXMgYXJyYXkgaXMgcmVwbGFjZWQgZHVyaW5nIGEgc3RyYXRlZ2ljXG4gICAqIG1lcmdlIHBhdGNoLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zKG9iajogVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBBIGxhYmVsIHNlbGVjdG9yIHJlcXVpcmVtZW50IGlzIGEgc2VsZWN0b3IgdGhhdCBjb250YWlucyB2YWx1ZXMsIGEga2V5LCBhbmQgYW4gb3BlcmF0b3IgdGhhdFxuICogcmVsYXRlcyB0aGUga2V5IGFuZCB2YWx1ZXMuXG4gKlxuICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybUxhYmVsU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zIHtcbiAgLyoqXG4gICAqIGtleSBpcyB0aGUgbGFiZWwga2V5IHRoYXQgdGhlIHNlbGVjdG9yIGFwcGxpZXMgdG8uXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMja2V5XG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogb3BlcmF0b3IgcmVwcmVzZW50cyBhIGtleSdzIHJlbGF0aW9uc2hpcCB0byBhIHNldCBvZiB2YWx1ZXMuXG4gICAqIFZhbGlkIG9wZXJhdG9ycyBhcmUgSW4sIE5vdEluLCBFeGlzdHMgYW5kIERvZXNOb3RFeGlzdC5cbiAgICpcbiAgICogQHNjaGVtYSBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMjdmFsdWVzXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTGFiZWxTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1MYWJlbFNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2tleSc6IG9iai5rZXksXG4gICAgJ29wZXJhdG9yJzogb2JqLm9wZXJhdG9yLFxuICAgICd2YWx1ZXMnOiBvYmoudmFsdWVzPy5tYXAoeSA9PiB5KSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEEgbGFiZWwgc2VsZWN0b3IgcmVxdWlyZW1lbnQgaXMgYSBzZWxlY3RvciB0aGF0IGNvbnRhaW5zIHZhbHVlcywgYSBrZXksIGFuZCBhbiBvcGVyYXRvciB0aGF0XG4gKiByZWxhdGVzIHRoZSBrZXkgYW5kIHZhbHVlcy5cbiAqXG4gKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyB7XG4gIC8qKlxuICAgKiBrZXkgaXMgdGhlIGxhYmVsIGtleSB0aGF0IHRoZSBzZWxlY3RvciBhcHBsaWVzIHRvLlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNrZXlcbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBvcGVyYXRvciByZXByZXNlbnRzIGEga2V5J3MgcmVsYXRpb25zaGlwIHRvIGEgc2V0IG9mIHZhbHVlcy5cbiAgICogVmFsaWQgb3BlcmF0b3JzIGFyZSBJbiwgTm90SW4sIEV4aXN0cyBhbmQgRG9lc05vdEV4aXN0LlxuICAgKlxuICAgKiBAc2NoZW1hIFZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucyNvcGVyYXRvclxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogdmFsdWVzIGlzIGFuIGFycmF5IG9mIHN0cmluZyB2YWx1ZXMuIElmIHRoZSBvcGVyYXRvciBpcyBJbiBvciBOb3RJbixcbiAgICogdGhlIHZhbHVlcyBhcnJheSBtdXN0IGJlIG5vbi1lbXB0eS4gSWYgdGhlIG9wZXJhdG9yIGlzIEV4aXN0cyBvciBEb2VzTm90RXhpc3QsXG4gICAqIHRoZSB2YWx1ZXMgYXJyYXkgbXVzdCBiZSBlbXB0eS4gVGhpcyBhcnJheSBpcyByZXBsYWNlZCBkdXJpbmcgYSBzdHJhdGVnaWNcbiAgICogbWVyZ2UgcGF0Y2guXG4gICAqXG4gICAqIEBzY2hlbWEgVmlueWxDYWNoZVNwZWNQb2RBZmZpbml0eVBvZEFudGlBZmZpbml0eVByZWZlcnJlZER1cmluZ1NjaGVkdWxpbmdJZ25vcmVkRHVyaW5nRXhlY3V0aW9uUG9kQWZmaW5pdHlUZXJtTmFtZXNwYWNlU2VsZWN0b3JNYXRjaEV4cHJlc3Npb25zI3ZhbHVlc1xuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1ZpbnlsQ2FjaGVTcGVjUG9kQWZmaW5pdHlQb2RBbnRpQWZmaW5pdHlQcmVmZXJyZWREdXJpbmdTY2hlZHVsaW5nSWdub3JlZER1cmluZ0V4ZWN1dGlvblBvZEFmZmluaXR5VGVybU5hbWVzcGFjZVNlbGVjdG9yTWF0Y2hFeHByZXNzaW9ucycgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9WaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMob2JqOiBWaW55bENhY2hlU3BlY1BvZEFmZmluaXR5UG9kQW50aUFmZmluaXR5UHJlZmVycmVkRHVyaW5nU2NoZWR1bGluZ0lnbm9yZWREdXJpbmdFeGVjdXRpb25Qb2RBZmZpbml0eVRlcm1OYW1lc3BhY2VTZWxlY3Rvck1hdGNoRXhwcmVzc2lvbnMgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdrZXknOiBvYmoua2V5LFxuICAgICdvcGVyYXRvcic6IG9iai5vcGVyYXRvcixcbiAgICAndmFsdWVzJzogb2JqLnZhbHVlcz8ubWFwKHkgPT4geSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuIl19