parse-server 9.8.1-alpha.1 → 9.9.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +60 -38
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Controllers/DatabaseController.js +5 -3
- package/lib/Options/Definitions.js +22 -1
- package/lib/Options/docs.js +8 -1
- package/lib/Options/index.js +1 -1
- package/lib/RestQuery.js +3 -1
- package/lib/Routers/AggregateRouter.js +21 -4
- package/package.json +6 -6
|
@@ -12,6 +12,7 @@ var _MongoSchemaCollection = _interopRequireDefault(require("./MongoSchemaCollec
|
|
|
12
12
|
var _MongoTransform = require("./MongoTransform");
|
|
13
13
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
14
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
|
+
var _bson = require("bson");
|
|
15
16
|
var _defaults = _interopRequireWildcard(require("../../../defaults"));
|
|
16
17
|
var _logger = _interopRequireDefault(require("../../../logger"));
|
|
17
18
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
@@ -727,24 +728,27 @@ class MongoStorageAdapter {
|
|
|
727
728
|
});
|
|
728
729
|
}).catch(err => this.handleError(err));
|
|
729
730
|
}
|
|
730
|
-
aggregate(className, schema, pipeline, readPreference, hint, explain, comment) {
|
|
731
|
+
aggregate(className, schema, pipeline, readPreference, hint, explain, comment, rawValues, rawFieldNames) {
|
|
731
732
|
validateExplainValue(explain);
|
|
733
|
+
if (rawValues) {
|
|
734
|
+
pipeline = _bson.EJSON.deserialize(pipeline);
|
|
735
|
+
}
|
|
732
736
|
let isPointerField = false;
|
|
733
737
|
pipeline = pipeline.map(stage => {
|
|
734
738
|
if (stage.$group) {
|
|
735
|
-
stage.$group = this._parseAggregateGroupArgs(schema, stage.$group);
|
|
739
|
+
stage.$group = this._parseAggregateGroupArgs(schema, stage.$group, rawFieldNames);
|
|
736
740
|
if (stage.$group._id && typeof stage.$group._id === 'string' && stage.$group._id.indexOf('$_p_') >= 0) {
|
|
737
741
|
isPointerField = true;
|
|
738
742
|
}
|
|
739
743
|
}
|
|
740
744
|
if (stage.$match) {
|
|
741
|
-
stage.$match = this._parseAggregateArgs(schema, stage.$match);
|
|
745
|
+
stage.$match = this._parseAggregateArgs(schema, stage.$match, rawValues, rawFieldNames);
|
|
742
746
|
}
|
|
743
747
|
if (stage.$project) {
|
|
744
|
-
stage.$project = this._parseAggregateProjectArgs(schema, stage.$project);
|
|
748
|
+
stage.$project = this._parseAggregateProjectArgs(schema, stage.$project, rawValues, rawFieldNames);
|
|
745
749
|
}
|
|
746
750
|
if (stage.$geoNear && stage.$geoNear.query) {
|
|
747
|
-
stage.$geoNear.query = this._parseAggregateArgs(schema, stage.$geoNear.query);
|
|
751
|
+
stage.$geoNear.query = this._parseAggregateArgs(schema, stage.$geoNear.query, rawValues, rawFieldNames);
|
|
748
752
|
}
|
|
749
753
|
return stage;
|
|
750
754
|
});
|
|
@@ -757,6 +761,9 @@ class MongoStorageAdapter {
|
|
|
757
761
|
explain,
|
|
758
762
|
comment
|
|
759
763
|
})).then(results => {
|
|
764
|
+
if (rawFieldNames) {
|
|
765
|
+
return results;
|
|
766
|
+
}
|
|
760
767
|
results.forEach(result => {
|
|
761
768
|
if (Object.prototype.hasOwnProperty.call(result, '_id')) {
|
|
762
769
|
if (isPointerField && result._id) {
|
|
@@ -770,7 +777,15 @@ class MongoStorageAdapter {
|
|
|
770
777
|
}
|
|
771
778
|
});
|
|
772
779
|
return results;
|
|
773
|
-
}).then(objects =>
|
|
780
|
+
}).then(objects => {
|
|
781
|
+
if (rawValues) {
|
|
782
|
+
return objects.map(obj => _bson.EJSON.serialize(obj));
|
|
783
|
+
}
|
|
784
|
+
if (rawFieldNames) {
|
|
785
|
+
return objects;
|
|
786
|
+
}
|
|
787
|
+
return objects.map(object => (0, _MongoTransform.mongoObjectToParseObject)(className, object, schema));
|
|
788
|
+
}).catch(err => this.handleError(err));
|
|
774
789
|
}
|
|
775
790
|
|
|
776
791
|
// This function will recursively traverse the pipeline and convert any Pointer or Date columns.
|
|
@@ -792,35 +807,40 @@ class MongoStorageAdapter {
|
|
|
792
807
|
//
|
|
793
808
|
// As much as I hate recursion...this seemed like a good fit for it. We're essentially traversing
|
|
794
809
|
// down a tree to find a "leaf node" and checking to see if it needs to be converted.
|
|
795
|
-
_parseAggregateArgs(schema, pipeline) {
|
|
810
|
+
_parseAggregateArgs(schema, pipeline, rawValues, rawFieldNames) {
|
|
796
811
|
if (pipeline === null) {
|
|
797
812
|
return null;
|
|
813
|
+
} else if (_Utils.default.isDate(pipeline)) {
|
|
814
|
+
return pipeline;
|
|
798
815
|
} else if (Array.isArray(pipeline)) {
|
|
799
|
-
return pipeline.map(value => this._parseAggregateArgs(schema, value));
|
|
816
|
+
return pipeline.map(value => this._parseAggregateArgs(schema, value, rawValues, rawFieldNames));
|
|
800
817
|
} else if (typeof pipeline === 'object') {
|
|
801
818
|
const returnValue = {};
|
|
802
819
|
for (const field in pipeline) {
|
|
803
|
-
if (schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
|
820
|
+
if (!rawFieldNames && schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
|
804
821
|
if (typeof pipeline[field] === 'object') {
|
|
805
|
-
|
|
822
|
+
returnValue[`_p_${field}`] = pipeline[field];
|
|
823
|
+
} else if (rawValues) {
|
|
806
824
|
returnValue[`_p_${field}`] = pipeline[field];
|
|
807
825
|
} else {
|
|
808
826
|
returnValue[`_p_${field}`] = `${schema.fields[field].targetClass}$${pipeline[field]}`;
|
|
809
827
|
}
|
|
810
|
-
} else if (schema.fields[field] && schema.fields[field].type === 'Date') {
|
|
828
|
+
} else if (schema.fields[field] && schema.fields[field].type === 'Date' && !rawValues) {
|
|
811
829
|
returnValue[field] = this._convertToDate(pipeline[field]);
|
|
812
830
|
} else {
|
|
813
|
-
returnValue[field] = this._parseAggregateArgs(schema, pipeline[field]);
|
|
831
|
+
returnValue[field] = this._parseAggregateArgs(schema, pipeline[field], rawValues, rawFieldNames);
|
|
814
832
|
}
|
|
815
|
-
if (
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
833
|
+
if (!rawFieldNames) {
|
|
834
|
+
if (field === 'objectId') {
|
|
835
|
+
returnValue['_id'] = returnValue[field];
|
|
836
|
+
delete returnValue[field];
|
|
837
|
+
} else if (field === 'createdAt') {
|
|
838
|
+
returnValue['_created_at'] = returnValue[field];
|
|
839
|
+
delete returnValue[field];
|
|
840
|
+
} else if (field === 'updatedAt') {
|
|
841
|
+
returnValue['_updated_at'] = returnValue[field];
|
|
842
|
+
delete returnValue[field];
|
|
843
|
+
}
|
|
824
844
|
}
|
|
825
845
|
}
|
|
826
846
|
return returnValue;
|
|
@@ -832,23 +852,25 @@ class MongoStorageAdapter {
|
|
|
832
852
|
// two functions and making the code even harder to understand, I decided to split it up. The
|
|
833
853
|
// difference with this function is we are not transforming the values, only the keys of the
|
|
834
854
|
// pipeline.
|
|
835
|
-
_parseAggregateProjectArgs(schema, pipeline) {
|
|
855
|
+
_parseAggregateProjectArgs(schema, pipeline, rawValues, rawFieldNames) {
|
|
836
856
|
const returnValue = {};
|
|
837
857
|
for (const field in pipeline) {
|
|
838
|
-
if (schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
|
858
|
+
if (!rawFieldNames && schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
|
839
859
|
returnValue[`_p_${field}`] = pipeline[field];
|
|
840
860
|
} else {
|
|
841
|
-
returnValue[field] = this._parseAggregateArgs(schema, pipeline[field]);
|
|
861
|
+
returnValue[field] = this._parseAggregateArgs(schema, pipeline[field], rawValues, rawFieldNames);
|
|
842
862
|
}
|
|
843
|
-
if (
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
863
|
+
if (!rawFieldNames) {
|
|
864
|
+
if (field === 'objectId') {
|
|
865
|
+
returnValue['_id'] = returnValue[field];
|
|
866
|
+
delete returnValue[field];
|
|
867
|
+
} else if (field === 'createdAt') {
|
|
868
|
+
returnValue['_created_at'] = returnValue[field];
|
|
869
|
+
delete returnValue[field];
|
|
870
|
+
} else if (field === 'updatedAt') {
|
|
871
|
+
returnValue['_updated_at'] = returnValue[field];
|
|
872
|
+
delete returnValue[field];
|
|
873
|
+
}
|
|
852
874
|
}
|
|
853
875
|
}
|
|
854
876
|
return returnValue;
|
|
@@ -859,16 +881,16 @@ class MongoStorageAdapter {
|
|
|
859
881
|
// The <expression> could be a column name, prefixed with the '$' character. We'll look for
|
|
860
882
|
// these <expression> and check to see if it is a 'Pointer' or if it's one of createdAt,
|
|
861
883
|
// updatedAt or objectId and change it accordingly.
|
|
862
|
-
_parseAggregateGroupArgs(schema, pipeline) {
|
|
884
|
+
_parseAggregateGroupArgs(schema, pipeline, rawFieldNames) {
|
|
863
885
|
if (Array.isArray(pipeline)) {
|
|
864
|
-
return pipeline.map(value => this._parseAggregateGroupArgs(schema, value));
|
|
886
|
+
return pipeline.map(value => this._parseAggregateGroupArgs(schema, value, rawFieldNames));
|
|
865
887
|
} else if (typeof pipeline === 'object') {
|
|
866
888
|
const returnValue = {};
|
|
867
889
|
for (const field in pipeline) {
|
|
868
|
-
returnValue[field] = this._parseAggregateGroupArgs(schema, pipeline[field]);
|
|
890
|
+
returnValue[field] = this._parseAggregateGroupArgs(schema, pipeline[field], rawFieldNames);
|
|
869
891
|
}
|
|
870
892
|
return returnValue;
|
|
871
|
-
} else if (typeof pipeline === 'string') {
|
|
893
|
+
} else if (typeof pipeline === 'string' && !rawFieldNames) {
|
|
872
894
|
const field = pipeline.substring(1);
|
|
873
895
|
if (schema.fields[field] && schema.fields[field].type === 'Pointer') {
|
|
874
896
|
return `$_p_${field}`;
|
|
@@ -1022,4 +1044,4 @@ class MongoStorageAdapter {
|
|
|
1022
1044
|
}
|
|
1023
1045
|
exports.MongoStorageAdapter = MongoStorageAdapter;
|
|
1024
1046
|
var _default = exports.default = MongoStorageAdapter;
|
|
1025
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9uZ29kYlVybCIsInJlcXVpcmUiLCJfU3RvcmFnZUFkYXB0ZXIiLCJfVXRpbHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX01vbmdvQ29sbGVjdGlvbiIsIl9Nb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJfTW9uZ29UcmFuc2Zvcm0iLCJfbm9kZSIsIl9sb2Rhc2giLCJfZGVmYXVsdHMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9sb2dnZXIiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJtb25nb2RiIiwiTW9uZ29DbGllbnQiLCJSZWFkUHJlZmVyZW5jZSIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbk5hbWUiLCJpc1RyYW5zaWVudEVycm9yIiwiZXJyb3IiLCJ0cmFuc2llbnRFcnJvck5hbWVzIiwiaW5jbHVkZXMiLCJuYW1lIiwiaGFzRXJyb3JMYWJlbCIsInN0b3JhZ2VBZGFwdGVyQWxsQ29sbGVjdGlvbnMiLCJtb25nb0FkYXB0ZXIiLCJjb25uZWN0IiwidGhlbiIsImRhdGFiYXNlIiwiY29sbGVjdGlvbnMiLCJmaWx0ZXIiLCJjb2xsZWN0aW9uIiwibmFtZXNwYWNlIiwibWF0Y2giLCJjb2xsZWN0aW9uTmFtZSIsImluZGV4T2YiLCJfY29sbGVjdGlvblByZWZpeCIsImNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEiLCJzY2hlbWEiLCJmaWVsZHMiLCJfcnBlcm0iLCJfd3Blcm0iLCJjbGFzc05hbWUiLCJfaGFzaGVkX3Bhc3N3b3JkIiwibW9uZ29TY2hlbWFGcm9tRmllbGRzQW5kQ2xhc3NOYW1lQW5kQ0xQIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiaW5kZXhlcyIsIm1vbmdvT2JqZWN0IiwiX2lkIiwib2JqZWN0SWQiLCJ1cGRhdGVkQXQiLCJjcmVhdGVkQXQiLCJfbWV0YWRhdGEiLCJ1bmRlZmluZWQiLCJmaWVsZE5hbWUiLCJ0eXBlIiwidGFyZ2V0Q2xhc3MiLCJmaWVsZE9wdGlvbnMiLCJNb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUiLCJrZXlzIiwibGVuZ3RoIiwiZmllbGRzX29wdGlvbnMiLCJjbGFzc19wZXJtaXNzaW9ucyIsInZhbGlkYXRlRXhwbGFpblZhbHVlIiwiZXhwbGFpbiIsImV4cGxhaW5BbGxvd2VkVmFsdWVzIiwiUGFyc2UiLCJFcnJvciIsIklOVkFMSURfUVVFUlkiLCJNb25nb1N0b3JhZ2VBZGFwdGVyIiwiY29uc3RydWN0b3IiLCJ1cmkiLCJkZWZhdWx0cyIsIkRlZmF1bHRNb25nb1VSSSIsImNvbGxlY3Rpb25QcmVmaXgiLCJtb25nb09wdGlvbnMiLCJfdXJpIiwiX29uY2hhbmdlIiwiX21heFRpbWVNUyIsIm1heFRpbWVNUyIsIl9iYXRjaFNpemUiLCJiYXRjaFNpemUiLCJjYW5Tb3J0T25Kb2luVGFibGVzIiwiZW5hYmxlU2NoZW1hSG9va3MiLCJzY2hlbWFDYWNoZVR0bCIsImRpc2FibGVJbmRleEZpZWxkVmFsaWRhdGlvbiIsIl9sb2dDbGllbnRFdmVudHMiLCJsb2dDbGllbnRFdmVudHMiLCJfY2xpZW50TWV0YWRhdGEiLCJjbGllbnRNZXRhZGF0YSIsIl9tb25nb09wdGlvbnMiLCJrZXkiLCJQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucyIsIndhdGNoIiwiY2FsbGJhY2siLCJjb25uZWN0aW9uUHJvbWlzZSIsImVuY29kZWRVcmkiLCJmb3JtYXRVcmwiLCJwYXJzZVVybCIsIm9wdGlvbnMiLCJkcml2ZXJJbmZvIiwidmVyc2lvbiIsImNsaWVudCIsInMiLCJkYiIsImRiTmFtZSIsIm9uIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsImV2ZW50Q29uZmlnIiwiZXZlbnQiLCJsb2dEYXRhIiwia2V5UGF0aCIsIl8iLCJsb2dMZXZlbCIsImxvZ2dlciIsImxvZ01lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwiVXRpbHMiLCJnZXRDaXJjdWxhclJlcGxhY2VyIiwiY2F0Y2giLCJlcnIiLCJQcm9taXNlIiwicmVqZWN0IiwiaGFuZGxlRXJyb3IiLCJjb2RlIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwiaGFuZGxlU2h1dGRvd24iLCJjbG9zZSIsIl9hZGFwdGl2ZUNvbGxlY3Rpb24iLCJyYXdDb2xsZWN0aW9uIiwiTW9uZ29Db2xsZWN0aW9uIiwiX3NjaGVtYUNvbGxlY3Rpb24iLCJfc3RyZWFtIiwiX21vbmdvQ29sbGVjdGlvbiIsImNsYXNzRXhpc3RzIiwibGlzdENvbGxlY3Rpb25zIiwidG9BcnJheSIsInNldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIkNMUHMiLCJzY2hlbWFDb2xsZWN0aW9uIiwidXBkYXRlU2NoZW1hIiwiJHNldCIsInNldEluZGV4ZXNXaXRoU2NoZW1hRm9ybWF0Iiwic3VibWl0dGVkSW5kZXhlcyIsImV4aXN0aW5nSW5kZXhlcyIsInJlc29sdmUiLCJfaWRfIiwiZGVsZXRlUHJvbWlzZXMiLCJpbnNlcnRlZEluZGV4ZXMiLCJmaWVsZCIsIl9fb3AiLCJwcm9taXNlIiwiZHJvcEluZGV4IiwicHVzaCIsInByb3RvdHlwZSIsInJlcGxhY2UiLCJpbnNlcnRQcm9taXNlIiwiY3JlYXRlSW5kZXhlcyIsImFsbCIsInNldEluZGV4ZXNGcm9tTW9uZ28iLCJnZXRJbmRleGVzIiwicmVkdWNlIiwib2JqIiwiaW5kZXgiLCJfZnRzIiwiX2Z0c3giLCJ3ZWlnaHRzIiwiY3JlYXRlQ2xhc3MiLCJpbnNlcnRTY2hlbWEiLCJ1cGRhdGVGaWVsZE9wdGlvbnMiLCJhZGRGaWVsZElmTm90RXhpc3RzIiwiY3JlYXRlSW5kZXhlc0lmTmVlZGVkIiwiZGVsZXRlQ2xhc3MiLCJkcm9wIiwibWVzc2FnZSIsImZpbmRBbmREZWxldGVTY2hlbWEiLCJkZWxldGVBbGxDbGFzc2VzIiwiZmFzdCIsIm1hcCIsImRlbGV0ZU1hbnkiLCJkZWxldGVGaWVsZHMiLCJmaWVsZE5hbWVzIiwibW9uZ29Gb3JtYXROYW1lcyIsImNvbGxlY3Rpb25VcGRhdGUiLCIkdW5zZXQiLCJjb2xsZWN0aW9uRmlsdGVyIiwiJG9yIiwiJGV4aXN0cyIsInNjaGVtYVVwZGF0ZSIsInVwZGF0ZU1hbnkiLCJnZXRBbGxDbGFzc2VzIiwic2NoZW1hc0NvbGxlY3Rpb24iLCJfZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEiLCJnZXRDbGFzcyIsIl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BIiwiY3JlYXRlT2JqZWN0Iiwib2JqZWN0IiwidHJhbnNhY3Rpb25hbFNlc3Npb24iLCJwYXJzZU9iamVjdFRvTW9uZ29PYmplY3RGb3JDcmVhdGUiLCJpbnNlcnRPbmUiLCJvcHMiLCJEVVBMSUNBVEVfVkFMVUUiLCJ1bmRlcmx5aW5nRXJyb3IiLCJtYXRjaGVzIiwidXNlckluZm8iLCJkdXBsaWNhdGVkX2ZpZWxkIiwiYXV0aERhdGFNYXRjaCIsImRlbGV0ZU9iamVjdHNCeVF1ZXJ5IiwicXVlcnkiLCJtb25nb1doZXJlIiwidHJhbnNmb3JtV2hlcmUiLCJkZWxldGVkQ291bnQiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidXBkYXRlT2JqZWN0c0J5UXVlcnkiLCJ1cGRhdGUiLCJtb25nb1VwZGF0ZSIsInRyYW5zZm9ybVVwZGF0ZSIsImZpbmRPbmVBbmRVcGRhdGUiLCJyZXR1cm5Eb2N1bWVudCIsInNlc3Npb24iLCJyZXN1bHQiLCJtb25nb09iamVjdFRvUGFyc2VPYmplY3QiLCJ1cHNlcnRPbmVPYmplY3QiLCJ1cHNlcnRPbmUiLCJmaW5kIiwic2tpcCIsImxpbWl0Iiwic29ydCIsInJlYWRQcmVmZXJlbmNlIiwiaGludCIsImNhc2VJbnNlbnNpdGl2ZSIsImNvbW1lbnQiLCJtb25nb1NvcnQiLCJtYXBLZXlzIiwidmFsdWUiLCJ0cmFuc2Zvcm1LZXkiLCJtb25nb0tleXMiLCJtZW1vIiwiX3BhcnNlUmVhZFByZWZlcmVuY2UiLCJjcmVhdGVUZXh0SW5kZXhlc0lmTmVlZGVkIiwib2JqZWN0cyIsImVuc3VyZUluZGV4IiwiaW5kZXhOYW1lIiwiaW5kZXhDcmVhdGlvblJlcXVlc3QiLCJtb25nb0ZpZWxkTmFtZXMiLCJpbmRleFR5cGUiLCJkZWZhdWx0T3B0aW9ucyIsImJhY2tncm91bmQiLCJzcGFyc2UiLCJpbmRleE5hbWVPcHRpb25zIiwidHRsT3B0aW9ucyIsInR0bCIsImV4cGlyZUFmdGVyU2Vjb25kcyIsInNwYXJzZU9wdGlvbnMiLCJjYXNlSW5zZW5zaXRpdmVPcHRpb25zIiwiY29sbGF0aW9uIiwiY2FzZUluc2Vuc2l0aXZlQ29sbGF0aW9uIiwicGFydGlhbEZpbHRlck9wdGlvbnMiLCJwYXJ0aWFsRmlsdGVyRXhwcmVzc2lvbiIsImluZGV4T3B0aW9ucyIsImNyZWF0ZUluZGV4IiwiZW5zdXJlVW5pcXVlbmVzcyIsIl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZCIsImVuc3VyZUF1dGhEYXRhVW5pcXVlbmVzcyIsInByb3ZpZGVyIiwidW5pcXVlIiwiX3Jhd0ZpbmQiLCJjb3VudCIsIl9lc3RpbWF0ZSIsImRpc3RpbmN0IiwiaXNQb2ludGVyRmllbGQiLCJ0cmFuc2Zvcm1GaWVsZCIsInRyYW5zZm9ybVBvaW50ZXJTdHJpbmciLCJhZ2dyZWdhdGUiLCJwaXBlbGluZSIsInN0YWdlIiwiJGdyb3VwIiwiX3BhcnNlQWdncmVnYXRlR3JvdXBBcmdzIiwiJG1hdGNoIiwiX3BhcnNlQWdncmVnYXRlQXJncyIsIiRwcm9qZWN0IiwiX3BhcnNlQWdncmVnYXRlUHJvamVjdEFyZ3MiLCIkZ2VvTmVhciIsInJlc3VsdHMiLCJzcGxpdCIsImlzRW1wdHkiLCJyZXR1cm5WYWx1ZSIsIl9jb252ZXJ0VG9EYXRlIiwic3Vic3RyaW5nIiwiaXNEYXRlIiwiaXNOYU4iLCJEYXRlIiwicGFyc2UiLCJ0b1VwcGVyQ2FzZSIsIlBSSU1BUlkiLCJQUklNQVJZX1BSRUZFUlJFRCIsIlNFQ09OREFSWSIsIlNFQ09OREFSWV9QUkVGRVJSRUQiLCJORUFSRVNUIiwicGVyZm9ybUluaXRpYWxpemF0aW9uIiwiJHRleHQiLCJ0ZXh0SW5kZXgiLCJkcm9wQWxsSW5kZXhlcyIsImRyb3BJbmRleGVzIiwidXBkYXRlU2NoZW1hV2l0aEluZGV4ZXMiLCJjbGFzc2VzIiwicHJvbWlzZXMiLCJjcmVhdGVUcmFuc2FjdGlvbmFsU2Vzc2lvbiIsInRyYW5zYWN0aW9uYWxTZWN0aW9uIiwic3RhcnRTZXNzaW9uIiwic3RhcnRUcmFuc2FjdGlvbiIsImNvbW1pdFRyYW5zYWN0aW9uYWxTZXNzaW9uIiwiY29tbWl0IiwicmV0cmllcyIsImNvbW1pdFRyYW5zYWN0aW9uIiwiZW5kU2Vzc2lvbiIsImFib3J0VHJhbnNhY3Rpb25hbFNlc3Npb24iLCJhYm9ydFRyYW5zYWN0aW9uIiwiZXhwb3J0cyIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29TdG9yYWdlQWRhcHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHsgZm9ybWF0IGFzIGZvcm1hdFVybCwgcGFyc2UgYXMgcGFyc2VVcmwgfSBmcm9tICcuLi8uLi8uLi92ZW5kb3IvbW9uZ29kYlVybCc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJ5T3B0aW9ucywgUXVlcnlUeXBlLCBTY2hlbWFUeXBlLCBTdG9yYWdlQ2xhc3MgfSBmcm9tICcuLi9TdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgeyBTdG9yYWdlQWRhcHRlciB9IGZyb20gJy4uL1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi8uLi8uLi9VdGlscyc7XG5pbXBvcnQgTW9uZ29Db2xsZWN0aW9uIGZyb20gJy4vTW9uZ29Db2xsZWN0aW9uJztcbmltcG9ydCBNb25nb1NjaGVtYUNvbGxlY3Rpb24gZnJvbSAnLi9Nb25nb1NjaGVtYUNvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0LFxuICBwYXJzZU9iamVjdFRvTW9uZ29PYmplY3RGb3JDcmVhdGUsXG4gIHRyYW5zZm9ybUtleSxcbiAgdHJhbnNmb3JtUG9pbnRlclN0cmluZyxcbiAgdHJhbnNmb3JtVXBkYXRlLFxuICB0cmFuc2Zvcm1XaGVyZSxcbn0gZnJvbSAnLi9Nb25nb1RyYW5zZm9ybSc7XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbi8vIEBmbG93LWRpc2FibGUtbmV4dFxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBkZWZhdWx0cywgeyBQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL2RlZmF1bHRzJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vLi4vLi4vbG9nZ2VyJztcblxuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5jb25zdCBtb25nb2RiID0gcmVxdWlyZSgnbW9uZ29kYicpO1xuY29uc3QgTW9uZ29DbGllbnQgPSBtb25nb2RiLk1vbmdvQ2xpZW50O1xuY29uc3QgUmVhZFByZWZlcmVuY2UgPSBtb25nb2RiLlJlYWRQcmVmZXJlbmNlO1xuXG5jb25zdCBNb25nb1NjaGVtYUNvbGxlY3Rpb25OYW1lID0gJ19TQ0hFTUEnO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgYSBNb25nb0RCIGVycm9yIGlzIGEgdHJhbnNpZW50IGluZnJhc3RydWN0dXJlIGVycm9yXG4gKiAoY29ubmVjdGlvbiBwb29sLCBuZXR3b3JrLCBzZXJ2ZXIgc2VsZWN0aW9uKSBhcyBvcHBvc2VkIHRvIGEgcXVlcnktbGV2ZWwgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIGlzVHJhbnNpZW50RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENvbm5lY3Rpb24gcG9vbCwgbmV0d29yaywgYW5kIHNlcnZlciBzZWxlY3Rpb24gZXJyb3JzXG4gIGNvbnN0IHRyYW5zaWVudEVycm9yTmFtZXMgPSBbXG4gICAgJ01vbmdvV2FpdFF1ZXVlVGltZW91dEVycm9yJyxcbiAgICAnTW9uZ29TZXJ2ZXJTZWxlY3Rpb25FcnJvcicsXG4gICAgJ01vbmdvTmV0d29ya1RpbWVvdXRFcnJvcicsXG4gICAgJ01vbmdvTmV0d29ya0Vycm9yJyxcbiAgXTtcbiAgaWYgKHRyYW5zaWVudEVycm9yTmFtZXMuaW5jbHVkZXMoZXJyb3IubmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBNb25nb0RCJ3MgdHJhbnNpZW50IHRyYW5zYWN0aW9uIGVycm9yIGxhYmVsXG4gIGlmICh0eXBlb2YgZXJyb3IuaGFzRXJyb3JMYWJlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChlcnJvci5oYXNFcnJvckxhYmVsKCdUcmFuc2llbnRUcmFuc2FjdGlvbkVycm9yJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuY29uc3Qgc3RvcmFnZUFkYXB0ZXJBbGxDb2xsZWN0aW9ucyA9IG1vbmdvQWRhcHRlciA9PiB7XG4gIHJldHVybiBtb25nb0FkYXB0ZXJcbiAgICAuY29ubmVjdCgpXG4gICAgLnRoZW4oKCkgPT4gbW9uZ29BZGFwdGVyLmRhdGFiYXNlLmNvbGxlY3Rpb25zKCkpXG4gICAgLnRoZW4oY29sbGVjdGlvbnMgPT4ge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLmZpbHRlcihjb2xsZWN0aW9uID0+IHtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24ubmFtZXNwYWNlLm1hdGNoKC9cXC5zeXN0ZW1cXC4vKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBJZiB5b3UgaGF2ZSBvbmUgYXBwIHdpdGggYSBjb2xsZWN0aW9uIHByZWZpeCB0aGF0IGhhcHBlbnMgdG8gYmUgYSBwcmVmaXggb2YgYW5vdGhlclxuICAgICAgICAvLyBhcHBzIHByZWZpeCwgdGhpcyB3aWxsIGdvIHZlcnkgdmVyeSBiYWRseS4gV2Ugc2hvdWxkIGZpeCB0aGF0IHNvbWVob3cuXG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmNvbGxlY3Rpb25OYW1lLmluZGV4T2YobW9uZ29BZGFwdGVyLl9jb2xsZWN0aW9uUHJlZml4KSA9PSAwO1xuICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5jb25zdCBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hID0gKHsgLi4uc2NoZW1hIH0pID0+IHtcbiAgZGVsZXRlIHNjaGVtYS5maWVsZHMuX3JwZXJtO1xuICBkZWxldGUgc2NoZW1hLmZpZWxkcy5fd3Blcm07XG5cbiAgaWYgKHNjaGVtYS5jbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAvLyBMZWdhY3kgbW9uZ28gYWRhcHRlciBrbm93cyBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHBhc3N3b3JkIGFuZCBfaGFzaGVkX3Bhc3N3b3JkLlxuICAgIC8vIEZ1dHVyZSBkYXRhYmFzZSBhZGFwdGVycyB3aWxsIG9ubHkga25vdyBhYm91dCBfaGFzaGVkX3Bhc3N3b3JkLlxuICAgIC8vIE5vdGU6IFBhcnNlIFNlcnZlciB3aWxsIGJyaW5nIGJhY2sgcGFzc3dvcmQgd2l0aCBpbmplY3REZWZhdWx0U2NoZW1hLCBzbyB3ZSBkb24ndCBuZWVkXG4gICAgLy8gdG8gYWRkIF9oYXNoZWRfcGFzc3dvcmQgYmFjayBldmVyLlxuICAgIGRlbGV0ZSBzY2hlbWEuZmllbGRzLl9oYXNoZWRfcGFzc3dvcmQ7XG4gIH1cblxuICByZXR1cm4gc2NoZW1hO1xufTtcblxuLy8gUmV0dXJucyB7IGNvZGUsIGVycm9yIH0gaWYgaW52YWxpZCwgb3IgeyByZXN1bHQgfSwgYW4gb2JqZWN0XG4vLyBzdWl0YWJsZSBmb3IgaW5zZXJ0aW5nIGludG8gX1NDSEVNQSBjb2xsZWN0aW9uLCBvdGhlcndpc2UuXG5jb25zdCBtb25nb1NjaGVtYUZyb21GaWVsZHNBbmRDbGFzc05hbWVBbmRDTFAgPSAoXG4gIGZpZWxkcyxcbiAgY2xhc3NOYW1lLFxuICBjbGFzc0xldmVsUGVybWlzc2lvbnMsXG4gIGluZGV4ZXNcbikgPT4ge1xuICBjb25zdCBtb25nb09iamVjdCA9IHtcbiAgICBfaWQ6IGNsYXNzTmFtZSxcbiAgICBvYmplY3RJZDogJ3N0cmluZycsXG4gICAgdXBkYXRlZEF0OiAnc3RyaW5nJyxcbiAgICBjcmVhdGVkQXQ6ICdzdHJpbmcnLFxuICAgIF9tZXRhZGF0YTogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGZvciAoY29uc3QgZmllbGROYW1lIGluIGZpZWxkcykge1xuICAgIGNvbnN0IHsgdHlwZSwgdGFyZ2V0Q2xhc3MsIC4uLmZpZWxkT3B0aW9ucyB9ID0gZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgbW9uZ29PYmplY3RbZmllbGROYW1lXSA9IE1vbmdvU2NoZW1hQ29sbGVjdGlvbi5wYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoe1xuICAgICAgdHlwZSxcbiAgICAgIHRhcmdldENsYXNzLFxuICAgIH0pO1xuICAgIGlmIChmaWVsZE9wdGlvbnMgJiYgT2JqZWN0LmtleXMoZmllbGRPcHRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICBtb25nb09iamVjdC5fbWV0YWRhdGEgPSBtb25nb09iamVjdC5fbWV0YWRhdGEgfHwge307XG4gICAgICBtb25nb09iamVjdC5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnMgPSBtb25nb09iamVjdC5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnMgfHwge307XG4gICAgICBtb25nb09iamVjdC5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnNbZmllbGROYW1lXSA9IGZpZWxkT3B0aW9ucztcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIGNsYXNzTGV2ZWxQZXJtaXNzaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtb25nb09iamVjdC5fbWV0YWRhdGEgPSBtb25nb09iamVjdC5fbWV0YWRhdGEgfHwge307XG4gICAgaWYgKCFjbGFzc0xldmVsUGVybWlzc2lvbnMpIHtcbiAgICAgIGRlbGV0ZSBtb25nb09iamVjdC5fbWV0YWRhdGEuY2xhc3NfcGVybWlzc2lvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucyA9IGNsYXNzTGV2ZWxQZXJtaXNzaW9ucztcbiAgICB9XG4gIH1cblxuICBpZiAoaW5kZXhlcyAmJiB0eXBlb2YgaW5kZXhlcyA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoaW5kZXhlcykubGVuZ3RoID4gMCkge1xuICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSA9IG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSB8fCB7fTtcbiAgICBtb25nb09iamVjdC5fbWV0YWRhdGEuaW5kZXhlcyA9IGluZGV4ZXM7XG4gIH1cblxuICBpZiAoIW1vbmdvT2JqZWN0Ll9tZXRhZGF0YSkge1xuICAgIC8vIGNsZWFudXAgdGhlIHVudXNlZCBfbWV0YWRhdGFcbiAgICBkZWxldGUgbW9uZ29PYmplY3QuX21ldGFkYXRhO1xuICB9XG5cbiAgcmV0dXJuIG1vbmdvT2JqZWN0O1xufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsYWluVmFsdWUoZXhwbGFpbikge1xuICBpZiAoZXhwbGFpbikge1xuICAgIC8vIFRoZSBsaXN0IG9mIGFsbG93ZWQgZXhwbGFpbiB2YWx1ZXMgaXMgZnJvbSBub2RlLW1vbmdvZGItbmF0aXZlL2xpYi9leHBsYWluLmpzXG4gICAgY29uc3QgZXhwbGFpbkFsbG93ZWRWYWx1ZXMgPSBbXG4gICAgICAncXVlcnlQbGFubmVyJyxcbiAgICAgICdxdWVyeVBsYW5uZXJFeHRlbmRlZCcsXG4gICAgICAnZXhlY3V0aW9uU3RhdHMnLFxuICAgICAgJ2FsbFBsYW5zRXhlY3V0aW9uJyxcbiAgICAgIGZhbHNlLFxuICAgICAgdHJ1ZSxcbiAgICBdO1xuICAgIGlmICghZXhwbGFpbkFsbG93ZWRWYWx1ZXMuaW5jbHVkZXMoZXhwbGFpbikpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnSW52YWxpZCB2YWx1ZSBmb3IgZXhwbGFpbicpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9uZ29TdG9yYWdlQWRhcHRlciBpbXBsZW1lbnRzIFN0b3JhZ2VBZGFwdGVyIHtcbiAgLy8gUHJpdmF0ZVxuICBfdXJpOiBzdHJpbmc7XG4gIF9jb2xsZWN0aW9uUHJlZml4OiBzdHJpbmc7XG4gIF9tb25nb09wdGlvbnM6IE9iamVjdDtcbiAgX29uY2hhbmdlOiBhbnk7XG4gIF9zdHJlYW06IGFueTtcbiAgX2xvZ0NsaWVudEV2ZW50czogP0FycmF5PGFueT47XG4gIF9jbGllbnRNZXRhZGF0YTogP3sgbmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcgfTtcbiAgLy8gUHVibGljXG4gIGNvbm5lY3Rpb25Qcm9taXNlOiA/UHJvbWlzZTxhbnk+O1xuICBkYXRhYmFzZTogYW55O1xuICBjbGllbnQ6IE1vbmdvQ2xpZW50O1xuICBfbWF4VGltZU1TOiA/bnVtYmVyO1xuICBfYmF0Y2hTaXplOiA/bnVtYmVyO1xuICBjYW5Tb3J0T25Kb2luVGFibGVzOiBib29sZWFuO1xuICBlbmFibGVTY2hlbWFIb29rczogYm9vbGVhbjtcbiAgc2NoZW1hQ2FjaGVUdGw6ID9udW1iZXI7XG4gIGRpc2FibGVJbmRleEZpZWxkVmFsaWRhdGlvbjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih7IHVyaSA9IGRlZmF1bHRzLkRlZmF1bHRNb25nb1VSSSwgY29sbGVjdGlvblByZWZpeCA9ICcnLCBtb25nb09wdGlvbnMgPSB7fSB9OiBhbnkpIHtcbiAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgdGhpcy5fY29sbGVjdGlvblByZWZpeCA9IGNvbGxlY3Rpb25QcmVmaXg7XG4gICAgdGhpcy5fb25jaGFuZ2UgPSAoKSA9PiB7fTtcblxuICAgIC8vIE1heFRpbWVNUyBpcyBub3QgYSBnbG9iYWwgTW9uZ29EQiBjbGllbnQgb3B0aW9uLCBpdCBpcyBhcHBsaWVkIHBlciBvcGVyYXRpb24uXG4gICAgdGhpcy5fbWF4VGltZU1TID0gbW9uZ29PcHRpb25zLm1heFRpbWVNUztcbiAgICAvLyBCYXRjaFNpemUgaXMgbm90IGEgZ2xvYmFsIE1vbmdvREIgY2xpZW50IG9wdGlvbiwgaXQgaXMgYXBwbGllZCBwZXIgY3Vyc29yIG9wZXJhdGlvbi5cbiAgICB0aGlzLl9iYXRjaFNpemUgPSBtb25nb09wdGlvbnMuYmF0Y2hTaXplO1xuICAgIHRoaXMuY2FuU29ydE9uSm9pblRhYmxlcyA9IHRydWU7XG4gICAgdGhpcy5lbmFibGVTY2hlbWFIb29rcyA9ICEhbW9uZ29PcHRpb25zLmVuYWJsZVNjaGVtYUhvb2tzO1xuICAgIHRoaXMuc2NoZW1hQ2FjaGVUdGwgPSBtb25nb09wdGlvbnMuc2NoZW1hQ2FjaGVUdGw7XG4gICAgdGhpcy5kaXNhYmxlSW5kZXhGaWVsZFZhbGlkYXRpb24gPSAhIW1vbmdvT3B0aW9ucy5kaXNhYmxlSW5kZXhGaWVsZFZhbGlkYXRpb247XG4gICAgdGhpcy5fbG9nQ2xpZW50RXZlbnRzID0gbW9uZ29PcHRpb25zLmxvZ0NsaWVudEV2ZW50cztcbiAgICB0aGlzLl9jbGllbnRNZXRhZGF0YSA9IG1vbmdvT3B0aW9ucy5jbGllbnRNZXRhZGF0YTtcblxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgbW9uZ29PcHRpb25zIGFuZCByZW1vdmUgUGFyc2UgU2VydmVyLXNwZWNpZmljIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90XG4gICAgLy8gYmUgcGFzc2VkIHRvIE1vbmdvREIgY2xpZW50LiBOb3RlOiBXZSBvbmx5IGRlbGV0ZSBmcm9tIHRoaXMuX21vbmdvT3B0aW9ucywgbm90IGZyb20gdGhlXG4gICAgLy8gb3JpZ2luYWwgbW9uZ29PcHRpb25zIG9iamVjdCwgYmVjYXVzZSBvdGhlciBjb21wb25lbnRzIChsaWtlIERhdGFiYXNlQ29udHJvbGxlcikgbmVlZFxuICAgIC8vIGFjY2VzcyB0byB0aGVzZSBvcHRpb25zLlxuICAgIHRoaXMuX21vbmdvT3B0aW9ucyA9IHsgLi4ubW9uZ29PcHRpb25zIH07XG4gICAgZm9yIChjb25zdCBrZXkgb2YgUGFyc2VTZXJ2ZXJEYXRhYmFzZU9wdGlvbnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9tb25nb09wdGlvbnNba2V5XTtcbiAgICB9XG4gIH1cblxuICB3YXRjaChjYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29uY2hhbmdlID0gY2FsbGJhY2s7XG4gIH1cblxuICBjb25uZWN0KCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25Qcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBwYXJzaW5nIGFuZCByZS1mb3JtYXR0aW5nIGNhdXNlcyB0aGUgYXV0aCB2YWx1ZSAoaWYgdGhlcmUpIHRvIGdldCBVUklcbiAgICAvLyBlbmNvZGVkXG4gICAgY29uc3QgZW5jb2RlZFVyaSA9IGZvcm1hdFVybChwYXJzZVVybCh0aGlzLl91cmkpKTtcblxuICAgIC8vIE9ubHkgdXNlIGRyaXZlckluZm8gaWYgY2xpZW50TWV0YWRhdGEgb3B0aW9uIGlzIHNldFxuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLnRoaXMuX21vbmdvT3B0aW9ucyB9O1xuICAgIGlmICh0aGlzLl9jbGllbnRNZXRhZGF0YSkge1xuICAgICAgb3B0aW9ucy5kcml2ZXJJbmZvID0ge1xuICAgICAgICBuYW1lOiB0aGlzLl9jbGllbnRNZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiB0aGlzLl9jbGllbnRNZXRhZGF0YS52ZXJzaW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuY29ubmVjdGlvblByb21pc2UgPSBNb25nb0NsaWVudC5jb25uZWN0KGVuY29kZWRVcmksIG9wdGlvbnMpXG4gICAgICAudGhlbihjbGllbnQgPT4ge1xuICAgICAgICAvLyBTdGFydGluZyBtb25nb0RCIDMuMCwgdGhlIE1vbmdvQ2xpZW50LmNvbm5lY3QgZG9uJ3QgcmV0dXJuIGEgREIgYW55bW9yZSBidXQgYSBjbGllbnRcbiAgICAgICAgLy8gRm9ydHVuYXRlbHksIHdlIGNhbiBnZXQgYmFjayB0aGUgb3B0aW9ucyBhbmQgdXNlIHRoZW0gdG8gc2VsZWN0IHRoZSBwcm9wZXIgREIuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb25nb2RiL25vZGUtbW9uZ29kYi1uYXRpdmUvYmxvYi8yYzM1ZDc2ZjA4NTc0MjI1YjhkYjAyZDdiZWY2ODcxMjNlNmJiMDE4L2xpYi9tb25nb19jbGllbnQuanMjTDg4NVxuICAgICAgICBjb25zdCBvcHRpb25zID0gY2xpZW50LnMub3B0aW9ucztcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSBjbGllbnQuZGIob3B0aW9ucy5kYk5hbWUpO1xuICAgICAgICBpZiAoIWRhdGFiYXNlKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNsaWVudC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBjbGllbnQub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZXQgdXAgY2xpZW50IGV2ZW50IGxvZ2dpbmcgaWYgY29uZmlndXJlZFxuICAgICAgICBpZiAodGhpcy5fbG9nQ2xpZW50RXZlbnRzICYmIEFycmF5LmlzQXJyYXkodGhpcy5fbG9nQ2xpZW50RXZlbnRzKSkge1xuICAgICAgICAgIHRoaXMuX2xvZ0NsaWVudEV2ZW50cy5mb3JFYWNoKGV2ZW50Q29uZmlnID0+IHtcbiAgICAgICAgICAgIGNsaWVudC5vbihldmVudENvbmZpZy5uYW1lLCBldmVudCA9PiB7XG4gICAgICAgICAgICAgIGxldCBsb2dEYXRhID0ge307XG4gICAgICAgICAgICAgIGlmICghZXZlbnRDb25maWcua2V5cyB8fCBldmVudENvbmZpZy5rZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxvZ0RhdGEgPSBldmVudDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBldmVudENvbmZpZy5rZXlzLmZvckVhY2goa2V5UGF0aCA9PiB7XG4gICAgICAgICAgICAgICAgICBsb2dEYXRhW2tleVBhdGhdID0gXy5nZXQoZXZlbnQsIGtleVBhdGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgbG9nIGxldmVsIGV4aXN0cywgZmFsbGJhY2sgdG8gJ2luZm8nXG4gICAgICAgICAgICAgIGNvbnN0IGxvZ0xldmVsID0gdHlwZW9mIGxvZ2dlcltldmVudENvbmZpZy5sb2dMZXZlbF0gPT09ICdmdW5jdGlvbicgPyBldmVudENvbmZpZy5sb2dMZXZlbCA6ICdpbmZvJztcblxuICAgICAgICAgICAgICAvLyBTYWZlIEpTT04gc2VyaWFsaXphdGlvbiB3aXRoIE1hcC9TZXQgYW5kIGNpcmN1bGFyIHJlZmVyZW5jZSBzdXBwb3J0XG4gICAgICAgICAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgTW9uZ29EQiBjbGllbnQgZXZlbnQgJHtldmVudENvbmZpZy5uYW1lfTogJHtKU09OLnN0cmluZ2lmeShsb2dEYXRhLCBVdGlscy5nZXRDaXJjdWxhclJlcGxhY2VyKCkpfWA7XG5cbiAgICAgICAgICAgICAgbG9nZ2VyW2xvZ0xldmVsXShsb2dNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIGhhbmRsZUVycm9yPFQ+KGVycm9yOiA/KEVycm9yIHwgUGFyc2UuRXJyb3IpKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKGVycm9yICYmIGVycm9yLmNvZGUgPT09IDEzKSB7XG4gICAgICAvLyBVbmF1dGhvcml6ZWQgZXJyb3JcbiAgICAgIGRlbGV0ZSB0aGlzLmNsaWVudDtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFiYXNlO1xuICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1JlY2VpdmVkIHVuYXV0aG9yaXplZCBlcnJvcicsIHsgZXJyb3I6IGVycm9yIH0pO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBpbmZyYXN0cnVjdHVyZS90cmFuc2llbnQgZXJyb3JzIGludG8gUGFyc2UuRXJyb3IuSU5URVJOQUxfU0VSVkVSX0VSUk9SXG4gICAgaWYgKGlzVHJhbnNpZW50RXJyb3IoZXJyb3IpKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0RhdGFiYXNlIHRyYW5zaWVudCBlcnJvcicsIGVycm9yKTtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdEYXRhYmFzZSBlcnJvcicpO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlU2h1dGRvd24oKSB7XG4gICAgaWYgKCF0aGlzLmNsaWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbG9zZShmYWxzZSk7XG4gICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gIH1cblxuICBfYWRhcHRpdmVDb2xsZWN0aW9uKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5kYXRhYmFzZS5jb2xsZWN0aW9uKHRoaXMuX2NvbGxlY3Rpb25QcmVmaXggKyBuYW1lKSlcbiAgICAgIC50aGVuKHJhd0NvbGxlY3Rpb24gPT4gbmV3IE1vbmdvQ29sbGVjdGlvbihyYXdDb2xsZWN0aW9uKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIF9zY2hlbWFDb2xsZWN0aW9uKCk6IFByb21pc2U8TW9uZ29TY2hlbWFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdCgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oTW9uZ29TY2hlbWFDb2xsZWN0aW9uTmFtZSkpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdHJlYW0gJiYgdGhpcy5lbmFibGVTY2hlbWFIb29rcykge1xuICAgICAgICAgIHRoaXMuX3N0cmVhbSA9IGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi53YXRjaCgpO1xuICAgICAgICAgIHRoaXMuX3N0cmVhbS5vbignY2hhbmdlJywgKCkgPT4gdGhpcy5fb25jaGFuZ2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBNb25nb1NjaGVtYUNvbGxlY3Rpb24oY29sbGVjdGlvbik7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsYXNzRXhpc3RzKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3QoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5saXN0Q29sbGVjdGlvbnMoeyBuYW1lOiB0aGlzLl9jb2xsZWN0aW9uUHJlZml4ICsgbmFtZSB9KS50b0FycmF5KCk7XG4gICAgICB9KVxuICAgICAgLnRoZW4oY29sbGVjdGlvbnMgPT4ge1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBzZXRDbGFzc0xldmVsUGVybWlzc2lvbnMoY2xhc3NOYW1lOiBzdHJpbmcsIENMUHM6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbGxlY3Rpb24gPT5cbiAgICAgICAgc2NoZW1hQ29sbGVjdGlvbi51cGRhdGVTY2hlbWEoY2xhc3NOYW1lLCB7XG4gICAgICAgICAgJHNldDogeyAnX21ldGFkYXRhLmNsYXNzX3Blcm1pc3Npb25zJzogQ0xQcyB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgc2V0SW5kZXhlc1dpdGhTY2hlbWFGb3JtYXQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc3VibWl0dGVkSW5kZXhlczogYW55LFxuICAgIGV4aXN0aW5nSW5kZXhlczogYW55ID0ge30sXG4gICAgZmllbGRzOiBhbnlcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHN1Ym1pdHRlZEluZGV4ZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMoZXhpc3RpbmdJbmRleGVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGV4aXN0aW5nSW5kZXhlcyA9IHsgX2lkXzogeyBfaWQ6IDEgfSB9O1xuICAgIH1cbiAgICBjb25zdCBkZWxldGVQcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGluc2VydGVkSW5kZXhlcyA9IFtdO1xuICAgIE9iamVjdC5rZXlzKHN1Ym1pdHRlZEluZGV4ZXMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBjb25zdCBmaWVsZCA9IHN1Ym1pdHRlZEluZGV4ZXNbbmFtZV07XG4gICAgICBpZiAoZXhpc3RpbmdJbmRleGVzW25hbWVdICYmIGZpZWxkLl9fb3AgIT09ICdEZWxldGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCBgSW5kZXggJHtuYW1lfSBleGlzdHMsIGNhbm5vdCB1cGRhdGUuYCk7XG4gICAgICB9XG4gICAgICBpZiAoIWV4aXN0aW5nSW5kZXhlc1tuYW1lXSAmJiBmaWVsZC5fX29wID09PSAnRGVsZXRlJykge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSxcbiAgICAgICAgICBgSW5kZXggJHtuYW1lfSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGRlbGV0ZS5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuZHJvcEluZGV4KGNsYXNzTmFtZSwgbmFtZSk7XG4gICAgICAgIGRlbGV0ZVByb21pc2VzLnB1c2gocHJvbWlzZSk7XG4gICAgICAgIGRlbGV0ZSBleGlzdGluZ0luZGV4ZXNbbmFtZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhmaWVsZCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0aGlzLmRpc2FibGVJbmRleEZpZWxkVmFsaWRhdGlvbiAmJlxuICAgICAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiAgICAgICAgICAgICAgZmllbGRzLFxuICAgICAgICAgICAgICBrZXkuaW5kZXhPZignX3BfJykgPT09IDAgPyBrZXkucmVwbGFjZSgnX3BfJywgJycpIDoga2V5XG4gICAgICAgICAgICApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksXG4gICAgICAgICAgICAgIGBGaWVsZCAke2tleX0gZG9lcyBub3QgZXhpc3QsIGNhbm5vdCBhZGQgaW5kZXguYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBleGlzdGluZ0luZGV4ZXNbbmFtZV0gPSBmaWVsZDtcbiAgICAgICAgaW5zZXJ0ZWRJbmRleGVzLnB1c2goe1xuICAgICAgICAgIGtleTogZmllbGQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbGV0IGluc2VydFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoaW5zZXJ0ZWRJbmRleGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGluc2VydFByb21pc2UgPSB0aGlzLmNyZWF0ZUluZGV4ZXMoY2xhc3NOYW1lLCBpbnNlcnRlZEluZGV4ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpXG4gICAgICAudGhlbigoKSA9PiBpbnNlcnRQcm9taXNlKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fc2NoZW1hQ29sbGVjdGlvbigpKVxuICAgICAgLnRoZW4oc2NoZW1hQ29sbGVjdGlvbiA9PlxuICAgICAgICBzY2hlbWFDb2xsZWN0aW9uLnVwZGF0ZVNjaGVtYShjbGFzc05hbWUsIHtcbiAgICAgICAgICAkc2V0OiB7ICdfbWV0YWRhdGEuaW5kZXhlcyc6IGV4aXN0aW5nSW5kZXhlcyB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgc2V0SW5kZXhlc0Zyb21Nb25nbyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdldEluZGV4ZXMoY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oaW5kZXhlcyA9PiB7XG4gICAgICAgIGluZGV4ZXMgPSBpbmRleGVzLnJlZHVjZSgob2JqLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGlmIChpbmRleC5rZXkuX2Z0cykge1xuICAgICAgICAgICAgZGVsZXRlIGluZGV4LmtleS5fZnRzO1xuICAgICAgICAgICAgZGVsZXRlIGluZGV4LmtleS5fZnRzeDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gaW5kZXgud2VpZ2h0cykge1xuICAgICAgICAgICAgICBpbmRleC5rZXlbZmllbGRdID0gJ3RleHQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvYmpbaW5kZXgubmFtZV0gPSBpbmRleC5rZXk7XG4gICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfSwge30pO1xuICAgICAgICByZXR1cm4gdGhpcy5fc2NoZW1hQ29sbGVjdGlvbigpLnRoZW4oc2NoZW1hQ29sbGVjdGlvbiA9PlxuICAgICAgICAgIHNjaGVtYUNvbGxlY3Rpb24udXBkYXRlU2NoZW1hKGNsYXNzTmFtZSwge1xuICAgICAgICAgICAgJHNldDogeyAnX21ldGFkYXRhLmluZGV4ZXMnOiBpbmRleGVzIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBjb2xsZWN0aW9uIG5vdCBmb3VuZFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29PYmplY3QgPSBtb25nb1NjaGVtYUZyb21GaWVsZHNBbmRDbGFzc05hbWVBbmRDTFAoXG4gICAgICBzY2hlbWEuZmllbGRzLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucyxcbiAgICAgIHNjaGVtYS5pbmRleGVzXG4gICAgKTtcbiAgICBtb25nb09iamVjdC5faWQgPSBjbGFzc05hbWU7XG4gICAgcmV0dXJuIHRoaXMuc2V0SW5kZXhlc1dpdGhTY2hlbWFGb3JtYXQoY2xhc3NOYW1lLCBzY2hlbWEuaW5kZXhlcywge30sIHNjaGVtYS5maWVsZHMpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCkpXG4gICAgICAudGhlbihzY2hlbWFDb2xsZWN0aW9uID0+IHNjaGVtYUNvbGxlY3Rpb24uaW5zZXJ0U2NoZW1hKG1vbmdvT2JqZWN0KSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkT3B0aW9ucyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIGNvbnN0IHNjaGVtYUNvbGxlY3Rpb24gPSBhd2FpdCB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCk7XG4gICAgYXdhaXQgc2NoZW1hQ29sbGVjdGlvbi51cGRhdGVGaWVsZE9wdGlvbnMoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHR5cGUpO1xuICB9XG5cbiAgYWRkRmllbGRJZk5vdEV4aXN0cyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIHR5cGU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbGxlY3Rpb24gPT4gc2NoZW1hQ29sbGVjdGlvbi5hZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZSwgZmllbGROYW1lLCB0eXBlKSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuY3JlYXRlSW5kZXhlc0lmTmVlZGVkKGNsYXNzTmFtZSwgZmllbGROYW1lLCB0eXBlKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIERyb3BzIGEgY29sbGVjdGlvbi4gUmVzb2x2ZXMgd2l0aCB0cnVlIGlmIGl0IHdhcyBhIFBhcnNlIFNjaGVtYSAoZWcuIF9Vc2VyLCBDdXN0b20sIGV0Yy4pXG4gIC8vIGFuZCByZXNvbHZlcyB3aXRoIGZhbHNlIGlmIGl0IHdhc24ndCAoZWcuIGEgam9pbiB0YWJsZSkuIFJlamVjdHMgaWYgZGVsZXRpb24gd2FzIGltcG9zc2libGUuXG4gIGRlbGV0ZUNsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi5kcm9wKCkpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgLy8gJ25zIG5vdCBmb3VuZCcgbWVhbnMgY29sbGVjdGlvbiB3YXMgYWxyZWFkeSBnb25lLiBJZ25vcmUgZGVsZXRpb24gYXR0ZW1wdC5cbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PSAnbnMgbm90IGZvdW5kJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSlcbiAgICAgICAgLy8gV2UndmUgZHJvcHBlZCB0aGUgY29sbGVjdGlvbiwgbm93IHJlbW92ZSB0aGUgX1NDSEVNQSBkb2N1bWVudFxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCkpXG4gICAgICAgIC50aGVuKHNjaGVtYUNvbGxlY3Rpb24gPT4gc2NoZW1hQ29sbGVjdGlvbi5maW5kQW5kRGVsZXRlU2NoZW1hKGNsYXNzTmFtZSkpXG4gICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxuICAgICk7XG4gIH1cblxuICBkZWxldGVBbGxDbGFzc2VzKGZhc3Q6IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gc3RvcmFnZUFkYXB0ZXJBbGxDb2xsZWN0aW9ucyh0aGlzKS50aGVuKGNvbGxlY3Rpb25zID0+XG4gICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgY29sbGVjdGlvbnMubWFwKGNvbGxlY3Rpb24gPT4gKGZhc3QgPyBjb2xsZWN0aW9uLmRlbGV0ZU1hbnkoe30pIDogY29sbGVjdGlvbi5kcm9wKCkpKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvLyBSZW1vdmUgdGhlIGNvbHVtbiBhbmQgYWxsIHRoZSBkYXRhLiBGb3IgUmVsYXRpb25zLCB0aGUgX0pvaW4gY29sbGVjdGlvbiBpcyBoYW5kbGVkXG4gIC8vIHNwZWNpYWxseSwgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZWxldGUgX0pvaW4gY29sdW1ucy4gSXQgc2hvdWxkLCBob3dldmVyLCBpbmRpY2F0ZVxuICAvLyB0aGF0IHRoZSByZWxhdGlvbiBmaWVsZHMgZG9lcyBub3QgZXhpc3QgYW55bW9yZS4gSW4gbW9uZ28sIHRoaXMgbWVhbnMgcmVtb3ZpbmcgaXQgZnJvbVxuICAvLyB0aGUgX1NDSEVNQSBjb2xsZWN0aW9uLiAgVGhlcmUgc2hvdWxkIGJlIG5vIGFjdHVhbCBkYXRhIGluIHRoZSBjb2xsZWN0aW9uIHVuZGVyIHRoZSBzYW1lIG5hbWVcbiAgLy8gYXMgdGhlIHJlbGF0aW9uIGNvbHVtbiwgc28gaXQncyBmaW5lIHRvIGF0dGVtcHQgdG8gZGVsZXRlIGl0LiBJZiB0aGUgZmllbGRzIGxpc3RlZCB0byBiZVxuICAvLyBkZWxldGVkIGRvIG5vdCBleGlzdCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHN1Y2Nlc3NmdWxseSBhbnl3YXlzLiBDaGVja2luZyBmb3JcbiAgLy8gYXR0ZW1wdHMgdG8gZGVsZXRlIG5vbi1leGlzdGVudCBmaWVsZHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIFBhcnNlIFNlcnZlci5cblxuICAvLyBQb2ludGVyIGZpZWxkIG5hbWVzIGFyZSBwYXNzZWQgZm9yIGxlZ2FjeSByZWFzb25zOiB0aGUgb3JpZ2luYWwgbW9uZ29cbiAgLy8gZm9ybWF0IHN0b3JlZCBwb2ludGVyIGZpZWxkIG5hbWVzIGRpZmZlcmVudGx5IGluIHRoZSBkYXRhYmFzZSwgYW5kIHRoZXJlZm9yZVxuICAvLyBuZWVkZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgZmllbGQgYmVmb3JlIGl0IGNvdWxkIGRlbGV0ZSBpdC4gRnV0dXJlIGRhdGFiYXNlXG4gIC8vIGFkYXB0ZXJzIHNob3VsZCBpZ25vcmUgdGhlIHBvaW50ZXJGaWVsZE5hbWVzIGFyZ3VtZW50LiBBbGwgdGhlIGZpZWxkIG5hbWVzIGFyZSBpblxuICAvLyBmaWVsZE5hbWVzLCB0aGV5IHNob3cgdXAgYWRkaXRpb25hbGx5IGluIHRoZSBwb2ludGVyRmllbGROYW1lcyBkYXRhYmFzZSBmb3IgdXNlXG4gIC8vIGJ5IHRoZSBtb25nbyBhZGFwdGVyLCB3aGljaCBkZWFscyB3aXRoIHRoZSBsZWdhY3kgbW9uZ28gZm9ybWF0LlxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgbm90IG9ibGlnYXRlZCB0byBkZWxldGUgZmllbGRzIGF0b21pY2FsbHkuIEl0IGlzIGdpdmVuIHRoZSBmaWVsZFxuICAvLyBuYW1lcyBpbiBhIGxpc3Qgc28gdGhhdCBkYXRhYmFzZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBkZWxldGluZyBmaWVsZHMgYXRvbWljYWxseVxuICAvLyBtYXkgZG8gc28uXG5cbiAgLy8gUmV0dXJucyBhIFByb21pc2UuXG4gIGRlbGV0ZUZpZWxkcyhjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBmaWVsZE5hbWVzOiBzdHJpbmdbXSkge1xuICAgIGNvbnN0IG1vbmdvRm9ybWF0TmFtZXMgPSBmaWVsZE5hbWVzLm1hcChmaWVsZE5hbWUgPT4ge1xuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgICAgcmV0dXJuIGBfcF8ke2ZpZWxkTmFtZX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBjb2xsZWN0aW9uVXBkYXRlID0geyAkdW5zZXQ6IHt9IH07XG4gICAgbW9uZ29Gb3JtYXROYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgY29sbGVjdGlvblVwZGF0ZVsnJHVuc2V0J11bbmFtZV0gPSBudWxsO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29sbGVjdGlvbkZpbHRlciA9IHsgJG9yOiBbXSB9O1xuICAgIG1vbmdvRm9ybWF0TmFtZXMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbGxlY3Rpb25GaWx0ZXJbJyRvciddLnB1c2goeyBbbmFtZV06IHsgJGV4aXN0czogdHJ1ZSB9IH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2NoZW1hVXBkYXRlID0geyAkdW5zZXQ6IHt9IH07XG4gICAgZmllbGROYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgc2NoZW1hVXBkYXRlWyckdW5zZXQnXVtuYW1lXSA9IG51bGw7XG4gICAgICBzY2hlbWFVcGRhdGVbJyR1bnNldCddW2BfbWV0YWRhdGEuZmllbGRzX29wdGlvbnMuJHtuYW1lfWBdID0gbnVsbDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLnVwZGF0ZU1hbnkoY29sbGVjdGlvbkZpbHRlciwgY29sbGVjdGlvblVwZGF0ZSkpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCkpXG4gICAgICAudGhlbihzY2hlbWFDb2xsZWN0aW9uID0+IHNjaGVtYUNvbGxlY3Rpb24udXBkYXRlU2NoZW1hKGNsYXNzTmFtZSwgc2NoZW1hVXBkYXRlKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIFJldHVybiBhIHByb21pc2UgZm9yIGFsbCBzY2hlbWFzIGtub3duIHRvIHRoaXMgYWRhcHRlciwgaW4gUGFyc2UgZm9ybWF0LiBJbiBjYXNlIHRoZVxuICAvLyBzY2hlbWFzIGNhbm5vdCBiZSByZXRyaWV2ZWQsIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVqZWN0cy4gUmVxdWlyZW1lbnRzIGZvciB0aGVcbiAgLy8gcmVqZWN0aW9uIHJlYXNvbiBhcmUgVEJELlxuICBnZXRBbGxDbGFzc2VzKCk6IFByb21pc2U8U3RvcmFnZUNsYXNzW10+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZW1hQ29sbGVjdGlvbigpXG4gICAgICAudGhlbihzY2hlbWFzQ29sbGVjdGlvbiA9PiBzY2hlbWFzQ29sbGVjdGlvbi5fZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEoKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIFJldHVybiBhIHByb21pc2UgZm9yIHRoZSBzY2hlbWEgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaW4gUGFyc2UgZm9ybWF0LiBJZlxuICAvLyB0aGlzIGFkYXB0ZXIgZG9lc24ndCBrbm93IGFib3V0IHRoZSBzY2hlbWEsIHJldHVybiBhIHByb21pc2UgdGhhdCByZWplY3RzIHdpdGhcbiAgLy8gdW5kZWZpbmVkIGFzIHRoZSByZWFzb24uXG4gIGdldENsYXNzKGNsYXNzTmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdG9yYWdlQ2xhc3M+IHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZW1hQ29sbGVjdGlvbigpXG4gICAgICAudGhlbihzY2hlbWFzQ29sbGVjdGlvbiA9PiBzY2hlbWFzQ29sbGVjdGlvbi5fZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQShjbGFzc05hbWUpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gVE9ETzogQXMgeWV0IG5vdCBwYXJ0aWN1bGFybHkgd2VsbCBzcGVjaWZpZWQuIENyZWF0ZXMgYW4gb2JqZWN0LiBNYXliZSBzaG91bGRuJ3QgZXZlbiBuZWVkIHRoZSBzY2hlbWEsXG4gIC8vIGFuZCBzaG91bGQgaW5mZXIgZnJvbSB0aGUgdHlwZS4gT3IgbWF5YmUgZG9lcyBuZWVkIHRoZSBzY2hlbWEgZm9yIHZhbGlkYXRpb25zLiBPciBtYXliZSBuZWVkc1xuICAvLyB0aGUgc2NoZW1hIG9ubHkgZm9yIHRoZSBsZWdhY3kgbW9uZ28gZm9ybWF0LiBXZSdsbCBmaWd1cmUgdGhhdCBvdXQgbGF0ZXIuXG4gIGNyZWF0ZU9iamVjdChjbGFzc05hbWU6IHN0cmluZywgc2NoZW1hOiBTY2hlbWFUeXBlLCBvYmplY3Q6IGFueSwgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnkpIHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29PYmplY3QgPSBwYXJzZU9iamVjdFRvTW9uZ29PYmplY3RGb3JDcmVhdGUoY2xhc3NOYW1lLCBvYmplY3QsIHNjaGVtYSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24uaW5zZXJ0T25lKG1vbmdvT2JqZWN0LCB0cmFuc2FjdGlvbmFsU2Vzc2lvbikpXG4gICAgICAudGhlbigoKSA9PiAoeyBvcHM6IFttb25nb09iamVjdF0gfSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMTEwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIudW5kZXJseWluZ0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9pbmRleDpbXFxzYS16QS1aMC05X1xcLVxcLl0rXFwkPyhbYS16QS1aXy1dKylfMS8pO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgICAgICAgICBlcnIudXNlckluZm8gPSB7IGR1cGxpY2F0ZWRfZmllbGQ6IG1hdGNoZXNbMV0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGZvciBhdXRoRGF0YSB1bmlxdWUgaW5kZXggdmlvbGF0aW9uc1xuICAgICAgICAgICAgaWYgKCFlcnIudXNlckluZm8pIHtcbiAgICAgICAgICAgICAgY29uc3QgYXV0aERhdGFNYXRjaCA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2luZGV4OlxccysoX2F1dGhfZGF0YV9bYS16QS1aMC05X10rX2lkKS8pO1xuICAgICAgICAgICAgICBpZiAoYXV0aERhdGFNYXRjaCkge1xuICAgICAgICAgICAgICAgIGVyci51c2VySW5mbyA9IHsgZHVwbGljYXRlZF9maWVsZDogYXV0aERhdGFNYXRjaFsxXSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gUGFyc2UgUXVlcnkuXG4gIC8vIElmIG5vIG9iamVjdHMgbWF0Y2gsIHJlamVjdCB3aXRoIE9CSkVDVF9OT1RfRk9VTkQuIElmIG9iamVjdHMgYXJlIGZvdW5kIGFuZCBkZWxldGVkLCByZXNvbHZlIHdpdGggdW5kZWZpbmVkLlxuICAvLyBJZiB0aGVyZSBpcyBzb21lIG90aGVyIGVycm9yLCByZWplY3Qgd2l0aCBJTlRFUk5BTF9TRVJWRVJfRVJST1IuXG4gIGRlbGV0ZU9iamVjdHNCeVF1ZXJ5KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4ge1xuICAgICAgICBjb25zdCBtb25nb1doZXJlID0gdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKTtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZGVsZXRlTWFueShtb25nb1doZXJlLCB0cmFuc2FjdGlvbmFsU2Vzc2lvbik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXG4gICAgICAudGhlbihcbiAgICAgICAgKHsgZGVsZXRlZENvdW50IH0pID0+IHtcbiAgICAgICAgICBpZiAoZGVsZXRlZENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdEYXRhYmFzZSBhZGFwdGVyIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICAvLyBBcHBseSB0aGUgdXBkYXRlIHRvIGFsbCBvYmplY3RzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIFBhcnNlIFF1ZXJ5LlxuICB1cGRhdGVPYmplY3RzQnlRdWVyeShcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB1cGRhdGU6IGFueSxcbiAgICB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueVxuICApIHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29VcGRhdGUgPSB0cmFuc2Zvcm1VcGRhdGUoY2xhc3NOYW1lLCB1cGRhdGUsIHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29XaGVyZSA9IHRyYW5zZm9ybVdoZXJlKGNsYXNzTmFtZSwgcXVlcnksIHNjaGVtYSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24udXBkYXRlTWFueShtb25nb1doZXJlLCBtb25nb1VwZGF0ZSwgdHJhbnNhY3Rpb25hbFNlc3Npb24pKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gQXRvbWljYWxseSBmaW5kcyBhbmQgdXBkYXRlcyBhbiBvYmplY3QgYmFzZWQgb24gcXVlcnkuXG4gIC8vIFJldHVybiB2YWx1ZSBub3QgY3VycmVudGx5IHdlbGwgc3BlY2lmaWVkLlxuICBmaW5kT25lQW5kVXBkYXRlKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHVwZGF0ZTogYW55LFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1VwZGF0ZSA9IHRyYW5zZm9ybVVwZGF0ZShjbGFzc05hbWUsIHVwZGF0ZSwgc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1doZXJlID0gdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmZpbmRPbmVBbmRVcGRhdGUobW9uZ29XaGVyZSwgbW9uZ29VcGRhdGUsIHtcbiAgICAgICAgICByZXR1cm5Eb2N1bWVudDogJ2FmdGVyJyxcbiAgICAgICAgICBzZXNzaW9uOiB0cmFuc2FjdGlvbmFsU2Vzc2lvbiB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHQgPT4gbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgcmVzdWx0LCBzY2hlbWEpKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDExMDAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdEdXBsaWNhdGUga2V5IGVycm9yOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSxcbiAgICAgICAgICAgICdBIGR1cGxpY2F0ZSB2YWx1ZSBmb3IgYSBmaWVsZCB3aXRoIHVuaXF1ZSB2YWx1ZXMgd2FzIHByb3ZpZGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLnVuZGVybHlpbmdFcnJvciA9IGVycm9yO1xuICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZXJyb3IubWVzc2FnZS5tYXRjaChcbiAgICAgICAgICAgICAgL2luZGV4OltcXHNhLXpBLVowLTlfXFwtXFwuXStcXCQ/KFthLXpBLVpfLV0rKV8xL1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzICYmIEFycmF5LmlzQXJyYXkobWF0Y2hlcykpIHtcbiAgICAgICAgICAgICAgZXJyLnVzZXJJbmZvID0geyBkdXBsaWNhdGVkX2ZpZWxkOiBtYXRjaGVzWzFdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWVyci51c2VySW5mbykge1xuICAgICAgICAgICAgICBjb25zdCBhdXRoRGF0YU1hdGNoID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvaW5kZXg6XFxzKyhfYXV0aF9kYXRhX1thLXpBLVowLTlfXStfaWQpLyk7XG4gICAgICAgICAgICAgIGlmIChhdXRoRGF0YU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgZXJyLnVzZXJJbmZvID0geyBkdXBsaWNhdGVkX2ZpZWxkOiBhdXRoRGF0YU1hdGNoWzFdIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIEhvcGVmdWxseSB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzLiBJdCdzIG9ubHkgdXNlZCBmb3IgY29uZmlnIGFuZCBob29rcy5cbiAgdXBzZXJ0T25lT2JqZWN0KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHVwZGF0ZTogYW55LFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1VwZGF0ZSA9IHRyYW5zZm9ybVVwZGF0ZShjbGFzc05hbWUsIHVwZGF0ZSwgc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1doZXJlID0gdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi51cHNlcnRPbmUobW9uZ29XaGVyZSwgbW9uZ29VcGRhdGUsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIEV4ZWN1dGVzIGEgZmluZC4gQWNjZXB0czogY2xhc3NOYW1lLCBxdWVyeSBpbiBQYXJzZSBmb3JtYXQsIGFuZCB7IHNraXAsIGxpbWl0LCBzb3J0IH0uXG4gIGZpbmQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAge1xuICAgICAgc2tpcCxcbiAgICAgIGxpbWl0LFxuICAgICAgc29ydCxcbiAgICAgIGtleXMsXG4gICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgIGhpbnQsXG4gICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICBleHBsYWluLFxuICAgICAgY29tbWVudCxcbiAgICB9OiBRdWVyeU9wdGlvbnNcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YWxpZGF0ZUV4cGxhaW5WYWx1ZShleHBsYWluKTtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29XaGVyZSA9IHRyYW5zZm9ybVdoZXJlKGNsYXNzTmFtZSwgcXVlcnksIHNjaGVtYSk7XG4gICAgY29uc3QgbW9uZ29Tb3J0ID0gXy5tYXBLZXlzKHNvcnQsICh2YWx1ZSwgZmllbGROYW1lKSA9PlxuICAgICAgdHJhbnNmb3JtS2V5KGNsYXNzTmFtZSwgZmllbGROYW1lLCBzY2hlbWEpXG4gICAgKTtcbiAgICBjb25zdCBtb25nb0tleXMgPSBfLnJlZHVjZShcbiAgICAgIGtleXMsXG4gICAgICAobWVtbywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09ICdBQ0wnKSB7XG4gICAgICAgICAgbWVtb1snX3JwZXJtJ10gPSAxO1xuICAgICAgICAgIG1lbW9bJ193cGVybSddID0gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZW1vW3RyYW5zZm9ybUtleShjbGFzc05hbWUsIGtleSwgc2NoZW1hKV0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIC8vIElmIHdlIGFyZW4ndCByZXF1ZXN0aW5nIHRoZSBgX2lkYCBmaWVsZCwgd2UgbmVlZCB0byBleHBsaWNpdGx5IG9wdCBvdXRcbiAgICAvLyBvZiBpdC4gRG9pbmcgc28gaW4gcGFyc2Utc2VydmVyIGlzIHVudXN1YWwsIGJ1dCBpdCBjYW4gYWxsb3cgdXMgdG9cbiAgICAvLyBvcHRpbWl6ZSBzb21lIHF1ZXJpZXMgd2l0aCBjb3ZlcmluZyBpbmRleGVzLlxuICAgIGlmIChrZXlzICYmICFtb25nb0tleXMuX2lkKSB7XG4gICAgICBtb25nb0tleXMuX2lkID0gMDtcbiAgICB9XG5cbiAgICByZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3BhcnNlUmVhZFByZWZlcmVuY2UocmVhZFByZWZlcmVuY2UpO1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVRleHRJbmRleGVzSWZOZWVkZWQoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSkpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+XG4gICAgICAgIGNvbGxlY3Rpb24uZmluZChtb25nb1doZXJlLCB7XG4gICAgICAgICAgc2tpcCxcbiAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICBzb3J0OiBtb25nb1NvcnQsXG4gICAgICAgICAga2V5czogbW9uZ29LZXlzLFxuICAgICAgICAgIG1heFRpbWVNUzogdGhpcy5fbWF4VGltZU1TLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5fYmF0Y2hTaXplLFxuICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgY2FzZUluc2Vuc2l0aXZlLFxuICAgICAgICAgIGV4cGxhaW4sXG4gICAgICAgICAgY29tbWVudCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC50aGVuKG9iamVjdHMgPT4ge1xuICAgICAgICBpZiAoZXhwbGFpbikge1xuICAgICAgICAgIHJldHVybiBvYmplY3RzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3RzLm1hcChvYmplY3QgPT4gbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgb2JqZWN0LCBzY2hlbWEpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBlbnN1cmVJbmRleChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgZmllbGROYW1lczogc3RyaW5nW10sXG4gICAgaW5kZXhOYW1lOiA/c3RyaW5nLFxuICAgIGNhc2VJbnNlbnNpdGl2ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgIG9wdGlvbnM/OiBPYmplY3QgPSB7fVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBpbmRleENyZWF0aW9uUmVxdWVzdCA9IHt9O1xuICAgIGNvbnN0IG1vbmdvRmllbGROYW1lcyA9IGZpZWxkTmFtZXMubWFwKGZpZWxkTmFtZSA9PiB0cmFuc2Zvcm1LZXkoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHNjaGVtYSkpO1xuICAgIG1vbmdvRmllbGROYW1lcy5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICBpbmRleENyZWF0aW9uUmVxdWVzdFtmaWVsZE5hbWVdID0gb3B0aW9ucy5pbmRleFR5cGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuaW5kZXhUeXBlIDogMTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zOiBPYmplY3QgPSB7IGJhY2tncm91bmQ6IHRydWUsIHNwYXJzZTogdHJ1ZSB9O1xuICAgIGNvbnN0IGluZGV4TmFtZU9wdGlvbnM6IE9iamVjdCA9IGluZGV4TmFtZSA/IHsgbmFtZTogaW5kZXhOYW1lIH0gOiB7fTtcbiAgICBjb25zdCB0dGxPcHRpb25zOiBPYmplY3QgPSBvcHRpb25zLnR0bCAhPT0gdW5kZWZpbmVkID8geyBleHBpcmVBZnRlclNlY29uZHM6IG9wdGlvbnMudHRsIH0gOiB7fTtcbiAgICBjb25zdCBzcGFyc2VPcHRpb25zOiBPYmplY3QgPSBvcHRpb25zLnNwYXJzZSAhPT0gdW5kZWZpbmVkID8geyBzcGFyc2U6IG9wdGlvbnMuc3BhcnNlIH0gOiB7fTtcbiAgICBjb25zdCBjYXNlSW5zZW5zaXRpdmVPcHRpb25zOiBPYmplY3QgPSBjYXNlSW5zZW5zaXRpdmVcbiAgICAgID8geyBjb2xsYXRpb246IE1vbmdvQ29sbGVjdGlvbi5jYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24oKSB9XG4gICAgICA6IHt9O1xuICAgIGNvbnN0IHBhcnRpYWxGaWx0ZXJPcHRpb25zOiBPYmplY3QgPVxuICAgICAgb3B0aW9ucy5wYXJ0aWFsRmlsdGVyRXhwcmVzc2lvbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyBwYXJ0aWFsRmlsdGVyRXhwcmVzc2lvbjogb3B0aW9ucy5wYXJ0aWFsRmlsdGVyRXhwcmVzc2lvbiB9XG4gICAgICAgIDoge307XG4gICAgY29uc3QgaW5kZXhPcHRpb25zOiBPYmplY3QgPSB7XG4gICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIC4uLmNhc2VJbnNlbnNpdGl2ZU9wdGlvbnMsXG4gICAgICAuLi5pbmRleE5hbWVPcHRpb25zLFxuICAgICAgLi4udHRsT3B0aW9ucyxcbiAgICAgIC4uLnNwYXJzZU9wdGlvbnMsXG4gICAgICAuLi5wYXJ0aWFsRmlsdGVyT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+XG4gICAgICAgIGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5jcmVhdGVJbmRleChpbmRleENyZWF0aW9uUmVxdWVzdCwgaW5kZXhPcHRpb25zKVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgdW5pcXVlIGluZGV4LiBVbmlxdWUgaW5kZXhlcyBvbiBudWxsYWJsZSBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkLiBTaW5jZSB3ZSBkb24ndFxuICAvLyBjdXJyZW50bHkga25vdyB3aGljaCBmaWVsZHMgYXJlIG51bGxhYmxlIGFuZCB3aGljaCBhcmVuJ3QsIHdlIGlnbm9yZSB0aGF0IGNyaXRlcmlhLlxuICAvLyBBcyBzdWNoLCB3ZSBzaG91bGRuJ3QgZXhwb3NlIHRoaXMgZnVuY3Rpb24gdG8gdXNlcnMgb2YgcGFyc2UgdW50aWwgd2UgaGF2ZSBhbiBvdXQtb2YtYmFuZFxuICAvLyBXYXkgb2YgZGV0ZXJtaW5pbmcgaWYgYSBmaWVsZCBpcyBudWxsYWJsZS4gVW5kZWZpbmVkIGRvZXNuJ3QgY291bnQgYWdhaW5zdCB1bmlxdWVuZXNzLFxuICAvLyB3aGljaCBpcyB3aHkgd2UgdXNlIHNwYXJzZSBpbmRleGVzLlxuICBlbnN1cmVVbmlxdWVuZXNzKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIGZpZWxkTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IGluZGV4Q3JlYXRpb25SZXF1ZXN0ID0ge307XG4gICAgY29uc3QgbW9uZ29GaWVsZE5hbWVzID0gZmllbGROYW1lcy5tYXAoZmllbGROYW1lID0+IHRyYW5zZm9ybUtleShjbGFzc05hbWUsIGZpZWxkTmFtZSwgc2NoZW1hKSk7XG4gICAgbW9uZ29GaWVsZE5hbWVzLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgIGluZGV4Q3JlYXRpb25SZXF1ZXN0W2ZpZWxkTmFtZV0gPSAxO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLl9lbnN1cmVTcGFyc2VVbmlxdWVJbmRleEluQmFja2dyb3VuZChpbmRleENyZWF0aW9uUmVxdWVzdCkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMTEwMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgICAnVHJpZWQgdG8gZW5zdXJlIGZpZWxkIHVuaXF1ZW5lc3MgZm9yIGEgY2xhc3MgdGhhdCBhbHJlYWR5IGhhcyBkdXBsaWNhdGVzLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIENyZWF0ZXMgYSB1bmlxdWUgc3BhcnNlIGluZGV4IG9uIF9hdXRoX2RhdGFfPHByb3ZpZGVyPi5pZCB0byBwcmV2ZW50XG4gIC8vIHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBzaWdudXBzIHdpdGggdGhlIHNhbWUgYXV0aERhdGEuXG4gIGVuc3VyZUF1dGhEYXRhVW5pcXVlbmVzcyhwcm92aWRlcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbignX1VzZXInKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PlxuICAgICAgICBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uY3JlYXRlSW5kZXgoXG4gICAgICAgICAgeyBbYF9hdXRoX2RhdGFfJHtwcm92aWRlcn0uaWRgXTogMSB9LFxuICAgICAgICAgIHsgdW5pcXVlOiB0cnVlLCBzcGFyc2U6IHRydWUsIGJhY2tncm91bmQ6IHRydWUsIG5hbWU6IGBfYXV0aF9kYXRhXyR7cHJvdmlkZXJ9X2lkYCB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSxcbiAgICAgICAgICAgICdUcmllZCB0byBlbnN1cmUgZmllbGQgdW5pcXVlbmVzcyBmb3IgYSBjbGFzcyB0aGF0IGFscmVhZHkgaGFzIGR1cGxpY2F0ZXMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWdub3JlIFwiaW5kZXggYWxyZWFkeSBleGlzdHMgd2l0aCBzYW1lIG5hbWVcIiBvciBcImluZGV4IGFscmVhZHkgZXhpc3RzIHdpdGggZGlmZmVyZW50IG9wdGlvbnNcIlxuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gODUgfHwgZXJyb3IuY29kZSA9PT0gODYpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gVXNlZCBpbiB0ZXN0c1xuICBfcmF3RmluZChjbGFzc05hbWU6IHN0cmluZywgcXVlcnk6IFF1ZXJ5VHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PlxuICAgICAgICBjb2xsZWN0aW9uLmZpbmQocXVlcnksIHtcbiAgICAgICAgICBtYXhUaW1lTVM6IHRoaXMuX21heFRpbWVNUyxcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuX2JhdGNoU2l6ZSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIEV4ZWN1dGVzIGEgY291bnQuXG4gIGNvdW50KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHJlYWRQcmVmZXJlbmNlOiA/c3RyaW5nLFxuICAgIF9lc3RpbWF0ZTogP2Jvb2xlYW4sXG4gICAgaGludDogP21peGVkLFxuICAgIGNvbW1lbnQ6ID9zdHJpbmdcbiAgKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIHJlYWRQcmVmZXJlbmNlID0gdGhpcy5fcGFyc2VSZWFkUHJlZmVyZW5jZShyZWFkUHJlZmVyZW5jZSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+XG4gICAgICAgIGNvbGxlY3Rpb24uY291bnQodHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hLCB0cnVlKSwge1xuICAgICAgICAgIG1heFRpbWVNUzogdGhpcy5fbWF4VGltZU1TLFxuICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgY29tbWVudCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGRpc3RpbmN0KGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIHF1ZXJ5OiBRdWVyeVR5cGUsIGZpZWxkTmFtZTogc3RyaW5nKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IGlzUG9pbnRlckZpZWxkID0gc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdICYmIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS50eXBlID09PSAnUG9pbnRlcic7XG4gICAgY29uc3QgdHJhbnNmb3JtRmllbGQgPSB0cmFuc2Zvcm1LZXkoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHNjaGVtYSk7XG5cbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5kaXN0aW5jdCh0cmFuc2Zvcm1GaWVsZCwgdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKSlcbiAgICAgIClcbiAgICAgIC50aGVuKG9iamVjdHMgPT4ge1xuICAgICAgICBvYmplY3RzID0gb2JqZWN0cy5maWx0ZXIob2JqID0+IG9iaiAhPSBudWxsKTtcbiAgICAgICAgcmV0dXJuIG9iamVjdHMubWFwKG9iamVjdCA9PiB7XG4gICAgICAgICAgaWYgKGlzUG9pbnRlckZpZWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtUG9pbnRlclN0cmluZyhzY2hlbWEsIGZpZWxkTmFtZSwgb2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdChjbGFzc05hbWUsIG9iamVjdCwgc2NoZW1hKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgYWdncmVnYXRlKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogYW55LFxuICAgIHBpcGVsaW5lOiBhbnksXG4gICAgcmVhZFByZWZlcmVuY2U6ID9zdHJpbmcsXG4gICAgaGludDogP21peGVkLFxuICAgIGV4cGxhaW4/OiBib29sZWFuLFxuICAgIGNvbW1lbnQ6ID9zdHJpbmdcbiAgKSB7XG4gICAgdmFsaWRhdGVFeHBsYWluVmFsdWUoZXhwbGFpbik7XG4gICAgbGV0IGlzUG9pbnRlckZpZWxkID0gZmFsc2U7XG4gICAgcGlwZWxpbmUgPSBwaXBlbGluZS5tYXAoc3RhZ2UgPT4ge1xuICAgICAgaWYgKHN0YWdlLiRncm91cCkge1xuICAgICAgICBzdGFnZS4kZ3JvdXAgPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUdyb3VwQXJncyhzY2hlbWEsIHN0YWdlLiRncm91cCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdGFnZS4kZ3JvdXAuX2lkICYmXG4gICAgICAgICAgdHlwZW9mIHN0YWdlLiRncm91cC5faWQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgc3RhZ2UuJGdyb3VwLl9pZC5pbmRleE9mKCckX3BfJykgPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBpc1BvaW50ZXJGaWVsZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGFnZS4kbWF0Y2gpIHtcbiAgICAgICAgc3RhZ2UuJG1hdGNoID0gdGhpcy5fcGFyc2VBZ2dyZWdhdGVBcmdzKHNjaGVtYSwgc3RhZ2UuJG1hdGNoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFnZS4kcHJvamVjdCkge1xuICAgICAgICBzdGFnZS4kcHJvamVjdCA9IHRoaXMuX3BhcnNlQWdncmVnYXRlUHJvamVjdEFyZ3Moc2NoZW1hLCBzdGFnZS4kcHJvamVjdCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJGdlb05lYXIgJiYgc3RhZ2UuJGdlb05lYXIucXVlcnkpIHtcbiAgICAgICAgc3RhZ2UuJGdlb05lYXIucXVlcnkgPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCBzdGFnZS4kZ2VvTmVhci5xdWVyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhZ2U7XG4gICAgfSk7XG4gICAgcmVhZFByZWZlcmVuY2UgPSB0aGlzLl9wYXJzZVJlYWRQcmVmZXJlbmNlKHJlYWRQcmVmZXJlbmNlKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5hZ2dyZWdhdGUocGlwZWxpbmUsIHtcbiAgICAgICAgICByZWFkUHJlZmVyZW5jZSxcbiAgICAgICAgICBtYXhUaW1lTVM6IHRoaXMuX21heFRpbWVNUyxcbiAgICAgICAgICBiYXRjaFNpemU6IHRoaXMuX2JhdGNoU2l6ZSxcbiAgICAgICAgICBoaW50LFxuICAgICAgICAgIGV4cGxhaW4sXG4gICAgICAgICAgY29tbWVudCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgJ19pZCcpKSB7XG4gICAgICAgICAgICBpZiAoaXNQb2ludGVyRmllbGQgJiYgcmVzdWx0Ll9pZCkge1xuICAgICAgICAgICAgICByZXN1bHQuX2lkID0gcmVzdWx0Ll9pZC5zcGxpdCgnJCcpWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICByZXN1bHQuX2lkID09IG51bGwgfHxcbiAgICAgICAgICAgICAgcmVzdWx0Ll9pZCA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKFsnb2JqZWN0JywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGVvZiByZXN1bHQuX2lkKSAmJiBfLmlzRW1wdHkocmVzdWx0Ll9pZCkpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9pZCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQub2JqZWN0SWQgPSByZXN1bHQuX2lkO1xuICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5faWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KVxuICAgICAgLnRoZW4ob2JqZWN0cyA9PiBvYmplY3RzLm1hcChvYmplY3QgPT4gbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgb2JqZWN0LCBzY2hlbWEpKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUgcGlwZWxpbmUgYW5kIGNvbnZlcnQgYW55IFBvaW50ZXIgb3IgRGF0ZSBjb2x1bW5zLlxuICAvLyBJZiB3ZSBkZXRlY3QgYSBwb2ludGVyIGNvbHVtbiB3ZSB3aWxsIHJlbmFtZSB0aGUgY29sdW1uIGJlaW5nIHF1ZXJpZWQgZm9yIHRvIG1hdGNoIHRoZSBjb2x1bW5cbiAgLy8gaW4gdGhlIGRhdGFiYXNlLiBXZSBhbHNvIG1vZGlmeSB0aGUgdmFsdWUgdG8gd2hhdCB3ZSBleHBlY3QgdGhlIHZhbHVlIHRvIGJlIGluIHRoZSBkYXRhYmFzZVxuICAvLyBhcyB3ZWxsLlxuICAvLyBGb3IgZGF0ZXMsIHRoZSBkcml2ZXIgZXhwZWN0cyBhIERhdGUgb2JqZWN0LCBidXQgd2UgaGF2ZSBhIHN0cmluZyBjb21pbmcgaW4uIFNvIHdlJ2xsIGNvbnZlcnRcbiAgLy8gdGhlIHN0cmluZyB0byBhIERhdGUgc28gdGhlIGRyaXZlciBjYW4gcGVyZm9ybSB0aGUgbmVjZXNzYXJ5IGNvbXBhcmlzb24uXG4gIC8vXG4gIC8vIFRoZSBnb2FsIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGxvb2sgZm9yIHRoZSBcImxlYXZlc1wiIG9mIHRoZSBwaXBlbGluZSBhbmQgZGV0ZXJtaW5lIGlmIGl0IG5lZWRzXG4gIC8vIHRvIGJlIGNvbnZlcnRlZC4gVGhlIHBpcGVsaW5lIGNhbiBoYXZlIGEgZmV3IGRpZmZlcmVudCBmb3Jtcy4gRm9yIG1vcmUgZGV0YWlscywgc2VlOlxuICAvLyAgICAgaHR0cHM6Ly9kb2NzLm1vbmdvZGIuY29tL21hbnVhbC9yZWZlcmVuY2Uvb3BlcmF0b3IvYWdncmVnYXRpb24vXG4gIC8vXG4gIC8vIElmIHRoZSBwaXBlbGluZSBpcyBhbiBhcnJheSwgaXQgbWVhbnMgd2UgYXJlIHByb2JhYmx5IHBhcnNpbmcgYW4gJyRhbmQnIG9yICckb3InIG9wZXJhdG9yLiBJblxuICAvLyB0aGF0IGNhc2Ugd2UgbmVlZCB0byBsb29wIHRocm91Z2ggYWxsIG9mIGl0J3MgY2hpbGRyZW4gdG8gZmluZCB0aGUgY29sdW1ucyBiZWluZyBvcGVyYXRlZCBvbi5cbiAgLy8gSWYgdGhlIHBpcGVsaW5lIGlzIGFuIG9iamVjdCwgdGhlbiB3ZSdsbCBsb29wIHRocm91Z2ggdGhlIGtleXMgY2hlY2tpbmcgdG8gc2VlIGlmIHRoZSBrZXkgbmFtZVxuICAvLyBtYXRjaGVzIG9uZSBvZiB0aGUgc2NoZW1hIGNvbHVtbnMuIElmIGl0IGRvZXMgbWF0Y2ggYSBjb2x1bW4gYW5kIHRoZSBjb2x1bW4gaXMgYSBQb2ludGVyIG9yXG4gIC8vIGEgRGF0ZSwgdGhlbiB3ZSdsbCBjb252ZXJ0IHRoZSB2YWx1ZSBhcyBkZXNjcmliZWQgYWJvdmUuXG4gIC8vXG4gIC8vIEFzIG11Y2ggYXMgSSBoYXRlIHJlY3Vyc2lvbi4uLnRoaXMgc2VlbWVkIGxpa2UgYSBnb29kIGZpdCBmb3IgaXQuIFdlJ3JlIGVzc2VudGlhbGx5IHRyYXZlcnNpbmdcbiAgLy8gZG93biBhIHRyZWUgdG8gZmluZCBhIFwibGVhZiBub2RlXCIgYW5kIGNoZWNraW5nIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQuXG4gIF9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hOiBhbnksIHBpcGVsaW5lOiBhbnkpOiBhbnkge1xuICAgIGlmIChwaXBlbGluZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBpcGVsaW5lKSkge1xuICAgICAgcmV0dXJuIHBpcGVsaW5lLm1hcCh2YWx1ZSA9PiB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCB2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBpcGVsaW5lID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gcGlwZWxpbmUpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgcGlwZWxpbmVbZmllbGRdID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUGFzcyBvYmplY3RzIGRvd24gdG8gTW9uZ29EQi4uLnRoaXMgaXMgbW9yZSB0aGFuIGxpa2VseSBhbiAkZXhpc3RzIG9wZXJhdG9yLlxuICAgICAgICAgICAgcmV0dXJuVmFsdWVbYF9wXyR7ZmllbGR9YF0gPSBwaXBlbGluZVtmaWVsZF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlW2BfcF8ke2ZpZWxkfWBdID0gYCR7c2NoZW1hLmZpZWxkc1tmaWVsZF0udGFyZ2V0Q2xhc3N9JCR7cGlwZWxpbmVbZmllbGRdfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdEYXRlJykge1xuICAgICAgICAgIHJldHVyblZhbHVlW2ZpZWxkXSA9IHRoaXMuX2NvbnZlcnRUb0RhdGUocGlwZWxpbmVbZmllbGRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZVtmaWVsZF0gPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCBwaXBlbGluZVtmaWVsZF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpZWxkID09PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWVbJ19pZCddID0gcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICAgIGRlbGV0ZSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdjcmVhdGVkQXQnKSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWVbJ19jcmVhdGVkX2F0J10gPSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgICAgZGVsZXRlIHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ3VwZGF0ZWRBdCcpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZVsnX3VwZGF0ZWRfYXQnXSA9IHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgICBkZWxldGUgcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBwaXBlbGluZTtcbiAgfVxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIG9uZSBhYm92ZS4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNvbWJpbmUgdGhlc2VcbiAgLy8gdHdvIGZ1bmN0aW9ucyBhbmQgbWFraW5nIHRoZSBjb2RlIGV2ZW4gaGFyZGVyIHRvIHVuZGVyc3RhbmQsIEkgZGVjaWRlZCB0byBzcGxpdCBpdCB1cC4gVGhlXG4gIC8vIGRpZmZlcmVuY2Ugd2l0aCB0aGlzIGZ1bmN0aW9uIGlzIHdlIGFyZSBub3QgdHJhbnNmb3JtaW5nIHRoZSB2YWx1ZXMsIG9ubHkgdGhlIGtleXMgb2YgdGhlXG4gIC8vIHBpcGVsaW5lLlxuICBfcGFyc2VBZ2dyZWdhdGVQcm9qZWN0QXJncyhzY2hlbWE6IGFueSwgcGlwZWxpbmU6IGFueSk6IGFueSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHBpcGVsaW5lKSB7XG4gICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZF0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICAgIHJldHVyblZhbHVlW2BfcF8ke2ZpZWxkfWBdID0gcGlwZWxpbmVbZmllbGRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuVmFsdWVbZmllbGRdID0gdGhpcy5fcGFyc2VBZ2dyZWdhdGVBcmdzKHNjaGVtYSwgcGlwZWxpbmVbZmllbGRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkID09PSAnb2JqZWN0SWQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlWydfaWQnXSA9IHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgZGVsZXRlIHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdjcmVhdGVkQXQnKSB7XG4gICAgICAgIHJldHVyblZhbHVlWydfY3JlYXRlZF9hdCddID0gcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICBkZWxldGUgcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ3VwZGF0ZWRBdCcpIHtcbiAgICAgICAgcmV0dXJuVmFsdWVbJ191cGRhdGVkX2F0J10gPSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgIGRlbGV0ZSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIHR3byBhYm92ZS4gTW9uZ29EQiAkZ3JvdXAgYWdncmVnYXRlIGxvb2tzIGxpa2U6XG4gIC8vICAgICB7ICRncm91cDogeyBfaWQ6IDxleHByZXNzaW9uPiwgPGZpZWxkMT46IHsgPGFjY3VtdWxhdG9yMT4gOiA8ZXhwcmVzc2lvbjE+IH0sIC4uLiB9IH1cbiAgLy8gVGhlIDxleHByZXNzaW9uPiBjb3VsZCBiZSBhIGNvbHVtbiBuYW1lLCBwcmVmaXhlZCB3aXRoIHRoZSAnJCcgY2hhcmFjdGVyLiBXZSdsbCBsb29rIGZvclxuICAvLyB0aGVzZSA8ZXhwcmVzc2lvbj4gYW5kIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyBhICdQb2ludGVyJyBvciBpZiBpdCdzIG9uZSBvZiBjcmVhdGVkQXQsXG4gIC8vIHVwZGF0ZWRBdCBvciBvYmplY3RJZCBhbmQgY2hhbmdlIGl0IGFjY29yZGluZ2x5LlxuICBfcGFyc2VBZ2dyZWdhdGVHcm91cEFyZ3Moc2NoZW1hOiBhbnksIHBpcGVsaW5lOiBhbnkpOiBhbnkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHBpcGVsaW5lKSkge1xuICAgICAgcmV0dXJuIHBpcGVsaW5lLm1hcCh2YWx1ZSA9PiB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUdyb3VwQXJncyhzY2hlbWEsIHZhbHVlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGlwZWxpbmUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBwaXBlbGluZSkge1xuICAgICAgICByZXR1cm5WYWx1ZVtmaWVsZF0gPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUdyb3VwQXJncyhzY2hlbWEsIHBpcGVsaW5lW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGlwZWxpbmUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHBpcGVsaW5lLnN1YnN0cmluZygxKTtcbiAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgICAgcmV0dXJuIGAkX3BfJHtmaWVsZH1gO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PSAnY3JlYXRlZEF0Jykge1xuICAgICAgICByZXR1cm4gJyRfY3JlYXRlZF9hdCc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkID09ICd1cGRhdGVkQXQnKSB7XG4gICAgICAgIHJldHVybiAnJF91cGRhdGVkX2F0JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBpcGVsaW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IGNvbnZlcnRzIHZhbHVlcyB0byBEYXRlIG9iamVjdHMuIFNpbmNlIHRoZSBwYXNzZWQgb2JqZWN0IGlzIHBhcnQgb2YgYW4gYWdncmVnYXRpb25cbiAgICogcGlwZWxpbmUgYW5kIGNhbiBjb250YWluIHZhcmlvdXMgbG9naWMgb3BlcmF0b3JzIChsaWtlICRndCwgJGx0LCBldGMpLCB0aGlzIGZ1bmN0aW9uIHdpbGxcbiAgICogdHJhdmVyc2UgdGhlIG9iamVjdCBhbmQgY29udmVydCBhbnkgc3RyaW5ncyB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgZGF0ZXMgaW50byBEYXRlIG9iamVjdHMuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge2FueX0gVGhlIG9yaWdpbmFsIHZhbHVlIGlmIG5vdCBjb252ZXJ0aWJsZSB0byBEYXRlLCBvciBhIERhdGUgb2JqZWN0IGlmIGl0IGlzLlxuICAgKi9cbiAgX2NvbnZlcnRUb0RhdGUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKFV0aWxzLmlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkgPyB2YWx1ZSA6IG5ldyBEYXRlKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0ge307XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHZhbHVlKSB7XG4gICAgICAgIHJldHVyblZhbHVlW2ZpZWxkXSA9IHRoaXMuX2NvbnZlcnRUb0RhdGUodmFsdWVbZmllbGRdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgX3BhcnNlUmVhZFByZWZlcmVuY2UocmVhZFByZWZlcmVuY2U6ID9zdHJpbmcpOiA/c3RyaW5nIHtcbiAgICBpZiAocmVhZFByZWZlcmVuY2UpIHtcbiAgICAgIHJlYWRQcmVmZXJlbmNlID0gcmVhZFByZWZlcmVuY2UudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgc3dpdGNoIChyZWFkUHJlZmVyZW5jZSkge1xuICAgICAgY2FzZSAnUFJJTUFSWSc6XG4gICAgICAgIHJlYWRQcmVmZXJlbmNlID0gUmVhZFByZWZlcmVuY2UuUFJJTUFSWTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUklNQVJZX1BSRUZFUlJFRCc6XG4gICAgICAgIHJlYWRQcmVmZXJlbmNlID0gUmVhZFByZWZlcmVuY2UuUFJJTUFSWV9QUkVGRVJSRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0VDT05EQVJZJzpcbiAgICAgICAgcmVhZFByZWZlcmVuY2UgPSBSZWFkUHJlZmVyZW5jZS5TRUNPTkRBUlk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0VDT05EQVJZX1BSRUZFUlJFRCc6XG4gICAgICAgIHJlYWRQcmVmZXJlbmNlID0gUmVhZFByZWZlcmVuY2UuU0VDT05EQVJZX1BSRUZFUlJFRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdORUFSRVNUJzpcbiAgICAgICAgcmVhZFByZWZlcmVuY2UgPSBSZWFkUHJlZmVyZW5jZS5ORUFSRVNUO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgY2FzZSBudWxsOlxuICAgICAgY2FzZSAnJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ05vdCBzdXBwb3J0ZWQgcmVhZCBwcmVmZXJlbmNlLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICBwZXJmb3JtSW5pdGlhbGl6YXRpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY3JlYXRlSW5kZXgoY2xhc3NOYW1lOiBzdHJpbmcsIGluZGV4OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4KSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGNyZWF0ZUluZGV4ZXMoY2xhc3NOYW1lOiBzdHJpbmcsIGluZGV4ZXM6IGFueSkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uY3JlYXRlSW5kZXhlcyhpbmRleGVzKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGNyZWF0ZUluZGV4ZXNJZk5lZWRlZChjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIGlmICh0eXBlICYmIHR5cGUudHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICBjb25zdCBpbmRleCA9IHtcbiAgICAgICAgW2ZpZWxkTmFtZV06ICcyZHNwaGVyZScsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSW5kZXgoY2xhc3NOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIGNyZWF0ZVRleHRJbmRleGVzSWZOZWVkZWQoY2xhc3NOYW1lOiBzdHJpbmcsIHF1ZXJ5OiBRdWVyeVR5cGUsIHNjaGVtYTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gcXVlcnkpIHtcbiAgICAgIGlmICghcXVlcnlbZmllbGROYW1lXSB8fCAhcXVlcnlbZmllbGROYW1lXS4kdGV4dCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4aXN0aW5nSW5kZXhlcyA9IHNjaGVtYS5pbmRleGVzO1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXhpc3RpbmdJbmRleGVzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZXhpc3RpbmdJbmRleGVzW2tleV07XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5kZXgsIGZpZWxkTmFtZSkpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4TmFtZSA9IGAke2ZpZWxkTmFtZX1fdGV4dGA7XG4gICAgICBjb25zdCB0ZXh0SW5kZXggPSB7XG4gICAgICAgIFtpbmRleE5hbWVdOiB7IFtmaWVsZE5hbWVdOiAndGV4dCcgfSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5zZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdChcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICB0ZXh0SW5kZXgsXG4gICAgICAgIGV4aXN0aW5nSW5kZXhlcyxcbiAgICAgICAgc2NoZW1hLmZpZWxkc1xuICAgICAgKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSA4NSkge1xuICAgICAgICAgIC8vIEluZGV4IGV4aXN0IHdpdGggZGlmZmVyZW50IG9wdGlvbnNcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZXRJbmRleGVzRnJvbU1vbmdvKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0SW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uaW5kZXhlcygpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgZHJvcEluZGV4KGNsYXNzTmFtZTogc3RyaW5nLCBpbmRleDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5kcm9wSW5kZXgoaW5kZXgpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgZHJvcEFsbEluZGV4ZXMoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmRyb3BJbmRleGVzKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICB1cGRhdGVTY2hlbWFXaXRoSW5kZXhlcygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmdldEFsbENsYXNzZXMoKVxuICAgICAgLnRoZW4oY2xhc3NlcyA9PiB7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gY2xhc3Nlcy5tYXAoc2NoZW1hID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZXRJbmRleGVzRnJvbU1vbmdvKHNjaGVtYS5jbGFzc05hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBjcmVhdGVUcmFuc2FjdGlvbmFsU2Vzc2lvbigpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uYWxTZWN0aW9uID0gdGhpcy5jbGllbnQuc3RhcnRTZXNzaW9uKCk7XG4gICAgdHJhbnNhY3Rpb25hbFNlY3Rpb24uc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJhbnNhY3Rpb25hbFNlY3Rpb24pO1xuICB9XG5cbiAgY29tbWl0VHJhbnNhY3Rpb25hbFNlc3Npb24odHJhbnNhY3Rpb25hbFNlY3Rpb246IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1pdCA9IHJldHJpZXMgPT4ge1xuICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uYWxTZWN0aW9uXG4gICAgICAgIC5jb21taXRUcmFuc2FjdGlvbigpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmhhc0Vycm9yTGFiZWwoJ1RyYW5zaWVudFRyYW5zYWN0aW9uRXJyb3InKSAmJiByZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbW1pdChyZXRyaWVzIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgdHJhbnNhY3Rpb25hbFNlY3Rpb24uZW5kU2Vzc2lvbigpO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBjb21taXQoNSk7XG4gIH1cblxuICBhYm9ydFRyYW5zYWN0aW9uYWxTZXNzaW9uKHRyYW5zYWN0aW9uYWxTZWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb25hbFNlY3Rpb24uYWJvcnRUcmFuc2FjdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgdHJhbnNhY3Rpb25hbFNlY3Rpb24uZW5kU2Vzc2lvbigpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE1vbmdvU3RvcmFnZUFkYXB0ZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLGVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJ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
|
|
1047
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9uZ29kYlVybCIsInJlcXVpcmUiLCJfU3RvcmFnZUFkYXB0ZXIiLCJfVXRpbHMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX01vbmdvQ29sbGVjdGlvbiIsIl9Nb25nb1NjaGVtYUNvbGxlY3Rpb24iLCJfTW9uZ29UcmFuc2Zvcm0iLCJfbm9kZSIsIl9sb2Rhc2giLCJfYnNvbiIsIl9kZWZhdWx0cyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2xvZ2dlciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm1vbmdvZGIiLCJNb25nb0NsaWVudCIsIlJlYWRQcmVmZXJlbmNlIiwiTW9uZ29TY2hlbWFDb2xsZWN0aW9uTmFtZSIsImlzVHJhbnNpZW50RXJyb3IiLCJlcnJvciIsInRyYW5zaWVudEVycm9yTmFtZXMiLCJpbmNsdWRlcyIsIm5hbWUiLCJoYXNFcnJvckxhYmVsIiwic3RvcmFnZUFkYXB0ZXJBbGxDb2xsZWN0aW9ucyIsIm1vbmdvQWRhcHRlciIsImNvbm5lY3QiLCJ0aGVuIiwiZGF0YWJhc2UiLCJjb2xsZWN0aW9ucyIsImZpbHRlciIsImNvbGxlY3Rpb24iLCJuYW1lc3BhY2UiLCJtYXRjaCIsImNvbGxlY3Rpb25OYW1lIiwiaW5kZXhPZiIsIl9jb2xsZWN0aW9uUHJlZml4IiwiY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYSIsInNjaGVtYSIsImZpZWxkcyIsIl9ycGVybSIsIl93cGVybSIsImNsYXNzTmFtZSIsIl9oYXNoZWRfcGFzc3dvcmQiLCJtb25nb1NjaGVtYUZyb21GaWVsZHNBbmRDbGFzc05hbWVBbmRDTFAiLCJjbGFzc0xldmVsUGVybWlzc2lvbnMiLCJpbmRleGVzIiwibW9uZ29PYmplY3QiLCJfaWQiLCJvYmplY3RJZCIsInVwZGF0ZWRBdCIsImNyZWF0ZWRBdCIsIl9tZXRhZGF0YSIsInVuZGVmaW5lZCIsImZpZWxkTmFtZSIsInR5cGUiLCJ0YXJnZXRDbGFzcyIsImZpZWxkT3B0aW9ucyIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbiIsInBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSIsImtleXMiLCJsZW5ndGgiLCJmaWVsZHNfb3B0aW9ucyIsImNsYXNzX3Blcm1pc3Npb25zIiwidmFsaWRhdGVFeHBsYWluVmFsdWUiLCJleHBsYWluIiwiZXhwbGFpbkFsbG93ZWRWYWx1ZXMiLCJQYXJzZSIsIkVycm9yIiwiSU5WQUxJRF9RVUVSWSIsIk1vbmdvU3RvcmFnZUFkYXB0ZXIiLCJjb25zdHJ1Y3RvciIsInVyaSIsImRlZmF1bHRzIiwiRGVmYXVsdE1vbmdvVVJJIiwiY29sbGVjdGlvblByZWZpeCIsIm1vbmdvT3B0aW9ucyIsIl91cmkiLCJfb25jaGFuZ2UiLCJfbWF4VGltZU1TIiwibWF4VGltZU1TIiwiX2JhdGNoU2l6ZSIsImJhdGNoU2l6ZSIsImNhblNvcnRPbkpvaW5UYWJsZXMiLCJlbmFibGVTY2hlbWFIb29rcyIsInNjaGVtYUNhY2hlVHRsIiwiZGlzYWJsZUluZGV4RmllbGRWYWxpZGF0aW9uIiwiX2xvZ0NsaWVudEV2ZW50cyIsImxvZ0NsaWVudEV2ZW50cyIsIl9jbGllbnRNZXRhZGF0YSIsImNsaWVudE1ldGFkYXRhIiwiX21vbmdvT3B0aW9ucyIsImtleSIsIlBhcnNlU2VydmVyRGF0YWJhc2VPcHRpb25zIiwid2F0Y2giLCJjYWxsYmFjayIsImNvbm5lY3Rpb25Qcm9taXNlIiwiZW5jb2RlZFVyaSIsImZvcm1hdFVybCIsInBhcnNlVXJsIiwib3B0aW9ucyIsImRyaXZlckluZm8iLCJ2ZXJzaW9uIiwiY2xpZW50IiwicyIsImRiIiwiZGJOYW1lIiwib24iLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiZXZlbnRDb25maWciLCJldmVudCIsImxvZ0RhdGEiLCJrZXlQYXRoIiwiXyIsImxvZ0xldmVsIiwibG9nZ2VyIiwibG9nTWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJVdGlscyIsImdldENpcmN1bGFyUmVwbGFjZXIiLCJjYXRjaCIsImVyciIsIlByb21pc2UiLCJyZWplY3QiLCJoYW5kbGVFcnJvciIsImNvZGUiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJoYW5kbGVTaHV0ZG93biIsImNsb3NlIiwiX2FkYXB0aXZlQ29sbGVjdGlvbiIsInJhd0NvbGxlY3Rpb24iLCJNb25nb0NvbGxlY3Rpb24iLCJfc2NoZW1hQ29sbGVjdGlvbiIsIl9zdHJlYW0iLCJfbW9uZ29Db2xsZWN0aW9uIiwiY2xhc3NFeGlzdHMiLCJsaXN0Q29sbGVjdGlvbnMiLCJ0b0FycmF5Iiwic2V0Q2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiQ0xQcyIsInNjaGVtYUNvbGxlY3Rpb24iLCJ1cGRhdGVTY2hlbWEiLCIkc2V0Iiwic2V0SW5kZXhlc1dpdGhTY2hlbWFGb3JtYXQiLCJzdWJtaXR0ZWRJbmRleGVzIiwiZXhpc3RpbmdJbmRleGVzIiwicmVzb2x2ZSIsIl9pZF8iLCJkZWxldGVQcm9taXNlcyIsImluc2VydGVkSW5kZXhlcyIsImZpZWxkIiwiX19vcCIsInByb21pc2UiLCJkcm9wSW5kZXgiLCJwdXNoIiwicHJvdG90eXBlIiwicmVwbGFjZSIsImluc2VydFByb21pc2UiLCJjcmVhdGVJbmRleGVzIiwiYWxsIiwic2V0SW5kZXhlc0Zyb21Nb25nbyIsImdldEluZGV4ZXMiLCJyZWR1Y2UiLCJvYmoiLCJpbmRleCIsIl9mdHMiLCJfZnRzeCIsIndlaWdodHMiLCJjcmVhdGVDbGFzcyIsImluc2VydFNjaGVtYSIsInVwZGF0ZUZpZWxkT3B0aW9ucyIsImFkZEZpZWxkSWZOb3RFeGlzdHMiLCJjcmVhdGVJbmRleGVzSWZOZWVkZWQiLCJkZWxldGVDbGFzcyIsImRyb3AiLCJtZXNzYWdlIiwiZmluZEFuZERlbGV0ZVNjaGVtYSIsImRlbGV0ZUFsbENsYXNzZXMiLCJmYXN0IiwibWFwIiwiZGVsZXRlTWFueSIsImRlbGV0ZUZpZWxkcyIsImZpZWxkTmFtZXMiLCJtb25nb0Zvcm1hdE5hbWVzIiwiY29sbGVjdGlvblVwZGF0ZSIsIiR1bnNldCIsImNvbGxlY3Rpb25GaWx0ZXIiLCIkb3IiLCIkZXhpc3RzIiwic2NoZW1hVXBkYXRlIiwidXBkYXRlTWFueSIsImdldEFsbENsYXNzZXMiLCJzY2hlbWFzQ29sbGVjdGlvbiIsIl9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSIsImdldENsYXNzIiwiX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEiLCJjcmVhdGVPYmplY3QiLCJvYmplY3QiLCJ0cmFuc2FjdGlvbmFsU2Vzc2lvbiIsInBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZSIsImluc2VydE9uZSIsIm9wcyIsIkRVUExJQ0FURV9WQUxVRSIsInVuZGVybHlpbmdFcnJvciIsIm1hdGNoZXMiLCJ1c2VySW5mbyIsImR1cGxpY2F0ZWRfZmllbGQiLCJhdXRoRGF0YU1hdGNoIiwiZGVsZXRlT2JqZWN0c0J5UXVlcnkiLCJxdWVyeSIsIm1vbmdvV2hlcmUiLCJ0cmFuc2Zvcm1XaGVyZSIsImRlbGV0ZWRDb3VudCIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ1cGRhdGVPYmplY3RzQnlRdWVyeSIsInVwZGF0ZSIsIm1vbmdvVXBkYXRlIiwidHJhbnNmb3JtVXBkYXRlIiwiZmluZE9uZUFuZFVwZGF0ZSIsInJldHVybkRvY3VtZW50Iiwic2Vzc2lvbiIsInJlc3VsdCIsIm1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCIsInVwc2VydE9uZU9iamVjdCIsInVwc2VydE9uZSIsImZpbmQiLCJza2lwIiwibGltaXQiLCJzb3J0IiwicmVhZFByZWZlcmVuY2UiLCJoaW50IiwiY2FzZUluc2Vuc2l0aXZlIiwiY29tbWVudCIsIm1vbmdvU29ydCIsIm1hcEtleXMiLCJ2YWx1ZSIsInRyYW5zZm9ybUtleSIsIm1vbmdvS2V5cyIsIm1lbW8iLCJfcGFyc2VSZWFkUHJlZmVyZW5jZSIsImNyZWF0ZVRleHRJbmRleGVzSWZOZWVkZWQiLCJvYmplY3RzIiwiZW5zdXJlSW5kZXgiLCJpbmRleE5hbWUiLCJpbmRleENyZWF0aW9uUmVxdWVzdCIsIm1vbmdvRmllbGROYW1lcyIsImluZGV4VHlwZSIsImRlZmF1bHRPcHRpb25zIiwiYmFja2dyb3VuZCIsInNwYXJzZSIsImluZGV4TmFtZU9wdGlvbnMiLCJ0dGxPcHRpb25zIiwidHRsIiwiZXhwaXJlQWZ0ZXJTZWNvbmRzIiwic3BhcnNlT3B0aW9ucyIsImNhc2VJbnNlbnNpdGl2ZU9wdGlvbnMiLCJjb2xsYXRpb24iLCJjYXNlSW5zZW5zaXRpdmVDb2xsYXRpb24iLCJwYXJ0aWFsRmlsdGVyT3B0aW9ucyIsInBhcnRpYWxGaWx0ZXJFeHByZXNzaW9uIiwiaW5kZXhPcHRpb25zIiwiY3JlYXRlSW5kZXgiLCJlbnN1cmVVbmlxdWVuZXNzIiwiX2Vuc3VyZVNwYXJzZVVuaXF1ZUluZGV4SW5CYWNrZ3JvdW5kIiwiZW5zdXJlQXV0aERhdGFVbmlxdWVuZXNzIiwicHJvdmlkZXIiLCJ1bmlxdWUiLCJfcmF3RmluZCIsImNvdW50IiwiX2VzdGltYXRlIiwiZGlzdGluY3QiLCJpc1BvaW50ZXJGaWVsZCIsInRyYW5zZm9ybUZpZWxkIiwidHJhbnNmb3JtUG9pbnRlclN0cmluZyIsImFnZ3JlZ2F0ZSIsInBpcGVsaW5lIiwicmF3VmFsdWVzIiwicmF3RmllbGROYW1lcyIsIkVKU09OIiwiZGVzZXJpYWxpemUiLCJzdGFnZSIsIiRncm91cCIsIl9wYXJzZUFnZ3JlZ2F0ZUdyb3VwQXJncyIsIiRtYXRjaCIsIl9wYXJzZUFnZ3JlZ2F0ZUFyZ3MiLCIkcHJvamVjdCIsIl9wYXJzZUFnZ3JlZ2F0ZVByb2plY3RBcmdzIiwiJGdlb05lYXIiLCJyZXN1bHRzIiwic3BsaXQiLCJpc0VtcHR5Iiwic2VyaWFsaXplIiwiaXNEYXRlIiwicmV0dXJuVmFsdWUiLCJfY29udmVydFRvRGF0ZSIsInN1YnN0cmluZyIsImlzTmFOIiwiRGF0ZSIsInBhcnNlIiwidG9VcHBlckNhc2UiLCJQUklNQVJZIiwiUFJJTUFSWV9QUkVGRVJSRUQiLCJTRUNPTkRBUlkiLCJTRUNPTkRBUllfUFJFRkVSUkVEIiwiTkVBUkVTVCIsInBlcmZvcm1Jbml0aWFsaXphdGlvbiIsIiR0ZXh0IiwidGV4dEluZGV4IiwiZHJvcEFsbEluZGV4ZXMiLCJkcm9wSW5kZXhlcyIsInVwZGF0ZVNjaGVtYVdpdGhJbmRleGVzIiwiY2xhc3NlcyIsInByb21pc2VzIiwiY3JlYXRlVHJhbnNhY3Rpb25hbFNlc3Npb24iLCJ0cmFuc2FjdGlvbmFsU2VjdGlvbiIsInN0YXJ0U2Vzc2lvbiIsInN0YXJ0VHJhbnNhY3Rpb24iLCJjb21taXRUcmFuc2FjdGlvbmFsU2Vzc2lvbiIsImNvbW1pdCIsInJldHJpZXMiLCJjb21taXRUcmFuc2FjdGlvbiIsImVuZFNlc3Npb24iLCJhYm9ydFRyYW5zYWN0aW9uYWxTZXNzaW9uIiwiYWJvcnRUcmFuc2FjdGlvbiIsImV4cG9ydHMiLCJfZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU3RvcmFnZUFkYXB0ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IGZvcm1hdCBhcyBmb3JtYXRVcmwsIHBhcnNlIGFzIHBhcnNlVXJsIH0gZnJvbSAnLi4vLi4vLi4vdmVuZG9yL21vbmdvZGJVcmwnO1xuaW1wb3J0IHR5cGUgeyBRdWVyeU9wdGlvbnMsIFF1ZXJ5VHlwZSwgU2NoZW1hVHlwZSwgU3RvcmFnZUNsYXNzIH0gZnJvbSAnLi4vU3RvcmFnZUFkYXB0ZXInO1xuaW1wb3J0IHsgU3RvcmFnZUFkYXB0ZXIgfSBmcm9tICcuLi9TdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vLi4vLi4vVXRpbHMnO1xuaW1wb3J0IE1vbmdvQ29sbGVjdGlvbiBmcm9tICcuL01vbmdvQ29sbGVjdGlvbic7XG5pbXBvcnQgTW9uZ29TY2hlbWFDb2xsZWN0aW9uIGZyb20gJy4vTW9uZ29TY2hlbWFDb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdCxcbiAgcGFyc2VPYmplY3RUb01vbmdvT2JqZWN0Rm9yQ3JlYXRlLFxuICB0cmFuc2Zvcm1LZXksXG4gIHRyYW5zZm9ybVBvaW50ZXJTdHJpbmcsXG4gIHRyYW5zZm9ybVVwZGF0ZSxcbiAgdHJhbnNmb3JtV2hlcmUsXG59IGZyb20gJy4vTW9uZ29UcmFuc2Zvcm0nO1xuLy8gQGZsb3ctZGlzYWJsZS1uZXh0XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBFSlNPTiB9IGZyb20gJ2Jzb24nO1xuaW1wb3J0IGRlZmF1bHRzLCB7IFBhcnNlU2VydmVyRGF0YWJhc2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vZGVmYXVsdHMnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi8uLi9sb2dnZXInO1xuXG4vLyBAZmxvdy1kaXNhYmxlLW5leHRcbmNvbnN0IG1vbmdvZGIgPSByZXF1aXJlKCdtb25nb2RiJyk7XG5jb25zdCBNb25nb0NsaWVudCA9IG1vbmdvZGIuTW9uZ29DbGllbnQ7XG5jb25zdCBSZWFkUHJlZmVyZW5jZSA9IG1vbmdvZGIuUmVhZFByZWZlcmVuY2U7XG5cbmNvbnN0IE1vbmdvU2NoZW1hQ29sbGVjdGlvbk5hbWUgPSAnX1NDSEVNQSc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIE1vbmdvREIgZXJyb3IgaXMgYSB0cmFuc2llbnQgaW5mcmFzdHJ1Y3R1cmUgZXJyb3JcbiAqIChjb25uZWN0aW9uIHBvb2wsIG5ldHdvcmssIHNlcnZlciBzZWxlY3Rpb24pIGFzIG9wcG9zZWQgdG8gYSBxdWVyeS1sZXZlbCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gaXNUcmFuc2llbnRFcnJvcihlcnJvcikge1xuICBpZiAoIWVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ29ubmVjdGlvbiBwb29sLCBuZXR3b3JrLCBhbmQgc2VydmVyIHNlbGVjdGlvbiBlcnJvcnNcbiAgY29uc3QgdHJhbnNpZW50RXJyb3JOYW1lcyA9IFtcbiAgICAnTW9uZ29XYWl0UXVldWVUaW1lb3V0RXJyb3InLFxuICAgICdNb25nb1NlcnZlclNlbGVjdGlvbkVycm9yJyxcbiAgICAnTW9uZ29OZXR3b3JrVGltZW91dEVycm9yJyxcbiAgICAnTW9uZ29OZXR3b3JrRXJyb3InLFxuICBdO1xuICBpZiAodHJhbnNpZW50RXJyb3JOYW1lcy5pbmNsdWRlcyhlcnJvci5uYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIE1vbmdvREIncyB0cmFuc2llbnQgdHJhbnNhY3Rpb24gZXJyb3IgbGFiZWxcbiAgaWYgKHR5cGVvZiBlcnJvci5oYXNFcnJvckxhYmVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGVycm9yLmhhc0Vycm9yTGFiZWwoJ1RyYW5zaWVudFRyYW5zYWN0aW9uRXJyb3InKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5jb25zdCBzdG9yYWdlQWRhcHRlckFsbENvbGxlY3Rpb25zID0gbW9uZ29BZGFwdGVyID0+IHtcbiAgcmV0dXJuIG1vbmdvQWRhcHRlclxuICAgIC5jb25uZWN0KClcbiAgICAudGhlbigoKSA9PiBtb25nb0FkYXB0ZXIuZGF0YWJhc2UuY29sbGVjdGlvbnMoKSlcbiAgICAudGhlbihjb2xsZWN0aW9ucyA9PiB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbnMuZmlsdGVyKGNvbGxlY3Rpb24gPT4ge1xuICAgICAgICBpZiAoY29sbGVjdGlvbi5uYW1lc3BhY2UubWF0Y2goL1xcLnN5c3RlbVxcLi8pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IElmIHlvdSBoYXZlIG9uZSBhcHAgd2l0aCBhIGNvbGxlY3Rpb24gcHJlZml4IHRoYXQgaGFwcGVucyB0byBiZSBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIGFwcHMgcHJlZml4LCB0aGlzIHdpbGwgZ28gdmVyeSB2ZXJ5IGJhZGx5LiBXZSBzaG91bGQgZml4IHRoYXQgc29tZWhvdy5cbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUuaW5kZXhPZihtb25nb0FkYXB0ZXIuX2NvbGxlY3Rpb25QcmVmaXgpID09IDA7XG4gICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmNvbnN0IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEgPSAoeyAuLi5zY2hlbWEgfSkgPT4ge1xuICBkZWxldGUgc2NoZW1hLmZpZWxkcy5fcnBlcm07XG4gIGRlbGV0ZSBzY2hlbWEuZmllbGRzLl93cGVybTtcblxuICBpZiAoc2NoZW1hLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIC8vIExlZ2FjeSBtb25nbyBhZGFwdGVyIGtub3dzIGFib3V0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcGFzc3dvcmQgYW5kIF9oYXNoZWRfcGFzc3dvcmQuXG4gICAgLy8gRnV0dXJlIGRhdGFiYXNlIGFkYXB0ZXJzIHdpbGwgb25seSBrbm93IGFib3V0IF9oYXNoZWRfcGFzc3dvcmQuXG4gICAgLy8gTm90ZTogUGFyc2UgU2VydmVyIHdpbGwgYnJpbmcgYmFjayBwYXNzd29yZCB3aXRoIGluamVjdERlZmF1bHRTY2hlbWEsIHNvIHdlIGRvbid0IG5lZWRcbiAgICAvLyB0byBhZGQgX2hhc2hlZF9wYXNzd29yZCBiYWNrIGV2ZXIuXG4gICAgZGVsZXRlIHNjaGVtYS5maWVsZHMuX2hhc2hlZF9wYXNzd29yZDtcbiAgfVxuXG4gIHJldHVybiBzY2hlbWE7XG59O1xuXG4vLyBSZXR1cm5zIHsgY29kZSwgZXJyb3IgfSBpZiBpbnZhbGlkLCBvciB7IHJlc3VsdCB9LCBhbiBvYmplY3Rcbi8vIHN1aXRhYmxlIGZvciBpbnNlcnRpbmcgaW50byBfU0NIRU1BIGNvbGxlY3Rpb24sIG90aGVyd2lzZS5cbmNvbnN0IG1vbmdvU2NoZW1hRnJvbUZpZWxkc0FuZENsYXNzTmFtZUFuZENMUCA9IChcbiAgZmllbGRzLFxuICBjbGFzc05hbWUsXG4gIGNsYXNzTGV2ZWxQZXJtaXNzaW9ucyxcbiAgaW5kZXhlc1xuKSA9PiB7XG4gIGNvbnN0IG1vbmdvT2JqZWN0ID0ge1xuICAgIF9pZDogY2xhc3NOYW1lLFxuICAgIG9iamVjdElkOiAnc3RyaW5nJyxcbiAgICB1cGRhdGVkQXQ6ICdzdHJpbmcnLFxuICAgIGNyZWF0ZWRBdDogJ3N0cmluZycsXG4gICAgX21ldGFkYXRhOiB1bmRlZmluZWQsXG4gIH07XG5cbiAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gZmllbGRzKSB7XG4gICAgY29uc3QgeyB0eXBlLCB0YXJnZXRDbGFzcywgLi4uZmllbGRPcHRpb25zIH0gPSBmaWVsZHNbZmllbGROYW1lXTtcbiAgICBtb25nb09iamVjdFtmaWVsZE5hbWVdID0gTW9uZ29TY2hlbWFDb2xsZWN0aW9uLnBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7XG4gICAgICB0eXBlLFxuICAgICAgdGFyZ2V0Q2xhc3MsXG4gICAgfSk7XG4gICAgaWYgKGZpZWxkT3B0aW9ucyAmJiBPYmplY3Qua2V5cyhmaWVsZE9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSA9IG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSB8fCB7fTtcbiAgICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucyA9IG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucyB8fCB7fTtcbiAgICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5maWVsZHNfb3B0aW9uc1tmaWVsZE5hbWVdID0gZmllbGRPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY2xhc3NMZXZlbFBlcm1pc3Npb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSA9IG1vbmdvT2JqZWN0Ll9tZXRhZGF0YSB8fCB7fTtcbiAgICBpZiAoIWNsYXNzTGV2ZWxQZXJtaXNzaW9ucykge1xuICAgICAgZGVsZXRlIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgbW9uZ29PYmplY3QuX21ldGFkYXRhLmNsYXNzX3Blcm1pc3Npb25zID0gY2xhc3NMZXZlbFBlcm1pc3Npb25zO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpbmRleGVzICYmIHR5cGVvZiBpbmRleGVzID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhpbmRleGVzKS5sZW5ndGggPiAwKSB7XG4gICAgbW9uZ29PYmplY3QuX21ldGFkYXRhID0gbW9uZ29PYmplY3QuX21ldGFkYXRhIHx8IHt9O1xuICAgIG1vbmdvT2JqZWN0Ll9tZXRhZGF0YS5pbmRleGVzID0gaW5kZXhlcztcbiAgfVxuXG4gIGlmICghbW9uZ29PYmplY3QuX21ldGFkYXRhKSB7XG4gICAgLy8gY2xlYW51cCB0aGUgdW51c2VkIF9tZXRhZGF0YVxuICAgIGRlbGV0ZSBtb25nb09iamVjdC5fbWV0YWRhdGE7XG4gIH1cblxuICByZXR1cm4gbW9uZ29PYmplY3Q7XG59O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxhaW5WYWx1ZShleHBsYWluKSB7XG4gIGlmIChleHBsYWluKSB7XG4gICAgLy8gVGhlIGxpc3Qgb2YgYWxsb3dlZCBleHBsYWluIHZhbHVlcyBpcyBmcm9tIG5vZGUtbW9uZ29kYi1uYXRpdmUvbGliL2V4cGxhaW4uanNcbiAgICBjb25zdCBleHBsYWluQWxsb3dlZFZhbHVlcyA9IFtcbiAgICAgICdxdWVyeVBsYW5uZXInLFxuICAgICAgJ3F1ZXJ5UGxhbm5lckV4dGVuZGVkJyxcbiAgICAgICdleGVjdXRpb25TdGF0cycsXG4gICAgICAnYWxsUGxhbnNFeGVjdXRpb24nLFxuICAgICAgZmFsc2UsXG4gICAgICB0cnVlLFxuICAgIF07XG4gICAgaWYgKCFleHBsYWluQWxsb3dlZFZhbHVlcy5pbmNsdWRlcyhleHBsYWluKSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdJbnZhbGlkIHZhbHVlIGZvciBleHBsYWluJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb25nb1N0b3JhZ2VBZGFwdGVyIGltcGxlbWVudHMgU3RvcmFnZUFkYXB0ZXIge1xuICAvLyBQcml2YXRlXG4gIF91cmk6IHN0cmluZztcbiAgX2NvbGxlY3Rpb25QcmVmaXg6IHN0cmluZztcbiAgX21vbmdvT3B0aW9uczogT2JqZWN0O1xuICBfb25jaGFuZ2U6IGFueTtcbiAgX3N0cmVhbTogYW55O1xuICBfbG9nQ2xpZW50RXZlbnRzOiA/QXJyYXk8YW55PjtcbiAgX2NsaWVudE1ldGFkYXRhOiA/eyBuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyB9O1xuICAvLyBQdWJsaWNcbiAgY29ubmVjdGlvblByb21pc2U6ID9Qcm9taXNlPGFueT47XG4gIGRhdGFiYXNlOiBhbnk7XG4gIGNsaWVudDogTW9uZ29DbGllbnQ7XG4gIF9tYXhUaW1lTVM6ID9udW1iZXI7XG4gIF9iYXRjaFNpemU6ID9udW1iZXI7XG4gIGNhblNvcnRPbkpvaW5UYWJsZXM6IGJvb2xlYW47XG4gIGVuYWJsZVNjaGVtYUhvb2tzOiBib29sZWFuO1xuICBzY2hlbWFDYWNoZVR0bDogP251bWJlcjtcbiAgZGlzYWJsZUluZGV4RmllbGRWYWxpZGF0aW9uOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHsgdXJpID0gZGVmYXVsdHMuRGVmYXVsdE1vbmdvVVJJLCBjb2xsZWN0aW9uUHJlZml4ID0gJycsIG1vbmdvT3B0aW9ucyA9IHt9IH06IGFueSkge1xuICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICB0aGlzLl9jb2xsZWN0aW9uUHJlZml4ID0gY29sbGVjdGlvblByZWZpeDtcbiAgICB0aGlzLl9vbmNoYW5nZSA9ICgpID0+IHt9O1xuXG4gICAgLy8gTWF4VGltZU1TIGlzIG5vdCBhIGdsb2JhbCBNb25nb0RCIGNsaWVudCBvcHRpb24sIGl0IGlzIGFwcGxpZWQgcGVyIG9wZXJhdGlvbi5cbiAgICB0aGlzLl9tYXhUaW1lTVMgPSBtb25nb09wdGlvbnMubWF4VGltZU1TO1xuICAgIC8vIEJhdGNoU2l6ZSBpcyBub3QgYSBnbG9iYWwgTW9uZ29EQiBjbGllbnQgb3B0aW9uLCBpdCBpcyBhcHBsaWVkIHBlciBjdXJzb3Igb3BlcmF0aW9uLlxuICAgIHRoaXMuX2JhdGNoU2l6ZSA9IG1vbmdvT3B0aW9ucy5iYXRjaFNpemU7XG4gICAgdGhpcy5jYW5Tb3J0T25Kb2luVGFibGVzID0gdHJ1ZTtcbiAgICB0aGlzLmVuYWJsZVNjaGVtYUhvb2tzID0gISFtb25nb09wdGlvbnMuZW5hYmxlU2NoZW1hSG9va3M7XG4gICAgdGhpcy5zY2hlbWFDYWNoZVR0bCA9IG1vbmdvT3B0aW9ucy5zY2hlbWFDYWNoZVR0bDtcbiAgICB0aGlzLmRpc2FibGVJbmRleEZpZWxkVmFsaWRhdGlvbiA9ICEhbW9uZ29PcHRpb25zLmRpc2FibGVJbmRleEZpZWxkVmFsaWRhdGlvbjtcbiAgICB0aGlzLl9sb2dDbGllbnRFdmVudHMgPSBtb25nb09wdGlvbnMubG9nQ2xpZW50RXZlbnRzO1xuICAgIHRoaXMuX2NsaWVudE1ldGFkYXRhID0gbW9uZ29PcHRpb25zLmNsaWVudE1ldGFkYXRhO1xuXG4gICAgLy8gQ3JlYXRlIGEgY29weSBvZiBtb25nb09wdGlvbnMgYW5kIHJlbW92ZSBQYXJzZSBTZXJ2ZXItc3BlY2lmaWMgb3B0aW9ucyB0aGF0IHNob3VsZCBub3RcbiAgICAvLyBiZSBwYXNzZWQgdG8gTW9uZ29EQiBjbGllbnQuIE5vdGU6IFdlIG9ubHkgZGVsZXRlIGZyb20gdGhpcy5fbW9uZ29PcHRpb25zLCBub3QgZnJvbSB0aGVcbiAgICAvLyBvcmlnaW5hbCBtb25nb09wdGlvbnMgb2JqZWN0LCBiZWNhdXNlIG90aGVyIGNvbXBvbmVudHMgKGxpa2UgRGF0YWJhc2VDb250cm9sbGVyKSBuZWVkXG4gICAgLy8gYWNjZXNzIHRvIHRoZXNlIG9wdGlvbnMuXG4gICAgdGhpcy5fbW9uZ29PcHRpb25zID0geyAuLi5tb25nb09wdGlvbnMgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBQYXJzZVNlcnZlckRhdGFiYXNlT3B0aW9ucykge1xuICAgICAgZGVsZXRlIHRoaXMuX21vbmdvT3B0aW9uc1trZXldO1xuICAgIH1cbiAgfVxuXG4gIHdhdGNoKGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fb25jaGFuZ2UgPSBjYWxsYmFjaztcbiAgfVxuXG4gIGNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIC8vIHBhcnNpbmcgYW5kIHJlLWZvcm1hdHRpbmcgY2F1c2VzIHRoZSBhdXRoIHZhbHVlIChpZiB0aGVyZSkgdG8gZ2V0IFVSSVxuICAgIC8vIGVuY29kZWRcbiAgICBjb25zdCBlbmNvZGVkVXJpID0gZm9ybWF0VXJsKHBhcnNlVXJsKHRoaXMuX3VyaSkpO1xuXG4gICAgLy8gT25seSB1c2UgZHJpdmVySW5mbyBpZiBjbGllbnRNZXRhZGF0YSBvcHRpb24gaXMgc2V0XG4gICAgY29uc3Qgb3B0aW9ucyA9IHsgLi4udGhpcy5fbW9uZ29PcHRpb25zIH07XG4gICAgaWYgKHRoaXMuX2NsaWVudE1ldGFkYXRhKSB7XG4gICAgICBvcHRpb25zLmRyaXZlckluZm8gPSB7XG4gICAgICAgIG5hbWU6IHRoaXMuX2NsaWVudE1ldGFkYXRhLm5hbWUsXG4gICAgICAgIHZlcnNpb246IHRoaXMuX2NsaWVudE1ldGFkYXRhLnZlcnNpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5jb25uZWN0aW9uUHJvbWlzZSA9IE1vbmdvQ2xpZW50LmNvbm5lY3QoZW5jb2RlZFVyaSwgb3B0aW9ucylcbiAgICAgIC50aGVuKGNsaWVudCA9PiB7XG4gICAgICAgIC8vIFN0YXJ0aW5nIG1vbmdvREIgMy4wLCB0aGUgTW9uZ29DbGllbnQuY29ubmVjdCBkb24ndCByZXR1cm4gYSBEQiBhbnltb3JlIGJ1dCBhIGNsaWVudFxuICAgICAgICAvLyBGb3J0dW5hdGVseSwgd2UgY2FuIGdldCBiYWNrIHRoZSBvcHRpb25zIGFuZCB1c2UgdGhlbSB0byBzZWxlY3QgdGhlIHByb3BlciBEQi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbmdvZGIvbm9kZS1tb25nb2RiLW5hdGl2ZS9ibG9iLzJjMzVkNzZmMDg1NzQyMjViOGRiMDJkN2JlZjY4NzEyM2U2YmIwMTgvbGliL21vbmdvX2NsaWVudC5qcyNMODg1XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjbGllbnQucy5vcHRpb25zO1xuICAgICAgICBjb25zdCBkYXRhYmFzZSA9IGNsaWVudC5kYihvcHRpb25zLmRiTmFtZSk7XG4gICAgICAgIGlmICghZGF0YWJhc2UpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2xpZW50Lm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNsaWVudC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuY29ubmVjdGlvblByb21pc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNldCB1cCBjbGllbnQgZXZlbnQgbG9nZ2luZyBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmICh0aGlzLl9sb2dDbGllbnRFdmVudHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLl9sb2dDbGllbnRFdmVudHMpKSB7XG4gICAgICAgICAgdGhpcy5fbG9nQ2xpZW50RXZlbnRzLmZvckVhY2goZXZlbnRDb25maWcgPT4ge1xuICAgICAgICAgICAgY2xpZW50Lm9uKGV2ZW50Q29uZmlnLm5hbWUsIGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgbGV0IGxvZ0RhdGEgPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCFldmVudENvbmZpZy5rZXlzIHx8IGV2ZW50Q29uZmlnLmtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nRGF0YSA9IGV2ZW50O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGV2ZW50Q29uZmlnLmtleXMuZm9yRWFjaChrZXlQYXRoID0+IHtcbiAgICAgICAgICAgICAgICAgIGxvZ0RhdGFba2V5UGF0aF0gPSBfLmdldChldmVudCwga2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBsb2cgbGV2ZWwgZXhpc3RzLCBmYWxsYmFjayB0byAnaW5mbydcbiAgICAgICAgICAgICAgY29uc3QgbG9nTGV2ZWwgPSB0eXBlb2YgbG9nZ2VyW2V2ZW50Q29uZmlnLmxvZ0xldmVsXSA9PT0gJ2Z1bmN0aW9uJyA/IGV2ZW50Q29uZmlnLmxvZ0xldmVsIDogJ2luZm8nO1xuXG4gICAgICAgICAgICAgIC8vIFNhZmUgSlNPTiBzZXJpYWxpemF0aW9uIHdpdGggTWFwL1NldCBhbmQgY2lyY3VsYXIgcmVmZXJlbmNlIHN1cHBvcnRcbiAgICAgICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGBNb25nb0RCIGNsaWVudCBldmVudCAke2V2ZW50Q29uZmlnLm5hbWV9OiAke0pTT04uc3RyaW5naWZ5KGxvZ0RhdGEsIFV0aWxzLmdldENpcmN1bGFyUmVwbGFjZXIoKSl9YDtcblxuICAgICAgICAgICAgICBsb2dnZXJbbG9nTGV2ZWxdKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICAgICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9taXNlO1xuICB9XG5cbiAgaGFuZGxlRXJyb3I8VD4oZXJyb3I6ID8oRXJyb3IgfCBQYXJzZS5FcnJvcikpOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gMTMpIHtcbiAgICAgIC8vIFVuYXV0aG9yaXplZCBlcnJvclxuICAgICAgZGVsZXRlIHRoaXMuY2xpZW50O1xuICAgICAgZGVsZXRlIHRoaXMuZGF0YWJhc2U7XG4gICAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgdW5hdXRob3JpemVkIGVycm9yJywgeyBlcnJvcjogZXJyb3IgfSk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtIGluZnJhc3RydWN0dXJlL3RyYW5zaWVudCBlcnJvcnMgaW50byBQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1JcbiAgICBpZiAoaXNUcmFuc2llbnRFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRGF0YWJhc2UgdHJhbnNpZW50IGVycm9yJywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0RhdGFiYXNlIGVycm9yJyk7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBhc3luYyBoYW5kbGVTaHV0ZG93bigpIHtcbiAgICBpZiAoIXRoaXMuY2xpZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsb3NlKGZhbHNlKTtcbiAgICBkZWxldGUgdGhpcy5jb25uZWN0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIF9hZGFwdGl2ZUNvbGxlY3Rpb24obmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdCgpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLmRhdGFiYXNlLmNvbGxlY3Rpb24odGhpcy5fY29sbGVjdGlvblByZWZpeCArIG5hbWUpKVxuICAgICAgLnRoZW4ocmF3Q29sbGVjdGlvbiA9PiBuZXcgTW9uZ29Db2xsZWN0aW9uKHJhd0NvbGxlY3Rpb24pKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgX3NjaGVtYUNvbGxlY3Rpb24oKTogUHJvbWlzZTxNb25nb1NjaGVtYUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0KClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihNb25nb1NjaGVtYUNvbGxlY3Rpb25OYW1lKSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3N0cmVhbSAmJiB0aGlzLmVuYWJsZVNjaGVtYUhvb2tzKSB7XG4gICAgICAgICAgdGhpcy5fc3RyZWFtID0gY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLndhdGNoKCk7XG4gICAgICAgICAgdGhpcy5fc3RyZWFtLm9uKCdjaGFuZ2UnLCAoKSA9PiB0aGlzLl9vbmNoYW5nZSgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1vbmdvU2NoZW1hQ29sbGVjdGlvbihjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xhc3NFeGlzdHMobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdCgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFiYXNlLmxpc3RDb2xsZWN0aW9ucyh7IG5hbWU6IHRoaXMuX2NvbGxlY3Rpb25QcmVmaXggKyBuYW1lIH0pLnRvQXJyYXkoKTtcbiAgICAgIH0pXG4gICAgICAudGhlbihjb2xsZWN0aW9ucyA9PiB7XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9ucy5sZW5ndGggPiAwO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIHNldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyhjbGFzc05hbWU6IHN0cmluZywgQ0xQczogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKVxuICAgICAgLnRoZW4oc2NoZW1hQ29sbGVjdGlvbiA9PlxuICAgICAgICBzY2hlbWFDb2xsZWN0aW9uLnVwZGF0ZVNjaGVtYShjbGFzc05hbWUsIHtcbiAgICAgICAgICAkc2V0OiB7ICdfbWV0YWRhdGEuY2xhc3NfcGVybWlzc2lvbnMnOiBDTFBzIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBzZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzdWJtaXR0ZWRJbmRleGVzOiBhbnksXG4gICAgZXhpc3RpbmdJbmRleGVzOiBhbnkgPSB7fSxcbiAgICBmaWVsZHM6IGFueVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc3VibWl0dGVkSW5kZXhlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhleGlzdGluZ0luZGV4ZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZXhpc3RpbmdJbmRleGVzID0geyBfaWRfOiB7IF9pZDogMSB9IH07XG4gICAgfVxuICAgIGNvbnN0IGRlbGV0ZVByb21pc2VzID0gW107XG4gICAgY29uc3QgaW5zZXJ0ZWRJbmRleGVzID0gW107XG4gICAgT2JqZWN0LmtleXMoc3VibWl0dGVkSW5kZXhlcykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gc3VibWl0dGVkSW5kZXhlc1tuYW1lXTtcbiAgICAgIGlmIChleGlzdGluZ0luZGV4ZXNbbmFtZV0gJiYgZmllbGQuX19vcCAhPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksIGBJbmRleCAke25hbWV9IGV4aXN0cywgY2Fubm90IHVwZGF0ZS5gKTtcbiAgICAgIH1cbiAgICAgIGlmICghZXhpc3RpbmdJbmRleGVzW25hbWVdICYmIGZpZWxkLl9fb3AgPT09ICdEZWxldGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLFxuICAgICAgICAgIGBJbmRleCAke25hbWV9IGRvZXMgbm90IGV4aXN0LCBjYW5ub3QgZGVsZXRlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5fX29wID09PSAnRGVsZXRlJykge1xuICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5kcm9wSW5kZXgoY2xhc3NOYW1lLCBuYW1lKTtcbiAgICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICAgICAgZGVsZXRlIGV4aXN0aW5nSW5kZXhlc1tuYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGZpZWxkKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuZGlzYWJsZUluZGV4RmllbGRWYWxpZGF0aW9uICYmXG4gICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFxuICAgICAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgICAgIGtleS5pbmRleE9mKCdfcF8nKSA9PT0gMCA/IGtleS5yZXBsYWNlKCdfcF8nLCAnJykgOiBrZXlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSxcbiAgICAgICAgICAgICAgYEZpZWxkICR7a2V5fSBkb2VzIG5vdCBleGlzdCwgY2Fubm90IGFkZCBpbmRleC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGV4aXN0aW5nSW5kZXhlc1tuYW1lXSA9IGZpZWxkO1xuICAgICAgICBpbnNlcnRlZEluZGV4ZXMucHVzaCh7XG4gICAgICAgICAga2V5OiBmaWVsZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgaW5zZXJ0UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChpbnNlcnRlZEluZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgaW5zZXJ0UHJvbWlzZSA9IHRoaXMuY3JlYXRlSW5kZXhlcyhjbGFzc05hbWUsIGluc2VydGVkSW5kZXhlcyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcylcbiAgICAgIC50aGVuKCgpID0+IGluc2VydFByb21pc2UpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCkpXG4gICAgICAudGhlbihzY2hlbWFDb2xsZWN0aW9uID0+XG4gICAgICAgIHNjaGVtYUNvbGxlY3Rpb24udXBkYXRlU2NoZW1hKGNsYXNzTmFtZSwge1xuICAgICAgICAgICRzZXQ6IHsgJ19tZXRhZGF0YS5pbmRleGVzJzogZXhpc3RpbmdJbmRleGVzIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBzZXRJbmRleGVzRnJvbU1vbmdvKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5kZXhlcyhjbGFzc05hbWUpXG4gICAgICAudGhlbihpbmRleGVzID0+IHtcbiAgICAgICAgaW5kZXhlcyA9IGluZGV4ZXMucmVkdWNlKChvYmosIGluZGV4KSA9PiB7XG4gICAgICAgICAgaWYgKGluZGV4LmtleS5fZnRzKSB7XG4gICAgICAgICAgICBkZWxldGUgaW5kZXgua2V5Ll9mdHM7XG4gICAgICAgICAgICBkZWxldGUgaW5kZXgua2V5Ll9mdHN4O1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBpbmRleC53ZWlnaHRzKSB7XG4gICAgICAgICAgICAgIGluZGV4LmtleVtmaWVsZF0gPSAndGV4dCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ialtpbmRleC5uYW1lXSA9IGluZGV4LmtleTtcbiAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKCkudGhlbihzY2hlbWFDb2xsZWN0aW9uID0+XG4gICAgICAgICAgc2NoZW1hQ29sbGVjdGlvbi51cGRhdGVTY2hlbWEoY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAkc2V0OiB7ICdfbWV0YWRhdGEuaW5kZXhlcyc6IGluZGV4ZXMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgLy8gSWdub3JlIGlmIGNvbGxlY3Rpb24gbm90IGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb09iamVjdCA9IG1vbmdvU2NoZW1hRnJvbUZpZWxkc0FuZENsYXNzTmFtZUFuZENMUChcbiAgICAgIHNjaGVtYS5maWVsZHMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzY2hlbWEuY2xhc3NMZXZlbFBlcm1pc3Npb25zLFxuICAgICAgc2NoZW1hLmluZGV4ZXNcbiAgICApO1xuICAgIG1vbmdvT2JqZWN0Ll9pZCA9IGNsYXNzTmFtZTtcbiAgICByZXR1cm4gdGhpcy5zZXRJbmRleGVzV2l0aFNjaGVtYUZvcm1hdChjbGFzc05hbWUsIHNjaGVtYS5pbmRleGVzLCB7fSwgc2NoZW1hLmZpZWxkcylcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKSlcbiAgICAgIC50aGVuKHNjaGVtYUNvbGxlY3Rpb24gPT4gc2NoZW1hQ29sbGVjdGlvbi5pbnNlcnRTY2hlbWEobW9uZ29PYmplY3QpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmllbGRPcHRpb25zKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgY29uc3Qgc2NoZW1hQ29sbGVjdGlvbiA9IGF3YWl0IHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKTtcbiAgICBhd2FpdCBzY2hlbWFDb2xsZWN0aW9uLnVwZGF0ZUZpZWxkT3B0aW9ucyhjbGFzc05hbWUsIGZpZWxkTmFtZSwgdHlwZSk7XG4gIH1cblxuICBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKVxuICAgICAgLnRoZW4oc2NoZW1hQ29sbGVjdGlvbiA9PiBzY2hlbWFDb2xsZWN0aW9uLmFkZEZpZWxkSWZOb3RFeGlzdHMoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHR5cGUpKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5jcmVhdGVJbmRleGVzSWZOZWVkZWQoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHR5cGUpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gRHJvcHMgYSBjb2xsZWN0aW9uLiBSZXNvbHZlcyB3aXRoIHRydWUgaWYgaXQgd2FzIGEgUGFyc2UgU2NoZW1hIChlZy4gX1VzZXIsIEN1c3RvbSwgZXRjLilcbiAgLy8gYW5kIHJlc29sdmVzIHdpdGggZmFsc2UgaWYgaXQgd2Fzbid0IChlZy4gYSBqb2luIHRhYmxlKS4gUmVqZWN0cyBpZiBkZWxldGlvbiB3YXMgaW1wb3NzaWJsZS5cbiAgZGVsZXRlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLmRyb3AoKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAvLyAnbnMgbm90IGZvdW5kJyBtZWFucyBjb2xsZWN0aW9uIHdhcyBhbHJlYWR5IGdvbmUuIElnbm9yZSBkZWxldGlvbiBhdHRlbXB0LlxuICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09ICducyBub3QgZm91bmQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KVxuICAgICAgICAvLyBXZSd2ZSBkcm9wcGVkIHRoZSBjb2xsZWN0aW9uLCBub3cgcmVtb3ZlIHRoZSBfU0NIRU1BIGRvY3VtZW50XG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKSlcbiAgICAgICAgLnRoZW4oc2NoZW1hQ29sbGVjdGlvbiA9PiBzY2hlbWFDb2xsZWN0aW9uLmZpbmRBbmREZWxldGVTY2hlbWEoY2xhc3NOYW1lKSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUFsbENsYXNzZXMoZmFzdDogYm9vbGVhbikge1xuICAgIHJldHVybiBzdG9yYWdlQWRhcHRlckFsbENvbGxlY3Rpb25zKHRoaXMpLnRoZW4oY29sbGVjdGlvbnMgPT5cbiAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICBjb2xsZWN0aW9ucy5tYXAoY29sbGVjdGlvbiA9PiAoZmFzdCA/IGNvbGxlY3Rpb24uZGVsZXRlTWFueSh7fSkgOiBjb2xsZWN0aW9uLmRyb3AoKSkpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgY29sdW1uIGFuZCBhbGwgdGhlIGRhdGEuIEZvciBSZWxhdGlvbnMsIHRoZSBfSm9pbiBjb2xsZWN0aW9uIGlzIGhhbmRsZWRcbiAgLy8gc3BlY2lhbGx5LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRlbGV0ZSBfSm9pbiBjb2x1bW5zLiBJdCBzaG91bGQsIGhvd2V2ZXIsIGluZGljYXRlXG4gIC8vIHRoYXQgdGhlIHJlbGF0aW9uIGZpZWxkcyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJbiBtb25nbywgdGhpcyBtZWFucyByZW1vdmluZyBpdCBmcm9tXG4gIC8vIHRoZSBfU0NIRU1BIGNvbGxlY3Rpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gYWN0dWFsIGRhdGEgaW4gdGhlIGNvbGxlY3Rpb24gdW5kZXIgdGhlIHNhbWUgbmFtZVxuICAvLyBhcyB0aGUgcmVsYXRpb24gY29sdW1uLCBzbyBpdCdzIGZpbmUgdG8gYXR0ZW1wdCB0byBkZWxldGUgaXQuIElmIHRoZSBmaWVsZHMgbGlzdGVkIHRvIGJlXG4gIC8vIGRlbGV0ZWQgZG8gbm90IGV4aXN0LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gc3VjY2Vzc2Z1bGx5IGFueXdheXMuIENoZWNraW5nIGZvclxuICAvLyBhdHRlbXB0cyB0byBkZWxldGUgbm9uLWV4aXN0ZW50IGZpZWxkcyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgUGFyc2UgU2VydmVyLlxuXG4gIC8vIFBvaW50ZXIgZmllbGQgbmFtZXMgYXJlIHBhc3NlZCBmb3IgbGVnYWN5IHJlYXNvbnM6IHRoZSBvcmlnaW5hbCBtb25nb1xuICAvLyBmb3JtYXQgc3RvcmVkIHBvaW50ZXIgZmllbGQgbmFtZXMgZGlmZmVyZW50bHkgaW4gdGhlIGRhdGFiYXNlLCBhbmQgdGhlcmVmb3JlXG4gIC8vIG5lZWRlZCB0byBrbm93IHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBiZWZvcmUgaXQgY291bGQgZGVsZXRlIGl0LiBGdXR1cmUgZGF0YWJhc2VcbiAgLy8gYWRhcHRlcnMgc2hvdWxkIGlnbm9yZSB0aGUgcG9pbnRlckZpZWxkTmFtZXMgYXJndW1lbnQuIEFsbCB0aGUgZmllbGQgbmFtZXMgYXJlIGluXG4gIC8vIGZpZWxkTmFtZXMsIHRoZXkgc2hvdyB1cCBhZGRpdGlvbmFsbHkgaW4gdGhlIHBvaW50ZXJGaWVsZE5hbWVzIGRhdGFiYXNlIGZvciB1c2VcbiAgLy8gYnkgdGhlIG1vbmdvIGFkYXB0ZXIsIHdoaWNoIGRlYWxzIHdpdGggdGhlIGxlZ2FjeSBtb25nbyBmb3JtYXQuXG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3Qgb2JsaWdhdGVkIHRvIGRlbGV0ZSBmaWVsZHMgYXRvbWljYWxseS4gSXQgaXMgZ2l2ZW4gdGhlIGZpZWxkXG4gIC8vIG5hbWVzIGluIGEgbGlzdCBzbyB0aGF0IGRhdGFiYXNlcyB0aGF0IGFyZSBjYXBhYmxlIG9mIGRlbGV0aW5nIGZpZWxkcyBhdG9taWNhbGx5XG4gIC8vIG1heSBkbyBzby5cblxuICAvLyBSZXR1cm5zIGEgUHJvbWlzZS5cbiAgZGVsZXRlRmllbGRzKGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIGZpZWxkTmFtZXM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgbW9uZ29Gb3JtYXROYW1lcyA9IGZpZWxkTmFtZXMubWFwKGZpZWxkTmFtZSA9PiB7XG4gICAgICBpZiAoc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICByZXR1cm4gYF9wXyR7ZmllbGROYW1lfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25VcGRhdGUgPSB7ICR1bnNldDoge30gfTtcbiAgICBtb25nb0Zvcm1hdE5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBjb2xsZWN0aW9uVXBkYXRlWyckdW5zZXQnXVtuYW1lXSA9IG51bGw7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjb2xsZWN0aW9uRmlsdGVyID0geyAkb3I6IFtdIH07XG4gICAgbW9uZ29Gb3JtYXROYW1lcy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgY29sbGVjdGlvbkZpbHRlclsnJG9yJ10ucHVzaCh7IFtuYW1lXTogeyAkZXhpc3RzOiB0cnVlIH0gfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzY2hlbWFVcGRhdGUgPSB7ICR1bnNldDoge30gfTtcbiAgICBmaWVsZE5hbWVzLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICBzY2hlbWFVcGRhdGVbJyR1bnNldCddW25hbWVdID0gbnVsbDtcbiAgICAgIHNjaGVtYVVwZGF0ZVsnJHVuc2V0J11bYF9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucy4ke25hbWV9YF0gPSBudWxsO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24udXBkYXRlTWFueShjb2xsZWN0aW9uRmlsdGVyLCBjb2xsZWN0aW9uVXBkYXRlKSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NjaGVtYUNvbGxlY3Rpb24oKSlcbiAgICAgIC50aGVuKHNjaGVtYUNvbGxlY3Rpb24gPT4gc2NoZW1hQ29sbGVjdGlvbi51cGRhdGVTY2hlbWEoY2xhc3NOYW1lLCBzY2hlbWFVcGRhdGUpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgYWxsIHNjaGVtYXMga25vd24gdG8gdGhpcyBhZGFwdGVyLCBpbiBQYXJzZSBmb3JtYXQuIEluIGNhc2UgdGhlXG4gIC8vIHNjaGVtYXMgY2Fubm90IGJlIHJldHJpZXZlZCwgcmV0dXJucyBhIHByb21pc2UgdGhhdCByZWplY3RzLiBSZXF1aXJlbWVudHMgZm9yIHRoZVxuICAvLyByZWplY3Rpb24gcmVhc29uIGFyZSBUQkQuXG4gIGdldEFsbENsYXNzZXMoKTogUHJvbWlzZTxTdG9yYWdlQ2xhc3NbXT4ge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKClcbiAgICAgIC50aGVuKHNjaGVtYXNDb2xsZWN0aW9uID0+IHNjaGVtYXNDb2xsZWN0aW9uLl9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSgpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgcHJvbWlzZSBmb3IgdGhlIHNjaGVtYSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpbiBQYXJzZSBmb3JtYXQuIElmXG4gIC8vIHRoaXMgYWRhcHRlciBkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHNjaGVtYSwgcmV0dXJuIGEgcHJvbWlzZSB0aGF0IHJlamVjdHMgd2l0aFxuICAvLyB1bmRlZmluZWQgYXMgdGhlIHJlYXNvbi5cbiAgZ2V0Q2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFN0b3JhZ2VDbGFzcz4ge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWFDb2xsZWN0aW9uKClcbiAgICAgIC50aGVuKHNjaGVtYXNDb2xsZWN0aW9uID0+IHNjaGVtYXNDb2xsZWN0aW9uLl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BKGNsYXNzTmFtZSkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICAvLyBUT0RPOiBBcyB5ZXQgbm90IHBhcnRpY3VsYXJseSB3ZWxsIHNwZWNpZmllZC4gQ3JlYXRlcyBhbiBvYmplY3QuIE1heWJlIHNob3VsZG4ndCBldmVuIG5lZWQgdGhlIHNjaGVtYSxcbiAgLy8gYW5kIHNob3VsZCBpbmZlciBmcm9tIHRoZSB0eXBlLiBPciBtYXliZSBkb2VzIG5lZWQgdGhlIHNjaGVtYSBmb3IgdmFsaWRhdGlvbnMuIE9yIG1heWJlIG5lZWRzXG4gIC8vIHRoZSBzY2hlbWEgb25seSBmb3IgdGhlIGxlZ2FjeSBtb25nbyBmb3JtYXQuIFdlJ2xsIGZpZ3VyZSB0aGF0IG91dCBsYXRlci5cbiAgY3JlYXRlT2JqZWN0KGNsYXNzTmFtZTogc3RyaW5nLCBzY2hlbWE6IFNjaGVtYVR5cGUsIG9iamVjdDogYW55LCB0cmFuc2FjdGlvbmFsU2Vzc2lvbjogP2FueSkge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb09iamVjdCA9IHBhcnNlT2JqZWN0VG9Nb25nb09iamVjdEZvckNyZWF0ZShjbGFzc05hbWUsIG9iamVjdCwgc2NoZW1hKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi5pbnNlcnRPbmUobW9uZ29PYmplY3QsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKSlcbiAgICAgIC50aGVuKCgpID0+ICh7IG9wczogW21vbmdvT2JqZWN0XSB9KSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRHVwbGljYXRlIGtleSBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgICAnQSBkdXBsaWNhdGUgdmFsdWUgZm9yIGEgZmllbGQgd2l0aCB1bmlxdWUgdmFsdWVzIHdhcyBwcm92aWRlZCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGVyci51bmRlcmx5aW5nRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGVycm9yLm1lc3NhZ2UubWF0Y2goL2luZGV4OltcXHNhLXpBLVowLTlfXFwtXFwuXStcXCQ/KFthLXpBLVpfLV0rKV8xLyk7XG4gICAgICAgICAgICBpZiAobWF0Y2hlcyAmJiBBcnJheS5pc0FycmF5KG1hdGNoZXMpKSB7XG4gICAgICAgICAgICAgIGVyci51c2VySW5mbyA9IHsgZHVwbGljYXRlZF9maWVsZDogbWF0Y2hlc1sxXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGF1dGhEYXRhIHVuaXF1ZSBpbmRleCB2aW9sYXRpb25zXG4gICAgICAgICAgICBpZiAoIWVyci51c2VySW5mbykge1xuICAgICAgICAgICAgICBjb25zdCBhdXRoRGF0YU1hdGNoID0gZXJyb3IubWVzc2FnZS5tYXRjaCgvaW5kZXg6XFxzKyhfYXV0aF9kYXRhX1thLXpBLVowLTlfXStfaWQpLyk7XG4gICAgICAgICAgICAgIGlmIChhdXRoRGF0YU1hdGNoKSB7XG4gICAgICAgICAgICAgICAgZXJyLnVzZXJJbmZvID0geyBkdXBsaWNhdGVkX2ZpZWxkOiBhdXRoRGF0YU1hdGNoWzFdIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbGwgb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBQYXJzZSBRdWVyeS5cbiAgLy8gSWYgbm8gb2JqZWN0cyBtYXRjaCwgcmVqZWN0IHdpdGggT0JKRUNUX05PVF9GT1VORC4gSWYgb2JqZWN0cyBhcmUgZm91bmQgYW5kIGRlbGV0ZWQsIHJlc29sdmUgd2l0aCB1bmRlZmluZWQuXG4gIC8vIElmIHRoZXJlIGlzIHNvbWUgb3RoZXIgZXJyb3IsIHJlamVjdCB3aXRoIElOVEVSTkFMX1NFUlZFUl9FUlJPUi5cbiAgZGVsZXRlT2JqZWN0c0J5UXVlcnkoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiB7XG4gICAgICAgIGNvbnN0IG1vbmdvV2hlcmUgPSB0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEpO1xuICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5kZWxldGVNYW55KG1vbmdvV2hlcmUsIHRyYW5zYWN0aW9uYWxTZXNzaW9uKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoeyBkZWxldGVkQ291bnQgfSkgPT4ge1xuICAgICAgICAgIGlmIChkZWxldGVkQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0RhdGFiYXNlIGFkYXB0ZXIgZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEFwcGx5IHRoZSB1cGRhdGUgdG8gYWxsIG9iamVjdHMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gUGFyc2UgUXVlcnkuXG4gIHVwZGF0ZU9iamVjdHNCeVF1ZXJ5KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBxdWVyeTogUXVlcnlUeXBlLFxuICAgIHVwZGF0ZTogYW55LFxuICAgIHRyYW5zYWN0aW9uYWxTZXNzaW9uOiA/YW55XG4gICkge1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1VwZGF0ZSA9IHRyYW5zZm9ybVVwZGF0ZShjbGFzc05hbWUsIHVwZGF0ZSwgc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1doZXJlID0gdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi51cGRhdGVNYW55KG1vbmdvV2hlcmUsIG1vbmdvVXBkYXRlLCB0cmFuc2FjdGlvbmFsU2Vzc2lvbikpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICAvLyBBdG9taWNhbGx5IGZpbmRzIGFuZCB1cGRhdGVzIGFuIG9iamVjdCBiYXNlZCBvbiBxdWVyeS5cbiAgLy8gUmV0dXJuIHZhbHVlIG5vdCBjdXJyZW50bHkgd2VsbCBzcGVjaWZpZWQuXG4gIGZpbmRPbmVBbmRVcGRhdGUoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdXBkYXRlOiBhbnksXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IG1vbmdvVXBkYXRlID0gdHJhbnNmb3JtVXBkYXRlKGNsYXNzTmFtZSwgdXBkYXRlLCBzY2hlbWEpO1xuICAgIGNvbnN0IG1vbmdvV2hlcmUgPSB0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEpO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PlxuICAgICAgICBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uZmluZE9uZUFuZFVwZGF0ZShtb25nb1doZXJlLCBtb25nb1VwZGF0ZSwge1xuICAgICAgICAgIHJldHVybkRvY3VtZW50OiAnYWZ0ZXInLFxuICAgICAgICAgIHNlc3Npb246IHRyYW5zYWN0aW9uYWxTZXNzaW9uIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC50aGVuKHJlc3VsdCA9PiBtb25nb09iamVjdFRvUGFyc2VPYmplY3QoY2xhc3NOYW1lLCByZXN1bHQsIHNjaGVtYSkpXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gMTEwMDApIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgZXJyb3I6JywgZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgY29uc3QgZXJyID0gbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBlcnIudW5kZXJseWluZ0Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBlcnJvci5tZXNzYWdlLm1hdGNoKFxuICAgICAgICAgICAgICAvaW5kZXg6W1xcc2EtekEtWjAtOV9cXC1cXC5dK1xcJD8oW2EtekEtWl8tXSspXzEvXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgQXJyYXkuaXNBcnJheShtYXRjaGVzKSkge1xuICAgICAgICAgICAgICBlcnIudXNlckluZm8gPSB7IGR1cGxpY2F0ZWRfZmllbGQ6IG1hdGNoZXNbMV0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXJyLnVzZXJJbmZvKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF1dGhEYXRhTWF0Y2ggPSBlcnJvci5tZXNzYWdlLm1hdGNoKC9pbmRleDpcXHMrKF9hdXRoX2RhdGFfW2EtekEtWjAtOV9dK19pZCkvKTtcbiAgICAgICAgICAgICAgaWYgKGF1dGhEYXRhTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICBlcnIudXNlckluZm8gPSB7IGR1cGxpY2F0ZWRfZmllbGQ6IGF1dGhEYXRhTWF0Y2hbMV0gfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gSG9wZWZ1bGx5IHdlIGNhbiBnZXQgcmlkIG9mIHRoaXMuIEl0J3Mgb25seSB1c2VkIGZvciBjb25maWcgYW5kIGhvb2tzLlxuICB1cHNlcnRPbmVPYmplY3QoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgdXBkYXRlOiBhbnksXG4gICAgdHJhbnNhY3Rpb25hbFNlc3Npb246ID9hbnlcbiAgKSB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IG1vbmdvVXBkYXRlID0gdHJhbnNmb3JtVXBkYXRlKGNsYXNzTmFtZSwgdXBkYXRlLCBzY2hlbWEpO1xuICAgIGNvbnN0IG1vbmdvV2hlcmUgPSB0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEpO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLnVwc2VydE9uZShtb25nb1doZXJlLCBtb25nb1VwZGF0ZSwgdHJhbnNhY3Rpb25hbFNlc3Npb24pKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gRXhlY3V0ZXMgYSBmaW5kLiBBY2NlcHRzOiBjbGFzc05hbWUsIHF1ZXJ5IGluIFBhcnNlIGZvcm1hdCwgYW5kIHsgc2tpcCwgbGltaXQsIHNvcnQgfS5cbiAgZmluZChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBzY2hlbWE6IFNjaGVtYVR5cGUsXG4gICAgcXVlcnk6IFF1ZXJ5VHlwZSxcbiAgICB7XG4gICAgICBza2lwLFxuICAgICAgbGltaXQsXG4gICAgICBzb3J0LFxuICAgICAga2V5cyxcbiAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgaGludCxcbiAgICAgIGNhc2VJbnNlbnNpdGl2ZSxcbiAgICAgIGV4cGxhaW4sXG4gICAgICBjb21tZW50LFxuICAgIH06IFF1ZXJ5T3B0aW9uc1xuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHZhbGlkYXRlRXhwbGFpblZhbHVlKGV4cGxhaW4pO1xuICAgIHNjaGVtYSA9IGNvbnZlcnRQYXJzZVNjaGVtYVRvTW9uZ29TY2hlbWEoc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1doZXJlID0gdHJhbnNmb3JtV2hlcmUoY2xhc3NOYW1lLCBxdWVyeSwgc2NoZW1hKTtcbiAgICBjb25zdCBtb25nb1NvcnQgPSBfLm1hcEtleXMoc29ydCwgKHZhbHVlLCBmaWVsZE5hbWUpID0+XG4gICAgICB0cmFuc2Zvcm1LZXkoY2xhc3NOYW1lLCBmaWVsZE5hbWUsIHNjaGVtYSlcbiAgICApO1xuICAgIGNvbnN0IG1vbmdvS2V5cyA9IF8ucmVkdWNlKFxuICAgICAga2V5cyxcbiAgICAgIChtZW1vLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ0FDTCcpIHtcbiAgICAgICAgICBtZW1vWydfcnBlcm0nXSA9IDE7XG4gICAgICAgICAgbWVtb1snX3dwZXJtJ10gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lbW9bdHJhbnNmb3JtS2V5KGNsYXNzTmFtZSwga2V5LCBzY2hlbWEpXSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gICAgLy8gSWYgd2UgYXJlbid0IHJlcXVlc3RpbmcgdGhlIGBfaWRgIGZpZWxkLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgb3B0IG91dFxuICAgIC8vIG9mIGl0LiBEb2luZyBzbyBpbiBwYXJzZS1zZXJ2ZXIgaXMgdW51c3VhbCwgYnV0IGl0IGNhbiBhbGxvdyB1cyB0b1xuICAgIC8vIG9wdGltaXplIHNvbWUgcXVlcmllcyB3aXRoIGNvdmVyaW5nIGluZGV4ZXMuXG4gICAgaWYgKGtleXMgJiYgIW1vbmdvS2V5cy5faWQpIHtcbiAgICAgIG1vbmdvS2V5cy5faWQgPSAwO1xuICAgIH1cblxuICAgIHJlYWRQcmVmZXJlbmNlID0gdGhpcy5fcGFyc2VSZWFkUHJlZmVyZW5jZShyZWFkUHJlZmVyZW5jZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGV4dEluZGV4ZXNJZk5lZWRlZChjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5maW5kKG1vbmdvV2hlcmUsIHtcbiAgICAgICAgICBza2lwLFxuICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgIHNvcnQ6IG1vbmdvU29ydCxcbiAgICAgICAgICBrZXlzOiBtb25nb0tleXMsXG4gICAgICAgICAgbWF4VGltZU1TOiB0aGlzLl9tYXhUaW1lTVMsXG4gICAgICAgICAgYmF0Y2hTaXplOiB0aGlzLl9iYXRjaFNpemUsXG4gICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgaGludCxcbiAgICAgICAgICBjYXNlSW5zZW5zaXRpdmUsXG4gICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICBjb21tZW50LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRoZW4ob2JqZWN0cyA9PiB7XG4gICAgICAgIGlmIChleHBsYWluKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iamVjdHMubWFwKG9iamVjdCA9PiBtb25nb09iamVjdFRvUGFyc2VPYmplY3QoY2xhc3NOYW1lLCBvYmplY3QsIHNjaGVtYSkpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGVuc3VyZUluZGV4KFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHNjaGVtYTogU2NoZW1hVHlwZSxcbiAgICBmaWVsZE5hbWVzOiBzdHJpbmdbXSxcbiAgICBpbmRleE5hbWU6ID9zdHJpbmcsXG4gICAgY2FzZUluc2Vuc2l0aXZlOiBib29sZWFuID0gZmFsc2UsXG4gICAgb3B0aW9ucz86IE9iamVjdCA9IHt9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgc2NoZW1hID0gY29udmVydFBhcnNlU2NoZW1hVG9Nb25nb1NjaGVtYShzY2hlbWEpO1xuICAgIGNvbnN0IGluZGV4Q3JlYXRpb25SZXF1ZXN0ID0ge307XG4gICAgY29uc3QgbW9uZ29GaWVsZE5hbWVzID0gZmllbGROYW1lcy5tYXAoZmllbGROYW1lID0+IHRyYW5zZm9ybUtleShjbGFzc05hbWUsIGZpZWxkTmFtZSwgc2NoZW1hKSk7XG4gICAgbW9uZ29GaWVsZE5hbWVzLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgIGluZGV4Q3JlYXRpb25SZXF1ZXN0W2ZpZWxkTmFtZV0gPSBvcHRpb25zLmluZGV4VHlwZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5pbmRleFR5cGUgOiAxO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZGVmYXVsdE9wdGlvbnM6IE9iamVjdCA9IHsgYmFja2dyb3VuZDogdHJ1ZSwgc3BhcnNlOiB0cnVlIH07XG4gICAgY29uc3QgaW5kZXhOYW1lT3B0aW9uczogT2JqZWN0ID0gaW5kZXhOYW1lID8geyBuYW1lOiBpbmRleE5hbWUgfSA6IHt9O1xuICAgIGNvbnN0IHR0bE9wdGlvbnM6IE9iamVjdCA9IG9wdGlvbnMudHRsICE9PSB1bmRlZmluZWQgPyB7IGV4cGlyZUFmdGVyU2Vjb25kczogb3B0aW9ucy50dGwgfSA6IHt9O1xuICAgIGNvbnN0IHNwYXJzZU9wdGlvbnM6IE9iamVjdCA9IG9wdGlvbnMuc3BhcnNlICE9PSB1bmRlZmluZWQgPyB7IHNwYXJzZTogb3B0aW9ucy5zcGFyc2UgfSA6IHt9O1xuICAgIGNvbnN0IGNhc2VJbnNlbnNpdGl2ZU9wdGlvbnM6IE9iamVjdCA9IGNhc2VJbnNlbnNpdGl2ZVxuICAgICAgPyB7IGNvbGxhdGlvbjogTW9uZ29Db2xsZWN0aW9uLmNhc2VJbnNlbnNpdGl2ZUNvbGxhdGlvbigpIH1cbiAgICAgIDoge307XG4gICAgY29uc3QgcGFydGlhbEZpbHRlck9wdGlvbnM6IE9iamVjdCA9XG4gICAgICBvcHRpb25zLnBhcnRpYWxGaWx0ZXJFeHByZXNzaW9uICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB7IHBhcnRpYWxGaWx0ZXJFeHByZXNzaW9uOiBvcHRpb25zLnBhcnRpYWxGaWx0ZXJFeHByZXNzaW9uIH1cbiAgICAgICAgOiB7fTtcbiAgICBjb25zdCBpbmRleE9wdGlvbnM6IE9iamVjdCA9IHtcbiAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgLi4uY2FzZUluc2Vuc2l0aXZlT3B0aW9ucyxcbiAgICAgIC4uLmluZGV4TmFtZU9wdGlvbnMsXG4gICAgICAuLi50dGxPcHRpb25zLFxuICAgICAgLi4uc3BhcnNlT3B0aW9ucyxcbiAgICAgIC4uLnBhcnRpYWxGaWx0ZXJPcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmNyZWF0ZUluZGV4KGluZGV4Q3JlYXRpb25SZXF1ZXN0LCBpbmRleE9wdGlvbnMpXG4gICAgICApXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSB1bmlxdWUgaW5kZXguIFVuaXF1ZSBpbmRleGVzIG9uIG51bGxhYmxlIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQuIFNpbmNlIHdlIGRvbid0XG4gIC8vIGN1cnJlbnRseSBrbm93IHdoaWNoIGZpZWxkcyBhcmUgbnVsbGFibGUgYW5kIHdoaWNoIGFyZW4ndCwgd2UgaWdub3JlIHRoYXQgY3JpdGVyaWEuXG4gIC8vIEFzIHN1Y2gsIHdlIHNob3VsZG4ndCBleHBvc2UgdGhpcyBmdW5jdGlvbiB0byB1c2VycyBvZiBwYXJzZSB1bnRpbCB3ZSBoYXZlIGFuIG91dC1vZi1iYW5kXG4gIC8vIFdheSBvZiBkZXRlcm1pbmluZyBpZiBhIGZpZWxkIGlzIG51bGxhYmxlLiBVbmRlZmluZWQgZG9lc24ndCBjb3VudCBhZ2FpbnN0IHVuaXF1ZW5lc3MsXG4gIC8vIHdoaWNoIGlzIHdoeSB3ZSB1c2Ugc3BhcnNlIGluZGV4ZXMuXG4gIGVuc3VyZVVuaXF1ZW5lc3MoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgZmllbGROYW1lczogc3RyaW5nW10pIHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgaW5kZXhDcmVhdGlvblJlcXVlc3QgPSB7fTtcbiAgICBjb25zdCBtb25nb0ZpZWxkTmFtZXMgPSBmaWVsZE5hbWVzLm1hcChmaWVsZE5hbWUgPT4gdHJhbnNmb3JtS2V5KGNsYXNzTmFtZSwgZmllbGROYW1lLCBzY2hlbWEpKTtcbiAgICBtb25nb0ZpZWxkTmFtZXMuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgaW5kZXhDcmVhdGlvblJlcXVlc3RbZmllbGROYW1lXSA9IDE7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24uX2Vuc3VyZVNwYXJzZVVuaXF1ZUluZGV4SW5CYWNrZ3JvdW5kKGluZGV4Q3JlYXRpb25SZXF1ZXN0KSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSxcbiAgICAgICAgICAgICdUcmllZCB0byBlbnN1cmUgZmllbGQgdW5pcXVlbmVzcyBmb3IgYSBjbGFzcyB0aGF0IGFscmVhZHkgaGFzIGR1cGxpY2F0ZXMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gQ3JlYXRlcyBhIHVuaXF1ZSBzcGFyc2UgaW5kZXggb24gX2F1dGhfZGF0YV88cHJvdmlkZXI+LmlkIHRvIHByZXZlbnRcbiAgLy8gcmFjZSBjb25kaXRpb25zIGR1cmluZyBjb25jdXJyZW50IHNpZ251cHMgd2l0aCB0aGUgc2FtZSBhdXRoRGF0YS5cbiAgZW5zdXJlQXV0aERhdGFVbmlxdWVuZXNzKHByb3ZpZGVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKCdfVXNlcicpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+XG4gICAgICAgIGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5jcmVhdGVJbmRleChcbiAgICAgICAgICB7IFtgX2F1dGhfZGF0YV8ke3Byb3ZpZGVyfS5pZGBdOiAxIH0sXG4gICAgICAgICAgeyB1bmlxdWU6IHRydWUsIHNwYXJzZTogdHJ1ZSwgYmFja2dyb3VuZDogdHJ1ZSwgbmFtZTogYF9hdXRoX2RhdGFfJHtwcm92aWRlcn1faWRgIH1cbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDExMDAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFLFxuICAgICAgICAgICAgJ1RyaWVkIHRvIGVuc3VyZSBmaWVsZCB1bmlxdWVuZXNzIGZvciBhIGNsYXNzIHRoYXQgYWxyZWFkeSBoYXMgZHVwbGljYXRlcy4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZ25vcmUgXCJpbmRleCBhbHJlYWR5IGV4aXN0cyB3aXRoIHNhbWUgbmFtZVwiIG9yIFwiaW5kZXggYWxyZWFkeSBleGlzdHMgd2l0aCBkaWZmZXJlbnQgb3B0aW9uc1wiXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSA4NSB8fCBlcnJvci5jb2RlID09PSA4Nikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICAvLyBVc2VkIGluIHRlc3RzXG4gIF9yYXdGaW5kKGNsYXNzTmFtZTogc3RyaW5nLCBxdWVyeTogUXVlcnlUeXBlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+XG4gICAgICAgIGNvbGxlY3Rpb24uZmluZChxdWVyeSwge1xuICAgICAgICAgIG1heFRpbWVNUzogdGhpcy5fbWF4VGltZU1TLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5fYmF0Y2hTaXplLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gRXhlY3V0ZXMgYSBjb3VudC5cbiAgY291bnQoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBTY2hlbWFUeXBlLFxuICAgIHF1ZXJ5OiBRdWVyeVR5cGUsXG4gICAgcmVhZFByZWZlcmVuY2U6ID9zdHJpbmcsXG4gICAgX2VzdGltYXRlOiA/Ym9vbGVhbixcbiAgICBoaW50OiA/bWl4ZWQsXG4gICAgY29tbWVudDogP3N0cmluZ1xuICApIHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgcmVhZFByZWZlcmVuY2UgPSB0aGlzLl9wYXJzZVJlYWRQcmVmZXJlbmNlKHJlYWRQcmVmZXJlbmNlKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT5cbiAgICAgICAgY29sbGVjdGlvbi5jb3VudCh0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEsIHRydWUpLCB7XG4gICAgICAgICAgbWF4VGltZU1TOiB0aGlzLl9tYXhUaW1lTVMsXG4gICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgaGludCxcbiAgICAgICAgICBjb21tZW50LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgZGlzdGluY3QoY2xhc3NOYW1lOiBzdHJpbmcsIHNjaGVtYTogU2NoZW1hVHlwZSwgcXVlcnk6IFF1ZXJ5VHlwZSwgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICBzY2hlbWEgPSBjb252ZXJ0UGFyc2VTY2hlbWFUb01vbmdvU2NoZW1hKHNjaGVtYSk7XG4gICAgY29uc3QgaXNQb2ludGVyRmllbGQgPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdLnR5cGUgPT09ICdQb2ludGVyJztcbiAgICBjb25zdCB0cmFuc2Zvcm1GaWVsZCA9IHRyYW5zZm9ybUtleShjbGFzc05hbWUsIGZpZWxkTmFtZSwgc2NoZW1hKTtcblxuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PlxuICAgICAgICBjb2xsZWN0aW9uLmRpc3RpbmN0KHRyYW5zZm9ybUZpZWxkLCB0cmFuc2Zvcm1XaGVyZShjbGFzc05hbWUsIHF1ZXJ5LCBzY2hlbWEpKVxuICAgICAgKVxuICAgICAgLnRoZW4ob2JqZWN0cyA9PiB7XG4gICAgICAgIG9iamVjdHMgPSBvYmplY3RzLmZpbHRlcihvYmogPT4gb2JqICE9IG51bGwpO1xuICAgICAgICByZXR1cm4gb2JqZWN0cy5tYXAob2JqZWN0ID0+IHtcbiAgICAgICAgICBpZiAoaXNQb2ludGVyRmllbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1Qb2ludGVyU3RyaW5nKHNjaGVtYSwgZmllbGROYW1lLCBvYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbW9uZ29PYmplY3RUb1BhcnNlT2JqZWN0KGNsYXNzTmFtZSwgb2JqZWN0LCBzY2hlbWEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBhZ2dyZWdhdGUoXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAgc2NoZW1hOiBhbnksXG4gICAgcGlwZWxpbmU6IGFueSxcbiAgICByZWFkUHJlZmVyZW5jZTogP3N0cmluZyxcbiAgICBoaW50OiA/bWl4ZWQsXG4gICAgZXhwbGFpbj86IGJvb2xlYW4sXG4gICAgY29tbWVudDogP3N0cmluZyxcbiAgICByYXdWYWx1ZXM/OiBib29sZWFuLFxuICAgIHJhd0ZpZWxkTmFtZXM/OiBib29sZWFuXG4gICkge1xuICAgIHZhbGlkYXRlRXhwbGFpblZhbHVlKGV4cGxhaW4pO1xuICAgIGlmIChyYXdWYWx1ZXMpIHtcbiAgICAgIHBpcGVsaW5lID0gRUpTT04uZGVzZXJpYWxpemUocGlwZWxpbmUpO1xuICAgIH1cbiAgICBsZXQgaXNQb2ludGVyRmllbGQgPSBmYWxzZTtcbiAgICBwaXBlbGluZSA9IHBpcGVsaW5lLm1hcChzdGFnZSA9PiB7XG4gICAgICBpZiAoc3RhZ2UuJGdyb3VwKSB7XG4gICAgICAgIHN0YWdlLiRncm91cCA9IHRoaXMuX3BhcnNlQWdncmVnYXRlR3JvdXBBcmdzKHNjaGVtYSwgc3RhZ2UuJGdyb3VwLCByYXdGaWVsZE5hbWVzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHN0YWdlLiRncm91cC5faWQgJiZcbiAgICAgICAgICB0eXBlb2Ygc3RhZ2UuJGdyb3VwLl9pZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBzdGFnZS4kZ3JvdXAuX2lkLmluZGV4T2YoJyRfcF8nKSA+PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIGlzUG9pbnRlckZpZWxkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0YWdlLiRtYXRjaCkge1xuICAgICAgICBzdGFnZS4kbWF0Y2ggPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCBzdGFnZS4kbWF0Y2gsIHJhd1ZhbHVlcywgcmF3RmllbGROYW1lcyk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJHByb2plY3QpIHtcbiAgICAgICAgc3RhZ2UuJHByb2plY3QgPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZVByb2plY3RBcmdzKHNjaGVtYSwgc3RhZ2UuJHByb2plY3QsIHJhd1ZhbHVlcywgcmF3RmllbGROYW1lcyk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhZ2UuJGdlb05lYXIgJiYgc3RhZ2UuJGdlb05lYXIucXVlcnkpIHtcbiAgICAgICAgc3RhZ2UuJGdlb05lYXIucXVlcnkgPSB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCBzdGFnZS4kZ2VvTmVhci5xdWVyeSwgcmF3VmFsdWVzLCByYXdGaWVsZE5hbWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGFnZTtcbiAgICB9KTtcbiAgICByZWFkUHJlZmVyZW5jZSA9IHRoaXMuX3BhcnNlUmVhZFByZWZlcmVuY2UocmVhZFByZWZlcmVuY2UpO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PlxuICAgICAgICBjb2xsZWN0aW9uLmFnZ3JlZ2F0ZShwaXBlbGluZSwge1xuICAgICAgICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgIG1heFRpbWVNUzogdGhpcy5fbWF4VGltZU1TLFxuICAgICAgICAgIGJhdGNoU2l6ZTogdGhpcy5fYmF0Y2hTaXplLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAgZXhwbGFpbixcbiAgICAgICAgICBjb21tZW50LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyYXdGaWVsZE5hbWVzKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsICdfaWQnKSkge1xuICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZpZWxkICYmIHJlc3VsdC5faWQpIHtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9pZCA9IHJlc3VsdC5faWQuc3BsaXQoJyQnKVsxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcmVzdWx0Ll9pZCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5faWQgPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIChbJ29iamVjdCcsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2YgcmVzdWx0Ll9pZCkgJiYgXy5pc0VtcHR5KHJlc3VsdC5faWQpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5faWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0Lm9iamVjdElkID0gcmVzdWx0Ll9pZDtcbiAgICAgICAgICAgIGRlbGV0ZSByZXN1bHQuX2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgfSlcbiAgICAgIC50aGVuKG9iamVjdHMgPT4ge1xuICAgICAgICBpZiAocmF3VmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdHMubWFwKG9iaiA9PiBFSlNPTi5zZXJpYWxpemUob2JqKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhd0ZpZWxkTmFtZXMpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0cy5tYXAob2JqZWN0ID0+IG1vbmdvT2JqZWN0VG9QYXJzZU9iamVjdChjbGFzc05hbWUsIG9iamVjdCwgc2NoZW1hKSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBwaXBlbGluZSBhbmQgY29udmVydCBhbnkgUG9pbnRlciBvciBEYXRlIGNvbHVtbnMuXG4gIC8vIElmIHdlIGRldGVjdCBhIHBvaW50ZXIgY29sdW1uIHdlIHdpbGwgcmVuYW1lIHRoZSBjb2x1bW4gYmVpbmcgcXVlcmllZCBmb3IgdG8gbWF0Y2ggdGhlIGNvbHVtblxuICAvLyBpbiB0aGUgZGF0YWJhc2UuIFdlIGFsc28gbW9kaWZ5IHRoZSB2YWx1ZSB0byB3aGF0IHdlIGV4cGVjdCB0aGUgdmFsdWUgdG8gYmUgaW4gdGhlIGRhdGFiYXNlXG4gIC8vIGFzIHdlbGwuXG4gIC8vIEZvciBkYXRlcywgdGhlIGRyaXZlciBleHBlY3RzIGEgRGF0ZSBvYmplY3QsIGJ1dCB3ZSBoYXZlIGEgc3RyaW5nIGNvbWluZyBpbi4gU28gd2UnbGwgY29udmVydFxuICAvLyB0aGUgc3RyaW5nIHRvIGEgRGF0ZSBzbyB0aGUgZHJpdmVyIGNhbiBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgY29tcGFyaXNvbi5cbiAgLy9cbiAgLy8gVGhlIGdvYWwgb2YgdGhpcyBtZXRob2QgaXMgdG8gbG9vayBmb3IgdGhlIFwibGVhdmVzXCIgb2YgdGhlIHBpcGVsaW5lIGFuZCBkZXRlcm1pbmUgaWYgaXQgbmVlZHNcbiAgLy8gdG8gYmUgY29udmVydGVkLiBUaGUgcGlwZWxpbmUgY2FuIGhhdmUgYSBmZXcgZGlmZmVyZW50IGZvcm1zLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWU6XG4gIC8vICAgICBodHRwczovL2RvY3MubW9uZ29kYi5jb20vbWFudWFsL3JlZmVyZW5jZS9vcGVyYXRvci9hZ2dyZWdhdGlvbi9cbiAgLy9cbiAgLy8gSWYgdGhlIHBpcGVsaW5lIGlzIGFuIGFycmF5LCBpdCBtZWFucyB3ZSBhcmUgcHJvYmFibHkgcGFyc2luZyBhbiAnJGFuZCcgb3IgJyRvcicgb3BlcmF0b3IuIEluXG4gIC8vIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIGxvb3AgdGhyb3VnaCBhbGwgb2YgaXQncyBjaGlsZHJlbiB0byBmaW5kIHRoZSBjb2x1bW5zIGJlaW5nIG9wZXJhdGVkIG9uLlxuICAvLyBJZiB0aGUgcGlwZWxpbmUgaXMgYW4gb2JqZWN0LCB0aGVuIHdlJ2xsIGxvb3AgdGhyb3VnaCB0aGUga2V5cyBjaGVja2luZyB0byBzZWUgaWYgdGhlIGtleSBuYW1lXG4gIC8vIG1hdGNoZXMgb25lIG9mIHRoZSBzY2hlbWEgY29sdW1ucy4gSWYgaXQgZG9lcyBtYXRjaCBhIGNvbHVtbiBhbmQgdGhlIGNvbHVtbiBpcyBhIFBvaW50ZXIgb3JcbiAgLy8gYSBEYXRlLCB0aGVuIHdlJ2xsIGNvbnZlcnQgdGhlIHZhbHVlIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgLy9cbiAgLy8gQXMgbXVjaCBhcyBJIGhhdGUgcmVjdXJzaW9uLi4udGhpcyBzZWVtZWQgbGlrZSBhIGdvb2QgZml0IGZvciBpdC4gV2UncmUgZXNzZW50aWFsbHkgdHJhdmVyc2luZ1xuICAvLyBkb3duIGEgdHJlZSB0byBmaW5kIGEgXCJsZWFmIG5vZGVcIiBhbmQgY2hlY2tpbmcgdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZC5cbiAgX3BhcnNlQWdncmVnYXRlQXJncyhzY2hlbWE6IGFueSwgcGlwZWxpbmU6IGFueSwgcmF3VmFsdWVzPzogYm9vbGVhbiwgcmF3RmllbGROYW1lcz86IGJvb2xlYW4pOiBhbnkge1xuICAgIGlmIChwaXBlbGluZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChVdGlscy5pc0RhdGUocGlwZWxpbmUpKSB7XG4gICAgICByZXR1cm4gcGlwZWxpbmU7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBpcGVsaW5lKSkge1xuICAgICAgcmV0dXJuIHBpcGVsaW5lLm1hcCh2YWx1ZSA9PiB0aGlzLl9wYXJzZUFnZ3JlZ2F0ZUFyZ3Moc2NoZW1hLCB2YWx1ZSwgcmF3VmFsdWVzLCByYXdGaWVsZE5hbWVzKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGlwZWxpbmUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBwaXBlbGluZSkge1xuICAgICAgICBpZiAoIXJhd0ZpZWxkTmFtZXMgJiYgc2NoZW1hLmZpZWxkc1tmaWVsZF0gJiYgc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwaXBlbGluZVtmaWVsZF0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZVtgX3BfJHtmaWVsZH1gXSA9IHBpcGVsaW5lW2ZpZWxkXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJhd1ZhbHVlcykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbYF9wXyR7ZmllbGR9YF0gPSBwaXBlbGluZVtmaWVsZF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVyblZhbHVlW2BfcF8ke2ZpZWxkfWBdID0gYCR7c2NoZW1hLmZpZWxkc1tmaWVsZF0udGFyZ2V0Q2xhc3N9JCR7cGlwZWxpbmVbZmllbGRdfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdEYXRlJyAmJiAhcmF3VmFsdWVzKSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWVbZmllbGRdID0gdGhpcy5fY29udmVydFRvRGF0ZShwaXBlbGluZVtmaWVsZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVyblZhbHVlW2ZpZWxkXSA9IHRoaXMuX3BhcnNlQWdncmVnYXRlQXJncyhzY2hlbWEsIHBpcGVsaW5lW2ZpZWxkXSwgcmF3VmFsdWVzLCByYXdGaWVsZE5hbWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmF3RmllbGROYW1lcykge1xuICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ29iamVjdElkJykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbJ19pZCddID0gcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICAgICAgZGVsZXRlIHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnY3JlYXRlZEF0Jykge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbJ19jcmVhdGVkX2F0J10gPSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgICAgICBkZWxldGUgcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICd1cGRhdGVkQXQnKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZVsnX3VwZGF0ZWRfYXQnXSA9IHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgICAgIGRlbGV0ZSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBwaXBlbGluZTtcbiAgfVxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gdGhlIG9uZSBhYm92ZS4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGNvbWJpbmUgdGhlc2VcbiAgLy8gdHdvIGZ1bmN0aW9ucyBhbmQgbWFraW5nIHRoZSBjb2RlIGV2ZW4gaGFyZGVyIHRvIHVuZGVyc3RhbmQsIEkgZGVjaWRlZCB0byBzcGxpdCBpdCB1cC4gVGhlXG4gIC8vIGRpZmZlcmVuY2Ugd2l0aCB0aGlzIGZ1bmN0aW9uIGlzIHdlIGFyZSBub3QgdHJhbnNmb3JtaW5nIHRoZSB2YWx1ZXMsIG9ubHkgdGhlIGtleXMgb2YgdGhlXG4gIC8vIHBpcGVsaW5lLlxuICBfcGFyc2VBZ2dyZWdhdGVQcm9qZWN0QXJncyhzY2hlbWE6IGFueSwgcGlwZWxpbmU6IGFueSwgcmF3VmFsdWVzPzogYm9vbGVhbiwgcmF3RmllbGROYW1lcz86IGJvb2xlYW4pOiBhbnkge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0ge307XG4gICAgZm9yIChjb25zdCBmaWVsZCBpbiBwaXBlbGluZSkge1xuICAgICAgaWYgKCFyYXdGaWVsZE5hbWVzICYmIHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICByZXR1cm5WYWx1ZVtgX3BfJHtmaWVsZH1gXSA9IHBpcGVsaW5lW2ZpZWxkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVyblZhbHVlW2ZpZWxkXSA9IHRoaXMuX3BhcnNlQWdncmVnYXRlQXJncyhzY2hlbWEsIHBpcGVsaW5lW2ZpZWxkXSwgcmF3VmFsdWVzLCByYXdGaWVsZE5hbWVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFyYXdGaWVsZE5hbWVzKSB7XG4gICAgICAgIGlmIChmaWVsZCA9PT0gJ29iamVjdElkJykge1xuICAgICAgICAgIHJldHVyblZhbHVlWydfaWQnXSA9IHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgICBkZWxldGUgcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAnY3JlYXRlZEF0Jykge1xuICAgICAgICAgIHJldHVyblZhbHVlWydfY3JlYXRlZF9hdCddID0gcmV0dXJuVmFsdWVbZmllbGRdO1xuICAgICAgICAgIGRlbGV0ZSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICd1cGRhdGVkQXQnKSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWVbJ191cGRhdGVkX2F0J10gPSByZXR1cm5WYWx1ZVtmaWVsZF07XG4gICAgICAgICAgZGVsZXRlIHJldHVyblZhbHVlW2ZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIHRoZSB0d28gYWJvdmUuIE1vbmdvREIgJGdyb3VwIGFnZ3JlZ2F0ZSBsb29rcyBsaWtlOlxuICAvLyAgICAgeyAkZ3JvdXA6IHsgX2lkOiA8ZXhwcmVzc2lvbj4sIDxmaWVsZDE+OiB7IDxhY2N1bXVsYXRvcjE+IDogPGV4cHJlc3Npb24xPiB9LCAuLi4gfSB9XG4gIC8vIFRoZSA8ZXhwcmVzc2lvbj4gY291bGQgYmUgYSBjb2x1bW4gbmFtZSwgcHJlZml4ZWQgd2l0aCB0aGUgJyQnIGNoYXJhY3Rlci4gV2UnbGwgbG9vayBmb3JcbiAgLy8gdGhlc2UgPGV4cHJlc3Npb24+IGFuZCBjaGVjayB0byBzZWUgaWYgaXQgaXMgYSAnUG9pbnRlcicgb3IgaWYgaXQncyBvbmUgb2YgY3JlYXRlZEF0LFxuICAvLyB1cGRhdGVkQXQgb3Igb2JqZWN0SWQgYW5kIGNoYW5nZSBpdCBhY2NvcmRpbmdseS5cbiAgX3BhcnNlQWdncmVnYXRlR3JvdXBBcmdzKHNjaGVtYTogYW55LCBwaXBlbGluZTogYW55LCByYXdGaWVsZE5hbWVzPzogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGlwZWxpbmUpKSB7XG4gICAgICByZXR1cm4gcGlwZWxpbmUubWFwKHZhbHVlID0+IHRoaXMuX3BhcnNlQWdncmVnYXRlR3JvdXBBcmdzKHNjaGVtYSwgdmFsdWUsIHJhd0ZpZWxkTmFtZXMpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwaXBlbGluZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0ge307XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHBpcGVsaW5lKSB7XG4gICAgICAgIHJldHVyblZhbHVlW2ZpZWxkXSA9IHRoaXMuX3BhcnNlQWdncmVnYXRlR3JvdXBBcmdzKHNjaGVtYSwgcGlwZWxpbmVbZmllbGRdLCByYXdGaWVsZE5hbWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwaXBlbGluZSA9PT0gJ3N0cmluZycgJiYgIXJhd0ZpZWxkTmFtZXMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gcGlwZWxpbmUuc3Vic3RyaW5nKDEpO1xuICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGRdICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICByZXR1cm4gYCRfcF8ke2ZpZWxkfWA7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkID09ICdjcmVhdGVkQXQnKSB7XG4gICAgICAgIHJldHVybiAnJF9jcmVhdGVkX2F0JztcbiAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT0gJ3VwZGF0ZWRBdCcpIHtcbiAgICAgICAgcmV0dXJuICckX3VwZGF0ZWRfYXQnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGlwZWxpbmU7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgY29udmVydHMgdmFsdWVzIHRvIERhdGUgb2JqZWN0cy4gU2luY2UgdGhlIHBhc3NlZCBvYmplY3QgaXMgcGFydCBvZiBhbiBhZ2dyZWdhdGlvblxuICAgKiBwaXBlbGluZSBhbmQgY2FuIGNvbnRhaW4gdmFyaW91cyBsb2dpYyBvcGVyYXRvcnMgKGxpa2UgJGd0LCAkbHQsIGV0YyksIHRoaXMgZnVuY3Rpb24gd2lsbFxuICAgKiB0cmF2ZXJzZSB0aGUgb2JqZWN0IGFuZCBjb252ZXJ0IGFueSBzdHJpbmdzIHRoYXQgY2FuIGJlIHBhcnNlZCBhcyBkYXRlcyBpbnRvIERhdGUgb2JqZWN0cy5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgb3JpZ2luYWwgdmFsdWUgaWYgbm90IGNvbnZlcnRpYmxlIHRvIERhdGUsIG9yIGEgRGF0ZSBvYmplY3QgaWYgaXQgaXMuXG4gICAqL1xuICBfY29udmVydFRvRGF0ZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoVXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGlzTmFOKERhdGUucGFyc2UodmFsdWUpKSA/IHZhbHVlIDogbmV3IERhdGUodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuVmFsdWVbZmllbGRdID0gdGhpcy5fY29udmVydFRvRGF0ZSh2YWx1ZVtmaWVsZF0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBfcGFyc2VSZWFkUHJlZmVyZW5jZShyZWFkUHJlZmVyZW5jZTogP3N0cmluZyk6ID9zdHJpbmcge1xuICAgIGlmIChyZWFkUHJlZmVyZW5jZSkge1xuICAgICAgcmVhZFByZWZlcmVuY2UgPSByZWFkUHJlZmVyZW5jZS50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgICBzd2l0Y2ggKHJlYWRQcmVmZXJlbmNlKSB7XG4gICAgICBjYXNlICdQUklNQVJZJzpcbiAgICAgICAgcmVhZFByZWZlcmVuY2UgPSBSZWFkUHJlZmVyZW5jZS5QUklNQVJZO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BSSU1BUllfUFJFRkVSUkVEJzpcbiAgICAgICAgcmVhZFByZWZlcmVuY2UgPSBSZWFkUHJlZmVyZW5jZS5QUklNQVJZX1BSRUZFUlJFRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdTRUNPTkRBUlknOlxuICAgICAgICByZWFkUHJlZmVyZW5jZSA9IFJlYWRQcmVmZXJlbmNlLlNFQ09OREFSWTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdTRUNPTkRBUllfUFJFRkVSUkVEJzpcbiAgICAgICAgcmVhZFByZWZlcmVuY2UgPSBSZWFkUHJlZmVyZW5jZS5TRUNPTkRBUllfUFJFRkVSUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05FQVJFU1QnOlxuICAgICAgICByZWFkUHJlZmVyZW5jZSA9IFJlYWRQcmVmZXJlbmNlLk5FQVJFU1Q7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlIG51bGw6XG4gICAgICBjYXNlICcnOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnTm90IHN1cHBvcnRlZCByZWFkIHByZWZlcmVuY2UuJyk7XG4gICAgfVxuICAgIHJldHVybiByZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIHBlcmZvcm1Jbml0aWFsaXphdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjcmVhdGVJbmRleChjbGFzc05hbWU6IHN0cmluZywgaW5kZXg6IGFueSkge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uY3JlYXRlSW5kZXgoaW5kZXgpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgY3JlYXRlSW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZywgaW5kZXhlczogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5jcmVhdGVJbmRleGVzKGluZGV4ZXMpKVxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLmhhbmRsZUVycm9yKGVycikpO1xuICB9XG5cbiAgY3JlYXRlSW5kZXhlc0lmTmVlZGVkKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgaWYgKHR5cGUgJiYgdHlwZS50eXBlID09PSAnUG9seWdvbicpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0ge1xuICAgICAgICBbZmllbGROYW1lXTogJzJkc3BoZXJlJyxcbiAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVJbmRleChjbGFzc05hbWUsIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY3JlYXRlVGV4dEluZGV4ZXNJZk5lZWRlZChjbGFzc05hbWU6IHN0cmluZywgcXVlcnk6IFF1ZXJ5VHlwZSwgc2NoZW1hOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiBxdWVyeSkge1xuICAgICAgaWYgKCFxdWVyeVtmaWVsZE5hbWVdIHx8ICFxdWVyeVtmaWVsZE5hbWVdLiR0ZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZXhpc3RpbmdJbmRleGVzID0gc2NoZW1hLmluZGV4ZXM7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBleGlzdGluZ0luZGV4ZXMpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBleGlzdGluZ0luZGV4ZXNba2V5XTtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpbmRleCwgZmllbGROYW1lKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhOYW1lID0gYCR7ZmllbGROYW1lfV90ZXh0YDtcbiAgICAgIGNvbnN0IHRleHRJbmRleCA9IHtcbiAgICAgICAgW2luZGV4TmFtZV06IHsgW2ZpZWxkTmFtZV06ICd0ZXh0JyB9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB0aGlzLnNldEluZGV4ZXNXaXRoU2NoZW1hRm9ybWF0KFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHRleHRJbmRleCxcbiAgICAgICAgZXhpc3RpbmdJbmRleGVzLFxuICAgICAgICBzY2hlbWEuZmllbGRzXG4gICAgICApLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IDg1KSB7XG4gICAgICAgICAgLy8gSW5kZXggZXhpc3Qgd2l0aCBkaWZmZXJlbnQgb3B0aW9uc1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldEluZGV4ZXNGcm9tTW9uZ28oY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXRJbmRleGVzKGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkYXB0aXZlQ29sbGVjdGlvbihjbGFzc05hbWUpXG4gICAgICAudGhlbihjb2xsZWN0aW9uID0+IGNvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5pbmRleGVzKCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBkcm9wSW5kZXgoY2xhc3NOYW1lOiBzdHJpbmcsIGluZGV4OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRpdmVDb2xsZWN0aW9uKGNsYXNzTmFtZSlcbiAgICAgIC50aGVuKGNvbGxlY3Rpb24gPT4gY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmRyb3BJbmRleChpbmRleCkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyKSk7XG4gIH1cblxuICBkcm9wQWxsSW5kZXhlcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGl2ZUNvbGxlY3Rpb24oY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oY29sbGVjdGlvbiA9PiBjb2xsZWN0aW9uLl9tb25nb0NvbGxlY3Rpb24uZHJvcEluZGV4ZXMoKSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIHVwZGF0ZVNjaGVtYVdpdGhJbmRleGVzKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWxsQ2xhc3NlcygpXG4gICAgICAudGhlbihjbGFzc2VzID0+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBjbGFzc2VzLm1hcChzY2hlbWEgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldEluZGV4ZXNGcm9tTW9uZ28oc2NoZW1hLmNsYXNzTmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5oYW5kbGVFcnJvcihlcnIpKTtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uYWxTZXNzaW9uKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25hbFNlY3Rpb24gPSB0aGlzLmNsaWVudC5zdGFydFNlc3Npb24oKTtcbiAgICB0cmFuc2FjdGlvbmFsU2VjdGlvbi5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cmFuc2FjdGlvbmFsU2VjdGlvbik7XG4gIH1cblxuICBjb21taXRUcmFuc2FjdGlvbmFsU2Vzc2lvbih0cmFuc2FjdGlvbmFsU2VjdGlvbjogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWl0ID0gcmV0cmllcyA9PiB7XG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb25hbFNlY3Rpb25cbiAgICAgICAgLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuaGFzRXJyb3JMYWJlbCgnVHJhbnNpZW50VHJhbnNhY3Rpb25FcnJvcicpICYmIHJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29tbWl0KHJldHJpZXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0cmFuc2FjdGlvbmFsU2VjdGlvbi5lbmRTZXNzaW9uKCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGNvbW1pdCg1KTtcbiAgfVxuXG4gIGFib3J0VHJhbnNhY3Rpb25hbFNlc3Npb24odHJhbnNhY3Rpb25hbFNlY3Rpb246IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0cmFuc2FjdGlvbmFsU2VjdGlvbi5hYm9ydFRyYW5zYWN0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICB0cmFuc2FjdGlvbmFsU2VjdGlvbi5lbmRTZXNzaW9uKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTW9uZ29TdG9yYWdlQWRh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
|