verdaccio 5.4.0 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/CODE_OF_CONDUCT.md +10 -10
- package/CONTRIBUTING.md +28 -27
- package/SECURITY.md +8 -9
- package/build/api/debug/index.js +1 -1
- package/build/api/endpoint/api/dist-tags.js +4 -4
- package/build/api/endpoint/api/package.js +3 -3
- package/build/api/endpoint/api/ping.js +1 -1
- package/build/api/endpoint/api/publish.js +11 -11
- package/build/api/endpoint/api/star.js +5 -5
- package/build/api/endpoint/api/stars.js +1 -1
- package/build/api/endpoint/api/user.js +6 -6
- package/build/api/endpoint/api/v1/index.js +1 -1
- package/build/api/endpoint/api/v1/profile.js +4 -4
- package/build/api/endpoint/api/v1/search.js +4 -4
- package/build/api/endpoint/api/v1/token.js +8 -8
- package/build/api/endpoint/api/whoami.js +1 -1
- package/build/api/endpoint/index.js +9 -9
- package/build/api/index.js +13 -13
- package/build/api/middleware.js +6 -6
- package/build/api/rate-limiter.js +3 -3
- package/build/api/web/api.js +3 -3
- package/build/api/web/endpoint/index.js +10 -4
- package/build/api/web/endpoint/package.js +9 -9
- package/build/api/web/endpoint/search.js +3 -3
- package/build/api/web/endpoint/user.js +4 -4
- package/build/api/web/html/renderHTML.js +13 -9
- package/build/api/web/html/template.js +1 -1
- package/build/api/web/index.js +10 -10
- package/build/config/env.js +1 -1
- package/build/index.js +1 -1
- package/build/lib/auth-utils.js +5 -5
- package/build/lib/auth.js +7 -17
- package/build/lib/bootstrap.js +8 -8
- package/build/lib/cli/cli.js +3 -3
- package/build/lib/cli/commands/info.js +3 -3
- package/build/lib/cli/commands/init.js +3 -3
- package/build/lib/cli/commands/version.js +1 -1
- package/build/lib/cli/utils.js +3 -3
- package/build/lib/config-path.js +3 -3
- package/build/lib/config-utils.js +3 -3
- package/build/lib/config.js +8 -32
- package/build/lib/crypto-utils.js +3 -3
- package/build/lib/local-storage.js +7 -15
- package/build/lib/logger/formatter/index.js +1 -1
- package/build/lib/logger/formatter/prettifier.js +3 -3
- package/build/lib/logger/levels.js +1 -1
- package/build/lib/logger/logger.js +10 -6
- package/build/lib/logger/utils.js +1 -1
- package/build/lib/metadata-utils.js +3 -3
- package/build/lib/notify/index.js +3 -3
- package/build/lib/notify/notify-request.js +5 -5
- package/build/lib/plugin-loader.js +4 -4
- package/build/lib/search.js +2 -6
- package/build/lib/storage-utils.js +3 -3
- package/build/lib/storage.js +10 -22
- package/build/lib/up-storage.js +9 -43
- package/build/lib/uplink-util.js +1 -1
- package/build/lib/utils.js +22 -13
- package/build/utils/user.js +1 -1
- package/conf/README.md +3 -3
- package/eslintrc.js +92 -92
- package/index.js +1 -1
- package/package.json +64 -63
- package/prettier.config.js +15 -0
- package/tsconfig.json +3 -10
- package/yarn-plugins/plugin-postinstall.js +10 -10
package/build/lib/storage.js
CHANGED
|
@@ -7,50 +7,38 @@ exports.default = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _assert = _interopRequireDefault(require("assert"));
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _async = _interopRequireDefault(require("async"));
|
|
11
11
|
|
|
12
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _stream = _interopRequireDefault(require("stream"));
|
|
15
15
|
|
|
16
16
|
var _streams = require("@verdaccio/streams");
|
|
17
17
|
|
|
18
18
|
var _logger = require("../lib/logger");
|
|
19
19
|
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
var _search = _interopRequireDefault(require("./search"));
|
|
20
|
+
var _configUtils = require("./config-utils");
|
|
23
21
|
|
|
24
22
|
var _constants = require("./constants");
|
|
25
23
|
|
|
26
24
|
var _localStorage = _interopRequireDefault(require("./local-storage"));
|
|
27
25
|
|
|
26
|
+
var _metadataUtils = require("./metadata-utils");
|
|
27
|
+
|
|
28
|
+
var _search = _interopRequireDefault(require("./search"));
|
|
29
|
+
|
|
28
30
|
var _storageUtils = require("./storage-utils");
|
|
29
31
|
|
|
30
|
-
var
|
|
32
|
+
var _upStorage = _interopRequireDefault(require("./up-storage"));
|
|
31
33
|
|
|
32
|
-
var
|
|
34
|
+
var _uplinkUtil = require("./uplink-util");
|
|
33
35
|
|
|
34
36
|
var _utils = require("./utils");
|
|
35
37
|
|
|
36
|
-
var _configUtils = require("./config-utils");
|
|
37
|
-
|
|
38
38
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
39
39
|
|
|
40
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
41
|
-
|
|
42
40
|
class Storage {
|
|
43
41
|
constructor(config) {
|
|
44
|
-
_defineProperty(this, "localStorage", void 0);
|
|
45
|
-
|
|
46
|
-
_defineProperty(this, "config", void 0);
|
|
47
|
-
|
|
48
|
-
_defineProperty(this, "logger", void 0);
|
|
49
|
-
|
|
50
|
-
_defineProperty(this, "uplinks", void 0);
|
|
51
|
-
|
|
52
|
-
_defineProperty(this, "filters", void 0);
|
|
53
|
-
|
|
54
42
|
this.config = config;
|
|
55
43
|
this.uplinks = (0, _uplinkUtil.setupUpLinks)(config);
|
|
56
44
|
this.logger = _logger.logger;
|
|
@@ -657,4 +645,4 @@ class Storage {
|
|
|
657
645
|
|
|
658
646
|
var _default = Storage;
|
|
659
647
|
exports.default = _default;
|
|
660
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvc3RvcmFnZS50cyJdLCJuYW1lcyI6WyJTdG9yYWdlIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJ1cGxpbmtzIiwibG9nZ2VyIiwiZmlsdGVycyIsImxvY2FsU3RvcmFnZSIsImluaXQiLCJMb2NhbFN0b3JhZ2UiLCJnZXRTZWNyZXQiLCJhZGRQYWNrYWdlIiwibmFtZSIsIm1ldGFkYXRhIiwiY2FsbGJhY2siLCJfaXNBbGxvd1B1Ymxpc2hPZmZsaW5lIiwiX3N5bmNVcGxpbmtzTWV0YWRhdGEiLCJiaW5kIiwiZXJyIiwicHVibGlzaCIsIl8iLCJpc0Jvb2xlYW4iLCJhbGxvd19vZmZsaW5lIiwicmVhZFRva2VucyIsImZpbHRlciIsInNhdmVUb2tlbiIsInRva2VuIiwiZGVsZXRlVG9rZW4iLCJ1c2VyIiwidG9rZW5LZXkiLCJhZGRWZXJzaW9uIiwidmVyc2lvbiIsInRhZyIsIm1lcmdlVGFncyIsInRhZ0hhc2giLCJjaGFuZ2VQYWNrYWdlIiwicmV2aXNpb24iLCJyZW1vdmVQYWNrYWdlIiwiU2VhcmNoIiwicmVtb3ZlIiwicmVtb3ZlVGFyYmFsbCIsImZpbGVuYW1lIiwiYWRkVGFyYmFsbCIsImhhc0xvY2FsVGFyYmFsbCIsInNlbGYiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImxvY2FsU3RyZWFtIiwiZ2V0VGFyYmFsbCIsImlzT3BlbiIsIm9uIiwic3RhdHVzIiwiSFRUUF9TVEFUVVMiLCJOT1RfRk9VTkQiLCJhYm9ydCIsInJlYWRTdHJlYW0iLCJSZWFkVGFyYmFsbCIsImVtaXQiLCJlcnI0MDQiLCJnZXRQYWNrYWdlTWV0YWRhdGEiLCJpbmZvIiwiaXNOaWwiLCJfZGlzdGZpbGVzIiwic2VydmVGaWxlIiwidiIsInBpcGUiLCJmaWxlIiwidXBsaW5rIiwidXBsaW5rSWQiLCJwYWNrYWdlcyIsIlByb3h5U3RvcmFnZSIsInVybCIsImNhY2hlIiwiX2F1dG9nZW5lcmF0ZWQiLCJzYXZlc3RyZWFtIiwib25fb3BlbiIsInJzdHJlYW0yIiwiZmV0Y2hUYXJiYWxsIiwiZG9uZSIsIndhcm4iLCJmaWxlTmFtZSIsImdldFBhY2thZ2UiLCJvcHRpb25zIiwiZGF0YSIsIklOVEVSTkFMX0VSUk9SIiwicmVxIiwidXBsaW5rc0xvb2siLCJnZXRQYWNrYWdlU3luVXBMaW5rc0NhbGxiYWNrIiwicmVzdWx0IiwidXBsaW5rRXJyb3JzIiwia2VlcFVwTGlua0RhdGEiLCJfYXR0YWNobWVudHMiLCJzZWFyY2giLCJzdGFydGtleSIsInNlYXJjaFN0cmVhbSIsIlN0cmVhbSIsIlBhc3NUaHJvdWdoIiwib2JqZWN0TW9kZSIsImFzeW5jIiwiZWFjaFNlcmllcyIsIk9iamVjdCIsImtleXMiLCJ1cF9uYW1lIiwiY2IiLCJxdWVyeSIsImxvY2FsIiwidW5kZWZpbmVkIiwidXBsaW5rU3RyZWFtIiwiZW5kIiwiZXJyb3IiLCJsb2NhbFNlYXJjaFN0cmVhbSIsImdldExvY2FsRGF0YWJhc2UiLCJzdG9yYWdlUGx1Z2luIiwiZ2V0IiwibG9jYWxzIiwiaXRlbVBrZyIsInBrZ01ldGFkYXRhIiwibGF0ZXN0IiwiRElTVF9UQUdTIiwidmVyc2lvbnMiLCJ0aW1lTGlzdCIsInRpbWUiLCJ1c2VycyIsInB1c2giLCJwYWNrYWdlIiwibGVuZ3RoIiwicGFja2FnZUluZm8iLCJmb3VuZCIsInVwTGlua3MiLCJoYXNUb0xvb2tJbnRvVXBsaW5rcyIsIm1hcCIsInVwTGluayIsIl9vcHRpb25zIiwiYXNzaWduIiwidXBMaW5rTWV0YSIsIl91cGxpbmtzIiwidXBuYW1lIiwiZmV0Y2hlZCIsIkRhdGUiLCJub3ciLCJtYXhhZ2UiLCJldGFnIiwiZ2V0UmVtb3RlTWV0YWRhdGEiLCJ1cExpbmtSZXNwb25zZSIsImVUYWciLCJyZW1vdGVTdGF0dXMiLCJFcnJvckNvZGUiLCJnZXRJbnRlcm5hbEVycm9yIiwic3ViIiwidXBMaW5rc0Vycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInVwbGlua1RpbWVvdXRFcnJvciIsImkiLCJqIiwiY29kZSIsImdldFNlcnZpY2VVbmF2YWlsYWJsZSIsImdldE5vdEZvdW5kIiwiQVBJX0VSUk9SIiwiTk9fUEFDS0FHRSIsInVwZGF0ZVZlcnNpb25zIiwicGFja2FnZUpzb25Mb2NhbCIsImZpbHRlckVycm9ycyIsImZpbHRlcl9tZXRhZGF0YSIsImNvbmNhdCIsIl91cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlN5bWJvbCIsImZvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7QUFFQSxNQUFNQSxPQUFOLENBQXlDO0FBT2hDQyxFQUFBQSxXQUFXLENBQUNDLE1BQUQsRUFBaUI7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFBQTs7QUFDakMsU0FBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLDhCQUFhRCxNQUFiLENBQWY7QUFDQSxTQUFLRSxNQUFMLEdBQWNBLGNBQWQ7QUFDQSxTQUFLQyxPQUFMLEdBQWUsRUFBZixDQUppQyxDQUtqQzs7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0Q7O0FBRU1DLEVBQUFBLElBQUksQ0FBQ0wsTUFBRCxFQUFpQkcsT0FBdUIsR0FBRyxFQUEzQyxFQUFnRTtBQUN6RSxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLElBQUlFLHFCQUFKLENBQWlCLEtBQUtOLE1BQXRCLEVBQThCRSxjQUE5QixDQUFwQjtBQUVBLFdBQU8sS0FBS0UsWUFBTCxDQUFrQkcsU0FBbEIsQ0FBNEJQLE1BQTVCLENBQVA7QUFDRDtBQUVEO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ3lCLFFBQVZRLFVBQVUsQ0FBQ0MsSUFBRCxFQUFlQyxRQUFmLEVBQThCQyxRQUE5QixFQUFpRTtBQUN0RixRQUFJO0FB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O0FBQ3JELGNBQU0zSCxPQUFPLEdBQUd5RixRQUFRLENBQUNrQyxDQUFELENBQXhCLENBRHFELENBR3JEO0FBQ0E7O0FBQ0EzSCxRQUFBQSxPQUFPLENBQUMySSxNQUFNLENBQUNDLEdBQVAsQ0FBVyxvQkFBWCxDQUFELENBQVAsR0FBNEN2QyxNQUFNLENBQUNLLE1BQW5EO0FBQ0Q7QUFDRjtBQUNGOztBQXhrQnNDOztlQTJrQjFCeEksTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBTdHJlYW0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgYXN5bmMsIHsgQXN5bmNSZXN1bHRBcnJheUNhbGxiYWNrIH0gZnJvbSAnYXN5bmMnO1xuaW1wb3J0IHsgUmVhZFRhcmJhbGwgfSBmcm9tICdAdmVyZGFjY2lvL3N0cmVhbXMnO1xuaW1wb3J0IHsgSVJlYWRUYXJiYWxsLCBJVXBsb2FkVGFyYmFsbCwgVmVyc2lvbnMsIFBhY2thZ2UsIENvbmZpZywgTWVyZ2VUYWdzLCBWZXJzaW9uLCBEaXN0RmlsZSwgQ2FsbGJhY2ssIExvZ2dlciB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuaW1wb3J0IHsgR2VuZXJpY0JvZHksIFRva2VuRmlsdGVyLCBUb2tlbiB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuaW1wb3J0IHsgVmVyZGFjY2lvRXJyb3IgfSBmcm9tICdAdmVyZGFjY2lvL2NvbW1vbnMtYXBpJztcbmltcG9ydCB7IElTdG9yYWdlLCBJUHJveHksIElTdG9yYWdlSGFuZGxlciwgUHJveHlMaXN0LCBTdHJpbmdWYWx1ZSwgSUdldFBhY2thZ2VPcHRpb25zLCBJU3luY1VwbGlua3MsIElQbHVnaW5GaWx0ZXJzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbGliL2xvZ2dlcic7XG5pbXBvcnQgUHJveHlTdG9yYWdlIGZyb20gJy4vdXAtc3RvcmFnZSc7XG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB7IEFQSV9FUlJPUiwgSFRUUF9TVEFUVVMsIERJU1RfVEFHUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCBMb2NhbFN0b3JhZ2UgZnJvbSAnLi9sb2NhbC1zdG9yYWdlJztcbmltcG9ydCB7IGNoZWNrUGFja2FnZUxvY2FsLCBwdWJsaXNoUGFja2FnZSwgY2hlY2tQYWNrYWdlUmVtb3RlLCBjbGVhblVwTGlua3NSZWYsIG1lcmdlVXBsaW5rVGltZUludG9Mb2NhbCwgZ2VuZXJhdGVQYWNrYWdlVGVtcGxhdGUgfSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuaW1wb3J0IHsgc2V0dXBVcExpbmtzLCB1cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayB9IGZyb20gJy4vdXBsaW5rLXV0aWwnO1xuaW1wb3J0IHsgbWVyZ2VWZXJzaW9ucyB9IGZyb20gJy4vbWV0YWRhdGEtdXRpbHMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBub3JtYWxpemVEaXN0VGFncywgdmFsaWRhdGVNZXRhZGF0YSwgaXNPYmplY3QgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IGhhc1Byb3h5VG8gfSBmcm9tICcuL2NvbmZpZy11dGlscyc7XG5cbmNsYXNzIFN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZUhhbmRsZXIge1xuICBwdWJsaWMgbG9jYWxTdG9yYWdlOiBJU3RvcmFnZTtcbiAgcHVibGljIGNvbmZpZzogQ29uZmlnO1xuICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXI7XG4gIHB1YmxpYyB1cGxpbmtzOiBQcm94eUxpc3Q7XG4gIHB1YmxpYyBmaWx0ZXJzOiBJUGx1Z2luRmlsdGVycztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29uZmlnOiBDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnVwbGlua3MgPSBzZXR1cFVwTGlua3MoY29uZmlnKTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmZpbHRlcnMgPSBbXTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGluaXQoY29uZmlnOiBDb25maWcsIGZpbHRlcnM6IElQbHVnaW5GaWx0ZXJzID0gW10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSBuZXcgTG9jYWxTdG9yYWdlKHRoaXMuY29uZmlnLCBsb2dnZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLmdldFNlY3JldChjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqICBBZGQgYSB7bmFtZX0gcGFja2FnZSB0byBhIHN5c3RlbVxuICAgRnVuY3Rpb24gY2hlY2tzIGlmIHBhY2thZ2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGF2YWlsYWJsZSBmcm9tIHVwbGlua3MuXG4gICBJZiBpdCBpc24ndCwgd2UgY3JlYXRlIHBhY2thZ2UgbG9jYWxseVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKSAmJiB1cGxpbmtzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkUGFja2FnZShuYW1lOiBzdHJpbmcsIG1ldGFkYXRhOiBhbnksIGNhbGxiYWNrOiBGdW5jdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VMb2NhbChuYW1lLCB0aGlzLmxvY2FsU3RvcmFnZSk7XG4gICAgICBhd2FpdCBjaGVja1BhY2thZ2VSZW1vdGUobmFtZSwgdGhpcy5faXNBbGxvd1B1Ymxpc2hPZmZsaW5lKCksIHRoaXMuX3N5bmNVcGxpbmtzTWV0YWRhdGEuYmluZCh0aGlzKSk7XG4gICAgICBhd2FpdCBwdWJsaXNoUGFja2FnZShuYW1lLCBtZXRhZGF0YSwgdGhpcy5sb2NhbFN0b3JhZ2UgYXMgSVN0b3JhZ2UpO1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaXNBbGxvd1B1Ymxpc2hPZmZsaW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5jb25maWcucHVibGlzaCAhPT0gJ3VuZGVmaW5lZCcgJiYgXy5pc0Jvb2xlYW4odGhpcy5jb25maWcucHVibGlzaC5hbGxvd19vZmZsaW5lKSAmJiB0aGlzLmNvbmZpZy5wdWJsaXNoLmFsbG93X29mZmxpbmU7XG4gIH1cblxuICBwdWJsaWMgcmVhZFRva2VucyhmaWx0ZXI6IFRva2VuRmlsdGVyKTogUHJvbWlzZTxUb2tlbltdPiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLnJlYWRUb2tlbnMoZmlsdGVyKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlVG9rZW4odG9rZW46IFRva2VuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlLnNhdmVUb2tlbih0b2tlbik7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlVG9rZW4odXNlcjogc3RyaW5nLCB0b2tlbktleTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UuZGVsZXRlVG9rZW4odXNlciwgdG9rZW5LZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyB2ZXJzaW9uIG9mIHBhY2thZ2Uge25hbWV9IHRvIGEgc3lzdGVtXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgYWRkVmVyc2lvbihuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgbWV0YWRhdGE6IFZlcnNpb24sIHRhZzogU3RyaW5nVmFsdWUsIGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLmFkZFZlcnNpb24obmFtZSwgdmVyc2lvbiwgbWV0YWRhdGEsIHRhZywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhZ3MgYSBwYWNrYWdlIHZlcnNpb24gd2l0aCBhIHByb3ZpZGVkIHRhZ1xuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIG1lcmdlVGFncyhuYW1lOiBzdHJpbmcsIHRhZ0hhc2g6IE1lcmdlVGFncywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UubWVyZ2VUYWdzKG5hbWUsIHRhZ0hhc2gsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgYW4gZXhpc3RpbmcgcGFja2FnZSAoaS5lLiB1bnB1Ymxpc2ggb25lIHZlcnNpb24pXG4gICBGdW5jdGlvbiBjaGFuZ2VzIGEgcGFja2FnZSBpbmZvIGZyb20gbG9jYWwgc3RvcmFnZSBhbmQgYWxsIHVwbGlua3Mgd2l0aCB3cml0ZSBhY2Nlc3MuL1xuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIGNoYW5nZVBhY2thZ2UobmFtZTogc3RyaW5nLCBtZXRhZGF0YTogUGFja2FnZSwgcmV2aXNpb246IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuY2hhbmdlUGFja2FnZShuYW1lLCBtZXRhZGF0YSwgcmV2aXNpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwYWNrYWdlIGZyb20gYSBzeXN0ZW1cbiAgIEZ1bmN0aW9uIHJlbW92ZXMgYSBwYWNrYWdlIGZyb20gbG9jYWwgc3RvcmFnZVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIHJlbW92ZVBhY2thZ2UobmFtZTogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5yZW1vdmVQYWNrYWdlKG5hbWUsIGNhbGxiYWNrKTtcbiAgICAvLyB1cGRhdGUgdGhlIGluZGV4ZXJcbiAgICBTZWFyY2gucmVtb3ZlKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICBSZW1vdmUgYSB0YXJiYWxsIGZyb20gYSBzeXN0ZW1cbiAgIEZ1bmN0aW9uIHJlbW92ZXMgYSB0YXJiYWxsIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgIFRhcmJhbGwgaW4gcXVlc3Rpb24gc2hvdWxkIG5vdCBiZSBsaW5rZWQgdG8gaW4gYW55IGV4aXN0aW5nXG4gICB2ZXJzaW9ucywgaS5lLiBwYWNrYWdlIHZlcnNpb24gc2hvdWxkIGJlIHVucHVibGlzaGVkIGZpcnN0LlxuICAgVXNlZCBzdG9yYWdlOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVGFyYmFsbChuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIHJldmlzaW9uOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZVRhcmJhbGwobmFtZSwgZmlsZW5hbWUsIHJldmlzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVXBsb2FkIGEgdGFyYmFsbCBmb3Ige25hbWV9IHBhY2thZ2VcbiAgIEZ1bmN0aW9uIGlzIHN5bmNocm9ub3VzIGFuZCByZXR1cm5zIGEgV3JpdGFibGVTdHJlYW1cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyBhZGRUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IElVcGxvYWRUYXJiYWxsIHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UuYWRkVGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gIH1cblxuICBwdWJsaWMgaGFzTG9jYWxUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICBsZXQgbG9jYWxTdHJlYW06IGFueSA9IHNlbGYubG9jYWxTdG9yYWdlLmdldFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICAgICAgbGV0IGlzT3BlbiA9IGZhbHNlO1xuICAgICAgbG9jYWxTdHJlYW0ub24oJ2Vycm9yJywgKGVycik6IGFueSA9PiB7XG4gICAgICAgIGlmIChpc09wZW4gfHwgZXJyLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVMuTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9jYWwgcmVwb3J0ZWQgNDA0IG9yIHJlcXVlc3Qgd2FzIGFib3J0ZWQgYWxyZWFkeVxuICAgICAgICBpZiAobG9jYWxTdHJlYW0pIHtcbiAgICAgICAgICBsb2NhbFN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgIGxvY2FsU3RyZWFtID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgbG9jYWxTdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIGlzT3BlbiA9IHRydWU7XG4gICAgICAgIGxvY2FsU3RyZWFtLmFib3J0KCk7XG4gICAgICAgIGxvY2FsU3RyZWFtID0gbnVsbDtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICBHZXQgYSB0YXJiYWxsIGZyb20gYSBzdG9yYWdlIGZvciB7bmFtZX0gcGFja2FnZVxuICAgRnVuY3Rpb24gaXMgc3luY2hyb25vdXMgYW5kIHJldHVybnMgYSBSZWFkYWJsZVN0cmVhbVxuICAgRnVuY3Rpb24gdHJpZXMgdG8gcmVhZCB0YXJiYWxsIGxvY2FsbHksIGlmIGl0IGZhaWxzIHRoZW4gaXQgcmVhZHMgcGFja2FnZVxuICAgaW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gZmlndXJlIG91dCB3aGVyZSB3ZSBjYW4gZ2V0IHRoaXMgdGFyYmFsbCBmcm9tXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCB8fCB1cGxpbmsgKGp1c3Qgb25lKVxuICAgKi9cbiAgcHVibGljIGdldFRhcmJhbGwobmFtZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogSVJlYWRUYXJiYWxsIHtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gbmV3IFJlYWRUYXJiYWxsKHt9KTtcbiAgICByZWFkU3RyZWFtLmFib3J0ID0gZnVuY3Rpb24gKCkge307XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIC8vIGlmIHNvbWVvbmUgcmVxdWVzdGluZyB0YXJiYWxsLCBpdCBtZWFucyB0aGF0IHdlIHNob3VsZCBhbHJlYWR5IGhhdmUgc29tZVxuICAgIC8vIGluZm9ybWF0aW9uIGFib3V0IGl0LCBzbyBmZXRjaGluZyBwYWNrYWdlIGluZm8gaXMgdW5uZWNlc3NhcnlcblxuICAgIC8vIHRyeWluZyBsb2NhbCBmaXJzdFxuICAgIC8vIGZsb3c6IHNob3VsZCBiZSBJUmVhZFRhcmJhbGxcbiAgICBsZXQgbG9jYWxTdHJlYW06IGFueSA9IHNlbGYubG9jYWxTdG9yYWdlLmdldFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICAgIGxldCBpc09wZW4gPSBmYWxzZTtcbiAgICBsb2NhbFN0cmVhbS5vbignZXJyb3InLCAoZXJyKTogYW55ID0+IHtcbiAgICAgIGlmIChpc09wZW4gfHwgZXJyLnN0YXR1cyAhPT0gSFRUUF9TVEFUVVMuTk9UX0ZPVU5EKSB7XG4gICAgICAgIHJldHVybiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgIH1cblxuICAgICAgLy8gbG9jYWwgcmVwb3J0ZWQgNDA0XG4gICAgICBjb25zdCBlcnI0MDQgPSBlcnI7XG4gICAgICBsb2NhbFN0cmVhbS5hYm9ydCgpO1xuICAgICAgbG9jYWxTdHJlYW0gPSBudWxsOyAvLyB3ZSBmb3JjZSBmb3IgZ2FyYmFnZSBjb2xsZWN0b3JcbiAgICAgIHNlbGYubG9jYWxTdG9yYWdlLmdldFBhY2thZ2VNZXRhZGF0YShuYW1lLCAoZXJyLCBpbmZvOiBQYWNrYWdlKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChfLmlzTmlsKGVycikgJiYgaW5mby5fZGlzdGZpbGVzICYmIF8uaXNOaWwoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmaWxlIGV4aXN0cyBsb2NhbGx5XG4gICAgICAgICAgc2VydmVGaWxlKGluZm8uX2Rpc3RmaWxlc1tmaWxlbmFtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHdlIGtub3cgbm90aGluZyBhYm91dCB0aGlzIGZpbGUsIHRyeWluZyB0byBnZXQgaW5mb3JtYXRpb24gZWxzZXdoZXJlXG4gICAgICAgICAgc2VsZi5fc3luY1VwbGlua3NNZXRhZGF0YShuYW1lLCBpbmZvLCB7fSwgKGVyciwgaW5mbzogUGFja2FnZSk6IGFueSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5pc05pbChlcnIpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXy5pc05pbChpbmZvLl9kaXN0ZmlsZXMpIHx8IF8uaXNOaWwoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnI0MDQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VydmVGaWxlKGluZm8uX2Rpc3RmaWxlc1tmaWxlbmFtZV0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBsb2NhbFN0cmVhbS5vbignY29udGVudC1sZW5ndGgnLCBmdW5jdGlvbiAodik6IHZvaWQge1xuICAgICAgcmVhZFN0cmVhbS5lbWl0KCdjb250ZW50LWxlbmd0aCcsIHYpO1xuICAgIH0pO1xuICAgIGxvY2FsU3RyZWFtLm9uKCdvcGVuJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgaXNPcGVuID0gdHJ1ZTtcbiAgICAgIGxvY2FsU3RyZWFtLnBpcGUocmVhZFN0cmVhbSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWRTdHJlYW07XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhbmQgY2FjaGUgbG9jYWwvcmVtb3RlIHBhY2thZ2VzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmaWxlIGRlZmluZSB0aGUgcGFja2FnZSBzaGFwZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNlcnZlRmlsZShmaWxlOiBEaXN0RmlsZSk6IHZvaWQge1xuICAgICAgbGV0IHVwbGluazogYW55ID0gbnVsbDtcblxuICAgICAgZm9yIChjb25zdCB1cGxpbmtJZCBpbiBzZWxmLnVwbGlua3MpIHtcbiAgICAgICAgaWYgKGhhc1Byb3h5VG8obmFtZSwgdXBsaW5rSWQsIHNlbGYuY29uZmlnLnBhY2thZ2VzKSkge1xuICAgICAgICAgIHVwbGluayA9IHNlbGYudXBsaW5rc1t1cGxpbmtJZF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHVwbGluayA9PSBudWxsKSB7XG4gICAgICAgIHVwbGluayA9IG5ldyBQcm94eVN0b3JhZ2UoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXJsOiBmaWxlLnVybCxcbiAgICAgICAgICAgIGNhY2hlOiB0cnVlLFxuICAgICAgICAgICAgX2F1dG9nZW5lcmF0ZWQ6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxmLmNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2F2ZXN0cmVhbTogSVVwbG9hZFRhcmJhbGwgfCBudWxsID0gbnVsbDtcbiAgICAgIGlmICh1cGxpbmsuY29uZmlnLmNhY2hlKSB7XG4gICAgICAgIHNhdmVzdHJlYW0gPSBzZWxmLmxvY2FsU3RvcmFnZS5hZGRUYXJiYWxsKG5hbWUsIGZpbGVuYW1lKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG9uX29wZW4gPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIC8vIHByZXZlbnQgaXQgZnJvbSBiZWluZyBjYWxsZWQgdHdpY2VcbiAgICAgICAgb25fb3BlbiA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgICBjb25zdCByc3RyZWFtMiA9IHVwbGluay5mZXRjaFRhcmJhbGwoZmlsZS51cmwpO1xuICAgICAgICByc3RyZWFtMi5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2F2ZXN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgICByc3RyZWFtMi5vbignZW5kJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgICAgICBzYXZlc3RyZWFtLmRvbmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJzdHJlYW0yLm9uKCdjb250ZW50LWxlbmd0aCcsIGZ1bmN0aW9uICh2KTogdm9pZCB7XG4gICAgICAgICAgcmVhZFN0cmVhbS5lbWl0KCdjb250ZW50LWxlbmd0aCcsIHYpO1xuICAgICAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgICAgICBzYXZlc3RyZWFtLmVtaXQoJ2NvbnRlbnQtbGVuZ3RoJywgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcnN0cmVhbTIucGlwZShyZWFkU3RyZWFtKTtcbiAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICByc3RyZWFtMi5waXBlKHNhdmVzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICBzYXZlc3RyZWFtLm9uKCdvcGVuJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIG9uX29wZW4oKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2F2ZXN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKTogdm9pZCB7XG4gICAgICAgICAgc2VsZi5sb2dnZXIud2Fybih7IGVycjogZXJyLCBmaWxlTmFtZTogZmlsZSB9LCAnZXJyb3Igc2F2aW5nIGZpbGUgQHtmaWxlTmFtZX06IEB7ZXJyLm1lc3NhZ2V9XFxuQHtlcnIuc3RhY2t9Jyk7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2F2ZXN0cmVhbSA9IG51bGw7XG4gICAgICAgICAgb25fb3BlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uX29wZW4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgIFJldHJpZXZlIGEgcGFja2FnZSBtZXRhZGF0YSBmb3Ige25hbWV9IHBhY2thZ2VcbiAgIEZ1bmN0aW9uIGludm9rZXMgbG9jYWxTdG9yYWdlLmdldFBhY2thZ2UgYW5kIHVwbGluay5nZXRfcGFja2FnZSBmb3IgZXZlcnlcbiAgIHVwbGluayB3aXRoIHByb3h5X2FjY2VzcyByaWdodHMgYWdhaW5zdCB7bmFtZX0gYW5kIGNvbWJpbmVzIHJlc3VsdHNcbiAgIGludG8gb25lIGpzb24gb2JqZWN0XG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAmJiB1cGxpbmsgKHByb3h5X2FjY2VzcylcblxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gb3B0aW9ucy5uYW1lIFBhY2thZ2UgTmFtZVxuICAgKiBAcHJvcGVydHkge29iamVjdH0gIG9wdGlvbnMucmVxIEV4cHJlc3MgYHJlcWAgb2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3B0aW9ucy5rZWVwVXBMaW5rRGF0YSBrZWVwIHVwIGxpbmsgaW5mbyBpbiBwYWNrYWdlIG1ldGEsIGxhc3QgdXBkYXRlLCBldGMuXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IG9wdGlvbnMuY2FsbGJhY2sgQ2FsbGJhY2sgZm9yIHJlY2VpdmUgZGF0YVxuICAgKi9cbiAgcHVibGljIGdldFBhY2thZ2Uob3B0aW9uczogSUdldFBhY2thZ2VPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKG9wdGlvbnMubmFtZSwgKGVyciwgZGF0YSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGVyciAmJiAoIWVyci5zdGF0dXMgfHwgZXJyLnN0YXR1cyA+PSBIVFRQX1NUQVRVUy5JTlRFUk5BTF9FUlJPUikpIHtcbiAgICAgICAgLy8gcmVwb3J0IGludGVybmFsIGVycm9ycyByaWdodCBhd2F5XG4gICAgICAgIHJldHVybiBvcHRpb25zLmNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3N5bmNVcGxpbmtzTWV0YWRhdGEoXG4gICAgICAgIG9wdGlvbnMubmFtZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgeyByZXE6IG9wdGlvbnMucmVxLCB1cGxpbmtzTG9vazogb3B0aW9ucy51cGxpbmtzTG9vayB9LFxuICAgICAgICBmdW5jdGlvbiBnZXRQYWNrYWdlU3luVXBMaW5rc0NhbGxiYWNrKGVyciwgcmVzdWx0OiBQYWNrYWdlLCB1cGxpbmtFcnJvcnMpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5vcm1hbGl6ZURpc3RUYWdzKGNsZWFuVXBMaW5rc1JlZihvcHRpb25zLmtlZXBVcExpbmtEYXRhLCByZXN1bHQpKTtcblxuICAgICAgICAgIC8vIG5wbSBjYW4gdGhyb3cgaWYgdGhpcyBmaWVsZCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgcmVzdWx0Ll9hdHRhY2htZW50cyA9IHt9O1xuXG4gICAgICAgICAgb3B0aW9ucy5jYWxsYmFjayhudWxsLCByZXN1bHQsIHVwbGlua0Vycm9ycyk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgIFJldHJpZXZlIHJlbW90ZSBhbmQgbG9jYWwgcGFja2FnZXMgbW9yZSByZWNlbnQgdGhhbiB7c3RhcnRrZXl9XG4gICBGdW5jdGlvbiBzdHJlYW1zIGFsbCBwYWNrYWdlcyBmcm9tIGFsbCB1cGxpbmtzIGZpcnN0LCBhbmQgdGhlblxuICAgbG9jYWwgcGFja2FnZXMuXG4gICBOb3RlIHRoYXQgbG9jYWwgcGFja2FnZXMgY291bGQgb3ZlcnJpZGUgcmVnaXN0cnkgb25lcyBqdXN0IGJlY2F1c2VcbiAgIHRoZXkgYXBwZWFyIGluIEpTT04gbGFzdC4gVGhhdCdzIGEgdHJhZGUtb2ZmIHdlIG1ha2UgdG8gYXZvaWRcbiAgIG1lbW9yeSBpc3N1ZXMuXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAmJiB1cGxpbmsgKHByb3h5X2FjY2VzcylcbiAgICogQHBhcmFtIHsqfSBzdGFydGtleVxuICAgKiBAcGFyYW0geyp9IG9wdGlvbnNcbiAgICogQHJldHVybiB7U3RyZWFtfVxuICAgKi9cbiAgcHVibGljIHNlYXJjaChzdGFydGtleTogc3RyaW5nLCBvcHRpb25zOiBhbnkpOiBJUmVhZFRhcmJhbGwge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHNlYXJjaFN0cmVhbTogYW55ID0gbmV3IFN0cmVhbS5QYXNzVGhyb3VnaCh7IG9iamVjdE1vZGU6IHRydWUgfSk7XG4gICAgYXN5bmMuZWFjaFNlcmllcyhcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMudXBsaW5rcyksXG4gICAgICBmdW5jdGlvbiAodXBfbmFtZSwgY2IpOiB2b2lkIHtcbiAgICAgICAgLy8gc2hvcnRjdXQ6IGlmIGBsb2NhbD0xYCBpcyBzdXBwbGllZCwgZG9uJ3QgY2FsbCB1cGxpbmtzXG4gICAgICAgIGlmIChvcHRpb25zLnJlcT8ucXVlcnk/LmxvY2FsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbyhgc2VhcmNoIGZvciB1cGxpbmsgJHt1cF9uYW1lfWApO1xuICAgICAgICAvLyBzZWFyY2ggYnkga2V5d29yZCBmb3IgZWFjaCB1cGxpbmtcbiAgICAgICAgY29uc3QgdXBsaW5rU3RyZWFtOiBJVXBsb2FkVGFyYmFsbCA9IHNlbGYudXBsaW5rc1t1cF9uYW1lXS5zZWFyY2gob3B0aW9ucyk7XG4gICAgICAgIC8vIGpvaW4gdXBsaW5rIHN0cmVhbSB3aXRoIHN0cmVhbXMgUGFzc1Rocm91Z2hcbiAgICAgICAgdXBsaW5rU3RyZWFtLnBpcGUoc2VhcmNoU3RyZWFtLCB7IGVuZDogZmFsc2UgfSk7XG4gICAgICAgIHVwbGlua1N0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKTogdm9pZCB7XG4gICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoeyBlcnI6IGVyciB9LCAndXBsaW5rIGVycm9yOiBAe2Vyci5tZXNzYWdlfScpO1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgLy8gdG8gYXZvaWQgY2FsbCBjYWxsYmFjayBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCk6IHZvaWQge307XG4gICAgICAgIH0pO1xuICAgICAgICB1cGxpbmtTdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBjYigpO1xuICAgICAgICAgIC8vIHRvIGF2b2lkIGNhbGwgY2FsbGJhY2sgbW9yZSB0aGFuIG9uY2VcbiAgICAgICAgICBjYiA9IGZ1bmN0aW9uICgpOiB2b2lkIHt9O1xuICAgICAgICB9KTtcblxuICAgICAgICBzZWFyY2hTdHJlYW0uYWJvcnQgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHVwbGlua1N0cmVhbS5hYm9ydCkge1xuICAgICAgICAgICAgdXBsaW5rU3RyZWFtLmFib3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgLy8gdG8gYXZvaWQgY2FsbCBjYWxsYmFjayBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCk6IHZvaWQge307XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgLy8gZXhlY3V0ZWQgYWZ0ZXIgYWxsIHNlcmllc1xuICAgICAgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAvLyBhdHRhY2ggYSBsb2NhbCBzZWFyY2ggcmVzdWx0c1xuICAgICAgICBjb25zdCBsb2NhbFNlYXJjaFN0cmVhbTogSVJlYWRUYXJiYWxsID0gc2VsZi5sb2NhbFN0b3JhZ2Uuc2VhcmNoKHN0YXJ0a2V5LCBvcHRpb25zKTtcbiAgICAgICAgc2VhcmNoU3RyZWFtLmFib3J0ID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLmFib3J0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGxvY2FsU2VhcmNoU3RyZWFtLnBpcGUoc2VhcmNoU3RyZWFtLCB7IGVuZDogdHJ1ZSB9KTtcbiAgICAgICAgbG9jYWxTZWFyY2hTdHJlYW0ub24oJ2Vycm9yJywgZnVuY3Rpb24gKGVycjogVmVyZGFjY2lvRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcih7IGVycjogZXJyIH0sICdzZWFyY2ggZXJyb3I6IEB7ZXJyLm1lc3NhZ2V9Jyk7XG4gICAgICAgICAgc2VhcmNoU3RyZWFtLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIHNlYXJjaFN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBvbmx5IHByaXZhdGUgbG9jYWwgcGFja2FnZXNcbiAgICogQHBhcmFtIHsqfSBjYWxsYmFja1xuICAgKi9cbiAgcHVibGljIGdldExvY2FsRGF0YWJhc2UoY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2Uuc3RvcmFnZVBsdWdpbi5nZXQoKGVyciwgbG9jYWxzKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhY2thZ2VzOiBWZXJzaW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IGdldFBhY2thZ2UgPSBmdW5jdGlvbiAoaXRlbVBrZyk6IHZvaWQge1xuICAgICAgICBzZWxmLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGEobG9jYWxzW2l0ZW1Qa2ddLCBmdW5jdGlvbiAoZXJyLCBwa2dNZXRhZGF0YTogUGFja2FnZSk6IHZvaWQge1xuICAgICAgICAgIGlmIChfLmlzTmlsKGVycikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVzdCA9IHBrZ01ldGFkYXRhW0RJU1RfVEFHU10ubGF0ZXN0O1xuICAgICAgICAgICAgaWYgKGxhdGVzdCAmJiBwa2dNZXRhZGF0YS52ZXJzaW9uc1tsYXRlc3RdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZlcnNpb246IFZlcnNpb24gPSBwa2dNZXRhZGF0YS52ZXJzaW9uc1tsYXRlc3RdO1xuICAgICAgICAgICAgICBjb25zdCB0aW1lTGlzdCA9IHBrZ01ldGFkYXRhLnRpbWUgYXMgR2VuZXJpY0JvZHk7XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lTGlzdFtsYXRlc3RdO1xuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIHZlcnNpb24udGltZSA9IHRpbWU7XG5cbiAgICAgICAgICAgICAgLy8gQWRkIGZvciBzdGFycyBhcGlcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICB2ZXJzaW9uLnVzZXJzID0gcGtnTWV0YWRhdGEudXNlcnM7XG5cbiAgICAgICAgICAgICAgcGFja2FnZXMucHVzaCh2ZXJzaW9uKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYubG9nZ2VyLndhcm4oeyBwYWNrYWdlOiBsb2NhbHNbaXRlbVBrZ10gfSwgJ3BhY2thZ2UgQHtwYWNrYWdlfSBkb2VzIG5vdCBoYXZlIGEgXCJsYXRlc3RcIiB0YWc/Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW1Qa2cgPj0gbG9jYWxzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHBhY2thZ2VzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFja2FnZShpdGVtUGtnICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChsb2NhbHMubGVuZ3RoKSB7XG4gICAgICAgIGdldFBhY2thZ2UoMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayhudWxsLCBbXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gZmV0Y2hlcyBwYWNrYWdlIG1ldGFkYXRhIGZyb20gdXBsaW5rcyBhbmQgc3luY2hyb25pemVzIGl0IHdpdGggbG9jYWwgZGF0YVxuICAgaWYgcGFja2FnZSBpcyBhdmFpbGFibGUgbG9jYWxseSwgaXQgTVVTVCBiZSBwcm92aWRlZCBpbiBwa2dpbmZvXG4gICByZXR1cm5zIGNhbGxiYWNrKGVyciwgcmVzdWx0LCB1cGxpbmtfZXJyb3JzKVxuICAgKi9cbiAgcHVibGljIF9zeW5jVXBsaW5rc01ldGFkYXRhKG5hbWU6IHN0cmluZywgcGFja2FnZUluZm86IFBhY2thZ2UsIG9wdGlvbnM6IElTeW5jVXBsaW5rcywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgbGV0IGZvdW5kID0gdHJ1ZTtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCB1cExpbmtzOiBJUHJveHlbXSA9IFtdO1xuICAgIGNvbnN0IGhhc1RvTG9va0ludG9VcGxpbmtzID0gXy5pc05pbChvcHRpb25zLnVwbGlua3NMb29rKSB8fCBvcHRpb25zLnVwbGlua3NMb29rO1xuXG4gICAgaWYgKCFwYWNrYWdlSW5mbykge1xuICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgIHBhY2thZ2VJbmZvID0gZ2VuZXJhdGVQYWNrYWdlVGVtcGxhdGUobmFtZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB1cGxpbmsgaW4gdGhpcy51cGxpbmtzKSB7XG4gICAgICBpZiAoaGFzUHJveHlUbyhuYW1lLCB1cGxpbmssIHRoaXMuY29uZmlnLnBhY2thZ2VzKSAmJiBoYXNUb0xvb2tJbnRvVXBsaW5rcykge1xuICAgICAgICB1cExpbmtzLnB1c2godGhpcy51cGxpbmtzW3VwbGlua10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jLm1hcChcbiAgICAgIHVwTGlua3MsXG4gICAgICAodXBMaW5rLCBjYik6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBfb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB1cExpbmtNZXRhID0gcGFja2FnZUluZm8uX3VwbGlua3NbdXBMaW5rLnVwbmFtZV07XG5cbiAgICAgICAgaWYgKGlzT2JqZWN0KHVwTGlua01ldGEpKSB7XG4gICAgICAgICAgY29uc3QgZmV0Y2hlZCA9IHVwTGlua01ldGEuZmV0Y2hlZDtcblxuICAgICAgICAgIGlmIChmZXRjaGVkICYmIERhdGUubm93KCkgLSBmZXRjaGVkIDwgdXBMaW5rLm1heGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX29wdGlvbnMuZXRhZyA9IHVwTGlua01ldGEuZXRhZztcbiAgICAgICAgfVxuXG4gICAgICAgIHVwTGluay5nZXRSZW1vdGVNZXRhZGF0YShuYW1lLCBfb3B0aW9ucywgKGVyciwgdXBMaW5rUmVzcG9uc2UsIGVUYWcpOiB2b2lkID0+IHtcbiAgICAgICAgICBpZiAoZXJyICYmIGVyci5yZW1vdGVTdGF0dXMgPT09IDMwNCkge1xuICAgICAgICAgICAgdXBMaW5rTWV0YS5mZXRjaGVkID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXJyIHx8ICF1cExpbmtSZXNwb25zZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNiKG51bGwsIFtlcnIgfHwgRXJyb3JDb2RlLmdldEludGVybmFsRXJyb3IoJ25vIGRhdGEnKV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWxpZGF0ZU1ldGFkYXRhKHVwTGlua1Jlc3BvbnNlLCBuYW1lKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3ViOiAnb3V0JyxcbiAgICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbiB2YWxpZGF0aW5nIGVycm9yIEB7IWVyci5tZXNzYWdlfVxcbkB7ZXJyLnN0YWNrfSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgW2Vycl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhY2thZ2VJbmZvLl91cGxpbmtzW3VwTGluay51cG5hbWVdID0ge1xuICAgICAgICAgICAgZXRhZzogZVRhZyxcbiAgICAgICAgICAgIGZldGNoZWQ6IERhdGUubm93KCksXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHBhY2thZ2VJbmZvLnRpbWUgPSBtZXJnZVVwbGlua1RpbWVJbnRvTG9jYWwocGFja2FnZUluZm8sIHVwTGlua1Jlc3BvbnNlKTtcblxuICAgICAgICAgIHVwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rKHVwTGlua1Jlc3BvbnNlLnZlcnNpb25zLCB1cExpbmspO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1lcmdlVmVyc2lvbnMocGFja2FnZUluZm8sIHVwTGlua1Jlc3BvbnNlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc3ViOiAnb3V0JyxcbiAgICAgICAgICAgICAgICBlcnI6IGVycixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ3BhY2thZ2UuanNvbiBwYXJzaW5nIGVycm9yIEB7IWVyci5tZXNzYWdlfVxcbkB7ZXJyLnN0YWNrfSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgW2Vycl0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlmIHdlIGdvdCB0byB0aGlzIHBvaW50LCBhc3N1bWUgdGhhdCB0aGUgY29ycmVjdCBwYWNrYWdlIGV4aXN0c1xuICAgICAgICAgIC8vIG9uIHRoZSB1cGxpbmtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgKGVycjogRXJyb3IsIHVwTGlua3NFcnJvcnM6IGFueSk6IEFzeW5jUmVzdWx0QXJyYXlDYWxsYmFjazx1bmtub3duLCBFcnJvcj4gPT4ge1xuICAgICAgICBhc3NlcnQoIWVyciAmJiBBcnJheS5pc0FycmF5KHVwTGlua3NFcnJvcnMpKTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgY29ubmVjdGlvbiB0aW1lb3V0IG9yIHJlc2V0IGVycm9ycyB3aXRoIHVwbGluayhzKVxuICAgICAgICAvLyAodGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUgcGFja2FnZSBub3QgYmVpbmcgZm91bmQpXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICBsZXQgdXBsaW5rVGltZW91dEVycm9yO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdXBMaW5rc0Vycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHVwTGlua3NFcnJvcnNbaV0pIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB1cExpbmtzRXJyb3JzW2ldLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVwTGlua3NFcnJvcnNbaV1bal0pIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSB1cExpbmtzRXJyb3JzW2ldW2pdLmNvZGU7XG4gICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ0VUSU1FRE9VVCcgfHwgY29kZSA9PT0gJ0VTT0NLRVRUSU1FRE9VVCcgfHwgY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVwbGlua1RpbWVvdXRFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1cGxpbmtUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvckNvZGUuZ2V0U2VydmljZVVuYXZhaWxhYmxlKCksIG51bGwsIHVwTGlua3NFcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soRXJyb3JDb2RlLmdldE5vdEZvdW5kKEFQSV9FUlJPUi5OT19QQUNLQUdFKSwgbnVsbCwgdXBMaW5rc0Vycm9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBMaW5rcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcGFja2FnZUluZm8pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5sb2NhbFN0b3JhZ2UudXBkYXRlVmVyc2lvbnMobmFtZSwgcGFja2FnZUluZm8sIGFzeW5jIChlcnIsIHBhY2thZ2VKc29uTG9jYWw6IFBhY2thZ2UpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBbnkgZXJyb3IgaGVyZSB3aWxsIGNhdXNlIGEgNDA0LCBsaWtlIGFuIHVwbGluayBlcnJvci4gVGhpcyBpcyBsaWtlbHkgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvXG4gICAgICAgICAgLy8gYXMgYSBicm9rZW4gZmlsdGVyIGlzIGEgc2VjdXJpdHkgcmlzay5cbiAgICAgICAgICBjb25zdCBmaWx0ZXJFcnJvcnM6IEVycm9yW10gPSBbXTtcbiAgICAgICAgICAvLyBUaGlzIE1VU1QgYmUgZG9uZSBzZXJpYWxseSBhbmQgbm90IGluIHBhcmFsbGVsIGFzIHRoZXkgbW9kaWZ5IHBhY2thZ2VKc29uTG9jYWxcbiAgICAgICAgICBmb3IgKGNvbnN0IGZpbHRlciBvZiBzZWxmLmZpbHRlcnMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIFRoZXNlIGZpbHRlcnMgY2FuIGFzc3VtZSBpdCdzIHNhdmUgdG8gbW9kaWZ5IHBhY2thZ2VKc29uTG9jYWwgYW5kIHJldHVybiBpdCBkaXJlY3RseSBmb3JcbiAgICAgICAgICAgICAgLy8gcGVyZm9ybWFuY2UgKGkuZS4gbmVlZCBub3QgYmUgcHVyZSlcbiAgICAgICAgICAgICAgcGFja2FnZUpzb25Mb2NhbCA9IGF3YWl0IGZpbHRlci5maWx0ZXJfbWV0YWRhdGEocGFja2FnZUpzb25Mb2NhbCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgZmlsdGVyRXJyb3JzLnB1c2goZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgcGFja2FnZUpzb25Mb2NhbCwgXy5jb25jYXQodXBMaW5rc0Vycm9ycywgZmlsdGVyRXJyb3JzKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgaGlkZGVuIHZhbHVlIGZvciBlYWNoIHZlcnNpb24uXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZlcnNpb25zIGxpc3Qgb2YgdmVyc2lvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gdXBMaW5rIHVwbGluayBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwdWJsaWMgX3VwZGF0ZVZlcnNpb25zSGlkZGVuVXBMaW5rKHZlcnNpb25zOiBWZXJzaW9ucywgdXBMaW5rOiBJUHJveHkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gdmVyc2lvbnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmVyc2lvbnMsIGkpKSB7XG4gICAgICAgIGNvbnN0IHZlcnNpb24gPSB2ZXJzaW9uc1tpXTtcblxuICAgICAgICAvLyBob2xkcyBhIFwiaGlkZGVuXCIgdmFsdWUgdG8gYmUgdXNlZCBieSB0aGUgcGFja2FnZSBzdG9yYWdlLlxuICAgICAgICAvLyAkRmxvd0ZpeE1lXG4gICAgICAgIHZlcnNpb25bU3ltYm9sLmZvcignX192ZXJkYWNjaW9fdXBsaW5rJyldID0gdXBMaW5rLnVwbmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3RvcmFnZTtcbiJdfQ==
|
|
648
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvc3RvcmFnZS50cyJdLCJuYW1lcyI6WyJTdG9yYWdlIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJ1cGxpbmtzIiwibG9nZ2VyIiwiZmlsdGVycyIsImxvY2FsU3RvcmFnZSIsImluaXQiLCJMb2NhbFN0b3JhZ2UiLCJnZXRTZWNyZXQiLCJhZGRQYWNrYWdlIiwibmFtZSIsIm1ldGFkYXRhIiwiY2FsbGJhY2siLCJfaXNBbGxvd1B1Ymxpc2hPZmZsaW5lIiwiX3N5bmNVcGxpbmtzTWV0YWRhdGEiLCJiaW5kIiwiZXJyIiwicHVibGlzaCIsIl8iLCJpc0Jvb2xlYW4iLCJhbGxvd19vZmZsaW5lIiwicmVhZFRva2VucyIsImZpbHRlciIsInNhdmVUb2tlbiIsInRva2VuIiwiZGVsZXRlVG9rZW4iLCJ1c2VyIiwidG9rZW5LZXkiLCJhZGRWZXJzaW9uIiwidmVyc2lvbiIsInRhZyIsIm1lcmdlVGFncyIsInRhZ0hhc2giLCJjaGFuZ2VQYWNrYWdlIiwicmV2aXNpb24iLCJyZW1vdmVQYWNrYWdlIiwiU2VhcmNoIiwicmVtb3ZlIiwicmVtb3ZlVGFyYmFsbCIsImZpbGVuYW1lIiwiYWRkVGFyYmFsbCIsImhhc0xvY2FsVGFyYmFsbCIsInNlbGYiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImxvY2FsU3RyZWFtIiwiZ2V0VGFyYmFsbCIsImlzT3BlbiIsIm9uIiwic3RhdHVzIiwiSFRUUF9TVEFUVVMiLCJOT1RfRk9VTkQiLCJhYm9ydCIsInJlYWRTdHJlYW0iLCJSZWFkVGFyYmFsbCIsImVtaXQiLCJlcnI0MDQiLCJnZXRQYWNrYWdlTWV0YWRhdGEiLCJpbmZvIiwiaXNOaWwiLCJfZGlzdGZpbGVzIiwic2VydmVGaWxlIiwidiIsInBpcGUiLCJmaWxlIiwidXBsaW5rIiwidXBsaW5rSWQiLCJwYWNrYWdlcyIsIlByb3h5U3RvcmFnZSIsInVybCIsImNhY2hlIiwiX2F1dG9nZW5lcmF0ZWQiLCJzYXZlc3RyZWFtIiwib25fb3BlbiIsInJzdHJlYW0yIiwiZmV0Y2hUYXJiYWxsIiwiZG9uZSIsIndhcm4iLCJmaWxlTmFtZSIsImdldFBhY2thZ2UiLCJvcHRpb25zIiwiZGF0YSIsIklOVEVSTkFMX0VSUk9SIiwicmVxIiwidXBsaW5rc0xvb2siLCJnZXRQYWNrYWdlU3luVXBMaW5rc0NhbGxiYWNrIiwicmVzdWx0IiwidXBsaW5rRXJyb3JzIiwia2VlcFVwTGlua0RhdGEiLCJfYXR0YWNobWVudHMiLCJzZWFyY2giLCJzdGFydGtleSIsInNlYXJjaFN0cmVhbSIsIlN0cmVhbSIsIlBhc3NUaHJvdWdoIiwib2JqZWN0TW9kZSIsImFzeW5jIiwiZWFjaFNlcmllcyIsIk9iamVjdCIsImtleXMiLCJ1cF9uYW1lIiwiY2IiLCJxdWVyeSIsImxvY2FsIiwidW5kZWZpbmVkIiwidXBsaW5rU3RyZWFtIiwiZW5kIiwiZXJyb3IiLCJsb2NhbFNlYXJjaFN0cmVhbSIsImdldExvY2FsRGF0YWJhc2UiLCJzdG9yYWdlUGx1Z2luIiwiZ2V0IiwibG9jYWxzIiwiaXRlbVBrZyIsInBrZ01ldGFkYXRhIiwibGF0ZXN0IiwiRElTVF9UQUdTIiwidmVyc2lvbnMiLCJ0aW1lTGlzdCIsInRpbWUiLCJ1c2VycyIsInB1c2giLCJwYWNrYWdlIiwibGVuZ3RoIiwicGFja2FnZUluZm8iLCJmb3VuZCIsInVwTGlua3MiLCJoYXNUb0xvb2tJbnRvVXBsaW5rcyIsIm1hcCIsInVwTGluayIsIl9vcHRpb25zIiwiYXNzaWduIiwidXBMaW5rTWV0YSIsIl91cGxpbmtzIiwidXBuYW1lIiwiZmV0Y2hlZCIsIkRhdGUiLCJub3ciLCJtYXhhZ2UiLCJldGFnIiwiZ2V0UmVtb3RlTWV0YWRhdGEiLCJ1cExpbmtSZXNwb25zZSIsImVUYWciLCJyZW1vdGVTdGF0dXMiLCJFcnJvckNvZGUiLCJnZXRJbnRlcm5hbEVycm9yIiwic3ViIiwidXBMaW5rc0Vycm9ycyIsIkFycmF5IiwiaXNBcnJheSIsInVwbGlua1RpbWVvdXRFcnJvciIsImkiLCJqIiwiY29kZSIsImdldFNlcnZpY2VVbmF2YWlsYWJsZSIsImdldE5vdEZvdW5kIiwiQVBJX0VSUk9SIiwiTk9fUEFDS0FHRSIsInVwZGF0ZVZlcnNpb25zIiwicGFja2FnZUpzb25Mb2NhbCIsImZpbHRlckVycm9ycyIsImZpbHRlcl9tZXRhZGF0YSIsImNvbmNhdCIsIl91cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlN5bWJvbCIsImZvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsT0FBTixDQUF5QztBQU9oQ0MsRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQWlCO0FBQ2pDLFNBQUtBLE1BQUwsR0FBY0EsTUFBZDtBQUNBLFNBQUtDLE9BQUwsR0FBZSw4QkFBYUQsTUFBYixDQUFmO0FBQ0EsU0FBS0UsTUFBTCxHQUFjQSxjQUFkO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLEVBQWYsQ0FKaUMsQ0FLakM7O0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixJQUFwQjtBQUNEOztBQUVNQyxFQUFBQSxJQUFJLENBQUNMLE1BQUQsRUFBaUJHLE9BQXVCLEdBQUcsRUFBM0MsRUFBZ0U7QUFDekUsU0FBS0EsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixJQUFJRSxxQkFBSixDQUFpQixLQUFLTixNQUF0QixFQUE4QkUsY0FBOUIsQ0FBcEI7QUFFQSxXQUFPLEtBQUtFLFlBQUwsQ0FBa0JHLFNBQWxCLENBQTRCUCxNQUE1QixDQUFQO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUN5QixRQUFWUSxVQUFVLENBQUNDLElBQUQsRUFBZUMsUUFBZixFQUE4QkMsUUFBOUIsRUFBaUU7QUFDdEYsUUFBSTtBQUNGLFlBQU0scUNBQWtCRixJQUFsQixFQUF3QixLQUFL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QUFDa0MsQ0FBRCxDQUF4QixDQURxRCxDQUdyRDtBQUNBOztBQUNBM0gsUUFBQUEsT0FBTyxDQUFDMkksTUFBTSxDQUFDQyxHQUFQLENBQVcsb0JBQVgsQ0FBRCxDQUFQLEdBQTRDdkMsTUFBTSxDQUFDSyxNQUFuRDtBQUNEO0FBQ0Y7QUFDRjs7QUF4a0JzQzs7ZUEya0IxQnhJLE8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgYXN5bmMsIHsgQXN5bmNSZXN1bHRBcnJheUNhbGxiYWNrIH0gZnJvbSAnYXN5bmMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBTdHJlYW0gZnJvbSAnc3RyZWFtJztcblxuaW1wb3J0IHsgVmVyZGFjY2lvRXJyb3IgfSBmcm9tICdAdmVyZGFjY2lvL2NvbW1vbnMtYXBpJztcbmltcG9ydCB7IFJlYWRUYXJiYWxsIH0gZnJvbSAnQHZlcmRhY2Npby9zdHJlYW1zJztcbmltcG9ydCB7IEdlbmVyaWNCb2R5LCBUb2tlbiwgVG9rZW5GaWx0ZXIgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcbmltcG9ydCB7IENhbGxiYWNrLCBDb25maWcsIERpc3RGaWxlLCBJUmVhZFRhcmJhbGwsIElVcGxvYWRUYXJiYWxsLCBMb2dnZXIsIE1lcmdlVGFncywgUGFja2FnZSwgVmVyc2lvbiwgVmVyc2lvbnMgfSBmcm9tICdAdmVyZGFjY2lvL3R5cGVzJztcblxuaW1wb3J0IHsgSUdldFBhY2thZ2VPcHRpb25zLCBJUGx1Z2luRmlsdGVycywgSVByb3h5LCBJU3RvcmFnZSwgSVN0b3JhZ2VIYW5kbGVyLCBJU3luY1VwbGlua3MsIFByb3h5TGlzdCwgU3RyaW5nVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi9saWIvbG9nZ2VyJztcbmltcG9ydCB7IGhhc1Byb3h5VG8gfSBmcm9tICcuL2NvbmZpZy11dGlscyc7XG5pbXBvcnQgeyBBUElfRVJST1IsIERJU1RfVEFHUywgSFRUUF9TVEFUVVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgTG9jYWxTdG9yYWdlIGZyb20gJy4vbG9jYWwtc3RvcmFnZSc7XG5pbXBvcnQgeyBtZXJnZVZlcnNpb25zIH0gZnJvbSAnLi9tZXRhZGF0YS11dGlscyc7XG5pbXBvcnQgU2VhcmNoIGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB7IGNoZWNrUGFja2FnZUxvY2FsLCBjaGVja1BhY2thZ2VSZW1vdGUsIGNsZWFuVXBMaW5rc1JlZiwgZ2VuZXJhdGVQYWNrYWdlVGVtcGxhdGUsIG1lcmdlVXBsaW5rVGltZUludG9Mb2NhbCwgcHVibGlzaFBhY2thZ2UgfSBmcm9tICcuL3N0b3JhZ2UtdXRpbHMnO1xuaW1wb3J0IFByb3h5U3RvcmFnZSBmcm9tICcuL3VwLXN0b3JhZ2UnO1xuaW1wb3J0IHsgc2V0dXBVcExpbmtzLCB1cGRhdGVWZXJzaW9uc0hpZGRlblVwTGluayB9IGZyb20gJy4vdXBsaW5rLXV0aWwnO1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBpc09iamVjdCwgbm9ybWFsaXplRGlzdFRhZ3MsIHZhbGlkYXRlTWV0YWRhdGEgfSBmcm9tICcuL3V0aWxzJztcblxuY2xhc3MgU3RvcmFnZSBpbXBsZW1lbnRzIElTdG9yYWdlSGFuZGxlciB7XG4gIHB1YmxpYyBsb2NhbFN0b3JhZ2U6IElTdG9yYWdlO1xuICBwdWJsaWMgY29uZmlnOiBDb25maWc7XG4gIHB1YmxpYyBsb2dnZXI6IExvZ2dlcjtcbiAgcHVibGljIHVwbGlua3M6IFByb3h5TGlzdDtcbiAgcHVibGljIGZpbHRlcnM6IElQbHVnaW5GaWx0ZXJzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMudXBsaW5rcyA9IHNldHVwVXBMaW5rcyhjb25maWcpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgaW5pdChjb25maWc6IENvbmZpZywgZmlsdGVyczogSVBsdWdpbkZpbHRlcnMgPSBbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IG5ldyBMb2NhbFN0b3JhZ2UodGhpcy5jb25maWcsIGxvZ2dlcik7XG5cbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UuZ2V0U2VjcmV0KGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogIEFkZCBhIHtuYW1lfSBwYWNrYWdlIHRvIGEgc3lzdGVtXG4gICBGdW5jdGlvbiBjaGVja3MgaWYgcGFja2FnZSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgYXZhaWxhYmxlIGZyb20gdXBsaW5rcy5cbiAgIElmIGl0IGlzbid0LCB3ZSBjcmVhdGUgcGFja2FnZSBsb2NhbGx5XG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpICYmIHVwbGlua3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRQYWNrYWdlKG5hbWU6IHN0cmluZywgbWV0YWRhdGE6IGFueSwgY2FsbGJhY2s6IEZ1bmN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNoZWNrUGFja2FnZUxvY2FsKG5hbWUsIHRoaXMubG9jYWxTdG9yYWdlKTtcbiAgICAgIGF3YWl0IGNoZWNrUGFja2FnZVJlbW90ZShuYW1lLCB0aGlzLl9pc0FsbG93UHVibGlzaE9mZmxpbmUoKSwgdGhpcy5fc3luY1VwbGlua3NNZXRhZGF0YS5iaW5kKHRoaXMpKTtcbiAgICAgIGF3YWl0IHB1Ymxpc2hQYWNrYWdlKG5hbWUsIG1ldGFkYXRhLCB0aGlzLmxvY2FsU3RvcmFnZSBhcyBJU3RvcmFnZSk7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pc0FsbG93UHVibGlzaE9mZmxpbmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLmNvbmZpZy5wdWJsaXNoICE9PSAndW5kZWZpbmVkJyAmJiBfLmlzQm9vbGVhbih0aGlzLmNvbmZpZy5wdWJsaXNoLmFsbG93X29mZmxpbmUpICYmIHRoaXMuY29uZmlnLnB1Ymxpc2guYWxsb3dfb2ZmbGluZTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkVG9rZW5zKGZpbHRlcjogVG9rZW5GaWx0ZXIpOiBQcm9taXNlPFRva2VuW10+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2UucmVhZFRva2VucyhmaWx0ZXIpO1xuICB9XG5cbiAgcHVibGljIHNhdmVUb2tlbih0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2Uuc2F2ZVRva2VuKHRva2VuKTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVUb2tlbih1c2VyOiBzdHJpbmcsIHRva2VuS2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZS5kZWxldGVUb2tlbih1c2VyLCB0b2tlbktleSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IHZlcnNpb24gb2YgcGFja2FnZSB7bmFtZX0gdG8gYSBzeXN0ZW1cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyBhZGRWZXJzaW9uKG5hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBtZXRhZGF0YTogVmVyc2lvbiwgdGFnOiBTdHJpbmdWYWx1ZSwgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UuYWRkVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCBtZXRhZGF0YSwgdGFnLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogVGFncyBhIHBhY2thZ2UgdmVyc2lvbiB3aXRoIGEgcHJvdmlkZWQgdGFnXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgbWVyZ2VUYWdzKG5hbWU6IHN0cmluZywgdGFnSGFzaDogTWVyZ2VUYWdzLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5tZXJnZVRhZ3MobmFtZSwgdGFnSGFzaCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSBhbiBleGlzdGluZyBwYWNrYWdlIChpLmUuIHVucHVibGlzaCBvbmUgdmVyc2lvbilcbiAgIEZ1bmN0aW9uIGNoYW5nZXMgYSBwYWNrYWdlIGluZm8gZnJvbSBsb2NhbCBzdG9yYWdlIGFuZCBhbGwgdXBsaW5rcyB3aXRoIHdyaXRlIGFjY2Vzcy4vXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgY2hhbmdlUGFja2FnZShuYW1lOiBzdHJpbmcsIG1ldGFkYXRhOiBQYWNrYWdlLCByZXZpc2lvbjogc3RyaW5nLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5jaGFuZ2VQYWNrYWdlKG5hbWUsIG1ldGFkYXRhLCByZXZpc2lvbiwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHBhY2thZ2UgZnJvbSBhIHN5c3RlbVxuICAgRnVuY3Rpb24gcmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSBsb2NhbCBzdG9yYWdlXG4gICBVc2VkIHN0b3JhZ2VzOiBsb2NhbCAod3JpdGUpXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlUGFja2FnZShuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxTdG9yYWdlLnJlbW92ZVBhY2thZ2UobmFtZSwgY2FsbGJhY2spO1xuICAgIC8vIHVwZGF0ZSB0aGUgaW5kZXhlclxuICAgIFNlYXJjaC5yZW1vdmUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgIFJlbW92ZSBhIHRhcmJhbGwgZnJvbSBhIHN5c3RlbVxuICAgRnVuY3Rpb24gcmVtb3ZlcyBhIHRhcmJhbGwgZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgVGFyYmFsbCBpbiBxdWVzdGlvbiBzaG91bGQgbm90IGJlIGxpbmtlZCB0byBpbiBhbnkgZXhpc3RpbmdcbiAgIHZlcnNpb25zLCBpLmUuIHBhY2thZ2UgdmVyc2lvbiBzaG91bGQgYmUgdW5wdWJsaXNoZWQgZmlyc3QuXG4gICBVc2VkIHN0b3JhZ2U6IGxvY2FsICh3cml0ZSlcbiAgICovXG4gIHB1YmxpYyByZW1vdmVUYXJiYWxsKG5hbWU6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgcmV2aXNpb246IHN0cmluZywgY2FsbGJhY2s6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UucmVtb3ZlVGFyYmFsbChuYW1lLCBmaWxlbmFtZSwgcmV2aXNpb24sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYSB0YXJiYWxsIGZvciB7bmFtZX0gcGFja2FnZVxuICAgRnVuY3Rpb24gaXMgc3luY2hyb25vdXMgYW5kIHJldHVybnMgYSBXcml0YWJsZVN0cmVhbVxuICAgVXNlZCBzdG9yYWdlczogbG9jYWwgKHdyaXRlKVxuICAgKi9cbiAgcHVibGljIGFkZFRhcmJhbGwobmFtZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogSVVwbG9hZFRhcmJhbGwge1xuICAgIHJldHVybiB0aGlzLmxvY2FsU3RvcmFnZS5hZGRUYXJiYWxsKG5hbWUsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNMb2NhbFRhcmJhbGwobmFtZTogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpOiB2b2lkID0+IHtcbiAgICAgIGxldCBsb2NhbFN0cmVhbTogYW55ID0gc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0VGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gICAgICBsZXQgaXNPcGVuID0gZmFsc2U7XG4gICAgICBsb2NhbFN0cmVhbS5vbignZXJyb3InLCAoZXJyKTogYW55ID0+IHtcbiAgICAgICAgaWYgKGlzT3BlbiB8fCBlcnIuc3RhdHVzICE9PSBIVFRQX1NUQVRVUy5OT1RfRk9VTkQpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBsb2NhbCByZXBvcnRlZCA0MDQgb3IgcmVxdWVzdCB3YXMgYWJvcnRlZCBhbHJlYWR5XG4gICAgICAgIGlmIChsb2NhbFN0cmVhbSkge1xuICAgICAgICAgIGxvY2FsU3RyZWFtLmFib3J0KCk7XG4gICAgICAgICAgbG9jYWxTdHJlYW0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBsb2NhbFN0cmVhbS5vbignb3BlbicsIGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgbG9jYWxTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgbG9jYWxTdHJlYW0gPSBudWxsO1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgIEdldCBhIHRhcmJhbGwgZnJvbSBhIHN0b3JhZ2UgZm9yIHtuYW1lfSBwYWNrYWdlXG4gICBGdW5jdGlvbiBpcyBzeW5jaHJvbm91cyBhbmQgcmV0dXJucyBhIFJlYWRhYmxlU3RyZWFtXG4gICBGdW5jdGlvbiB0cmllcyB0byByZWFkIHRhcmJhbGwgbG9jYWxseSwgaWYgaXQgZmFpbHMgdGhlbiBpdCByZWFkcyBwYWNrYWdlXG4gICBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXJlIHdlIGNhbiBnZXQgdGhpcyB0YXJiYWxsIGZyb21cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsIHx8IHVwbGluayAoanVzdCBvbmUpXG4gICAqL1xuICBwdWJsaWMgZ2V0VGFyYmFsbChuYW1lOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiBJUmVhZFRhcmJhbGwge1xuICAgIGNvbnN0IHJlYWRTdHJlYW0gPSBuZXcgUmVhZFRhcmJhbGwoe30pO1xuICAgIHJlYWRTdHJlYW0uYWJvcnQgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gaWYgc29tZW9uZSByZXF1ZXN0aW5nIHRhcmJhbGwsIGl0IG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzb21lXG4gICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgaXQsIHNvIGZldGNoaW5nIHBhY2thZ2UgaW5mbyBpcyB1bm5lY2Vzc2FyeVxuXG4gICAgLy8gdHJ5aW5nIGxvY2FsIGZpcnN0XG4gICAgLy8gZmxvdzogc2hvdWxkIGJlIElSZWFkVGFyYmFsbFxuICAgIGxldCBsb2NhbFN0cmVhbTogYW55ID0gc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0VGFyYmFsbChuYW1lLCBmaWxlbmFtZSk7XG4gICAgbGV0IGlzT3BlbiA9IGZhbHNlO1xuICAgIGxvY2FsU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpOiBhbnkgPT4ge1xuICAgICAgaWYgKGlzT3BlbiB8fCBlcnIuc3RhdHVzICE9PSBIVFRQX1NUQVRVUy5OT1RfRk9VTkQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRTdHJlYW0uZW1pdCgnZXJyb3InLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBsb2NhbCByZXBvcnRlZCA0MDRcbiAgICAgIGNvbnN0IGVycjQwNCA9IGVycjtcbiAgICAgIGxvY2FsU3RyZWFtLmFib3J0KCk7XG4gICAgICBsb2NhbFN0cmVhbSA9IG51bGw7IC8vIHdlIGZvcmNlIGZvciBnYXJiYWdlIGNvbGxlY3RvclxuICAgICAgc2VsZi5sb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZU1ldGFkYXRhKG5hbWUsIChlcnIsIGluZm86IFBhY2thZ2UpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKF8uaXNOaWwoZXJyKSAmJiBpbmZvLl9kaXN0ZmlsZXMgJiYgXy5pc05pbChpbmZvLl9kaXN0ZmlsZXNbZmlsZW5hbWVdKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGZpbGUgZXhpc3RzIGxvY2FsbHlcbiAgICAgICAgICBzZXJ2ZUZpbGUoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gd2Uga25vdyBub3RoaW5nIGFib3V0IHRoaXMgZmlsZSwgdHJ5aW5nIHRvIGdldCBpbmZvcm1hdGlvbiBlbHNld2hlcmVcbiAgICAgICAgICBzZWxmLl9zeW5jVXBsaW5rc01ldGFkYXRhKG5hbWUsIGluZm8sIHt9LCAoZXJyLCBpbmZvOiBQYWNrYWdlKTogYW55ID0+IHtcbiAgICAgICAgICAgIGlmIChfLmlzTmlsKGVycikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfLmlzTmlsKGluZm8uX2Rpc3RmaWxlcykgfHwgXy5pc05pbChpbmZvLl9kaXN0ZmlsZXNbZmlsZW5hbWVdKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVhZFN0cmVhbS5lbWl0KCdlcnJvcicsIGVycjQwNCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXJ2ZUZpbGUoaW5mby5fZGlzdGZpbGVzW2ZpbGVuYW1lXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGxvY2FsU3RyZWFtLm9uKCdjb250ZW50LWxlbmd0aCcsIGZ1bmN0aW9uICh2KTogdm9pZCB7XG4gICAgICByZWFkU3RyZWFtLmVtaXQoJ2NvbnRlbnQtbGVuZ3RoJywgdik7XG4gICAgfSk7XG4gICAgbG9jYWxTdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICBpc09wZW4gPSB0cnVlO1xuICAgICAgbG9jYWxTdHJlYW0ucGlwZShyZWFkU3RyZWFtKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVhZFN0cmVhbTtcblxuICAgIC8qKlxuICAgICAqIEZldGNoIGFuZCBjYWNoZSBsb2NhbC9yZW1vdGUgcGFja2FnZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGZpbGUgZGVmaW5lIHRoZSBwYWNrYWdlIHNoYXBlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2VydmVGaWxlKGZpbGU6IERpc3RGaWxlKTogdm9pZCB7XG4gICAgICBsZXQgdXBsaW5rOiBhbnkgPSBudWxsO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbGlua0lkIGluIHNlbGYudXBsaW5rcykge1xuICAgICAgICBpZiAoaGFzUHJveHlUbyhuYW1lLCB1cGxpbmtJZCwgc2VsZi5jb25maWcucGFja2FnZXMpKSB7XG4gICAgICAgICAgdXBsaW5rID0gc2VsZi51cGxpbmtzW3VwbGlua0lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodXBsaW5rID09IG51bGwpIHtcbiAgICAgICAgdXBsaW5rID0gbmV3IFByb3h5U3RvcmFnZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmw6IGZpbGUudXJsLFxuICAgICAgICAgICAgY2FjaGU6IHRydWUsXG4gICAgICAgICAgICBfYXV0b2dlbmVyYXRlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlbGYuY29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzYXZlc3RyZWFtOiBJVXBsb2FkVGFyYmFsbCB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHVwbGluay5jb25maWcuY2FjaGUpIHtcbiAgICAgICAgc2F2ZXN0cmVhbSA9IHNlbGYubG9jYWxTdG9yYWdlLmFkZFRhcmJhbGwobmFtZSwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICBsZXQgb25fb3BlbiA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgLy8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGNhbGxlZCB0d2ljZVxuICAgICAgICBvbl9vcGVuID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgIGNvbnN0IHJzdHJlYW0yID0gdXBsaW5rLmZldGNoVGFyYmFsbChmaWxlLnVybCk7XG4gICAgICAgIHJzdHJlYW0yLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYXZlc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICByZWFkU3RyZWFtLmVtaXQoJ2Vycm9yJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJzdHJlYW0yLm9uKCdlbmQnLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uZG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcnN0cmVhbTIub24oJ2NvbnRlbnQtbGVuZ3RoJywgZnVuY3Rpb24gKHYpOiB2b2lkIHtcbiAgICAgICAgICByZWFkU3RyZWFtLmVtaXQoJ2NvbnRlbnQtbGVuZ3RoJywgdik7XG4gICAgICAgICAgaWYgKHNhdmVzdHJlYW0pIHtcbiAgICAgICAgICAgIHNhdmVzdHJlYW0uZW1pdCgnY29udGVudC1sZW5ndGgnLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByc3RyZWFtMi5waXBlKHJlYWRTdHJlYW0pO1xuICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgIHJzdHJlYW0yLnBpcGUoc2F2ZXN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChzYXZlc3RyZWFtKSB7XG4gICAgICAgIHNhdmVzdHJlYW0ub24oJ29wZW4nLCBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgb25fb3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzYXZlc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci53YXJuKHsgZXJyOiBlcnIsIGZpbGVOYW1lOiBmaWxlIH0sICdlcnJvciBzYXZpbmcgZmlsZSBAe2ZpbGVOYW1lfTogQHtlcnIubWVzc2FnZX1cXG5Ae2Vyci5zdGFja30nKTtcbiAgICAgICAgICBpZiAoc2F2ZXN0cmVhbSkge1xuICAgICAgICAgICAgc2F2ZXN0cmVhbS5hYm9ydCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYXZlc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICBvbl9vcGVuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25fb3BlbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgUmV0cmlldmUgYSBwYWNrYWdlIG1ldGFkYXRhIGZvciB7bmFtZX0gcGFja2FnZVxuICAgRnVuY3Rpb24gaW52b2tlcyBsb2NhbFN0b3JhZ2UuZ2V0UGFja2FnZSBhbmQgdXBsaW5rLmdldF9wYWNrYWdlIGZvciBldmVyeVxuICAgdXBsaW5rIHdpdGggcHJveHlfYWNjZXNzIHJpZ2h0cyBhZ2FpbnN0IHtuYW1lfSBhbmQgY29tYmluZXMgcmVzdWx0c1xuICAgaW50byBvbmUganNvbiBvYmplY3RcbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICYmIHVwbGluayAocHJveHlfYWNjZXNzKVxuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcHRpb25zLm5hbWUgUGFja2FnZSBOYW1lXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSAgb3B0aW9ucy5yZXEgRXhwcmVzcyBgcmVxYCBvYmplY3RcbiAgICogQHByb3BlcnR5IHtib29sZWFufSBvcHRpb25zLmtlZXBVcExpbmtEYXRhIGtlZXAgdXAgbGluayBpbmZvIGluIHBhY2thZ2UgbWV0YSwgbGFzdCB1cGRhdGUsIGV0Yy5cbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gb3B0aW9ucy5jYWxsYmFjayBDYWxsYmFjayBmb3IgcmVjZWl2ZSBkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFja2FnZShvcHRpb25zOiBJR2V0UGFja2FnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5nZXRQYWNrYWdlTWV0YWRhdGEob3B0aW9ucy5uYW1lLCAoZXJyLCBkYXRhKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZXJyICYmICghZXJyLnN0YXR1cyB8fCBlcnIuc3RhdHVzID49IEhUVFBfU1RBVFVTLklOVEVSTkFMX0VSUk9SKSkge1xuICAgICAgICAvLyByZXBvcnQgaW50ZXJuYWwgZXJyb3JzIHJpZ2h0IGF3YXlcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc3luY1VwbGlua3NNZXRhZGF0YShcbiAgICAgICAgb3B0aW9ucy5uYW1lLFxuICAgICAgICBkYXRhLFxuICAgICAgICB7IHJlcTogb3B0aW9ucy5yZXEsIHVwbGlua3NMb29rOiBvcHRpb25zLnVwbGlua3NMb29rIH0sXG4gICAgICAgIGZ1bmN0aW9uIGdldFBhY2thZ2VTeW5VcExpbmtzQ2FsbGJhY2soZXJyLCByZXN1bHQ6IFBhY2thZ2UsIHVwbGlua0Vycm9ycyk6IHZvaWQge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNhbGxiYWNrKGVycik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbm9ybWFsaXplRGlzdFRhZ3MoY2xlYW5VcExpbmtzUmVmKG9wdGlvbnMua2VlcFVwTGlua0RhdGEsIHJlc3VsdCkpO1xuXG4gICAgICAgICAgLy8gbnBtIGNhbiB0aHJvdyBpZiB0aGlzIGZpZWxkIGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICByZXN1bHQuX2F0dGFjaG1lbnRzID0ge307XG5cbiAgICAgICAgICBvcHRpb25zLmNhbGxiYWNrKG51bGwsIHJlc3VsdCwgdXBsaW5rRXJyb3JzKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgUmV0cmlldmUgcmVtb3RlIGFuZCBsb2NhbCBwYWNrYWdlcyBtb3JlIHJlY2VudCB0aGFuIHtzdGFydGtleX1cbiAgIEZ1bmN0aW9uIHN0cmVhbXMgYWxsIHBhY2thZ2VzIGZyb20gYWxsIHVwbGlua3MgZmlyc3QsIGFuZCB0aGVuXG4gICBsb2NhbCBwYWNrYWdlcy5cbiAgIE5vdGUgdGhhdCBsb2NhbCBwYWNrYWdlcyBjb3VsZCBvdmVycmlkZSByZWdpc3RyeSBvbmVzIGp1c3QgYmVjYXVzZVxuICAgdGhleSBhcHBlYXIgaW4gSlNPTiBsYXN0LiBUaGF0J3MgYSB0cmFkZS1vZmYgd2UgbWFrZSB0byBhdm9pZFxuICAgbWVtb3J5IGlzc3Vlcy5cbiAgIFVzZWQgc3RvcmFnZXM6IGxvY2FsICYmIHVwbGluayAocHJveHlfYWNjZXNzKVxuICAgKiBAcGFyYW0geyp9IHN0YXJ0a2V5XG4gICAqIEBwYXJhbSB7Kn0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtTdHJlYW19XG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKHN0YXJ0a2V5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSk6IElSZWFkVGFyYmFsbCB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgc2VhcmNoU3RyZWFtOiBhbnkgPSBuZXcgU3RyZWFtLlBhc3NUaHJvdWdoKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgICBhc3luYy5lYWNoU2VyaWVzKFxuICAgICAgT2JqZWN0LmtleXModGhpcy51cGxpbmtzKSxcbiAgICAgIGZ1bmN0aW9uICh1cF9uYW1lLCBjYik6IHZvaWQge1xuICAgICAgICAvLyBzaG9ydGN1dDogaWYgYGxvY2FsPTFgIGlzIHN1cHBsaWVkLCBkb24ndCBjYWxsIHVwbGlua3NcbiAgICAgICAgaWYgKG9wdGlvbnMucmVxPy5xdWVyeT8ubG9jYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBjYigpO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci5pbmZvKGBzZWFyY2ggZm9yIHVwbGluayAke3VwX25hbWV9YCk7XG4gICAgICAgIC8vIHNlYXJjaCBieSBrZXl3b3JkIGZvciBlYWNoIHVwbGlua1xuICAgICAgICBjb25zdCB1cGxpbmtTdHJlYW06IElVcGxvYWRUYXJiYWxsID0gc2VsZi51cGxpbmtzW3VwX25hbWVdLnNlYXJjaChvcHRpb25zKTtcbiAgICAgICAgLy8gam9pbiB1cGxpbmsgc3RyZWFtIHdpdGggc3RyZWFtcyBQYXNzVGhyb3VnaFxuICAgICAgICB1cGxpbmtTdHJlYW0ucGlwZShzZWFyY2hTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgdXBsaW5rU3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpOiB2b2lkIHtcbiAgICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcih7IGVycjogZXJyIH0sICd1cGxpbmsgZXJyb3I6IEB7ZXJyLm1lc3NhZ2V9Jyk7XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfSk7XG4gICAgICAgIHVwbGlua1N0cmVhbS5vbignZW5kJywgZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgLy8gdG8gYXZvaWQgY2FsbCBjYWxsYmFjayBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgIGNiID0gZnVuY3Rpb24gKCk6IHZvaWQge307XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNlYXJjaFN0cmVhbS5hYm9ydCA9IGZ1bmN0aW9uICgpOiB2b2lkIHtcbiAgICAgICAgICBpZiAodXBsaW5rU3RyZWFtLmFib3J0KSB7XG4gICAgICAgICAgICB1cGxpbmtTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2IoKTtcbiAgICAgICAgICAvLyB0byBhdm9pZCBjYWxsIGNhbGxiYWNrIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgY2IgPSBmdW5jdGlvbiAoKTogdm9pZCB7fTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICAvLyBleGVjdXRlZCBhZnRlciBhbGwgc2VyaWVzXG4gICAgICBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgIC8vIGF0dGFjaCBhIGxvY2FsIHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGNvbnN0IGxvY2FsU2VhcmNoU3RyZWFtOiBJUmVhZFRhcmJhbGwgPSBzZWxmLmxvY2FsU3RvcmFnZS5zZWFyY2goc3RhcnRrZXksIG9wdGlvbnMpO1xuICAgICAgICBzZWFyY2hTdHJlYW0uYWJvcnQgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG4gICAgICAgICAgbG9jYWxTZWFyY2hTdHJlYW0uYWJvcnQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgbG9jYWxTZWFyY2hTdHJlYW0ucGlwZShzZWFyY2hTdHJlYW0sIHsgZW5kOiB0cnVlIH0pO1xuICAgICAgICBsb2NhbFNlYXJjaFN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyOiBWZXJkYWNjaW9FcnJvcik6IHZvaWQge1xuICAgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKHsgZXJyOiBlcnIgfSwgJ3NlYXJjaCBlcnJvcjogQHtlcnIubWVzc2FnZX0nKTtcbiAgICAgICAgICBzZWFyY2hTdHJlYW0uZW5kKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gc2VhcmNoU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIG9ubHkgcHJpdmF0ZSBsb2NhbCBwYWNrYWdlc1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICBwdWJsaWMgZ2V0TG9jYWxEYXRhYmFzZShjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLmxvY2FsU3RvcmFnZS5zdG9yYWdlUGx1Z2luLmdldCgoZXJyLCBsb2NhbHMpOiB2b2lkID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFja2FnZXM6IFZlcnNpb25bXSA9IFtdO1xuICAgICAgY29uc3QgZ2V0UGFja2FnZSA9IGZ1bmN0aW9uIChpdGVtUGtnKTogdm9pZCB7XG4gICAgICAgIHNlbGYubG9jYWxTdG9yYWdlLmdldFBhY2thZ2VNZXRhZGF0YShsb2NhbHNbaXRlbVBrZ10sIGZ1bmN0aW9uIChlcnIsIHBrZ01ldGFkYXRhOiBQYWNrYWdlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKF8uaXNOaWwoZXJyKSkge1xuICAgICAgICAgICAgY29uc3QgbGF0ZXN0ID0gcGtnTWV0YWRhdGFbRElTVF9UQUdTXS5sYXRlc3Q7XG4gICAgICAgICAgICBpZiAobGF0ZXN0ICYmIHBrZ01ldGFkYXRhLnZlcnNpb25zW2xhdGVzdF0pIHtcbiAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbjogVmVyc2lvbiA9IHBrZ01ldGFkYXRhLnZlcnNpb25zW2xhdGVzdF07XG4gICAgICAgICAgICAgIGNvbnN0IHRpbWVMaXN0ID0gcGtnTWV0YWRhdGEudGltZSBhcyBHZW5lcmljQm9keTtcbiAgICAgICAgICAgICAgY29uc3QgdGltZSA9IHRpbWVMaXN0W2xhdGVzdF07XG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgdmVyc2lvbi50aW1lID0gdGltZTtcblxuICAgICAgICAgICAgICAvLyBBZGQgZm9yIHN0YXJzIGFwaVxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgIHZlcnNpb24udXNlcnMgPSBwa2dNZXRhZGF0YS51c2VycztcblxuICAgICAgICAgICAgICBwYWNrYWdlcy5wdXNoKHZlcnNpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2VsZi5sb2dnZXIud2Fybih7IHBhY2thZ2U6IGxvY2Fsc1tpdGVtUGtnXSB9LCAncGFja2FnZSBAe3BhY2thZ2V9IGRvZXMgbm90IGhhdmUgYSBcImxhdGVzdFwiIHRhZz8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaXRlbVBrZyA+PSBsb2NhbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgcGFja2FnZXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYWNrYWdlKGl0ZW1Qa2cgKyAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaWYgKGxvY2Fscy5sZW5ndGgpIHtcbiAgICAgICAgZ2V0UGFja2FnZSgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIFtdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiBmZXRjaGVzIHBhY2thZ2UgbWV0YWRhdGEgZnJvbSB1cGxpbmtzIGFuZCBzeW5jaHJvbml6ZXMgaXQgd2l0aCBsb2NhbCBkYXRhXG4gICBpZiBwYWNrYWdlIGlzIGF2YWlsYWJsZSBsb2NhbGx5LCBpdCBNVVNUIGJlIHByb3ZpZGVkIGluIHBrZ2luZm9cbiAgIHJldHVybnMgY2FsbGJhY2soZXJyLCByZXN1bHQsIHVwbGlua19lcnJvcnMpXG4gICAqL1xuICBwdWJsaWMgX3N5bmNVcGxpbmtzTWV0YWRhdGEobmFtZTogc3RyaW5nLCBwYWNrYWdlSW5mbzogUGFja2FnZSwgb3B0aW9uczogSVN5bmNVcGxpbmtzLCBjYWxsYmFjazogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICBsZXQgZm91bmQgPSB0cnVlO1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHVwTGlua3M6IElQcm94eVtdID0gW107XG4gICAgY29uc3QgaGFzVG9Mb29rSW50b1VwbGlua3MgPSBfLmlzTmlsKG9wdGlvbnMudXBsaW5rc0xvb2spIHx8IG9wdGlvbnMudXBsaW5rc0xvb2s7XG5cbiAgICBpZiAoIXBhY2thZ2VJbmZvKSB7XG4gICAgICBmb3VuZCA9IGZhbHNlO1xuICAgICAgcGFja2FnZUluZm8gPSBnZW5lcmF0ZVBhY2thZ2VUZW1wbGF0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHVwbGluayBpbiB0aGlzLnVwbGlua3MpIHtcbiAgICAgIGlmIChoYXNQcm94eVRvKG5hbWUsIHVwbGluaywgdGhpcy5jb25maWcucGFja2FnZXMpICYmIGhhc1RvTG9va0ludG9VcGxpbmtzKSB7XG4gICAgICAgIHVwTGlua3MucHVzaCh0aGlzLnVwbGlua3NbdXBsaW5rXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMubWFwKFxuICAgICAgdXBMaW5rcyxcbiAgICAgICh1cExpbmssIGNiKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IF9vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHVwTGlua01ldGEgPSBwYWNrYWdlSW5mby5fdXBsaW5rc1t1cExpbmsudXBuYW1lXTtcblxuICAgICAgICBpZiAoaXNPYmplY3QodXBMaW5rTWV0YSkpIHtcbiAgICAgICAgICBjb25zdCBmZXRjaGVkID0gdXBMaW5rTWV0YS5mZXRjaGVkO1xuXG4gICAgICAgICAgaWYgKGZldGNoZWQgJiYgRGF0ZS5ub3coKSAtIGZldGNoZWQgPCB1cExpbmsubWF4YWdlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfb3B0aW9ucy5ldGFnID0gdXBMaW5rTWV0YS5ldGFnO1xuICAgICAgICB9XG5cbiAgICAgICAgdXBMaW5rLmdldFJlbW90ZU1ldGFkYXRhKG5hbWUsIF9vcHRpb25zLCAoZXJyLCB1cExpbmtSZXNwb25zZSwgZVRhZyk6IHZvaWQgPT4ge1xuICAgICAgICAgIGlmIChlcnIgJiYgZXJyLnJlbW90ZVN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgICAgICB1cExpbmtNZXRhLmZldGNoZWQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlcnIgfHwgIXVwTGlua1Jlc3BvbnNlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgW2VyciB8fCBFcnJvckNvZGUuZ2V0SW50ZXJuYWxFcnJvcignbm8gZGF0YScpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbGlkYXRlTWV0YWRhdGEodXBMaW5rUmVzcG9uc2UsIG5hbWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWI6ICdvdXQnLFxuICAgICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAncGFja2FnZS5qc29uIHZhbGlkYXRpbmcgZXJyb3IgQHshZXJyLm1lc3NhZ2V9XFxuQHtlcnIuc3RhY2t9J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBbZXJyXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcGFja2FnZUluZm8uX3VwbGlua3NbdXBMaW5rLnVwbmFtZV0gPSB7XG4gICAgICAgICAgICBldGFnOiBlVGFnLFxuICAgICAgICAgICAgZmV0Y2hlZDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcGFja2FnZUluZm8udGltZSA9IG1lcmdlVXBsaW5rVGltZUludG9Mb2NhbChwYWNrYWdlSW5mbywgdXBMaW5rUmVzcG9uc2UpO1xuXG4gICAgICAgICAgdXBkYXRlVmVyc2lvbnNIaWRkZW5VcExpbmsodXBMaW5rUmVzcG9uc2UudmVyc2lvbnMsIHVwTGluayk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbWVyZ2VWZXJzaW9ucyhwYWNrYWdlSW5mbywgdXBMaW5rUmVzcG9uc2UpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzdWI6ICdvdXQnLFxuICAgICAgICAgICAgICAgIGVycjogZXJyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAncGFja2FnZS5qc29uIHBhcnNpbmcgZXJyb3IgQHshZXJyLm1lc3NhZ2V9XFxuQHtlcnIuc3RhY2t9J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBbZXJyXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIGFzc3VtZSB0aGF0IHRoZSBjb3JyZWN0IHBhY2thZ2UgZXhpc3RzXG4gICAgICAgICAgLy8gb24gdGhlIHVwbGlua1xuICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBjYigpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAoZXJyOiBFcnJvciwgdXBMaW5rc0Vycm9yczogYW55KTogQXN5bmNSZXN1bHRBcnJheUNhbGxiYWNrPHVua25vd24sIEVycm9yPiA9PiB7XG4gICAgICAgIGFzc2VydCghZXJyICYmIEFycmF5LmlzQXJyYXkodXBMaW5rc0Vycm9ycykpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBjb25uZWN0aW9uIHRpbWVvdXQgb3IgcmVzZXQgZXJyb3JzIHdpdGggdXBsaW5rKHMpXG4gICAgICAgIC8vICh0aGVzZSBzaG91bGQgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmcm9tIHRoZSBwYWNrYWdlIG5vdCBiZWluZyBmb3VuZClcbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgIGxldCB1cGxpbmtUaW1lb3V0RXJyb3I7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cExpbmtzRXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodXBMaW5rc0Vycm9yc1tpXSkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHVwTGlua3NFcnJvcnNbaV0ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodXBMaW5rc0Vycm9yc1tpXVtqXSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHVwTGlua3NFcnJvcnNbaV1bal0uY29kZTtcbiAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSAnRVRJTUVET1VUJyB8fCBjb2RlID09PSAnRVNPQ0tFVFRJTUVET1VUJyB8fCBjb2RlID09PSAnRUNPTk5SRVNFVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBsaW5rVGltZW91dEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHVwbGlua1RpbWVvdXRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKEVycm9yQ29kZS5nZXRTZXJ2aWNlVW5hdmFpbGFibGUoKSwgbnVsbCwgdXBMaW5rc0Vycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhFcnJvckNvZGUuZ2V0Tm90Rm91bmQoQVBJX0VSUk9SLk5PX1BBQ0tBR0UpLCBudWxsLCB1cExpbmtzRXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cExpbmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBwYWNrYWdlSW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmxvY2FsU3RvcmFnZS51cGRhdGVWZXJzaW9ucyhuYW1lLCBwYWNrYWdlSW5mbywgYXN5bmMgKGVyciwgcGFja2FnZUpzb25Mb2NhbDogUGFja2FnZSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEFueSBlcnJvciBoZXJlIHdpbGwgY2F1c2UgYSA0MDQsIGxpa2UgYW4gdXBsaW5rIGVycm9yLiBUaGlzIGlzIGxpa2VseSB0aGUgcmlnaHQgdGhpbmcgdG8gZG9cbiAgICAgICAgICAvLyBhcyBhIGJyb2tlbiBmaWx0ZXIgaXMgYSBzZWN1cml0eSByaXNrLlxuICAgICAgICAgIGNvbnN0IGZpbHRlckVycm9yczogRXJyb3JbXSA9IFtdO1xuICAgICAgICAgIC8vIFRoaXMgTVVTVCBiZSBkb25lIHNlcmlhbGx5IGFuZCBub3QgaW4gcGFyYWxsZWwgYXMgdGhleSBtb2RpZnkgcGFja2FnZUpzb25Mb2NhbFxuICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHNlbGYuZmlsdGVycykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gVGhlc2UgZmlsdGVycyBjYW4gYXNzdW1lIGl0J3Mgc2F2ZSB0byBtb2RpZnkgcGFja2FnZUpzb25Mb2NhbCBhbmQgcmV0dXJuIGl0IGRpcmVjdGx5IGZvclxuICAgICAgICAgICAgICAvLyBwZXJmb3JtYW5jZSAoaS5lLiBuZWVkIG5vdCBiZSBwdXJlKVxuICAgICAgICAgICAgICBwYWNrYWdlSnNvbkxvY2FsID0gYXdhaXQgZmlsdGVyLmZpbHRlcl9tZXRhZGF0YShwYWNrYWdlSnNvbkxvY2FsKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBmaWx0ZXJFcnJvcnMucHVzaChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBwYWNrYWdlSnNvbkxvY2FsLCBfLmNvbmNhdCh1cExpbmtzRXJyb3JzLCBmaWx0ZXJFcnJvcnMpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBoaWRkZW4gdmFsdWUgZm9yIGVhY2ggdmVyc2lvbi5cbiAgICogQHBhcmFtIHtBcnJheX0gdmVyc2lvbnMgbGlzdCBvZiB2ZXJzaW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB1cExpbmsgdXBsaW5rIG5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHB1YmxpYyBfdXBkYXRlVmVyc2lvbnNIaWRkZW5VcExpbmsodmVyc2lvbnM6IFZlcnNpb25zLCB1cExpbms6IElQcm94eSk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgaSBpbiB2ZXJzaW9ucykge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2ZXJzaW9ucywgaSkpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IHZlcnNpb25zW2ldO1xuXG4gICAgICAgIC8vIGhvbGRzIGEgXCJoaWRkZW5cIiB2YWx1ZSB0byBiZSB1c2VkIGJ5IHRoZSBwYWNrYWdlIHN0b3JhZ2UuXG4gICAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgICAgdmVyc2lvbltTeW1ib2wuZm9yKCdfX3ZlcmRhY2Npb191cGxpbmsnKV0gPSB1cExpbmsudXBuYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlO1xuIl19
|