parse-server 9.10.1-alpha.9 → 9.10.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.
@@ -14,6 +14,7 @@ var _middlewares = require("../middlewares");
14
14
  var _requiredParameter = _interopRequireDefault(require("../requiredParameter"));
15
15
  var _logger = _interopRequireDefault(require("../logger"));
16
16
  var _ParseGraphQLSchema = require("./ParseGraphQLSchema");
17
+ var _defaultGraphQLTypes = require("./loaders/defaultGraphQLTypes");
17
18
  var _ParseGraphQLController = _interopRequireWildcard(require("../Controllers/ParseGraphQLController"));
18
19
  var _queryComplexity = require("./helpers/queryComplexity");
19
20
  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); }
@@ -68,18 +69,29 @@ const IntrospectionControlPlugin = publicIntrospection => ({
68
69
  if (isMasterOrMaintenance) {
69
70
  return;
70
71
  }
71
- const query = requestContext.request.query;
72
+
73
+ // Apollo resolves the operation text into `requestContext.source` before this hook
74
+ // runs and guarantees it is set here. It is NOT the same as `request.query`: on an
75
+ // automatic persisted query cache hit the text comes from the persisted-query cache
76
+ // and `request.query` is never populated, so reading `request.query` would leave
77
+ // nothing to inspect and silently skip both guards below. Apollo enables automatic
78
+ // persisted queries by default, so that path is reachable on every deployment. Fall
79
+ // back to `request.query` only for robustness, and fail closed when neither is a
80
+ // string so that an operation which cannot be inspected is never allowed through.
81
+ const query = requestContext.source ?? requestContext.request.query;
72
82
 
73
83
  // Fast path: simple string check for __schema
74
84
  // This avoids parsing the query in most cases
75
- if (query?.includes('__schema')) {
85
+ // An operation text that is not a string cannot be inspected at all, so it is denied
86
+ // for the same reason: this guard must never let an operation through uninspected.
87
+ if (typeof query !== 'string' || query.includes('__schema')) {
76
88
  return throwIntrospectionError();
77
89
  }
78
90
 
79
91
  // Smart check for __type: only parse if the string is present
80
92
  // This avoids false positives (e.g., "__type" in strings or comments)
81
93
  // while still being efficient for the common case
82
- if (query?.includes('__type') && hasTypeIntrospection(query)) {
94
+ if (query.includes('__type') && hasTypeIntrospection(query)) {
83
95
  return throwIntrospectionError();
84
96
  }
85
97
  }
@@ -111,6 +123,16 @@ const stripSchemaSuggestion = message => typeof message === 'string' ? message.r
111
123
  // they disclose nothing the caller did not already provide.
112
124
  const stripSchemaCoercionIdentifiers = message => typeof message === 'string' ? message.replace(/Field "[^"]*" of required type "[^"]*" was not provided\./g, 'Field of required type was not provided.') : message;
113
125
 
126
+ // Type names that reveal nothing about THIS application's schema, so redacting them would cost
127
+ // message quality for no security gain. `RESERVED_GRAPHQL_TYPE_NAMES` covers the names the schema
128
+ // builder refuses to let a class generate, but Parse registers built-in types outside that list
129
+ // too. Of those, only an ENUM can reach the enum templates below, and the GraphQL layer defines
130
+ // exactly three enums: `CloudCodeFunction` (reserved), the per-class `<Class>Order` (the
131
+ // disclosure these templates exist to redact) and `ReadPreference`. Include the last one so that
132
+ // an invalid `options.readPreference` value still names its enum, just as `CloudCodeFunction`
133
+ // does — it is identical on every deployment and reachable from every generated find query.
134
+ const NON_DISCLOSING_TYPE_NAMES = new Set([..._ParseGraphQLSchema.RESERVED_GRAPHQL_TYPE_NAMES, _defaultGraphQLTypes.READ_PREFERENCE.name]);
135
+
114
136
  // graphql-js also emits base coercion / validation messages that name a nested input
115
137
  // TYPE without a "Did you mean" clause, so neither strip above reaches them. For a
116
138
  // Pointer or Relation field the generated input type name embeds the pointer's TARGET
@@ -126,37 +148,63 @@ const stripSchemaTypeIdentifiers = (message, operationText) => {
126
148
  if (typeof message !== 'string') {
127
149
  return message;
128
150
  }
129
- // A generated type identifier counts as "referenced" (and therefore not a disclosure) only if
130
- // the caller wrote it as a whole token in the operation text. Tokenize the operation on
131
- // non-identifier characters and compare exact tokens rather than building a RegExp from the
132
- // captured name: this avoids substring false-matches (e.g. preserving "AuthorPointerInput"
133
- // because the operation contains "SecretAuthorPointerInput") and any regex injection/ReDoS from
134
- // an unusual captured name. GraphQL list/non-null wrappers ("[", "]", "!") are stripped from the
135
- // captured name so e.g. "SecretAuthorPointerInput!" still matches "$x: SecretAuthorPointerInput!".
136
- // When the operation text is unavailable the type is treated as not referenced (fail closed).
151
+ // A generated type identifier is kept (it is not a disclosure) if the caller wrote it as a
152
+ // whole token in the operation text, or if it is a non-disclosing name (above). Tokenize the
153
+ // operation on non-identifier characters and compare exact tokens rather than building a
154
+ // RegExp from the captured name: this avoids substring false-matches (e.g. preserving
155
+ // "AuthorPointerInput" because the operation contains "SecretAuthorPointerInput") and any
156
+ // regex injection/ReDoS from an unusual captured name. GraphQL list/non-null wrappers ("[",
157
+ // "]", "!") are stripped from the captured name so e.g. "SecretAuthorPointerInput!" still
158
+ // matches "$x: SecretAuthorPointerInput!". When the operation text is unavailable the type is
159
+ // treated as not referenced (fail closed).
137
160
  const referencedTokens = typeof operationText === 'string' ? new Set(operationText.split(/[^_A-Za-z0-9]+/).filter(Boolean)) : new Set();
138
- const isReferenced = typeName => referencedTokens.has(typeName.replace(/[[\]!]/g, ''));
161
+ // A non-disclosing type name (`CloudCodeFunction`, `ReadPreference`, `Viewer`, `PageInfo`, the
162
+ // built-in scalars, ...) is identical on every Parse Server deployment and cannot collide with
163
+ // a user class, since `ParseGraphQLSchema` rejects class names that would produce one. Echoing
164
+ // one therefore discloses nothing about THIS application's schema, so it is preserved like a
165
+ // caller-referenced name and the message stays useful.
166
+ const shouldKeepTypeName = typeName => {
167
+ const bareTypeName = typeName.replace(/[[\]!]/g, '');
168
+ return NON_DISCLOSING_TYPE_NAMES.has(bareTypeName) || referencedTokens.has(bareTypeName);
169
+ };
139
170
  return message
140
171
  // Input coercion / ValuesOfCorrectTypeRule (variables and inline literals).
141
- .replace(/Expected value of type "([^"]+)"/g, (match, typeName) => isReferenced(typeName) ? match : 'Expected value of the correct type').replace(/Expected type "([^"]+)" to be an object\./g, (match, typeName) => isReferenced(typeName) ? match : 'Expected an object.').replace(/Expected non-nullable type "([^"]+)" not to be null\./g, (match, typeName) => isReferenced(typeName) ? match : 'Expected a non-null value.').replace(/ is not defined by type "([^"]+)"\./g, (match, typeName) => isReferenced(typeName) ? match : ' is not defined.')
172
+ .replace(/Expected value of type "([^"]+)"/g, (match, typeName) => shouldKeepTypeName(typeName) ? match : 'Expected value of the correct type').replace(/Expected type "([^"]+)" to be an object\./g, (match, typeName) => shouldKeepTypeName(typeName) ? match : 'Expected an object.').replace(/Expected non-nullable type "([^"]+)" not to be null\./g, (match, typeName) => shouldKeepTypeName(typeName) ? match : 'Expected a non-null value.').replace(/ is not defined by type "([^"]+)"\./g, (match, typeName) => shouldKeepTypeName(typeName) ? match : ' is not defined.')
142
173
  // VariablesInAllowedPositionRule: the position type is the pointer/relation target
143
174
  // input type; the caller only wrote their own variable's declared type.
144
- .replace(/ used in position expecting type "([^"]+)"\./g, (match, typeName) => isReferenced(typeName) ? match : ' used in position expecting a different type.')
175
+ .replace(/ used in position expecting type "([^"]+)"\./g, (match, typeName) => shouldKeepTypeName(typeName) ? match : ' used in position expecting a different type.')
145
176
  // FieldsOnCorrectTypeRule: descending into a Pointer/Relation output field names its
146
177
  // target output object type.
147
- .replace(/Cannot query field ("[^"]*") on type "([^"]+)"\./g, (match, fieldName, typeName) => isReferenced(typeName) ? match : `Cannot query field ${fieldName}.`)
178
+ .replace(/Cannot query field ("[^"]*") on type "([^"]+)"\./g, (match, fieldName, typeName) => shouldKeepTypeName(typeName) ? match : `Cannot query field ${fieldName}.`)
148
179
  // ScalarLeafsRule: selecting a Pointer/Relation output field with no sub-selection names
149
180
  // its target output object type.
150
- .replace(/Field ("[^"]*") of type "([^"]+)" must have a selection of subfields\./g, (match, fieldName, typeName) => isReferenced(typeName) ? match : `Field ${fieldName} must have a selection of subfields.`)
181
+ .replace(/Field ("[^"]*") of type "([^"]+)" must have a selection of subfields\./g, (match, fieldName, typeName) => shouldKeepTypeName(typeName) ? match : `Field ${fieldName} must have a selection of subfields.`)
151
182
  // PossibleFragmentSpreadsRule: an inline/named fragment on an incompatible type inside a
152
183
  // Pointer/Relation output field names the target output object type (the parent type).
153
184
  // Redact each type token the caller did not reference; when both are referenced the
154
185
  // reconstruction is identical to the original message.
155
186
  .replace(/objects of type "([^"]+)" can never be of type "([^"]+)"\./g, (match, parentType, fragType) => {
156
- const parent = isReferenced(parentType) ? `type "${parentType}"` : 'the parent type';
157
- const frag = isReferenced(fragType) ? `type "${fragType}"` : 'the given type';
187
+ const parent = shouldKeepTypeName(parentType) ? `type "${parentType}"` : 'the parent type';
188
+ const frag = shouldKeepTypeName(fragType) ? `type "${fragType}"` : 'the given type';
158
189
  return `objects of ${parent} can never be of ${frag}.`;
159
- });
190
+ })
191
+ // KnownArgumentNamesRule: the argument's parent OUTPUT type. Inside a Pointer/Relation
192
+ // sub-selection that parent is the TARGET class, whose output type is named exactly the
193
+ // class name (`parseClassTypes.js`), so it discloses a class the caller never wrote — they
194
+ // only supplied the pointer field name. The type is embedded in a dotted "<Type>.<field>"
195
+ // token; keep the field name (the caller wrote it) and redact only the type half. Note the
196
+ // directive form ('... on directive "@name".') carries no type and is left alone.
197
+ .replace(/Unknown argument ("[^"]*") on field "([^".]+)\.([^".]+)"\./g, (match, argName, typeName, fieldName) => shouldKeepTypeName(typeName) ? match : `Unknown argument ${argName} on field "${fieldName}".`)
198
+ // GraphQLEnumType.parseValue/parseLiteral: a Relation field's `order` argument is typed
199
+ // `[<Target>Order!]` (`parseClassTypes.js`), so an invalid enum literal names the target
200
+ // class. These messages come from the enum type itself rather than from a validation rule,
201
+ // which is why the ValuesOfCorrectTypeRule templates above do not reach them. The offending
202
+ // value is caller-supplied and is preserved; only the enum type name is redacted.
203
+ .replace(/Value ("[^"]*") does not exist in "([^"]+)" enum\./g, (match, value, typeName) => shouldKeepTypeName(typeName) ? match : `Value ${value} does not exist in the enum.`)
204
+ // Sibling branches of the same enum type, reached when the literal is not an enum value at
205
+ // all ('cannot represent non-enum value: ...', 'cannot represent non-string value: ...',
206
+ // 'cannot represent value: ...'). Same disclosure, same redaction.
207
+ .replace(/Enum "([^"]+)" cannot represent /g, (match, typeName) => shouldKeepTypeName(typeName) ? match : 'Enum cannot represent ');
160
208
  };
161
209
  const stripSchemaIdentifiers = (message, operationText) => stripSchemaTypeIdentifiers(stripSchemaCoercionIdentifiers(stripSchemaSuggestion(message)), operationText);
162
210
  const SchemaSuggestionsControlPlugin = publicIntrospection => ({
@@ -171,7 +219,12 @@ const SchemaSuggestionsControlPlugin = publicIntrospection => ({
171
219
  }
172
220
  const body = requestContext.response?.body;
173
221
  const errors = body?.kind === 'single' ? body.singleResult.errors : body?.kind === 'incremental' ? body.initialResult.errors : undefined;
174
- const operationText = requestContext.request?.query;
222
+ // Same as in `IntrospectionControlPlugin`: `requestContext.source` carries the
223
+ // operation text for every request, including an automatic persisted query cache hit
224
+ // where `request.query` is undefined. Reading `request.query` alone would make the
225
+ // allowlist below empty on those requests and redact type names the caller wrote
226
+ // themselves.
227
+ const operationText = requestContext.source ?? requestContext.request?.query;
175
228
  errors?.forEach(error => {
176
229
  error.message = stripSchemaIdentifiers(error.message, operationText);
177
230
  if (Array.isArray(error.extensions?.stacktrace)) {
@@ -334,4 +387,4 @@ class ParseGraphQLServer {
334
387
  }
335
388
  }
336
389
  exports.ParseGraphQLServer = ParseGraphQLServer;
337
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbFVwbG9hZEV4cHJlc3MiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zZXJ2ZXIiLCJfZXhwcmVzcyIsIl9kaXNhYmxlZCIsIl9leHByZXNzMiIsIl9ncmFwaHFsIiwiX21pZGRsZXdhcmVzIiwiX3JlcXVpcmVkUGFyYW1ldGVyIiwiX2xvZ2dlciIsIl9QYXJzZUdyYXBoUUxTY2hlbWEiLCJfUGFyc2VHcmFwaFFMQ29udHJvbGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX3F1ZXJ5Q29tcGxleGl0eSIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImhhc1R5cGVJbnRyb3NwZWN0aW9uIiwicXVlcnkiLCJhc3QiLCJwYXJzZSIsImNoZWNrU2VsZWN0aW9ucyIsInNlbGVjdGlvbnMiLCJzZWxlY3Rpb24iLCJraW5kIiwibmFtZSIsInZhbHVlIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic2VsZWN0aW9uU2V0IiwiZGVmaW5pdGlvbiIsImRlZmluaXRpb25zIiwidGhyb3dJbnRyb3NwZWN0aW9uRXJyb3IiLCJHcmFwaFFMRXJyb3IiLCJleHRlbnNpb25zIiwiaHR0cCIsInN0YXR1cyIsIkludHJvc3BlY3Rpb25Db250cm9sUGx1Z2luIiwicHVibGljSW50cm9zcGVjdGlvbiIsInJlcXVlc3REaWRTdGFydCIsInJlcXVlc3RDb250ZXh0IiwiZGlkUmVzb2x2ZU9wZXJhdGlvbiIsImlzTWFzdGVyT3JNYWludGVuYW5jZSIsImNvbnRleHRWYWx1ZSIsImF1dGgiLCJpc01hc3RlciIsImlzTWFpbnRlbmFuY2UiLCJyZXF1ZXN0IiwiaW5jbHVkZXMiLCJzdHJpcFNjaGVtYVN1Z2dlc3Rpb24iLCJtZXNzYWdlIiwicmVwbGFjZSIsInN0cmlwU2NoZW1hQ29lcmNpb25JZGVudGlmaWVycyIsInN0cmlwU2NoZW1hVHlwZUlkZW50aWZpZXJzIiwib3BlcmF0aW9uVGV4dCIsInJlZmVyZW5jZWRUb2tlbnMiLCJTZXQiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJpc1JlZmVyZW5jZWQiLCJ0eXBlTmFtZSIsIm1hdGNoIiwiZmllbGROYW1lIiwicGFyZW50VHlwZSIsImZyYWdUeXBlIiwicGFyZW50IiwiZnJhZyIsInN0cmlwU2NoZW1hSWRlbnRpZmllcnMiLCJTY2hlbWFTdWdnZXN0aW9uc0NvbnRyb2xQbHVnaW4iLCJ3aWxsU2VuZFJlc3BvbnNlIiwiYm9keSIsInJlc3BvbnNlIiwiZXJyb3JzIiwic2luZ2xlUmVzdWx0IiwiaW5pdGlhbFJlc3VsdCIsInVuZGVmaW5lZCIsImZvckVhY2giLCJlcnJvciIsIkFycmF5IiwiaXNBcnJheSIsInN0YWNrdHJhY2UiLCJtYXAiLCJQYXJzZUdyYXBoUUxTZXJ2ZXIiLCJjb25zdHJ1Y3RvciIsInBhcnNlU2VydmVyIiwiY29uZmlnIiwicmVxdWlyZWRQYXJhbWV0ZXIiLCJncmFwaFFMUGF0aCIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJsb2ciLCJsb2dnZXJDb250cm9sbGVyIiwiZGVmYXVsdExvZ2dlciIsInBhcnNlR3JhcGhRTFNjaGVtYSIsIlBhcnNlR3JhcGhRTFNjaGVtYSIsImRhdGFiYXNlQ29udHJvbGxlciIsImdyYXBoUUxDdXN0b21UeXBlRGVmcyIsImFwcElkIiwiX2dldEdyYXBoUUxPcHRpb25zIiwic2NoZW1hIiwibG9hZCIsImNvbnRleHQiLCJyZXEiLCJpbmZvIiwic3RhY2siLCJ0b1N0cmluZyIsIl9nZXRTZXJ2ZXIiLCJzY2hlbWFSZWYiLCJncmFwaFFMU2NoZW1hIiwibmV3U2NoZW1hUmVmIiwiX3NjaGVtYVJlZk11dGV4IiwiY3JlYXRlU2VydmVyIiwiYXBvbGxvIiwiQXBvbGxvU2VydmVyIiwiY3NyZlByZXZlbnRpb24iLCJyZXF1ZXN0SGVhZGVycyIsImludHJvc3BlY3Rpb24iLCJwbHVnaW5zIiwiQXBvbGxvU2VydmVyUGx1Z2luQ2FjaGVDb250cm9sRGlzYWJsZWQiLCJncmFwaFFMUHVibGljSW50cm9zcGVjdGlvbiIsImNyZWF0ZUNvbXBsZXhpdHlWYWxpZGF0aW9uUGx1Z2luIiwicmVxdWVzdENvbXBsZXhpdHkiLCJzdGFydCIsImV4cHJlc3NNaWRkbGV3YXJlIiwiX3RyYW5zZm9ybU1heFVwbG9hZFNpemVUb0J5dGVzIiwibWF4VXBsb2FkU2l6ZSIsInVuaXRNYXAiLCJrYiIsIm1iIiwiZ2IiLCJOdW1iZXIiLCJzbGljZSIsIk1hdGgiLCJwb3ciLCJ0b0xvd2VyQ2FzZSIsImFwcGx5UmVxdWVzdENvbnRleHRNaWRkbGV3YXJlIiwiYXBpIiwib3B0aW9ucyIsInJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSIsIkVycm9yIiwidXNlIiwiYXBwbHlHcmFwaFFMIiwiYXBwIiwiYWxsb3dDcm9zc0RvbWFpbiIsImhhbmRsZVBhcnNlSGVhZGVycyIsImhhbmRsZVBhcnNlU2Vzc2lvbiIsImhhbmRsZVBhcnNlRXJyb3JzIiwiZ3JhcGhxbFVwbG9hZEV4cHJlc3MiLCJtYXhGaWxlU2l6ZSIsImV4cHJlc3MiLCJqc29uIiwicmVzIiwibmV4dCIsInNlcnZlciIsImFwcGx5UGxheWdyb3VuZCIsInBsYXlncm91bmRQYXRoIiwiX3JlcSIsInNldEhlYWRlciIsIndyaXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1hc3RlcktleSIsImVuZCIsInNldEdyYXBoUUxDb25maWciLCJncmFwaFFMQ29uZmlnIiwidXBkYXRlR3JhcGhRTENvbmZpZyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvR3JhcGhRTC9QYXJzZUdyYXBoUUxTZXJ2ZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGdyYXBocWxVcGxvYWRFeHByZXNzIGZyb20gJ2dyYXBocWwtdXBsb2FkL2dyYXBocWxVcGxvYWRFeHByZXNzLmpzJztcbmltcG9ydCB7IEFwb2xsb1NlcnZlciB9IGZyb20gJ0BhcG9sbG8vc2VydmVyJztcbmltcG9ydCB7IGV4cHJlc3NNaWRkbGV3YXJlIH0gZnJvbSAnQGFzLWludGVncmF0aW9ucy9leHByZXNzNSc7XG5pbXBvcnQgeyBBcG9sbG9TZXJ2ZXJQbHVnaW5DYWNoZUNvbnRyb2xEaXNhYmxlZCB9IGZyb20gJ0BhcG9sbG8vc2VydmVyL3BsdWdpbi9kaXNhYmxlZCc7XG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEdyYXBoUUxFcnJvciwgcGFyc2UgfSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7IGFsbG93Q3Jvc3NEb21haW4sIGhhbmRsZVBhcnNlRXJyb3JzLCBoYW5kbGVQYXJzZUhlYWRlcnMsIGhhbmRsZVBhcnNlU2Vzc2lvbiB9IGZyb20gJy4uL21pZGRsZXdhcmVzJztcbmltcG9ydCByZXF1aXJlZFBhcmFtZXRlciBmcm9tICcuLi9yZXF1aXJlZFBhcmFtZXRlcic7XG5pbXBvcnQgZGVmYXVsdExvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgUGFyc2VHcmFwaFFMU2NoZW1hIH0gZnJvbSAnLi9QYXJzZUdyYXBoUUxTY2hlbWEnO1xuaW1wb3J0IFBhcnNlR3JhcGhRTENvbnRyb2xsZXIsIHsgUGFyc2VHcmFwaFFMQ29uZmlnIH0gZnJvbSAnLi4vQ29udHJvbGxlcnMvUGFyc2VHcmFwaFFMQ29udHJvbGxlcic7XG5pbXBvcnQgeyBjcmVhdGVDb21wbGV4aXR5VmFsaWRhdGlvblBsdWdpbiB9IGZyb20gJy4vaGVscGVycy9xdWVyeUNvbXBsZXhpdHknO1xuXG5cbmNvbnN0IGhhc1R5cGVJbnRyb3NwZWN0aW9uID0gKHF1ZXJ5KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXN0ID0gcGFyc2UocXVlcnkpO1xuICAgIGNvbnN0IGNoZWNrU2VsZWN0aW9ucyA9IChzZWxlY3Rpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdGlvbiBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ua2luZCA9PT0gJ0ZpZWxkJyAmJiBzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gJ19fdHlwZScpIHtcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmFyZ3VtZW50cyAmJiBzZWxlY3Rpb24uYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0aW9uLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgIGlmIChjaGVja1NlbGVjdGlvbnMoc2VsZWN0aW9uLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgYXN0LmRlZmluaXRpb25zKSB7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5zZWxlY3Rpb25TZXQpIHtcbiAgICAgICAgaWYgKGNoZWNrU2VsZWN0aW9ucyhkZWZpbml0aW9uLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCB0aHJvd0ludHJvc3BlY3Rpb25FcnJvciA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEdyYXBoUUxFcnJvcignSW50cm9zcGVjdGlvbiBpcyBub3QgYWxsb3dlZCcsIHtcbiAgICBleHRlbnNpb25zOiB7XG4gICAgICBodHRwOiB7XG4gICAgICAgIHN0YXR1czogNDAzLFxuICAgICAgfSxcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgSW50cm9zcGVjdGlvbkNvbnRyb2xQbHVnaW4gPSAocHVibGljSW50cm9zcGVjdGlvbikgPT4gKHtcblxuXG4gIHJlcXVlc3REaWRTdGFydDogKHJlcXVlc3RDb250ZXh0KSA9PiAoe1xuXG4gICAgZGlkUmVzb2x2ZU9wZXJhdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gSWYgcHVibGljIGludHJvc3BlY3Rpb24gaXMgZW5hYmxlZCwgd2UgYWxsb3cgYWxsIGludHJvc3BlY3Rpb24gcXVlcmllc1xuICAgICAgaWYgKHB1YmxpY0ludHJvc3BlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc01hc3Rlck9yTWFpbnRlbmFuY2UgPSByZXF1ZXN0Q29udGV4dC5jb250ZXh0VmFsdWUuYXV0aD8uaXNNYXN0ZXIgfHwgcmVxdWVzdENvbnRleHQuY29udGV4dFZhbHVlLmF1dGg/LmlzTWFpbnRlbmFuY2VcbiAgICAgIGlmIChpc01hc3Rlck9yTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeSA9IHJlcXVlc3RDb250ZXh0LnJlcXVlc3QucXVlcnk7XG5cblxuICAgICAgLy8gRmFzdCBwYXRoOiBzaW1wbGUgc3RyaW5nIGNoZWNrIGZvciBfX3NjaGVtYVxuICAgICAgLy8gVGhpcyBhdm9pZHMgcGFyc2luZyB0aGUgcXVlcnkgaW4gbW9zdCBjYXNlc1xuICAgICAgaWYgKHF1ZXJ5Py5pbmNsdWRlcygnX19zY2hlbWEnKSkge1xuICAgICAgICByZXR1cm4gdGhyb3dJbnRyb3NwZWN0aW9uRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU21hcnQgY2hlY2sgZm9yIF9fdHlwZTogb25seSBwYXJzZSBpZiB0aGUgc3RyaW5nIGlzIHByZXNlbnRcbiAgICAgIC8vIFRoaXMgYXZvaWRzIGZhbHNlIHBvc2l0aXZlcyAoZS5nLiwgXCJfX3R5cGVcIiBpbiBzdHJpbmdzIG9yIGNvbW1lbnRzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgYmVpbmcgZWZmaWNpZW50IGZvciB0aGUgY29tbW9uIGNhc2VcbiAgICAgIGlmIChxdWVyeT8uaW5jbHVkZXMoJ19fdHlwZScpICYmIGhhc1R5cGVJbnRyb3NwZWN0aW9uKHF1ZXJ5KSkge1xuICAgICAgICByZXR1cm4gdGhyb3dJbnRyb3NwZWN0aW9uRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gIH0pXG5cbn0pO1xuXG4vLyBncmFwaHFsLWpzIGVtYmVkcyBcIkRpZCB5b3UgbWVhbiAuLi4/XCIgaGludHMgc291cmNlZCBmcm9tIHRoZSBsaXZlIHNjaGVtYSBpblxuLy8gaXRzIGVycm9yIG1lc3NhZ2VzLiBUaGV5IGFyZSBwcm9kdWNlZCBpbiB0d28gZGlzdGluY3QgcGhhc2VzOlxuLy8gICAtIHZhbGlkYXRpb24gcnVsZXMgKEZpZWxkc09uQ29ycmVjdFR5cGVSdWxlLCBLbm93bkFyZ3VtZW50TmFtZXNSdWxlLFxuLy8gICAgIEtub3duVHlwZU5hbWVzUnVsZSwgLi4uKSwgYW5kXG4vLyAgIC0gdmFyaWFibGUgY29lcmNpb24gKHVua25vd24gZW51bSB2YWx1ZXMsIHVua25vd24gaW5wdXQtb2JqZWN0IGZpZWxkcyksXG4vLyAgICAgd2hpY2ggcnVucyBkdXJpbmcgZXhlY3V0aW9uLCBhZnRlciB2YWxpZGF0aW9uLlxuLy8gQWxsIG9mIHRoZXNlIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGFuZCBkaXNjbG9zZSBzY2hlbWEgaWRlbnRpZmllcnMgKENsb3VkXG4vLyBDb2RlIGZ1bmN0aW9uIG5hbWVzLCBjbGFzcyBhbmQgZmllbGQgbmFtZXMpIHRoYXQgdGhlIGludHJvc3BlY3Rpb24gZ3VhcmQgaXNcbi8vIG1lYW50IHRvIGhpZGUuIFN0cmlwIHRoZSBoaW50IHN1ZmZpeCBmcm9tIGV2ZXJ5IHJldHVybmVkIGVycm9yIOKAlCBpbmNsdWRpbmcgdGhlXG4vLyBjb3B5IGdyYXBocWwtanMgZHVwbGljYXRlcyBpbnRvIGV4dGVuc2lvbnMuc3RhY2t0cmFjZSBpbiBub24tcHJvZHVjdGlvbiDigJQgZm9yXG4vLyBjYWxsZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGludHJvc3BlY3QuXG5jb25zdCBzdHJpcFNjaGVtYVN1Z2dlc3Rpb24gPSBtZXNzYWdlID0+XG4gIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyA/IG1lc3NhZ2UucmVwbGFjZSgvID9EaWQgeW91IG1lYW4oLis/KVxcPyQvLCAnJykgOiBtZXNzYWdlO1xuXG4vLyBncmFwaHFsLWpzIGFsc28gZW1pdHMgYSBiYXNlIGlucHV0LWNvZXJjaW9uIG1lc3NhZ2UgdGhhdCBuYW1lcyBhIHNjaGVtYVxuLy8gaWRlbnRpZmllciBXSVRIT1VUIGEgXCJEaWQgeW91IG1lYW5cIiBjbGF1c2UsIHNvIHRoZSBzdWdnZXN0aW9uIHN0cmlwIGFib3ZlXG4vLyBjYW5ub3QgcmVhY2ggaXQ6IHdoZW4gYSByZXF1aXJlZCBjdXN0b20gaW5wdXQgZmllbGQgaXMgb21pdHRlZCwgY29lcmNlSW5wdXRWYWx1ZVxuLy8gcmV0dXJucyAnRmllbGQgXCI8bmFtZT5cIiBvZiByZXF1aXJlZCB0eXBlIFwiPHR5cGU+XCIgd2FzIG5vdCBwcm92aWRlZC4nLCBkaXNjbG9zaW5nXG4vLyBhIGZpZWxkIG5hbWUgdGhlIGNhbGxlciBuZXZlciBzdXBwbGllZC4gUmVkYWN0IHRoZSBxdW90ZWQgaWRlbnRpZmllcnMgZnJvbSB0aGlzXG4vLyB0ZW1wbGF0ZSB3aGlsZSBwcmVzZXJ2aW5nIHRoZSBlcnJvciBzaGFwZSwgZm9yIGNhbGxlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG9cbi8vIGludHJvc3BlY3QuIFRoZSBzaWJsaW5nIGNvZXJjaW9uIG1lc3NhZ2VzICgnLi4uIGlzIG5vdCBkZWZpbmVkIGJ5IHR5cGUgXCI8dHlwZT5cIi4nLFxuLy8gJ0V4cGVjdGVkIHR5cGUgXCI8dHlwZT5cIiB0byBiZSBhbiBvYmplY3QuJykgYXJlIGludGVudGlvbmFsbHkgbGVmdCBpbnRhY3Q6IHRoZXlcbi8vIG9ubHkgZWNobyBhbiBpbnB1dCB0eXBlIG5hbWUgdGhlIGNhbGxlciBhbHJlYWR5IHJlZmVyZW5jZWQgaW4gdGhlIG9wZXJhdGlvbiwgc29cbi8vIHRoZXkgZGlzY2xvc2Ugbm90aGluZyB0aGUgY2FsbGVyIGRpZCBub3QgYWxyZWFkeSBwcm92aWRlLlxuY29uc3Qgc3RyaXBTY2hlbWFDb2VyY2lvbklkZW50aWZpZXJzID0gbWVzc2FnZSA9PlxuICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZydcbiAgICA/IG1lc3NhZ2UucmVwbGFjZShcbiAgICAgIC9GaWVsZCBcIlteXCJdKlwiIG9mIHJlcXVpcmVkIHR5cGUgXCJbXlwiXSpcIiB3YXMgbm90IHByb3ZpZGVkXFwuL2csXG4gICAgICAnRmllbGQgb2YgcmVxdWlyZWQgdHlwZSB3YXMgbm90IHByb3ZpZGVkLidcbiAgICApXG4gICAgOiBtZXNzYWdlO1xuXG4vLyBncmFwaHFsLWpzIGFsc28gZW1pdHMgYmFzZSBjb2VyY2lvbiAvIHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCBuYW1lIGEgbmVzdGVkIGlucHV0XG4vLyBUWVBFIHdpdGhvdXQgYSBcIkRpZCB5b3UgbWVhblwiIGNsYXVzZSwgc28gbmVpdGhlciBzdHJpcCBhYm92ZSByZWFjaGVzIHRoZW0uIEZvciBhXG4vLyBQb2ludGVyIG9yIFJlbGF0aW9uIGZpZWxkIHRoZSBnZW5lcmF0ZWQgaW5wdXQgdHlwZSBuYW1lIGVtYmVkcyB0aGUgcG9pbnRlcidzIFRBUkdFVFxuLy8gY2xhc3MgKGA8VGFyZ2V0PlBvaW50ZXJJbnB1dGAsIGA8VGFyZ2V0PlJlbGF0aW9uV2hlcmVJbnB1dGAsIGBDcmVhdGU8VGFyZ2V0PkZpZWxkc0lucHV0YClcbi8vIOKAlCBhIGNsYXNzIHRoZSBjYWxsZXIgbmV2ZXIgcmVmZXJlbmNlZCBhbmQgY2Fubm90IGRlcml2ZSBmcm9tIHRoZSBmaWVsZCBuYW1lIHRoZXlcbi8vIHN1cHBsaWVkIOKAlCBzbyB0aGVzZSB0ZW1wbGF0ZXMgZGlzY2xvc2UgYSBzY2hlbWEgY2xhc3MgbmFtZSB0byBhIGNhbGxlciB3aG8gaGFzIG9ubHkgdGhlXG4vLyBwdWJsaWMgYXBwbGljYXRpb24gaWQuIFJlZGFjdCB0aGUgcXVvdGVkIHR5cGUgaWRlbnRpZmllciBmcm9tIHRob3NlIHRlbXBsYXRlcyBVTkxFU1MgdGhlXG4vLyBjYWxsZXIgcmVmZXJlbmNlZCBpdCBpbiB0aGUgb3BlcmF0aW9uIHRleHQ6IGEgdHlwZSBuYW1lIHRoZSBjYWxsZXIgd3JvdGUgaW4gdGhlIG9wZXJhdGlvblxuLy8gKGUuZy4gYCR3aGVyZTogVXNlcldoZXJlSW5wdXRgKSBpcyBub3QgYSBkaXNjbG9zdXJlLCBhbmQgcHJlc2VydmluZyBpdCBrZWVwcyB0aGUgbWVzc2FnZVxuLy8gKCcuLi4gaXMgbm90IGRlZmluZWQgYnkgdHlwZSBcIlVzZXJXaGVyZUlucHV0XCIuJykgdXNlZnVsLiBXaGVuIHRoZSBvcGVyYXRpb24gdGV4dCBpc1xuLy8gdW5hdmFpbGFibGUgdGhlIGlkZW50aWZpZXIgaXMgcmVkYWN0ZWQgKGZhaWwgY2xvc2VkKS5cbmNvbnN0IHN0cmlwU2NoZW1hVHlwZUlkZW50aWZpZXJzID0gKG1lc3NhZ2UsIG9wZXJhdGlvblRleHQpID0+IHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gbWVzc2FnZTsgfVxuICAvLyBBIGdlbmVyYXRlZCB0eXBlIGlkZW50aWZpZXIgY291bnRzIGFzIFwicmVmZXJlbmNlZFwiIChhbmQgdGhlcmVmb3JlIG5vdCBhIGRpc2Nsb3N1cmUpIG9ubHkgaWZcbiAgLy8gdGhlIGNhbGxlciB3cm90ZSBpdCBhcyBhIHdob2xlIHRva2VuIGluIHRoZSBvcGVyYXRpb24gdGV4dC4gVG9rZW5pemUgdGhlIG9wZXJhdGlvbiBvblxuICAvLyBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzIGFuZCBjb21wYXJlIGV4YWN0IHRva2VucyByYXRoZXIgdGhhbiBidWlsZGluZyBhIFJlZ0V4cCBmcm9tIHRoZVxuICAvLyBjYXB0dXJlZCBuYW1lOiB0aGlzIGF2b2lkcyBzdWJzdHJpbmcgZmFsc2UtbWF0Y2hlcyAoZS5nLiBwcmVzZXJ2aW5nIFwiQXV0aG9yUG9pbnRlcklucHV0XCJcbiAgLy8gYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGNvbnRhaW5zIFwiU2VjcmV0QXV0aG9yUG9pbnRlcklucHV0XCIpIGFuZCBhbnkgcmVnZXggaW5qZWN0aW9uL1JlRG9TIGZyb21cbiAgLy8gYW4gdW51c3VhbCBjYXB0dXJlZCBuYW1lLiBHcmFwaFFMIGxpc3Qvbm9uLW51bGwgd3JhcHBlcnMgKFwiW1wiLCBcIl1cIiwgXCIhXCIpIGFyZSBzdHJpcHBlZCBmcm9tIHRoZVxuICAvLyBjYXB0dXJlZCBuYW1lIHNvIGUuZy4gXCJTZWNyZXRBdXRob3JQb2ludGVySW5wdXQhXCIgc3RpbGwgbWF0Y2hlcyBcIiR4OiBTZWNyZXRBdXRob3JQb2ludGVySW5wdXQhXCIuXG4gIC8vIFdoZW4gdGhlIG9wZXJhdGlvbiB0ZXh0IGlzIHVuYXZhaWxhYmxlIHRoZSB0eXBlIGlzIHRyZWF0ZWQgYXMgbm90IHJlZmVyZW5jZWQgKGZhaWwgY2xvc2VkKS5cbiAgY29uc3QgcmVmZXJlbmNlZFRva2VucyA9XG4gICAgdHlwZW9mIG9wZXJhdGlvblRleHQgPT09ICdzdHJpbmcnXG4gICAgICA/IG5ldyBTZXQob3BlcmF0aW9uVGV4dC5zcGxpdCgvW15fQS1aYS16MC05XSsvKS5maWx0ZXIoQm9vbGVhbikpXG4gICAgICA6IG5ldyBTZXQoKTtcbiAgY29uc3QgaXNSZWZlcmVuY2VkID0gdHlwZU5hbWUgPT4gcmVmZXJlbmNlZFRva2Vucy5oYXModHlwZU5hbWUucmVwbGFjZSgvW1tcXF0hXS9nLCAnJykpO1xuICByZXR1cm4gbWVzc2FnZVxuICAgIC8vIElucHV0IGNvZXJjaW9uIC8gVmFsdWVzT2ZDb3JyZWN0VHlwZVJ1bGUgKHZhcmlhYmxlcyBhbmQgaW5saW5lIGxpdGVyYWxzKS5cbiAgICAucmVwbGFjZSgvRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSBcIihbXlwiXSspXCIvZywgKG1hdGNoLCB0eXBlTmFtZSkgPT5cbiAgICAgIGlzUmVmZXJlbmNlZCh0eXBlTmFtZSkgPyBtYXRjaCA6ICdFeHBlY3RlZCB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlJ1xuICAgIClcbiAgICAucmVwbGFjZSgvRXhwZWN0ZWQgdHlwZSBcIihbXlwiXSspXCIgdG8gYmUgYW4gb2JqZWN0XFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBpc1JlZmVyZW5jZWQodHlwZU5hbWUpID8gbWF0Y2ggOiAnRXhwZWN0ZWQgYW4gb2JqZWN0LidcbiAgICApXG4gICAgLnJlcGxhY2UoL0V4cGVjdGVkIG5vbi1udWxsYWJsZSB0eXBlIFwiKFteXCJdKylcIiBub3QgdG8gYmUgbnVsbFxcLi9nLCAobWF0Y2gsIHR5cGVOYW1lKSA9PlxuICAgICAgaXNSZWZlcmVuY2VkKHR5cGVOYW1lKSA/IG1hdGNoIDogJ0V4cGVjdGVkIGEgbm9uLW51bGwgdmFsdWUuJ1xuICAgIClcbiAgICAucmVwbGFjZSgvIGlzIG5vdCBkZWZpbmVkIGJ5IHR5cGUgXCIoW15cIl0rKVwiXFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBpc1JlZmVyZW5jZWQodHlwZU5hbWUpID8gbWF0Y2ggOiAnIGlzIG5vdCBkZWZpbmVkLidcbiAgICApXG4gICAgLy8gVmFyaWFibGVzSW5BbGxvd2VkUG9zaXRpb25SdWxlOiB0aGUgcG9zaXRpb24gdHlwZSBpcyB0aGUgcG9pbnRlci9yZWxhdGlvbiB0YXJnZXRcbiAgICAvLyBpbnB1dCB0eXBlOyB0aGUgY2FsbGVyIG9ubHkgd3JvdGUgdGhlaXIgb3duIHZhcmlhYmxlJ3MgZGVjbGFyZWQgdHlwZS5cbiAgICAucmVwbGFjZSgvIHVzZWQgaW4gcG9zaXRpb24gZXhwZWN0aW5nIHR5cGUgXCIoW15cIl0rKVwiXFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBpc1JlZmVyZW5jZWQodHlwZU5hbWUpID8gbWF0Y2ggOiAnIHVzZWQgaW4gcG9zaXRpb24gZXhwZWN0aW5nIGEgZGlmZmVyZW50IHR5cGUuJ1xuICAgIClcbiAgICAvLyBGaWVsZHNPbkNvcnJlY3RUeXBlUnVsZTogZGVzY2VuZGluZyBpbnRvIGEgUG9pbnRlci9SZWxhdGlvbiBvdXRwdXQgZmllbGQgbmFtZXMgaXRzXG4gICAgLy8gdGFyZ2V0IG91dHB1dCBvYmplY3QgdHlwZS5cbiAgICAucmVwbGFjZSgvQ2Fubm90IHF1ZXJ5IGZpZWxkIChcIlteXCJdKlwiKSBvbiB0eXBlIFwiKFteXCJdKylcIlxcLi9nLCAobWF0Y2gsIGZpZWxkTmFtZSwgdHlwZU5hbWUpID0+XG4gICAgICBpc1JlZmVyZW5jZWQodHlwZU5hbWUpID8gbWF0Y2ggOiBgQ2Fubm90IHF1ZXJ5IGZpZWxkICR7ZmllbGROYW1lfS5gXG4gICAgKVxuICAgIC8vIFNjYWxhckxlYWZzUnVsZTogc2VsZWN0aW5nIGEgUG9pbnRlci9SZWxhdGlvbiBvdXRwdXQgZmllbGQgd2l0aCBubyBzdWItc2VsZWN0aW9uIG5hbWVzXG4gICAgLy8gaXRzIHRhcmdldCBvdXRwdXQgb2JqZWN0IHR5cGUuXG4gICAgLnJlcGxhY2UoXG4gICAgICAvRmllbGQgKFwiW15cIl0qXCIpIG9mIHR5cGUgXCIoW15cIl0rKVwiIG11c3QgaGF2ZSBhIHNlbGVjdGlvbiBvZiBzdWJmaWVsZHNcXC4vZyxcbiAgICAgIChtYXRjaCwgZmllbGROYW1lLCB0eXBlTmFtZSkgPT5cbiAgICAgICAgaXNSZWZlcmVuY2VkKHR5cGVOYW1lKSA/IG1hdGNoIDogYEZpZWxkICR7ZmllbGROYW1lfSBtdXN0IGhhdmUgYSBzZWxlY3Rpb24gb2Ygc3ViZmllbGRzLmBcbiAgICApXG4gICAgLy8gUG9zc2libGVGcmFnbWVudFNwcmVhZHNSdWxlOiBhbiBpbmxpbmUvbmFtZWQgZnJhZ21lbnQgb24gYW4gaW5jb21wYXRpYmxlIHR5cGUgaW5zaWRlIGFcbiAgICAvLyBQb2ludGVyL1JlbGF0aW9uIG91dHB1dCBmaWVsZCBuYW1lcyB0aGUgdGFyZ2V0IG91dHB1dCBvYmplY3QgdHlwZSAodGhlIHBhcmVudCB0eXBlKS5cbiAgICAvLyBSZWRhY3QgZWFjaCB0eXBlIHRva2VuIHRoZSBjYWxsZXIgZGlkIG5vdCByZWZlcmVuY2U7IHdoZW4gYm90aCBhcmUgcmVmZXJlbmNlZCB0aGVcbiAgICAvLyByZWNvbnN0cnVjdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsIG1lc3NhZ2UuXG4gICAgLnJlcGxhY2UoXG4gICAgICAvb2JqZWN0cyBvZiB0eXBlIFwiKFteXCJdKylcIiBjYW4gbmV2ZXIgYmUgb2YgdHlwZSBcIihbXlwiXSspXCJcXC4vZyxcbiAgICAgIChtYXRjaCwgcGFyZW50VHlwZSwgZnJhZ1R5cGUpID0+IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gaXNSZWZlcmVuY2VkKHBhcmVudFR5cGUpID8gYHR5cGUgXCIke3BhcmVudFR5cGV9XCJgIDogJ3RoZSBwYXJlbnQgdHlwZSc7XG4gICAgICAgIGNvbnN0IGZyYWcgPSBpc1JlZmVyZW5jZWQoZnJhZ1R5cGUpID8gYHR5cGUgXCIke2ZyYWdUeXBlfVwiYCA6ICd0aGUgZ2l2ZW4gdHlwZSc7XG4gICAgICAgIHJldHVybiBgb2JqZWN0cyBvZiAke3BhcmVudH0gY2FuIG5ldmVyIGJlIG9mICR7ZnJhZ30uYDtcbiAgICAgIH1cbiAgICApO1xufTtcblxuY29uc3Qgc3RyaXBTY2hlbWFJZGVudGlmaWVycyA9IChtZXNzYWdlLCBvcGVyYXRpb25UZXh0KSA9PlxuICBzdHJpcFNjaGVtYVR5cGVJZGVudGlmaWVycyhcbiAgICBzdHJpcFNjaGVtYUNvZXJjaW9uSWRlbnRpZmllcnMoc3RyaXBTY2hlbWFTdWdnZXN0aW9uKG1lc3NhZ2UpKSxcbiAgICBvcGVyYXRpb25UZXh0XG4gICk7XG5cbmNvbnN0IFNjaGVtYVN1Z2dlc3Rpb25zQ29udHJvbFBsdWdpbiA9IChwdWJsaWNJbnRyb3NwZWN0aW9uKSA9PiAoe1xuICByZXF1ZXN0RGlkU3RhcnQ6IGFzeW5jIChyZXF1ZXN0Q29udGV4dCkgPT4gKHtcbiAgICB3aWxsU2VuZFJlc3BvbnNlOiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocHVibGljSW50cm9zcGVjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpc01hc3Rlck9yTWFpbnRlbmFuY2UgPVxuICAgICAgICByZXF1ZXN0Q29udGV4dC5jb250ZXh0VmFsdWUuYXV0aD8uaXNNYXN0ZXIgfHxcbiAgICAgICAgcmVxdWVzdENvbnRleHQuY29udGV4dFZhbHVlLmF1dGg/LmlzTWFpbnRlbmFuY2U7XG4gICAgICBpZiAoaXNNYXN0ZXJPck1haW50ZW5hbmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0Q29udGV4dC5yZXNwb25zZT8uYm9keTtcbiAgICAgIGNvbnN0IGVycm9ycyA9XG4gICAgICAgIGJvZHk/LmtpbmQgPT09ICdzaW5nbGUnXG4gICAgICAgICAgPyBib2R5LnNpbmdsZVJlc3VsdC5lcnJvcnNcbiAgICAgICAgICA6IGJvZHk/LmtpbmQgPT09ICdpbmNyZW1lbnRhbCdcbiAgICAgICAgICAgID8gYm9keS5pbml0aWFsUmVzdWx0LmVycm9yc1xuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBvcGVyYXRpb25UZXh0ID0gcmVxdWVzdENvbnRleHQucmVxdWVzdD8ucXVlcnk7XG4gICAgICBlcnJvcnM/LmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gc3RyaXBTY2hlbWFJZGVudGlmaWVycyhlcnJvci5tZXNzYWdlLCBvcGVyYXRpb25UZXh0KTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXJyb3IuZXh0ZW5zaW9ucz8uc3RhY2t0cmFjZSkpIHtcbiAgICAgICAgICBlcnJvci5leHRlbnNpb25zLnN0YWNrdHJhY2UgPSBlcnJvci5leHRlbnNpb25zLnN0YWNrdHJhY2UubWFwKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHN0cmlwU2NoZW1hSWRlbnRpZmllcnMobWVzc2FnZSwgb3BlcmF0aW9uVGV4dClcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICB9KSxcbn0pO1xuXG5jbGFzcyBQYXJzZUdyYXBoUUxTZXJ2ZXIge1xuICBwYXJzZUdyYXBoUUxDb250cm9sbGVyOiBQYXJzZUdyYXBoUUxDb250cm9sbGVyO1xuXG4gIGNvbnN0cnVjdG9yKHBhcnNlU2VydmVyLCBjb25maWcpIHtcbiAgICB0aGlzLnBhcnNlU2VydmVyID0gcGFyc2VTZXJ2ZXIgfHwgcmVxdWlyZWRQYXJhbWV0ZXIoJ1lvdSBtdXN0IHByb3ZpZGUgYSBwYXJzZVNlcnZlciBpbnN0YW5jZSEnKTtcbiAgICBpZiAoIWNvbmZpZyB8fCAhY29uZmlnLmdyYXBoUUxQYXRoKSB7XG4gICAgICByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZy5ncmFwaFFMUGF0aCEnKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5wYXJzZUdyYXBoUUxDb250cm9sbGVyID0gdGhpcy5wYXJzZVNlcnZlci5jb25maWcucGFyc2VHcmFwaFFMQ29udHJvbGxlcjtcbiAgICB0aGlzLmxvZyA9XG4gICAgICAodGhpcy5wYXJzZVNlcnZlci5jb25maWcgJiYgdGhpcy5wYXJzZVNlcnZlci5jb25maWcubG9nZ2VyQ29udHJvbGxlcikgfHwgZGVmYXVsdExvZ2dlcjtcbiAgICB0aGlzLnBhcnNlR3JhcGhRTFNjaGVtYSA9IG5ldyBQYXJzZUdyYXBoUUxTY2hlbWEoe1xuICAgICAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcjogdGhpcy5wYXJzZUdyYXBoUUxDb250cm9sbGVyLFxuICAgICAgZGF0YWJhc2VDb250cm9sbGVyOiB0aGlzLnBhcnNlU2VydmVyLmNvbmZpZy5kYXRhYmFzZUNvbnRyb2xsZXIsXG4gICAgICBsb2c6IHRoaXMubG9nLFxuICAgICAgZ3JhcGhRTEN1c3RvbVR5cGVEZWZzOiB0aGlzLmNvbmZpZy5ncmFwaFFMQ3VzdG9tVHlwZURlZnMsXG4gICAgICBhcHBJZDogdGhpcy5wYXJzZVNlcnZlci5jb25maWcuYXBwSWQsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBfZ2V0R3JhcGhRTE9wdGlvbnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjaGVtYTogYXdhaXQgdGhpcy5wYXJzZUdyYXBoUUxTY2hlbWEubG9hZCgpLFxuICAgICAgICBjb250ZXh0OiBhc3luYyAoeyByZXEgfSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmZvOiByZXEuaW5mbyxcbiAgICAgICAgICAgIGNvbmZpZzogcmVxLmNvbmZpZyxcbiAgICAgICAgICAgIGF1dGg6IHJlcS5hdXRoLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGUuc3RhY2sgfHwgKHR5cGVvZiBlLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nICYmIGUudG9TdHJpbmcoKSkgfHwgZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9nZXRTZXJ2ZXIoKSB7XG4gICAgY29uc3Qgc2NoZW1hUmVmID0gdGhpcy5wYXJzZUdyYXBoUUxTY2hlbWEuZ3JhcGhRTFNjaGVtYTtcbiAgICBjb25zdCBuZXdTY2hlbWFSZWYgPSBhd2FpdCB0aGlzLnBhcnNlR3JhcGhRTFNjaGVtYS5sb2FkKCk7XG4gICAgaWYgKHNjaGVtYVJlZiA9PT0gbmV3U2NoZW1hUmVmICYmIHRoaXMuX3NlcnZlcikge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlcjtcbiAgICB9XG4gICAgLy8gSXQgbWVhbnMgYSBwYXJhbGxlbCBfZ2V0U2VydmVyIGNhbGwgaXMgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgIGlmICh0aGlzLl9zY2hlbWFSZWZNdXRleCA9PT0gbmV3U2NoZW1hUmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VydmVyO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhlIHNjaGVtYSByZWYgbXV0ZXggdG8gYXZvaWQgcGFyYWxsZWwgX2dldFNlcnZlciBjYWxsc1xuICAgIHRoaXMuX3NjaGVtYVJlZk11dGV4ID0gbmV3U2NoZW1hUmVmO1xuICAgIGNvbnN0IGNyZWF0ZVNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgc2NoZW1hLCBjb250ZXh0IH0gPSBhd2FpdCB0aGlzLl9nZXRHcmFwaFFMT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBhcG9sbG8gPSBuZXcgQXBvbGxvU2VydmVyKHtcbiAgICAgICAgICBjc3JmUHJldmVudGlvbjoge1xuICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LmFwb2xsb2dyYXBocWwuY29tL2RvY3Mvcm91dGVyL2NvbmZpZ3VyYXRpb24vY3NyZi9cbiAgICAgICAgICAgIC8vIG5lZWRlZCBzaW5jZSB3ZSB1c2UgZ3JhcGhxbCB1cGxvYWRcbiAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiBbJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIFdlIG5lZWQgYWx3YXlzIHRydWUgaW50cm9zcGVjdGlvbiBiZWNhdXNlIGFwb2xsbyBzZXJ2ZXIgaGF2ZSBjaGFuZ2luZyBiZWhhdmlvciBiYXNlZCBvbiB0aGUgTk9ERV9FTlYgdmFyaWFibGVcbiAgICAgICAgICAvLyB3ZSBkZWxlZ2F0ZSB0aGUgaW50cm9zcGVjdGlvbiBjb250cm9sIHRvIHRoZSBJbnRyb3NwZWN0aW9uQ29udHJvbFBsdWdpblxuICAgICAgICAgIGludHJvc3BlY3Rpb246IHRydWUsXG4gICAgICAgICAgcGx1Z2luczogW0Fwb2xsb1NlcnZlclBsdWdpbkNhY2hlQ29udHJvbERpc2FibGVkKCksIEludHJvc3BlY3Rpb25Db250cm9sUGx1Z2luKHRoaXMuY29uZmlnLmdyYXBoUUxQdWJsaWNJbnRyb3NwZWN0aW9uKSwgU2NoZW1hU3VnZ2VzdGlvbnNDb250cm9sUGx1Z2luKHRoaXMuY29uZmlnLmdyYXBoUUxQdWJsaWNJbnRyb3NwZWN0aW9uKSwgY3JlYXRlQ29tcGxleGl0eVZhbGlkYXRpb25QbHVnaW4oKCkgPT4gdGhpcy5wYXJzZVNlcnZlci5jb25maWcucmVxdWVzdENvbXBsZXhpdHkpXSxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBhcG9sbG8uc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3NNaWRkbGV3YXJlKGFwb2xsbywge1xuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBSZXNldCBhbGwgbXV0ZXhlcyBhbmQgZm9yd2FyZCB0aGUgZXJyb3JcbiAgICAgICAgdGhpcy5fc2VydmVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2NoZW1hUmVmTXV0ZXggPSBudWxsO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEbyBub3QgYXdhaXQgc28gcGFyYWxsZWwgcmVxdWVzdCB3aWxsIHdhaXQgdGhlIHNhbWUgcHJvbWlzZSByZWZcbiAgICB0aGlzLl9zZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcbiAgICByZXR1cm4gdGhpcy5fc2VydmVyO1xuICB9XG5cbiAgX3RyYW5zZm9ybU1heFVwbG9hZFNpemVUb0J5dGVzKG1heFVwbG9hZFNpemUpIHtcbiAgICBjb25zdCB1bml0TWFwID0ge1xuICAgICAga2I6IDEsXG4gICAgICBtYjogMixcbiAgICAgIGdiOiAzLFxuICAgIH07XG5cbiAgICByZXR1cm4gKFxuICAgICAgTnVtYmVyKG1heFVwbG9hZFNpemUuc2xpY2UoMCwgLTIpKSAqXG4gICAgICBNYXRoLnBvdygxMDI0LCB1bml0TWFwW21heFVwbG9hZFNpemUuc2xpY2UoLTIpLnRvTG93ZXJDYXNlKCldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBBbGxvdyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBlYWNoIHJlcXVlc3Qgd2l0aCBpbnZlcnNpb24gb2YgY29udHJvbC9kZXBlbmRlbmN5IGluamVjdGlvblxuICAgKi9cbiAgYXBwbHlSZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUoYXBpLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucmVxdWVzdENvbnRleHRNaWRkbGV3YXJlKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMucmVxdWVzdENvbnRleHRNaWRkbGV3YXJlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncmVxdWVzdENvbnRleHRNaWRkbGV3YXJlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgfVxuICAgICAgYXBpLnVzZSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCwgb3B0aW9ucy5yZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5R3JhcGhRTChhcHApIHtcbiAgICBpZiAoIWFwcCB8fCAhYXBwLnVzZSkge1xuICAgICAgcmVxdWlyZWRQYXJhbWV0ZXIoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gRXhwcmVzcy5qcyBhcHAgaW5zdGFuY2UhJyk7XG4gICAgfVxuICAgIGFwcC51c2UodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgsIGFsbG93Q3Jvc3NEb21haW4odGhpcy5wYXJzZVNlcnZlci5jb25maWcuYXBwSWQpKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBoYW5kbGVQYXJzZUhlYWRlcnMpO1xuICAgIGFwcC51c2UodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgsIGhhbmRsZVBhcnNlU2Vzc2lvbik7XG4gICAgdGhpcy5hcHBseVJlcXVlc3RDb250ZXh0TWlkZGxld2FyZShhcHAsIHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBoYW5kbGVQYXJzZUVycm9ycyk7XG4gICAgYXBwLnVzZShcbiAgICAgIHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLFxuICAgICAgZ3JhcGhxbFVwbG9hZEV4cHJlc3Moe1xuICAgICAgICBtYXhGaWxlU2l6ZTogdGhpcy5fdHJhbnNmb3JtTWF4VXBsb2FkU2l6ZVRvQnl0ZXMoXG4gICAgICAgICAgdGhpcy5wYXJzZVNlcnZlci5jb25maWcubWF4VXBsb2FkU2l6ZSB8fCAnMjBtYidcbiAgICAgICAgKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCB0aGlzLl9nZXRTZXJ2ZXIoKTtcbiAgICAgIHJldHVybiBzZXJ2ZXIocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwbHlQbGF5Z3JvdW5kKGFwcCkge1xuICAgIGlmICghYXBwIHx8ICFhcHAuZ2V0KSB7XG4gICAgICByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhbiBFeHByZXNzLmpzIGFwcCBpbnN0YW5jZSEnKTtcbiAgICB9XG5cbiAgICBhcHAuZ2V0KFxuICAgICAgdGhpcy5jb25maWcucGxheWdyb3VuZFBhdGggfHxcbiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGEgY29uZmlnLnBsYXlncm91bmRQYXRoIHRvIGFwcGx5UGxheWdyb3VuZCEnKSxcbiAgICAgIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICByZXMud3JpdGUoXG4gICAgICAgICAgYDxkaXYgaWQ9XCJzYW5kYm94XCIgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MFwiPjwvZGl2PlxuICAgICAgICAgIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly9lbWJlZGRhYmxlLXNhbmRib3guY2RuLmFwb2xsb2dyYXBocWwuY29tL19sYXRlc3QvZW1iZWRkYWJsZS1zYW5kYm94LnVtZC5wcm9kdWN0aW9uLm1pbi5qc1wiPjwvc2NyaXB0PlxuICAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgIG5ldyB3aW5kb3cuRW1iZWRkZWRTYW5kYm94KHtcbiAgICAgICAgICAgICB0YXJnZXQ6IFwiI3NhbmRib3hcIixcbiAgICAgICAgICAgICBlbmRwb2ludElzRWRpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgIGluaXRpYWxFbmRwb2ludDogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCl9LFxuICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3Q6IChlbmRwb2ludFVybCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZmV0Y2goZW5kcG9pbnRVcmwsIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAnWC1QYXJzZS1BcHBsaWNhdGlvbi1JZCc6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZVNlcnZlci5jb25maWcuYXBwSWQpfSxcbiAgICAgICAgICAgICAgICAgICAgJ1gtUGFyc2UtTWFzdGVyLUtleSc6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXJzZVNlcnZlci5jb25maWcubWFzdGVyS2V5KX0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgIH0pO1xuICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb25zOiBodHRwczovL3d3dy5hcG9sbG9ncmFwaHFsLmNvbS9kb2NzL3N0dWRpby9leHBsb3Jlci9zYW5kYm94I2VtYmVkZGluZy1zYW5kYm94XG4gICAgICAgICAgPC9zY3JpcHQ+YFxuICAgICAgICApO1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHNldEdyYXBoUUxDb25maWcoZ3JhcGhRTENvbmZpZzogUGFyc2VHcmFwaFFMQ29uZmlnKTogUHJvbWlzZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VHcmFwaFFMQ29udHJvbGxlci51cGRhdGVHcmFwaFFMQ29uZmlnKGdyYXBoUUxDb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhcnNlR3JhcGhRTFNlcnZlciB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxxQkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksU0FBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sWUFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sa0JBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFRLE9BQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLG1CQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSx1QkFBQSxHQUFBQyx1QkFBQSxDQUFBWCxPQUFBO0FBQ0EsSUFBQVksZ0JBQUEsR0FBQVosT0FBQTtBQUE2RSxTQUFBVyx3QkFBQUUsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUosdUJBQUEsWUFBQUEsQ0FBQUUsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FB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
390
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbFVwbG9hZEV4cHJlc3MiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9zZXJ2ZXIiLCJfZXhwcmVzcyIsIl9kaXNhYmxlZCIsIl9leHByZXNzMiIsIl9ncmFwaHFsIiwiX21pZGRsZXdhcmVzIiwiX3JlcXVpcmVkUGFyYW1ldGVyIiwiX2xvZ2dlciIsIl9QYXJzZUdyYXBoUUxTY2hlbWEiLCJfZGVmYXVsdEdyYXBoUUxUeXBlcyIsIl9QYXJzZUdyYXBoUUxDb250cm9sbGVyIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfcXVlcnlDb21wbGV4aXR5IiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiZGVmYXVsdCIsImhhcyIsImdldCIsInNldCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaGFzVHlwZUludHJvc3BlY3Rpb24iLCJxdWVyeSIsImFzdCIsInBhcnNlIiwiY2hlY2tTZWxlY3Rpb25zIiwic2VsZWN0aW9ucyIsInNlbGVjdGlvbiIsImtpbmQiLCJuYW1lIiwidmFsdWUiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzZWxlY3Rpb25TZXQiLCJkZWZpbml0aW9uIiwiZGVmaW5pdGlvbnMiLCJ0aHJvd0ludHJvc3BlY3Rpb25FcnJvciIsIkdyYXBoUUxFcnJvciIsImV4dGVuc2lvbnMiLCJodHRwIiwic3RhdHVzIiwiSW50cm9zcGVjdGlvbkNvbnRyb2xQbHVnaW4iLCJwdWJsaWNJbnRyb3NwZWN0aW9uIiwicmVxdWVzdERpZFN0YXJ0IiwicmVxdWVzdENvbnRleHQiLCJkaWRSZXNvbHZlT3BlcmF0aW9uIiwiaXNNYXN0ZXJPck1haW50ZW5hbmNlIiwiY29udGV4dFZhbHVlIiwiYXV0aCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsInNvdXJjZSIsInJlcXVlc3QiLCJpbmNsdWRlcyIsInN0cmlwU2NoZW1hU3VnZ2VzdGlvbiIsIm1lc3NhZ2UiLCJyZXBsYWNlIiwic3RyaXBTY2hlbWFDb2VyY2lvbklkZW50aWZpZXJzIiwiTk9OX0RJU0NMT1NJTkdfVFlQRV9OQU1FUyIsIlNldCIsIlJFU0VSVkVEX0dSQVBIUUxfVFlQRV9OQU1FUyIsIlJFQURfUFJFRkVSRU5DRSIsInN0cmlwU2NoZW1hVHlwZUlkZW50aWZpZXJzIiwib3BlcmF0aW9uVGV4dCIsInJlZmVyZW5jZWRUb2tlbnMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJzaG91bGRLZWVwVHlwZU5hbWUiLCJ0eXBlTmFtZSIsImJhcmVUeXBlTmFtZSIsIm1hdGNoIiwiZmllbGROYW1lIiwicGFyZW50VHlwZSIsImZyYWdUeXBlIiwicGFyZW50IiwiZnJhZyIsImFyZ05hbWUiLCJzdHJpcFNjaGVtYUlkZW50aWZpZXJzIiwiU2NoZW1hU3VnZ2VzdGlvbnNDb250cm9sUGx1Z2luIiwid2lsbFNlbmRSZXNwb25zZSIsImJvZHkiLCJyZXNwb25zZSIsImVycm9ycyIsInNpbmdsZVJlc3VsdCIsImluaXRpYWxSZXN1bHQiLCJ1bmRlZmluZWQiLCJmb3JFYWNoIiwiZXJyb3IiLCJBcnJheSIsImlzQXJyYXkiLCJzdGFja3RyYWNlIiwibWFwIiwiUGFyc2VHcmFwaFFMU2VydmVyIiwiY29uc3RydWN0b3IiLCJwYXJzZVNlcnZlciIsImNvbmZpZyIsInJlcXVpcmVkUGFyYW1ldGVyIiwiZ3JhcGhRTFBhdGgiLCJwYXJzZUdyYXBoUUxDb250cm9sbGVyIiwibG9nIiwibG9nZ2VyQ29udHJvbGxlciIsImRlZmF1bHRMb2dnZXIiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJQYXJzZUdyYXBoUUxTY2hlbWEiLCJkYXRhYmFzZUNvbnRyb2xsZXIiLCJncmFwaFFMQ3VzdG9tVHlwZURlZnMiLCJhcHBJZCIsIl9nZXRHcmFwaFFMT3B0aW9ucyIsInNjaGVtYSIsImxvYWQiLCJjb250ZXh0IiwicmVxIiwiaW5mbyIsInN0YWNrIiwidG9TdHJpbmciLCJfZ2V0U2VydmVyIiwic2NoZW1hUmVmIiwiZ3JhcGhRTFNjaGVtYSIsIm5ld1NjaGVtYVJlZiIsIl9zY2hlbWFSZWZNdXRleCIsImNyZWF0ZVNlcnZlciIsImFwb2xsbyIsIkFwb2xsb1NlcnZlciIsImNzcmZQcmV2ZW50aW9uIiwicmVxdWVzdEhlYWRlcnMiLCJpbnRyb3NwZWN0aW9uIiwicGx1Z2lucyIsIkFwb2xsb1NlcnZlclBsdWdpbkNhY2hlQ29udHJvbERpc2FibGVkIiwiZ3JhcGhRTFB1YmxpY0ludHJvc3BlY3Rpb24iLCJjcmVhdGVDb21wbGV4aXR5VmFsaWRhdGlvblBsdWdpbiIsInJlcXVlc3RDb21wbGV4aXR5Iiwic3RhcnQiLCJleHByZXNzTWlkZGxld2FyZSIsIl90cmFuc2Zvcm1NYXhVcGxvYWRTaXplVG9CeXRlcyIsIm1heFVwbG9hZFNpemUiLCJ1bml0TWFwIiwia2IiLCJtYiIsImdiIiwiTnVtYmVyIiwic2xpY2UiLCJNYXRoIiwicG93IiwidG9Mb3dlckNhc2UiLCJhcHBseVJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSIsImFwaSIsIm9wdGlvbnMiLCJyZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUiLCJFcnJvciIsInVzZSIsImFwcGx5R3JhcGhRTCIsImFwcCIsImFsbG93Q3Jvc3NEb21haW4iLCJoYW5kbGVQYXJzZUhlYWRlcnMiLCJoYW5kbGVQYXJzZVNlc3Npb24iLCJoYW5kbGVQYXJzZUVycm9ycyIsImdyYXBocWxVcGxvYWRFeHByZXNzIiwibWF4RmlsZVNpemUiLCJleHByZXNzIiwianNvbiIsInJlcyIsIm5leHQiLCJzZXJ2ZXIiLCJhcHBseVBsYXlncm91bmQiLCJwbGF5Z3JvdW5kUGF0aCIsIl9yZXEiLCJzZXRIZWFkZXIiLCJ3cml0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtYXN0ZXJLZXkiLCJlbmQiLCJzZXRHcmFwaFFMQ29uZmlnIiwiZ3JhcGhRTENvbmZpZyIsInVwZGF0ZUdyYXBoUUxDb25maWciLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0dyYXBoUUwvUGFyc2VHcmFwaFFMU2VydmVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBncmFwaHFsVXBsb2FkRXhwcmVzcyBmcm9tICdncmFwaHFsLXVwbG9hZC9ncmFwaHFsVXBsb2FkRXhwcmVzcy5qcyc7XG5pbXBvcnQgeyBBcG9sbG9TZXJ2ZXIgfSBmcm9tICdAYXBvbGxvL3NlcnZlcic7XG5pbXBvcnQgeyBleHByZXNzTWlkZGxld2FyZSB9IGZyb20gJ0Bhcy1pbnRlZ3JhdGlvbnMvZXhwcmVzczUnO1xuaW1wb3J0IHsgQXBvbGxvU2VydmVyUGx1Z2luQ2FjaGVDb250cm9sRGlzYWJsZWQgfSBmcm9tICdAYXBvbGxvL3NlcnZlci9wbHVnaW4vZGlzYWJsZWQnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBHcmFwaFFMRXJyb3IsIHBhcnNlIH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQgeyBhbGxvd0Nyb3NzRG9tYWluLCBoYW5kbGVQYXJzZUVycm9ycywgaGFuZGxlUGFyc2VIZWFkZXJzLCBoYW5kbGVQYXJzZVNlc3Npb24gfSBmcm9tICcuLi9taWRkbGV3YXJlcyc7XG5pbXBvcnQgcmVxdWlyZWRQYXJhbWV0ZXIgZnJvbSAnLi4vcmVxdWlyZWRQYXJhbWV0ZXInO1xuaW1wb3J0IGRlZmF1bHRMb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IFBhcnNlR3JhcGhRTFNjaGVtYSwgUkVTRVJWRURfR1JBUEhRTF9UWVBFX05BTUVTIH0gZnJvbSAnLi9QYXJzZUdyYXBoUUxTY2hlbWEnO1xuaW1wb3J0IHsgUkVBRF9QUkVGRVJFTkNFIH0gZnJvbSAnLi9sb2FkZXJzL2RlZmF1bHRHcmFwaFFMVHlwZXMnO1xuaW1wb3J0IFBhcnNlR3JhcGhRTENvbnRyb2xsZXIsIHsgUGFyc2VHcmFwaFFMQ29uZmlnIH0gZnJvbSAnLi4vQ29udHJvbGxlcnMvUGFyc2VHcmFwaFFMQ29udHJvbGxlcic7XG5pbXBvcnQgeyBjcmVhdGVDb21wbGV4aXR5VmFsaWRhdGlvblBsdWdpbiB9IGZyb20gJy4vaGVscGVycy9xdWVyeUNvbXBsZXhpdHknO1xuXG5cbmNvbnN0IGhhc1R5cGVJbnRyb3NwZWN0aW9uID0gKHF1ZXJ5KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXN0ID0gcGFyc2UocXVlcnkpO1xuICAgIGNvbnN0IGNoZWNrU2VsZWN0aW9ucyA9IChzZWxlY3Rpb25zKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdGlvbiBvZiBzZWxlY3Rpb25zKSB7XG4gICAgICAgIGlmIChzZWxlY3Rpb24ua2luZCA9PT0gJ0ZpZWxkJyAmJiBzZWxlY3Rpb24ubmFtZS52YWx1ZSA9PT0gJ19fdHlwZScpIHtcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmFyZ3VtZW50cyAmJiBzZWxlY3Rpb24uYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0aW9uLnNlbGVjdGlvblNldCkge1xuICAgICAgICAgIGlmIChjaGVja1NlbGVjdGlvbnMoc2VsZWN0aW9uLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgYXN0LmRlZmluaXRpb25zKSB7XG4gICAgICBpZiAoZGVmaW5pdGlvbi5zZWxlY3Rpb25TZXQpIHtcbiAgICAgICAgaWYgKGNoZWNrU2VsZWN0aW9ucyhkZWZpbml0aW9uLnNlbGVjdGlvblNldC5zZWxlY3Rpb25zKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5jb25zdCB0aHJvd0ludHJvc3BlY3Rpb25FcnJvciA9ICgpID0+IHtcbiAgdGhyb3cgbmV3IEdyYXBoUUxFcnJvcignSW50cm9zcGVjdGlvbiBpcyBub3QgYWxsb3dlZCcsIHtcbiAgICBleHRlbnNpb25zOiB7XG4gICAgICBodHRwOiB7XG4gICAgICAgIHN0YXR1czogNDAzLFxuICAgICAgfSxcbiAgICB9XG4gIH0pO1xufTtcblxuY29uc3QgSW50cm9zcGVjdGlvbkNvbnRyb2xQbHVnaW4gPSAocHVibGljSW50cm9zcGVjdGlvbikgPT4gKHtcblxuXG4gIHJlcXVlc3REaWRTdGFydDogKHJlcXVlc3RDb250ZXh0KSA9PiAoe1xuXG4gICAgZGlkUmVzb2x2ZU9wZXJhdGlvbjogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gSWYgcHVibGljIGludHJvc3BlY3Rpb24gaXMgZW5hYmxlZCwgd2UgYWxsb3cgYWxsIGludHJvc3BlY3Rpb24gcXVlcmllc1xuICAgICAgaWYgKHB1YmxpY0ludHJvc3BlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc01hc3Rlck9yTWFpbnRlbmFuY2UgPSByZXF1ZXN0Q29udGV4dC5jb250ZXh0VmFsdWUuYXV0aD8uaXNNYXN0ZXIgfHwgcmVxdWVzdENvbnRleHQuY29udGV4dFZhbHVlLmF1dGg/LmlzTWFpbnRlbmFuY2VcbiAgICAgIGlmIChpc01hc3Rlck9yTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBBcG9sbG8gcmVzb2x2ZXMgdGhlIG9wZXJhdGlvbiB0ZXh0IGludG8gYHJlcXVlc3RDb250ZXh0LnNvdXJjZWAgYmVmb3JlIHRoaXMgaG9va1xuICAgICAgLy8gcnVucyBhbmQgZ3VhcmFudGVlcyBpdCBpcyBzZXQgaGVyZS4gSXQgaXMgTk9UIHRoZSBzYW1lIGFzIGByZXF1ZXN0LnF1ZXJ5YDogb24gYW5cbiAgICAgIC8vIGF1dG9tYXRpYyBwZXJzaXN0ZWQgcXVlcnkgY2FjaGUgaGl0IHRoZSB0ZXh0IGNvbWVzIGZyb20gdGhlIHBlcnNpc3RlZC1xdWVyeSBjYWNoZVxuICAgICAgLy8gYW5kIGByZXF1ZXN0LnF1ZXJ5YCBpcyBuZXZlciBwb3B1bGF0ZWQsIHNvIHJlYWRpbmcgYHJlcXVlc3QucXVlcnlgIHdvdWxkIGxlYXZlXG4gICAgICAvLyBub3RoaW5nIHRvIGluc3BlY3QgYW5kIHNpbGVudGx5IHNraXAgYm90aCBndWFyZHMgYmVsb3cuIEFwb2xsbyBlbmFibGVzIGF1dG9tYXRpY1xuICAgICAgLy8gcGVyc2lzdGVkIHF1ZXJpZXMgYnkgZGVmYXVsdCwgc28gdGhhdCBwYXRoIGlzIHJlYWNoYWJsZSBvbiBldmVyeSBkZXBsb3ltZW50LiBGYWxsXG4gICAgICAvLyBiYWNrIHRvIGByZXF1ZXN0LnF1ZXJ5YCBvbmx5IGZvciByb2J1c3RuZXNzLCBhbmQgZmFpbCBjbG9zZWQgd2hlbiBuZWl0aGVyIGlzIGFcbiAgICAgIC8vIHN0cmluZyBzbyB0aGF0IGFuIG9wZXJhdGlvbiB3aGljaCBjYW5ub3QgYmUgaW5zcGVjdGVkIGlzIG5ldmVyIGFsbG93ZWQgdGhyb3VnaC5cbiAgICAgIGNvbnN0IHF1ZXJ5ID0gcmVxdWVzdENvbnRleHQuc291cmNlID8/IHJlcXVlc3RDb250ZXh0LnJlcXVlc3QucXVlcnk7XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogc2ltcGxlIHN0cmluZyBjaGVjayBmb3IgX19zY2hlbWFcbiAgICAgIC8vIFRoaXMgYXZvaWRzIHBhcnNpbmcgdGhlIHF1ZXJ5IGluIG1vc3QgY2FzZXNcbiAgICAgIC8vIEFuIG9wZXJhdGlvbiB0ZXh0IHRoYXQgaXMgbm90IGEgc3RyaW5nIGNhbm5vdCBiZSBpbnNwZWN0ZWQgYXQgYWxsLCBzbyBpdCBpcyBkZW5pZWRcbiAgICAgIC8vIGZvciB0aGUgc2FtZSByZWFzb246IHRoaXMgZ3VhcmQgbXVzdCBuZXZlciBsZXQgYW4gb3BlcmF0aW9uIHRocm91Z2ggdW5pbnNwZWN0ZWQuXG4gICAgICBpZiAodHlwZW9mIHF1ZXJ5ICE9PSAnc3RyaW5nJyB8fCBxdWVyeS5pbmNsdWRlcygnX19zY2hlbWEnKSkge1xuICAgICAgICByZXR1cm4gdGhyb3dJbnRyb3NwZWN0aW9uRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU21hcnQgY2hlY2sgZm9yIF9fdHlwZTogb25seSBwYXJzZSBpZiB0aGUgc3RyaW5nIGlzIHByZXNlbnRcbiAgICAgIC8vIFRoaXMgYXZvaWRzIGZhbHNlIHBvc2l0aXZlcyAoZS5nLiwgXCJfX3R5cGVcIiBpbiBzdHJpbmdzIG9yIGNvbW1lbnRzKVxuICAgICAgLy8gd2hpbGUgc3RpbGwgYmVpbmcgZWZmaWNpZW50IGZvciB0aGUgY29tbW9uIGNhc2VcbiAgICAgIGlmIChxdWVyeS5pbmNsdWRlcygnX190eXBlJykgJiYgaGFzVHlwZUludHJvc3BlY3Rpb24ocXVlcnkpKSB7XG4gICAgICAgIHJldHVybiB0aHJvd0ludHJvc3BlY3Rpb25FcnJvcigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgfSlcblxufSk7XG5cbi8vIGdyYXBocWwtanMgZW1iZWRzIFwiRGlkIHlvdSBtZWFuIC4uLj9cIiBoaW50cyBzb3VyY2VkIGZyb20gdGhlIGxpdmUgc2NoZW1hIGluXG4vLyBpdHMgZXJyb3IgbWVzc2FnZXMuIFRoZXkgYXJlIHByb2R1Y2VkIGluIHR3byBkaXN0aW5jdCBwaGFzZXM6XG4vLyAgIC0gdmFsaWRhdGlvbiBydWxlcyAoRmllbGRzT25Db3JyZWN0VHlwZVJ1bGUsIEtub3duQXJndW1lbnROYW1lc1J1bGUsXG4vLyAgICAgS25vd25UeXBlTmFtZXNSdWxlLCAuLi4pLCBhbmRcbi8vICAgLSB2YXJpYWJsZSBjb2VyY2lvbiAodW5rbm93biBlbnVtIHZhbHVlcywgdW5rbm93biBpbnB1dC1vYmplY3QgZmllbGRzKSxcbi8vICAgICB3aGljaCBydW5zIGR1cmluZyBleGVjdXRpb24sIGFmdGVyIHZhbGlkYXRpb24uXG4vLyBBbGwgb2YgdGhlc2UgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgYW5kIGRpc2Nsb3NlIHNjaGVtYSBpZGVudGlmaWVycyAoQ2xvdWRcbi8vIENvZGUgZnVuY3Rpb24gbmFtZXMsIGNsYXNzIGFuZCBmaWVsZCBuYW1lcykgdGhhdCB0aGUgaW50cm9zcGVjdGlvbiBndWFyZCBpc1xuLy8gbWVhbnQgdG8gaGlkZS4gU3RyaXAgdGhlIGhpbnQgc3VmZml4IGZyb20gZXZlcnkgcmV0dXJuZWQgZXJyb3Ig4oCUIGluY2x1ZGluZyB0aGVcbi8vIGNvcHkgZ3JhcGhxbC1qcyBkdXBsaWNhdGVzIGludG8gZXh0ZW5zaW9ucy5zdGFja3RyYWNlIGluIG5vbi1wcm9kdWN0aW9uIOKAlCBmb3Jcbi8vIGNhbGxlcnMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gaW50cm9zcGVjdC5cbmNvbnN0IHN0cmlwU2NoZW1hU3VnZ2VzdGlvbiA9IG1lc3NhZ2UgPT5cbiAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnID8gbWVzc2FnZS5yZXBsYWNlKC8gP0RpZCB5b3UgbWVhbiguKz8pXFw/JC8sICcnKSA6IG1lc3NhZ2U7XG5cbi8vIGdyYXBocWwtanMgYWxzbyBlbWl0cyBhIGJhc2UgaW5wdXQtY29lcmNpb24gbWVzc2FnZSB0aGF0IG5hbWVzIGEgc2NoZW1hXG4vLyBpZGVudGlmaWVyIFdJVEhPVVQgYSBcIkRpZCB5b3UgbWVhblwiIGNsYXVzZSwgc28gdGhlIHN1Z2dlc3Rpb24gc3RyaXAgYWJvdmVcbi8vIGNhbm5vdCByZWFjaCBpdDogd2hlbiBhIHJlcXVpcmVkIGN1c3RvbSBpbnB1dCBmaWVsZCBpcyBvbWl0dGVkLCBjb2VyY2VJbnB1dFZhbHVlXG4vLyByZXR1cm5zICdGaWVsZCBcIjxuYW1lPlwiIG9mIHJlcXVpcmVkIHR5cGUgXCI8dHlwZT5cIiB3YXMgbm90IHByb3ZpZGVkLicsIGRpc2Nsb3Npbmdcbi8vIGEgZmllbGQgbmFtZSB0aGUgY2FsbGVyIG5ldmVyIHN1cHBsaWVkLiBSZWRhY3QgdGhlIHF1b3RlZCBpZGVudGlmaWVycyBmcm9tIHRoaXNcbi8vIHRlbXBsYXRlIHdoaWxlIHByZXNlcnZpbmcgdGhlIGVycm9yIHNoYXBlLCBmb3IgY2FsbGVycyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0b1xuLy8gaW50cm9zcGVjdC4gVGhlIHNpYmxpbmcgY29lcmNpb24gbWVzc2FnZXMgKCcuLi4gaXMgbm90IGRlZmluZWQgYnkgdHlwZSBcIjx0eXBlPlwiLicsXG4vLyAnRXhwZWN0ZWQgdHlwZSBcIjx0eXBlPlwiIHRvIGJlIGFuIG9iamVjdC4nKSBhcmUgaW50ZW50aW9uYWxseSBsZWZ0IGludGFjdDogdGhleVxuLy8gb25seSBlY2hvIGFuIGlucHV0IHR5cGUgbmFtZSB0aGUgY2FsbGVyIGFscmVhZHkgcmVmZXJlbmNlZCBpbiB0aGUgb3BlcmF0aW9uLCBzb1xuLy8gdGhleSBkaXNjbG9zZSBub3RoaW5nIHRoZSBjYWxsZXIgZGlkIG5vdCBhbHJlYWR5IHByb3ZpZGUuXG5jb25zdCBzdHJpcFNjaGVtYUNvZXJjaW9uSWRlbnRpZmllcnMgPSBtZXNzYWdlID0+XG4gIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgID8gbWVzc2FnZS5yZXBsYWNlKFxuICAgICAgL0ZpZWxkIFwiW15cIl0qXCIgb2YgcmVxdWlyZWQgdHlwZSBcIlteXCJdKlwiIHdhcyBub3QgcHJvdmlkZWRcXC4vZyxcbiAgICAgICdGaWVsZCBvZiByZXF1aXJlZCB0eXBlIHdhcyBub3QgcHJvdmlkZWQuJ1xuICAgIClcbiAgICA6IG1lc3NhZ2U7XG5cbi8vIFR5cGUgbmFtZXMgdGhhdCByZXZlYWwgbm90aGluZyBhYm91dCBUSElTIGFwcGxpY2F0aW9uJ3Mgc2NoZW1hLCBzbyByZWRhY3RpbmcgdGhlbSB3b3VsZCBjb3N0XG4vLyBtZXNzYWdlIHF1YWxpdHkgZm9yIG5vIHNlY3VyaXR5IGdhaW4uIGBSRVNFUlZFRF9HUkFQSFFMX1RZUEVfTkFNRVNgIGNvdmVycyB0aGUgbmFtZXMgdGhlIHNjaGVtYVxuLy8gYnVpbGRlciByZWZ1c2VzIHRvIGxldCBhIGNsYXNzIGdlbmVyYXRlLCBidXQgUGFyc2UgcmVnaXN0ZXJzIGJ1aWx0LWluIHR5cGVzIG91dHNpZGUgdGhhdCBsaXN0XG4vLyB0b28uIE9mIHRob3NlLCBvbmx5IGFuIEVOVU0gY2FuIHJlYWNoIHRoZSBlbnVtIHRlbXBsYXRlcyBiZWxvdywgYW5kIHRoZSBHcmFwaFFMIGxheWVyIGRlZmluZXNcbi8vIGV4YWN0bHkgdGhyZWUgZW51bXM6IGBDbG91ZENvZGVGdW5jdGlvbmAgKHJlc2VydmVkKSwgdGhlIHBlci1jbGFzcyBgPENsYXNzPk9yZGVyYCAodGhlXG4vLyBkaXNjbG9zdXJlIHRoZXNlIHRlbXBsYXRlcyBleGlzdCB0byByZWRhY3QpIGFuZCBgUmVhZFByZWZlcmVuY2VgLiBJbmNsdWRlIHRoZSBsYXN0IG9uZSBzbyB0aGF0XG4vLyBhbiBpbnZhbGlkIGBvcHRpb25zLnJlYWRQcmVmZXJlbmNlYCB2YWx1ZSBzdGlsbCBuYW1lcyBpdHMgZW51bSwganVzdCBhcyBgQ2xvdWRDb2RlRnVuY3Rpb25gXG4vLyBkb2VzIOKAlCBpdCBpcyBpZGVudGljYWwgb24gZXZlcnkgZGVwbG95bWVudCBhbmQgcmVhY2hhYmxlIGZyb20gZXZlcnkgZ2VuZXJhdGVkIGZpbmQgcXVlcnkuXG5jb25zdCBOT05fRElTQ0xPU0lOR19UWVBFX05BTUVTID0gbmV3IFNldChbLi4uUkVTRVJWRURfR1JBUEhRTF9UWVBFX05BTUVTLCBSRUFEX1BSRUZFUkVOQ0UubmFtZV0pO1xuXG4vLyBncmFwaHFsLWpzIGFsc28gZW1pdHMgYmFzZSBjb2VyY2lvbiAvIHZhbGlkYXRpb24gbWVzc2FnZXMgdGhhdCBuYW1lIGEgbmVzdGVkIGlucHV0XG4vLyBUWVBFIHdpdGhvdXQgYSBcIkRpZCB5b3UgbWVhblwiIGNsYXVzZSwgc28gbmVpdGhlciBzdHJpcCBhYm92ZSByZWFjaGVzIHRoZW0uIEZvciBhXG4vLyBQb2ludGVyIG9yIFJlbGF0aW9uIGZpZWxkIHRoZSBnZW5lcmF0ZWQgaW5wdXQgdHlwZSBuYW1lIGVtYmVkcyB0aGUgcG9pbnRlcidzIFRBUkdFVFxuLy8gY2xhc3MgKGA8VGFyZ2V0PlBvaW50ZXJJbnB1dGAsIGA8VGFyZ2V0PlJlbGF0aW9uV2hlcmVJbnB1dGAsIGBDcmVhdGU8VGFyZ2V0PkZpZWxkc0lucHV0YClcbi8vIOKAlCBhIGNsYXNzIHRoZSBjYWxsZXIgbmV2ZXIgcmVmZXJlbmNlZCBhbmQgY2Fubm90IGRlcml2ZSBmcm9tIHRoZSBmaWVsZCBuYW1lIHRoZXlcbi8vIHN1cHBsaWVkIOKAlCBzbyB0aGVzZSB0ZW1wbGF0ZXMgZGlzY2xvc2UgYSBzY2hlbWEgY2xhc3MgbmFtZSB0byBhIGNhbGxlciB3aG8gaGFzIG9ubHkgdGhlXG4vLyBwdWJsaWMgYXBwbGljYXRpb24gaWQuIFJlZGFjdCB0aGUgcXVvdGVkIHR5cGUgaWRlbnRpZmllciBmcm9tIHRob3NlIHRlbXBsYXRlcyBVTkxFU1MgdGhlXG4vLyBjYWxsZXIgcmVmZXJlbmNlZCBpdCBpbiB0aGUgb3BlcmF0aW9uIHRleHQ6IGEgdHlwZSBuYW1lIHRoZSBjYWxsZXIgd3JvdGUgaW4gdGhlIG9wZXJhdGlvblxuLy8gKGUuZy4gYCR3aGVyZTogVXNlcldoZXJlSW5wdXRgKSBpcyBub3QgYSBkaXNjbG9zdXJlLCBhbmQgcHJlc2VydmluZyBpdCBrZWVwcyB0aGUgbWVzc2FnZVxuLy8gKCcuLi4gaXMgbm90IGRlZmluZWQgYnkgdHlwZSBcIlVzZXJXaGVyZUlucHV0XCIuJykgdXNlZnVsLiBXaGVuIHRoZSBvcGVyYXRpb24gdGV4dCBpc1xuLy8gdW5hdmFpbGFibGUgdGhlIGlkZW50aWZpZXIgaXMgcmVkYWN0ZWQgKGZhaWwgY2xvc2VkKS5cbmNvbnN0IHN0cmlwU2NoZW1hVHlwZUlkZW50aWZpZXJzID0gKG1lc3NhZ2UsIG9wZXJhdGlvblRleHQpID0+IHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJykgeyByZXR1cm4gbWVzc2FnZTsgfVxuICAvLyBBIGdlbmVyYXRlZCB0eXBlIGlkZW50aWZpZXIgaXMga2VwdCAoaXQgaXMgbm90IGEgZGlzY2xvc3VyZSkgaWYgdGhlIGNhbGxlciB3cm90ZSBpdCBhcyBhXG4gIC8vIHdob2xlIHRva2VuIGluIHRoZSBvcGVyYXRpb24gdGV4dCwgb3IgaWYgaXQgaXMgYSBub24tZGlzY2xvc2luZyBuYW1lIChhYm92ZSkuIFRva2VuaXplIHRoZVxuICAvLyBvcGVyYXRpb24gb24gbm9uLWlkZW50aWZpZXIgY2hhcmFjdGVycyBhbmQgY29tcGFyZSBleGFjdCB0b2tlbnMgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYVxuICAvLyBSZWdFeHAgZnJvbSB0aGUgY2FwdHVyZWQgbmFtZTogdGhpcyBhdm9pZHMgc3Vic3RyaW5nIGZhbHNlLW1hdGNoZXMgKGUuZy4gcHJlc2VydmluZ1xuICAvLyBcIkF1dGhvclBvaW50ZXJJbnB1dFwiIGJlY2F1c2UgdGhlIG9wZXJhdGlvbiBjb250YWlucyBcIlNlY3JldEF1dGhvclBvaW50ZXJJbnB1dFwiKSBhbmQgYW55XG4gIC8vIHJlZ2V4IGluamVjdGlvbi9SZURvUyBmcm9tIGFuIHVudXN1YWwgY2FwdHVyZWQgbmFtZS4gR3JhcGhRTCBsaXN0L25vbi1udWxsIHdyYXBwZXJzIChcIltcIixcbiAgLy8gXCJdXCIsIFwiIVwiKSBhcmUgc3RyaXBwZWQgZnJvbSB0aGUgY2FwdHVyZWQgbmFtZSBzbyBlLmcuIFwiU2VjcmV0QXV0aG9yUG9pbnRlcklucHV0IVwiIHN0aWxsXG4gIC8vIG1hdGNoZXMgXCIkeDogU2VjcmV0QXV0aG9yUG9pbnRlcklucHV0IVwiLiBXaGVuIHRoZSBvcGVyYXRpb24gdGV4dCBpcyB1bmF2YWlsYWJsZSB0aGUgdHlwZSBpc1xuICAvLyB0cmVhdGVkIGFzIG5vdCByZWZlcmVuY2VkIChmYWlsIGNsb3NlZCkuXG4gIGNvbnN0IHJlZmVyZW5jZWRUb2tlbnMgPVxuICAgIHR5cGVvZiBvcGVyYXRpb25UZXh0ID09PSAnc3RyaW5nJ1xuICAgICAgPyBuZXcgU2V0KG9wZXJhdGlvblRleHQuc3BsaXQoL1teX0EtWmEtejAtOV0rLykuZmlsdGVyKEJvb2xlYW4pKVxuICAgICAgOiBuZXcgU2V0KCk7XG4gIC8vIEEgbm9uLWRpc2Nsb3NpbmcgdHlwZSBuYW1lIChgQ2xvdWRDb2RlRnVuY3Rpb25gLCBgUmVhZFByZWZlcmVuY2VgLCBgVmlld2VyYCwgYFBhZ2VJbmZvYCwgdGhlXG4gIC8vIGJ1aWx0LWluIHNjYWxhcnMsIC4uLikgaXMgaWRlbnRpY2FsIG9uIGV2ZXJ5IFBhcnNlIFNlcnZlciBkZXBsb3ltZW50IGFuZCBjYW5ub3QgY29sbGlkZSB3aXRoXG4gIC8vIGEgdXNlciBjbGFzcywgc2luY2UgYFBhcnNlR3JhcGhRTFNjaGVtYWAgcmVqZWN0cyBjbGFzcyBuYW1lcyB0aGF0IHdvdWxkIHByb2R1Y2Ugb25lLiBFY2hvaW5nXG4gIC8vIG9uZSB0aGVyZWZvcmUgZGlzY2xvc2VzIG5vdGhpbmcgYWJvdXQgVEhJUyBhcHBsaWNhdGlvbidzIHNjaGVtYSwgc28gaXQgaXMgcHJlc2VydmVkIGxpa2UgYVxuICAvLyBjYWxsZXItcmVmZXJlbmNlZCBuYW1lIGFuZCB0aGUgbWVzc2FnZSBzdGF5cyB1c2VmdWwuXG4gIGNvbnN0IHNob3VsZEtlZXBUeXBlTmFtZSA9IHR5cGVOYW1lID0+IHtcbiAgICBjb25zdCBiYXJlVHlwZU5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKC9bW1xcXSFdL2csICcnKTtcbiAgICByZXR1cm4gTk9OX0RJU0NMT1NJTkdfVFlQRV9OQU1FUy5oYXMoYmFyZVR5cGVOYW1lKSB8fCByZWZlcmVuY2VkVG9rZW5zLmhhcyhiYXJlVHlwZU5hbWUpO1xuICB9O1xuICByZXR1cm4gbWVzc2FnZVxuICAgIC8vIElucHV0IGNvZXJjaW9uIC8gVmFsdWVzT2ZDb3JyZWN0VHlwZVJ1bGUgKHZhcmlhYmxlcyBhbmQgaW5saW5lIGxpdGVyYWxzKS5cbiAgICAucmVwbGFjZSgvRXhwZWN0ZWQgdmFsdWUgb2YgdHlwZSBcIihbXlwiXSspXCIvZywgKG1hdGNoLCB0eXBlTmFtZSkgPT5cbiAgICAgIHNob3VsZEtlZXBUeXBlTmFtZSh0eXBlTmFtZSkgPyBtYXRjaCA6ICdFeHBlY3RlZCB2YWx1ZSBvZiB0aGUgY29ycmVjdCB0eXBlJ1xuICAgIClcbiAgICAucmVwbGFjZSgvRXhwZWN0ZWQgdHlwZSBcIihbXlwiXSspXCIgdG8gYmUgYW4gb2JqZWN0XFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBzaG91bGRLZWVwVHlwZU5hbWUodHlwZU5hbWUpID8gbWF0Y2ggOiAnRXhwZWN0ZWQgYW4gb2JqZWN0LidcbiAgICApXG4gICAgLnJlcGxhY2UoL0V4cGVjdGVkIG5vbi1udWxsYWJsZSB0eXBlIFwiKFteXCJdKylcIiBub3QgdG8gYmUgbnVsbFxcLi9nLCAobWF0Y2gsIHR5cGVOYW1lKSA9PlxuICAgICAgc2hvdWxkS2VlcFR5cGVOYW1lKHR5cGVOYW1lKSA/IG1hdGNoIDogJ0V4cGVjdGVkIGEgbm9uLW51bGwgdmFsdWUuJ1xuICAgIClcbiAgICAucmVwbGFjZSgvIGlzIG5vdCBkZWZpbmVkIGJ5IHR5cGUgXCIoW15cIl0rKVwiXFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBzaG91bGRLZWVwVHlwZU5hbWUodHlwZU5hbWUpID8gbWF0Y2ggOiAnIGlzIG5vdCBkZWZpbmVkLidcbiAgICApXG4gICAgLy8gVmFyaWFibGVzSW5BbGxvd2VkUG9zaXRpb25SdWxlOiB0aGUgcG9zaXRpb24gdHlwZSBpcyB0aGUgcG9pbnRlci9yZWxhdGlvbiB0YXJnZXRcbiAgICAvLyBpbnB1dCB0eXBlOyB0aGUgY2FsbGVyIG9ubHkgd3JvdGUgdGhlaXIgb3duIHZhcmlhYmxlJ3MgZGVjbGFyZWQgdHlwZS5cbiAgICAucmVwbGFjZSgvIHVzZWQgaW4gcG9zaXRpb24gZXhwZWN0aW5nIHR5cGUgXCIoW15cIl0rKVwiXFwuL2csIChtYXRjaCwgdHlwZU5hbWUpID0+XG4gICAgICBzaG91bGRLZWVwVHlwZU5hbWUodHlwZU5hbWUpID8gbWF0Y2ggOiAnIHVzZWQgaW4gcG9zaXRpb24gZXhwZWN0aW5nIGEgZGlmZmVyZW50IHR5cGUuJ1xuICAgIClcbiAgICAvLyBGaWVsZHNPbkNvcnJlY3RUeXBlUnVsZTogZGVzY2VuZGluZyBpbnRvIGEgUG9pbnRlci9SZWxhdGlvbiBvdXRwdXQgZmllbGQgbmFtZXMgaXRzXG4gICAgLy8gdGFyZ2V0IG91dHB1dCBvYmplY3QgdHlwZS5cbiAgICAucmVwbGFjZSgvQ2Fubm90IHF1ZXJ5IGZpZWxkIChcIlteXCJdKlwiKSBvbiB0eXBlIFwiKFteXCJdKylcIlxcLi9nLCAobWF0Y2gsIGZpZWxkTmFtZSwgdHlwZU5hbWUpID0+XG4gICAgICBzaG91bGRLZWVwVHlwZU5hbWUodHlwZU5hbWUpID8gbWF0Y2ggOiBgQ2Fubm90IHF1ZXJ5IGZpZWxkICR7ZmllbGROYW1lfS5gXG4gICAgKVxuICAgIC8vIFNjYWxhckxlYWZzUnVsZTogc2VsZWN0aW5nIGEgUG9pbnRlci9SZWxhdGlvbiBvdXRwdXQgZmllbGQgd2l0aCBubyBzdWItc2VsZWN0aW9uIG5hbWVzXG4gICAgLy8gaXRzIHRhcmdldCBvdXRwdXQgb2JqZWN0IHR5cGUuXG4gICAgLnJlcGxhY2UoXG4gICAgICAvRmllbGQgKFwiW15cIl0qXCIpIG9mIHR5cGUgXCIoW15cIl0rKVwiIG11c3QgaGF2ZSBhIHNlbGVjdGlvbiBvZiBzdWJmaWVsZHNcXC4vZyxcbiAgICAgIChtYXRjaCwgZmllbGROYW1lLCB0eXBlTmFtZSkgPT5cbiAgICAgICAgc2hvdWxkS2VlcFR5cGVOYW1lKHR5cGVOYW1lKVxuICAgICAgICAgID8gbWF0Y2hcbiAgICAgICAgICA6IGBGaWVsZCAke2ZpZWxkTmFtZX0gbXVzdCBoYXZlIGEgc2VsZWN0aW9uIG9mIHN1YmZpZWxkcy5gXG4gICAgKVxuICAgIC8vIFBvc3NpYmxlRnJhZ21lbnRTcHJlYWRzUnVsZTogYW4gaW5saW5lL25hbWVkIGZyYWdtZW50IG9uIGFuIGluY29tcGF0aWJsZSB0eXBlIGluc2lkZSBhXG4gICAgLy8gUG9pbnRlci9SZWxhdGlvbiBvdXRwdXQgZmllbGQgbmFtZXMgdGhlIHRhcmdldCBvdXRwdXQgb2JqZWN0IHR5cGUgKHRoZSBwYXJlbnQgdHlwZSkuXG4gICAgLy8gUmVkYWN0IGVhY2ggdHlwZSB0b2tlbiB0aGUgY2FsbGVyIGRpZCBub3QgcmVmZXJlbmNlOyB3aGVuIGJvdGggYXJlIHJlZmVyZW5jZWQgdGhlXG4gICAgLy8gcmVjb25zdHJ1Y3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbCBtZXNzYWdlLlxuICAgIC5yZXBsYWNlKFxuICAgICAgL29iamVjdHMgb2YgdHlwZSBcIihbXlwiXSspXCIgY2FuIG5ldmVyIGJlIG9mIHR5cGUgXCIoW15cIl0rKVwiXFwuL2csXG4gICAgICAobWF0Y2gsIHBhcmVudFR5cGUsIGZyYWdUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNob3VsZEtlZXBUeXBlTmFtZShwYXJlbnRUeXBlKSA/IGB0eXBlIFwiJHtwYXJlbnRUeXBlfVwiYCA6ICd0aGUgcGFyZW50IHR5cGUnO1xuICAgICAgICBjb25zdCBmcmFnID0gc2hvdWxkS2VlcFR5cGVOYW1lKGZyYWdUeXBlKSA/IGB0eXBlIFwiJHtmcmFnVHlwZX1cImAgOiAndGhlIGdpdmVuIHR5cGUnO1xuICAgICAgICByZXR1cm4gYG9iamVjdHMgb2YgJHtwYXJlbnR9IGNhbiBuZXZlciBiZSBvZiAke2ZyYWd9LmA7XG4gICAgICB9XG4gICAgKVxuICAgIC8vIEtub3duQXJndW1lbnROYW1lc1J1bGU6IHRoZSBhcmd1bWVudCdzIHBhcmVudCBPVVRQVVQgdHlwZS4gSW5zaWRlIGEgUG9pbnRlci9SZWxhdGlvblxuICAgIC8vIHN1Yi1zZWxlY3Rpb24gdGhhdCBwYXJlbnQgaXMgdGhlIFRBUkdFVCBjbGFzcywgd2hvc2Ugb3V0cHV0IHR5cGUgaXMgbmFtZWQgZXhhY3RseSB0aGVcbiAgICAvLyBjbGFzcyBuYW1lIChgcGFyc2VDbGFzc1R5cGVzLmpzYCksIHNvIGl0IGRpc2Nsb3NlcyBhIGNsYXNzIHRoZSBjYWxsZXIgbmV2ZXIgd3JvdGUg4oCUIHRoZXlcbiAgICAvLyBvbmx5IHN1cHBsaWVkIHRoZSBwb2ludGVyIGZpZWxkIG5hbWUuIFRoZSB0eXBlIGlzIGVtYmVkZGVkIGluIGEgZG90dGVkIFwiPFR5cGU+LjxmaWVsZD5cIlxuICAgIC8vIHRva2VuOyBrZWVwIHRoZSBmaWVsZCBuYW1lICh0aGUgY2FsbGVyIHdyb3RlIGl0KSBhbmQgcmVkYWN0IG9ubHkgdGhlIHR5cGUgaGFsZi4gTm90ZSB0aGVcbiAgICAvLyBkaXJlY3RpdmUgZm9ybSAoJy4uLiBvbiBkaXJlY3RpdmUgXCJAbmFtZVwiLicpIGNhcnJpZXMgbm8gdHlwZSBhbmQgaXMgbGVmdCBhbG9uZS5cbiAgICAucmVwbGFjZShcbiAgICAgIC9Vbmtub3duIGFyZ3VtZW50IChcIlteXCJdKlwiKSBvbiBmaWVsZCBcIihbXlwiLl0rKVxcLihbXlwiLl0rKVwiXFwuL2csXG4gICAgICAobWF0Y2gsIGFyZ05hbWUsIHR5cGVOYW1lLCBmaWVsZE5hbWUpID0+XG4gICAgICAgIHNob3VsZEtlZXBUeXBlTmFtZSh0eXBlTmFtZSlcbiAgICAgICAgICA/IG1hdGNoXG4gICAgICAgICAgOiBgVW5rbm93biBhcmd1bWVudCAke2FyZ05hbWV9IG9uIGZpZWxkIFwiJHtmaWVsZE5hbWV9XCIuYFxuICAgIClcbiAgICAvLyBHcmFwaFFMRW51bVR5cGUucGFyc2VWYWx1ZS9wYXJzZUxpdGVyYWw6IGEgUmVsYXRpb24gZmllbGQncyBgb3JkZXJgIGFyZ3VtZW50IGlzIHR5cGVkXG4gICAgLy8gYFs8VGFyZ2V0Pk9yZGVyIV1gIChgcGFyc2VDbGFzc1R5cGVzLmpzYCksIHNvIGFuIGludmFsaWQgZW51bSBsaXRlcmFsIG5hbWVzIHRoZSB0YXJnZXRcbiAgICAvLyBjbGFzcy4gVGhlc2UgbWVzc2FnZXMgY29tZSBmcm9tIHRoZSBlbnVtIHR5cGUgaXRzZWxmIHJhdGhlciB0aGFuIGZyb20gYSB2YWxpZGF0aW9uIHJ1bGUsXG4gICAgLy8gd2hpY2ggaXMgd2h5IHRoZSBWYWx1ZXNPZkNvcnJlY3RUeXBlUnVsZSB0ZW1wbGF0ZXMgYWJvdmUgZG8gbm90IHJlYWNoIHRoZW0uIFRoZSBvZmZlbmRpbmdcbiAgICAvLyB2YWx1ZSBpcyBjYWxsZXItc3VwcGxpZWQgYW5kIGlzIHByZXNlcnZlZDsgb25seSB0aGUgZW51bSB0eXBlIG5hbWUgaXMgcmVkYWN0ZWQuXG4gICAgLnJlcGxhY2UoL1ZhbHVlIChcIlteXCJdKlwiKSBkb2VzIG5vdCBleGlzdCBpbiBcIihbXlwiXSspXCIgZW51bVxcLi9nLCAobWF0Y2gsIHZhbHVlLCB0eXBlTmFtZSkgPT5cbiAgICAgIHNob3VsZEtlZXBUeXBlTmFtZSh0eXBlTmFtZSkgPyBtYXRjaCA6IGBWYWx1ZSAke3ZhbHVlfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZW51bS5gXG4gICAgKVxuICAgIC8vIFNpYmxpbmcgYnJhbmNoZXMgb2YgdGhlIHNhbWUgZW51bSB0eXBlLCByZWFjaGVkIHdoZW4gdGhlIGxpdGVyYWwgaXMgbm90IGFuIGVudW0gdmFsdWUgYXRcbiAgICAvLyBhbGwgKCdjYW5ub3QgcmVwcmVzZW50IG5vbi1lbnVtIHZhbHVlOiAuLi4nLCAnY2Fubm90IHJlcHJlc2VudCBub24tc3RyaW5nIHZhbHVlOiAuLi4nLFxuICAgIC8vICdjYW5ub3QgcmVwcmVzZW50IHZhbHVlOiAuLi4nKS4gU2FtZSBkaXNjbG9zdXJlLCBzYW1lIHJlZGFjdGlvbi5cbiAgICAucmVwbGFjZSgvRW51bSBcIihbXlwiXSspXCIgY2Fubm90IHJlcHJlc2VudCAvZywgKG1hdGNoLCB0eXBlTmFtZSkgPT5cbiAgICAgIHNob3VsZEtlZXBUeXBlTmFtZSh0eXBlTmFtZSkgPyBtYXRjaCA6ICdFbnVtIGNhbm5vdCByZXByZXNlbnQgJ1xuICAgICk7XG59O1xuXG5jb25zdCBzdHJpcFNjaGVtYUlkZW50aWZpZXJzID0gKG1lc3NhZ2UsIG9wZXJhdGlvblRleHQpID0+XG4gIHN0cmlwU2NoZW1hVHlwZUlkZW50aWZpZXJzKFxuICAgIHN0cmlwU2NoZW1hQ29lcmNpb25JZGVudGlmaWVycyhzdHJpcFNjaGVtYVN1Z2dlc3Rpb24obWVzc2FnZSkpLFxuICAgIG9wZXJhdGlvblRleHRcbiAgKTtcblxuY29uc3QgU2NoZW1hU3VnZ2VzdGlvbnNDb250cm9sUGx1Z2luID0gKHB1YmxpY0ludHJvc3BlY3Rpb24pID0+ICh7XG4gIHJlcXVlc3REaWRTdGFydDogYXN5bmMgKHJlcXVlc3RDb250ZXh0KSA9PiAoe1xuICAgIHdpbGxTZW5kUmVzcG9uc2U6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChwdWJsaWNJbnRyb3NwZWN0aW9uKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzTWFzdGVyT3JNYWludGVuYW5jZSA9XG4gICAgICAgIHJlcXVlc3RDb250ZXh0LmNvbnRleHRWYWx1ZS5hdXRoPy5pc01hc3RlciB8fFxuICAgICAgICByZXF1ZXN0Q29udGV4dC5jb250ZXh0VmFsdWUuYXV0aD8uaXNNYWludGVuYW5jZTtcbiAgICAgIGlmIChpc01hc3Rlck9yTWFpbnRlbmFuY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IHJlcXVlc3RDb250ZXh0LnJlc3BvbnNlPy5ib2R5O1xuICAgICAgY29uc3QgZXJyb3JzID1cbiAgICAgICAgYm9keT8ua2luZCA9PT0gJ3NpbmdsZSdcbiAgICAgICAgICA/IGJvZHkuc2luZ2xlUmVzdWx0LmVycm9yc1xuICAgICAgICAgIDogYm9keT8ua2luZCA9PT0gJ2luY3JlbWVudGFsJ1xuICAgICAgICAgICAgPyBib2R5LmluaXRpYWxSZXN1bHQuZXJyb3JzXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFNhbWUgYXMgaW4gYEludHJvc3BlY3Rpb25Db250cm9sUGx1Z2luYDogYHJlcXVlc3RDb250ZXh0LnNvdXJjZWAgY2FycmllcyB0aGVcbiAgICAgIC8vIG9wZXJhdGlvbiB0ZXh0IGZvciBldmVyeSByZXF1ZXN0LCBpbmNsdWRpbmcgYW4gYXV0b21hdGljIHBlcnNpc3RlZCBxdWVyeSBjYWNoZSBoaXRcbiAgICAgIC8vIHdoZXJlIGByZXF1ZXN0LnF1ZXJ5YCBpcyB1bmRlZmluZWQuIFJlYWRpbmcgYHJlcXVlc3QucXVlcnlgIGFsb25lIHdvdWxkIG1ha2UgdGhlXG4gICAgICAvLyBhbGxvd2xpc3QgYmVsb3cgZW1wdHkgb24gdGhvc2UgcmVxdWVzdHMgYW5kIHJlZGFjdCB0eXBlIG5hbWVzIHRoZSBjYWxsZXIgd3JvdGVcbiAgICAgIC8vIHRoZW1zZWx2ZXMuXG4gICAgICBjb25zdCBvcGVyYXRpb25UZXh0ID0gcmVxdWVzdENvbnRleHQuc291cmNlID8/IHJlcXVlc3RDb250ZXh0LnJlcXVlc3Q/LnF1ZXJ5O1xuICAgICAgZXJyb3JzPy5mb3JFYWNoKGVycm9yID0+IHtcbiAgICAgICAgZXJyb3IubWVzc2FnZSA9IHN0cmlwU2NoZW1hSWRlbnRpZmllcnMoZXJyb3IubWVzc2FnZSwgb3BlcmF0aW9uVGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGVycm9yLmV4dGVuc2lvbnM/LnN0YWNrdHJhY2UpKSB7XG4gICAgICAgICAgZXJyb3IuZXh0ZW5zaW9ucy5zdGFja3RyYWNlID0gZXJyb3IuZXh0ZW5zaW9ucy5zdGFja3RyYWNlLm1hcChtZXNzYWdlID0+XG4gICAgICAgICAgICBzdHJpcFNjaGVtYUlkZW50aWZpZXJzKG1lc3NhZ2UsIG9wZXJhdGlvblRleHQpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfSksXG59KTtcblxuY2xhc3MgUGFyc2VHcmFwaFFMU2VydmVyIHtcbiAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcjogUGFyc2VHcmFwaFFMQ29udHJvbGxlcjtcblxuICBjb25zdHJ1Y3RvcihwYXJzZVNlcnZlciwgY29uZmlnKSB7XG4gICAgdGhpcy5wYXJzZVNlcnZlciA9IHBhcnNlU2VydmVyIHx8IHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGEgcGFyc2VTZXJ2ZXIgaW5zdGFuY2UhJyk7XG4gICAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5ncmFwaFFMUGF0aCkge1xuICAgICAgcmVxdWlyZWRQYXJhbWV0ZXIoJ1lvdSBtdXN0IHByb3ZpZGUgYSBjb25maWcuZ3JhcGhRTFBhdGghJyk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMucGFyc2VHcmFwaFFMQ29udHJvbGxlciA9IHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLnBhcnNlR3JhcGhRTENvbnRyb2xsZXI7XG4gICAgdGhpcy5sb2cgPVxuICAgICAgKHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnICYmIHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmxvZ2dlckNvbnRyb2xsZXIpIHx8IGRlZmF1bHRMb2dnZXI7XG4gICAgdGhpcy5wYXJzZUdyYXBoUUxTY2hlbWEgPSBuZXcgUGFyc2VHcmFwaFFMU2NoZW1hKHtcbiAgICAgIHBhcnNlR3JhcGhRTENvbnRyb2xsZXI6IHRoaXMucGFyc2VHcmFwaFFMQ29udHJvbGxlcixcbiAgICAgIGRhdGFiYXNlQ29udHJvbGxlcjogdGhpcy5wYXJzZVNlcnZlci5jb25maWcuZGF0YWJhc2VDb250cm9sbGVyLFxuICAgICAgbG9nOiB0aGlzLmxvZyxcbiAgICAgIGdyYXBoUUxDdXN0b21UeXBlRGVmczogdGhpcy5jb25maWcuZ3JhcGhRTEN1c3RvbVR5cGVEZWZzLFxuICAgICAgYXBwSWQ6IHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmFwcElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX2dldEdyYXBoUUxPcHRpb25zKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzY2hlbWE6IGF3YWl0IHRoaXMucGFyc2VHcmFwaFFMU2NoZW1hLmxvYWQoKSxcbiAgICAgICAgY29udGV4dDogYXN5bmMgKHsgcmVxIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5mbzogcmVxLmluZm8sXG4gICAgICAgICAgICBjb25maWc6IHJlcS5jb25maWcsXG4gICAgICAgICAgICBhdXRoOiByZXEuYXV0aCxcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihlLnN0YWNrIHx8ICh0eXBlb2YgZS50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJyAmJiBlLnRvU3RyaW5nKCkpIHx8IGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfZ2V0U2VydmVyKCkge1xuICAgIGNvbnN0IHNjaGVtYVJlZiA9IHRoaXMucGFyc2VHcmFwaFFMU2NoZW1hLmdyYXBoUUxTY2hlbWE7XG4gICAgY29uc3QgbmV3U2NoZW1hUmVmID0gYXdhaXQgdGhpcy5wYXJzZUdyYXBoUUxTY2hlbWEubG9hZCgpO1xuICAgIGlmIChzY2hlbWFSZWYgPT09IG5ld1NjaGVtYVJlZiAmJiB0aGlzLl9zZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJ2ZXI7XG4gICAgfVxuICAgIC8vIEl0IG1lYW5zIGEgcGFyYWxsZWwgX2dldFNlcnZlciBjYWxsIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3NcbiAgICBpZiAodGhpcy5fc2NoZW1hUmVmTXV0ZXggPT09IG5ld1NjaGVtYVJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcnZlcjtcbiAgICB9XG4gICAgLy8gVXBkYXRlIHRoZSBzY2hlbWEgcmVmIG11dGV4IHRvIGF2b2lkIHBhcmFsbGVsIF9nZXRTZXJ2ZXIgY2FsbHNcbiAgICB0aGlzLl9zY2hlbWFSZWZNdXRleCA9IG5ld1NjaGVtYVJlZjtcbiAgICBjb25zdCBjcmVhdGVTZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHNjaGVtYSwgY29udGV4dCB9ID0gYXdhaXQgdGhpcy5fZ2V0R3JhcGhRTE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgYXBvbGxvID0gbmV3IEFwb2xsb1NlcnZlcih7XG4gICAgICAgICAgY3NyZlByZXZlbnRpb246IHtcbiAgICAgICAgICAgIC8vIFNlZSBodHRwczovL3d3dy5hcG9sbG9ncmFwaHFsLmNvbS9kb2NzL3JvdXRlci9jb25maWd1cmF0aW9uL2NzcmYvXG4gICAgICAgICAgICAvLyBuZWVkZWQgc2luY2Ugd2UgdXNlIGdyYXBocWwgdXBsb2FkXG4gICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogWydYLVBhcnNlLUFwcGxpY2F0aW9uLUlkJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLyBXZSBuZWVkIGFsd2F5cyB0cnVlIGludHJvc3BlY3Rpb24gYmVjYXVzZSBhcG9sbG8gc2VydmVyIGhhdmUgY2hhbmdpbmcgYmVoYXZpb3IgYmFzZWQgb24gdGhlIE5PREVfRU5WIHZhcmlhYmxlXG4gICAgICAgICAgLy8gd2UgZGVsZWdhdGUgdGhlIGludHJvc3BlY3Rpb24gY29udHJvbCB0byB0aGUgSW50cm9zcGVjdGlvbkNvbnRyb2xQbHVnaW5cbiAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0cnVlLFxuICAgICAgICAgIHBsdWdpbnM6IFtBcG9sbG9TZXJ2ZXJQbHVnaW5DYWNoZUNvbnRyb2xEaXNhYmxlZCgpLCBJbnRyb3NwZWN0aW9uQ29udHJvbFBsdWdpbih0aGlzLmNvbmZpZy5ncmFwaFFMUHVibGljSW50cm9zcGVjdGlvbiksIFNjaGVtYVN1Z2dlc3Rpb25zQ29udHJvbFBsdWdpbih0aGlzLmNvbmZpZy5ncmFwaFFMUHVibGljSW50cm9zcGVjdGlvbiksIGNyZWF0ZUNvbXBsZXhpdHlWYWxpZGF0aW9uUGx1Z2luKCgpID0+IHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLnJlcXVlc3RDb21wbGV4aXR5KV0sXG4gICAgICAgICAgc2NoZW1hLFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgYXBvbGxvLnN0YXJ0KCk7XG4gICAgICAgIHJldHVybiBleHByZXNzTWlkZGxld2FyZShhcG9sbG8sIHtcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gUmVzZXQgYWxsIG11dGV4ZXMgYW5kIGZvcndhcmQgdGhlIGVycm9yXG4gICAgICAgIHRoaXMuX3NlcnZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3NjaGVtYVJlZk11dGV4ID0gbnVsbDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRG8gbm90IGF3YWl0IHNvIHBhcmFsbGVsIHJlcXVlc3Qgd2lsbCB3YWl0IHRoZSBzYW1lIHByb21pc2UgcmVmXG4gICAgdGhpcy5fc2VydmVyID0gY3JlYXRlU2VydmVyKCk7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlcjtcbiAgfVxuXG4gIF90cmFuc2Zvcm1NYXhVcGxvYWRTaXplVG9CeXRlcyhtYXhVcGxvYWRTaXplKSB7XG4gICAgY29uc3QgdW5pdE1hcCA9IHtcbiAgICAgIGtiOiAxLFxuICAgICAgbWI6IDIsXG4gICAgICBnYjogMyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIE51bWJlcihtYXhVcGxvYWRTaXplLnNsaWNlKDAsIC0yKSkgKlxuICAgICAgTWF0aC5wb3coMTAyNCwgdW5pdE1hcFttYXhVcGxvYWRTaXplLnNsaWNlKC0yKS50b0xvd2VyQ2FzZSgpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQWxsb3cgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgZWFjaCByZXF1ZXN0IHdpdGggaW52ZXJzaW9uIG9mIGNvbnRyb2wvZGVwZW5kZW5jeSBpbmplY3Rpb25cbiAgICovXG4gIGFwcGx5UmVxdWVzdENvbnRleHRNaWRkbGV3YXJlKGFwaSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSkge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnJlcXVlc3RDb250ZXh0TWlkZGxld2FyZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVlc3RDb250ZXh0TWlkZGxld2FyZSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIGFwaS51c2UodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgsIG9wdGlvbnMucmVxdWVzdENvbnRleHRNaWRkbGV3YXJlKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYXBoUUwoYXBwKSB7XG4gICAgaWYgKCFhcHAgfHwgIWFwcC51c2UpIHtcbiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyKCdZb3UgbXVzdCBwcm92aWRlIGFuIEV4cHJlc3MuanMgYXBwIGluc3RhbmNlIScpO1xuICAgIH1cbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBhbGxvd0Nyb3NzRG9tYWluKHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmFwcElkKSk7XG4gICAgYXBwLnVzZSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCwgaGFuZGxlUGFyc2VIZWFkZXJzKTtcbiAgICBhcHAudXNlKHRoaXMuY29uZmlnLmdyYXBoUUxQYXRoLCBoYW5kbGVQYXJzZVNlc3Npb24pO1xuICAgIHRoaXMuYXBwbHlSZXF1ZXN0Q29udGV4dE1pZGRsZXdhcmUoYXBwLCB0aGlzLnBhcnNlU2VydmVyLmNvbmZpZyk7XG4gICAgYXBwLnVzZSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCwgaGFuZGxlUGFyc2VFcnJvcnMpO1xuICAgIGFwcC51c2UoXG4gICAgICB0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCxcbiAgICAgIGdyYXBocWxVcGxvYWRFeHByZXNzKHtcbiAgICAgICAgbWF4RmlsZVNpemU6IHRoaXMuX3RyYW5zZm9ybU1heFVwbG9hZFNpemVUb0J5dGVzKFxuICAgICAgICAgIHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLm1heFVwbG9hZFNpemUgfHwgJzIwbWInXG4gICAgICAgICksXG4gICAgICB9KVxuICAgICk7XG4gICAgYXBwLnVzZSh0aGlzLmNvbmZpZy5ncmFwaFFMUGF0aCwgZXhwcmVzcy5qc29uKCksIGFzeW5jIChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgdGhpcy5fZ2V0U2VydmVyKCk7XG4gICAgICByZXR1cm4gc2VydmVyKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGx5UGxheWdyb3VuZChhcHApIHtcbiAgICBpZiAoIWFwcCB8fCAhYXBwLmdldCkge1xuICAgICAgcmVxdWlyZWRQYXJhbWV0ZXIoJ1lvdSBtdXN0IHByb3ZpZGUgYW4gRXhwcmVzcy5qcyBhcHAgaW5zdGFuY2UhJyk7XG4gICAgfVxuXG4gICAgYXBwLmdldChcbiAgICAgIHRoaXMuY29uZmlnLnBsYXlncm91bmRQYXRoIHx8XG4gICAgICByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhIGNvbmZpZy5wbGF5Z3JvdW5kUGF0aCB0byBhcHBseVBsYXlncm91bmQhJyksXG4gICAgICAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgcmVzLndyaXRlKFxuICAgICAgICAgIGA8ZGl2IGlkPVwic2FuZGJveFwiIHN0eWxlPVwicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtib3R0b206MDtsZWZ0OjBcIj48L2Rpdj5cbiAgICAgICAgICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vZW1iZWRkYWJsZS1zYW5kYm94LmNkbi5hcG9sbG9ncmFwaHFsLmNvbS9fbGF0ZXN0L2VtYmVkZGFibGUtc2FuZGJveC51bWQucHJvZHVjdGlvbi5taW4uanNcIj48L3NjcmlwdD5cbiAgICAgICAgICA8c2NyaXB0PlxuICAgICAgICAgICBuZXcgd2luZG93LkVtYmVkZGVkU2FuZGJveCh7XG4gICAgICAgICAgICAgdGFyZ2V0OiBcIiNzYW5kYm94XCIsXG4gICAgICAgICAgICAgZW5kcG9pbnRJc0VkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICBpbml0aWFsRW5kcG9pbnQ6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcuZ3JhcGhRTFBhdGgpfSxcbiAgICAgICAgICAgICBoYW5kbGVSZXF1ZXN0OiAoZW5kcG9pbnRVcmwsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZldGNoKGVuZHBvaW50VXJsLCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgJ1gtUGFyc2UtQXBwbGljYXRpb24tSWQnOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLmFwcElkKX0sXG4gICAgICAgICAgICAgICAgICAgICdYLVBhcnNlLU1hc3Rlci1LZXknOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGFyc2VTZXJ2ZXIuY29uZmlnLm1hc3RlcktleSl9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICB9KTtcbiAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uczogaHR0cHM6Ly93d3cuYXBvbGxvZ3JhcGhxbC5jb20vZG9jcy9zdHVkaW8vZXhwbG9yZXIvc2FuZGJveCNlbWJlZGRpbmctc2FuZGJveFxuICAgICAgICAgIDwvc2NyaXB0PmBcbiAgICAgICAgKTtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBzZXRHcmFwaFFMQ29uZmlnKGdyYXBoUUxDb25maWc6IFBhcnNlR3JhcGhRTENvbmZpZyk6IFByb21pc2Uge1xuICAgIHJldHVybiB0aGlzLnBhcnNlR3JhcGhRTENvbnRyb2xsZXIudXBkYXRlR3JhcGhRTENvbmZpZyhncmFwaFFMQ29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgeyBQYXJzZUdyYXBoUUxTZXJ2ZXIgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEscUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFFBQUEsR0FBQUYsT0FBQTtBQUNB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