semantifold 0.10.0 → 0.11.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.
Files changed (41) hide show
  1. package/README.md +1 -1
  2. package/build/src/backends/kotlin.d.ts +1 -1
  3. package/build/src/backends/kotlin.js +2 -2
  4. package/build/src/backends/shared.d.ts.map +1 -1
  5. package/build/src/backends/shared.js +29 -1
  6. package/build/src/frontends/java.d.ts.map +1 -1
  7. package/build/src/frontends/java.js +23 -1
  8. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  9. package/build/src/frontends/javascript-typescript.js +45 -4
  10. package/build/src/frontends/php.d.ts.map +1 -1
  11. package/build/src/frontends/php.js +54 -3
  12. package/build/src/frontends/ruby.d.ts.map +1 -1
  13. package/build/src/frontends/ruby.js +55 -5
  14. package/build/src/language-registry.d.ts.map +1 -1
  15. package/build/src/language-registry.js +18 -6
  16. package/build/src/semantic/effects.js +3 -1
  17. package/build/src/semantic/provenance.d.ts.map +1 -1
  18. package/build/src/semantic/provenance.js +11 -1
  19. package/build/src/semantic/types.d.ts +52 -2
  20. package/build/src/semantic/types.d.ts.map +1 -1
  21. package/build/src/semantic/types.js +14 -2
  22. package/build/src/semantic/validate.js +18 -1
  23. package/build/src/toolchains.js +3 -3
  24. package/docs/adr-expression-breadth.md +186 -0
  25. package/docs/kotlin.md +2 -2
  26. package/docs/language-support.md +11 -3
  27. package/docs/parser-qualification.md +1 -1
  28. package/docs/testing.md +2 -2
  29. package/package.json +1 -1
  30. package/src/backends/kotlin.js +1 -1
  31. package/src/backends/shared.js +30 -0
  32. package/src/frontends/java.js +24 -0
  33. package/src/frontends/javascript-typescript.js +49 -2
  34. package/src/frontends/php.js +61 -2
  35. package/src/frontends/ruby.js +62 -2
  36. package/src/language-registry.js +17 -5
  37. package/src/semantic/effects.js +1 -0
  38. package/src/semantic/provenance.js +8 -0
  39. package/src/semantic/types.js +14 -1
  40. package/src/semantic/validate.js +26 -0
  41. package/src/toolchains.js +2 -2
@@ -2015,6 +2015,23 @@ function inferExpressionType(expression, scope, functions, records, fail, normal
2015
2015
  }
2016
2016
  return scalarType(signature.result);
2017
2017
  }
2018
+ if (expression.kind == "ConditionalExpression") {
2019
+ const conditionType = inferValueExpressionType(expression.condition, scope, functions, records, fail, normalizeOperations, "a condition");
2020
+ if (!isScalarType(conditionType, "boolean")) {
2021
+ fail("NON_BOOLEAN_CONDITION", `Conditional expression condition type ${typeDescription(conditionType)}; expected boolean.`, expression.condition.location);
2022
+ }
2023
+ const consequentScope = createScope(scope, []);
2024
+ const alternateScope = createScope(scope, []);
2025
+ applyPresenceNarrowing(expression.condition, scope, consequentScope, true);
2026
+ applyPresenceNarrowing(expression.condition, scope, alternateScope, false);
2027
+ const consequentType = inferValueExpressionType(expression.consequent, consequentScope, functions, records, fail, normalizeOperations, "a conditional expression consequent");
2028
+ const alternateType = inferValueExpressionType(expression.alternate, alternateScope, functions, records, fail, normalizeOperations, "a conditional expression alternate");
2029
+ if (!sameType(consequentType, alternateType)) {
2030
+ fail("TYPE_MISMATCH", `Conditional expression arms ${typeDescription(consequentType)} and ${typeDescription(alternateType)}; expected one joined type.`, expression.alternate.location);
2031
+ }
2032
+ Reflect.set(expression, "type", consequentType);
2033
+ return consequentType;
2034
+ }
2018
2035
  if (expression.kind == "BinaryExpression") {
2019
2036
  const left = inferValueExpressionType(expression.left, scope, functions, records, fail, normalizeOperations, "a binary operand");
2020
2037
  const right = inferValueExpressionType(expression.right, scope, functions, records, fail, normalizeOperations, "a binary operand");
@@ -2947,4 +2964,4 @@ function setNormalizedOperation(expression, operation, type) {
2947
2964
  Reflect.set(expression, "operation", operation);
2948
2965
  Reflect.set(expression, "type", type);
2949
2966
  }
2950
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdmFsaWRhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxlQUFlLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUMxRixPQUFPLEVBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDbkcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUV2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUVwRyxvRkFBb0Y7QUFDcEYsa0ZBQWtGO0FBQ2xGLGtGQUFrRjtBQUNsRixxREFBcUQ7QUFDckQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ3RELG1EQUFtRDtBQUNuRCxNQUFNLDJCQUEyQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFakQ7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9B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LENBQUMsZUFBZSxFQUFFLG1DQUFtQyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQTtBQUMzRyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUk7SUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQy9DLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7c2VtYW50aWNGYWlsdXJlLCB1bnN1cHBvcnRlZENhcGFiaWxpdHksIHVuc3VwcG9ydGVkU3ludGF4fSBmcm9tIFwiLi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge3JlY29yZFR5cGVTdWJzdGl0dXRpb25zLCBzdWJzdGl0dXRlVmFsdWVUeXBlLCB0eXBlQ29udGFpbnNBbnlWYXJpYWJsZX0gZnJvbSBcIi4vZ2VuZXJpY3MuanNcIlxuaW1wb3J0IHtoYXNPbmx5VW5pY29kZVNjYWxhcnMsIGlzU2NhbGFyVHlwZU5hbWUsIHNjYWxhclR5cGV9IGZyb20gXCIuL3NjYWxhcnMuanNcIlxuaW1wb3J0IHthZGFwdGVkT3BlcmF0aW9uRm9yfSBmcm9tIFwiLi9vcGVyYXRvcnMuanNcIlxuaW1wb3J0IHtwYXJzZXJSYW5nZUZvcn0gZnJvbSBcIi4vcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlRWZmZWN0R3JhcGh9IGZyb20gXCIuL2VmZmVjdHMuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZVJlc291cmNlTGlmZXRpbWVzfSBmcm9tIFwiLi9saWZldGltZS5qc1wiXG5cbmNvbnN0IHRhc2swMDVMYW5ndWFnZXMgPSBuZXcgU2V0KFtcInBocFwiLCBcInJ1YnlcIiwgXCJqYXZhc2NyaXB0XCIsIFwidHlwZXNjcmlwdFwiLCBcImphdmFcIiwgXCJkYXJ0XCIsIFwiemlnXCJdKVxuXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+fSBSZWNvcmRSZWdpc3RyeSAqL1xuLyoqIEB0eXBlZGVmIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+fSBDbGFzc1JlZ2lzdHJ5ICovXG4vKiogQHR5cGVkZWYge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IEVycm9yUmVnaXN0cnkgKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgQ2xhc3NSZWdpc3RyeT59ICovXG5jb25zdCByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeSA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxSZWNvcmRSZWdpc3RyeSwgU2V0PHN0cmluZz4+fSAqL1xuY29uc3QgcmVzb3VyY2VJZHNCeVJlY29yZFJlZ2lzdHJ5ID0gbmV3IFdlYWtNYXAoKVxuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGV9IHR5cGUgLSBCaW5kaW5nIHR5cGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0ga25vd25WYWx1ZSAtIEN1cnJlbnQgc3RhdGljYWxseSBrbm93biBpbW11dGFibGUgdmFsdWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTY29wZVxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBCaW5kaW5nPn0gYmluZGluZ3MgLSBCaW5kaW5ncyBkZWNsYXJlZCBkaXJlY3RseSBpbiB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gcGVuZGluZyAtIE5hbWVzIGRlY2xhcmVkIGxhdGVyIGluIHRoaXMgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NldDxCaW5kaW5nPn0gcHJlc2VuY2VQcm9vZnMgLSBPcHRpb25hbCBiaW5kaW5ncyBwcm92ZW4gcHJlc2VudCBvbiB0aGlzIHBhdGguXG4gKiBAcHJvcGVydHkge1Njb3BlIHwgdW5kZWZpbmVkfSBwYXJlbnQgLSBFbmNsb3NpbmcgbGV4aWNhbCBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHR5cGVQYXJhbWV0ZXJzIC0gVHlwZSBwYXJhbWV0ZXJzIHZpc2libGUgdGhyb3VnaG91dCB0aGUgZW5jbG9zaW5nIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtTZXQ8c3RyaW5nPn0gdXNlZE5hbWVzIC0gQWxsIG5hbWVzIHVzZWQgYnkgdGhlIGVuY2xvc2luZyBmdW5jdGlvbiBvciBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uIHwgdW5kZWZpbmVkfSBjdXJyZW50Q2xhc3MgLSBEZWNsYXJpbmcgY2xhc3MgZm9yIHJlY2VpdmVyLXByaXZhdGUgYWNjZXNzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9vcEZsb3dDb250ZXh0XG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnR9IFtuZWFyZXN0XSAtIE5lYXJlc3QgYWN0aXZlIGxvb3AuXG4gKiBAcHJvcGVydHkge29iamVjdH0gb3duZXIgLSBFbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnktcG9pbnQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge01hcDxzdHJpbmcsIG9iamVjdD59IG93bmVycyAtIExvb3Agb3duZXIgYnkgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ZhaWxcbiAqIEB0eXBlIHsoY29kZTogc3RyaW5nLCBkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfVxuICovXG5cbi8qKlxuICogRW5mb3JjZXMgdGhlIGNvaGVyZW50IHJlbGVhc2UtY2FuZGlkYXRlIHNlbWFudGljIHN1YnNldCBhZnRlciBhZGFwdGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBBZGFwdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUHJvZ3JhbSBpbXBvcnRzIHZpc2libGUgZHVyaW5nIHZhbGlkYXRpb24uXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gVmFsaWRhdGVkIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwgbGFuZ3VhZ2UsIHZpc2libGUgPSB7fSkge1xuICBub3JtYWxpemVQYXJzZWRPd25lZFJlZmVyZW5jZXMobW9kdWxlLCB2aXNpYmxlLmNsYXNzZXMpXG4gIHZhbGlkYXRlTW9kdWxlU2hhcGUobW9kdWxlLCBsYW5ndWFnZSwgKGRldGFpbCwgbG9jYXRpb24pID0+IHVuc3VwcG9ydGVkU3ludGF4KGxhbmd1YWdlLCBkZXRhaWwsIGxvY2F0aW9uKSlcbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBwYXJzZXIgZmFpbHVyZSBpbnRvIGEgbG9jYXRlZCBzZW1hbnRpYyBkaWFnbm9zdGljLlxuICAgKiBAdHlwZSB7U2VtYW50aWNGYWlsfVxuICAgKi9cbiAgY29uc3QgZmFpbCA9IChjb2RlLCBkZXRhaWwsIGxvY2F0aW9uKSA9PiBzZW1hbnRpY0ZhaWx1cmUobGFuZ3VhZ2UsIGNvZGUsIGRldGFpbCwgbG9jYXRpb24pXG5cbiAgdmFsaWRhdGVNb2R1bGVUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCBmYWlsLCB0cnVlLCB2aXNpYmxlKVxuICB2YWxpZGF0ZVJlc291cmNlTGlmZXRpbWVzKG1vZHVsZSwgaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUuY2FsbEVmZmVjdHMpLCBmYWlsKVxuXG4gIHJldHVybiBtb2R1bGVcbn1cblxuLyoqXG4gKiBQcm9tb3RlcyBwYXJzZXItYXV0aG9yZWQgY2xhc3Mgc3BlbGxpbmdzIGFmdGVyIGFsbCBwcml2YXRlIGZpZWxkIHR5cGVzIGFyZSBrbm93bi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUGFyc2VyLWF1dGhvcmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gW3Zpc2libGVDbGFzc2VzXSAtIEltcG9ydGVkIHJlZmVyZW5jZSBjbGFzc2VzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlZE93bmVkUmVmZXJlbmNlcyhtb2R1bGUsIHZpc2libGVDbGFzc2VzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IG93bmVkQ2xhc3NJZHMgPSBuZXcgU2V0KFsuLi52aXNpYmxlQ2xhc3Nlcy52YWx1ZXMoKV0uZmlsdGVyKCh7b3duZXJzaGlwfSkgPT4gb3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKVxuICAgIC5tYXAoKHtpZH0pID0+IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoaWQpKSlcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgY29uc3QgZmllbGRzID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbHRlcigoe3R5cGV9KSA9PiB0eXBlPy5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcbiAgICBpZiAoZmllbGRzLmxlbmd0aCAhPSAxKSBjb250aW51ZVxuICAgIGNvbnN0IGZpZWxkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZCAmIHt0eXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlfX0gKi8gKGZpZWxkc1swXSlcblxuICAgIGRlY2xhcmF0aW9uLm93bmVyc2hpcCA9IHtmaWVsZElkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKSwga2luZDogXCJvd25lZFJlc291cmNlXCIsIHJlc291cmNlSWQ6IGZpZWxkLnR5cGUucmVzb3VyY2VJZH1cbiAgICBvd25lZENsYXNzSWRzLmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgfVxuICAvKiogQHR5cGUge3Vua25vd25bXX0gKi9cbiAgY29uc3QgcGVuZGluZyA9IFttb2R1bGVdXG4gIC8qKiBAdHlwZSB7U2V0PG9iamVjdD59ICovXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KClcblxuICB3aGlsZSAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdmFsdWUgPSBwZW5kaW5nLnBvcCgpXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiUmVmZXJlbmNlVHlwZVwiICYmXG4gICAgICBvd25lZENsYXNzSWRzLmhhcyhSZWZsZWN0LmdldCh2YWx1ZSwgXCJkZWNsYXJhdGlvbklkXCIpKSkgUmVmbGVjdC5zZXQodmFsdWUsIFwia2luZFwiLCBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiXS5pbmNsdWRlcyhrZXkpKSBjb250aW51ZVxuICAgICAgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHNjYWxhciB0eXBlcyBhbmQgYmluZGluZ3MgZm9yIGEgY2FsbGVyLXN1cHBsaWVkIHNlbWFudGljIG1vZHVsZSBiZWZvcmUgZW1pc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gQmFja2VuZCBsYW5ndWFnZSBvciBiaW5hcnkgdGFyZ2V0LlxuICogQHBhcmFtIHt7Y2xhc3Nlcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj4sIGZ1bmN0aW9ucz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIHJlY29yZHM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPiwgZXJyb3JzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9uPiwgY2FsbEVmZmVjdHM/OiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBbdmlzaWJsZV0gLSBSZXNvbHZlZCBwcm9ncmFtIGltcG9ydHMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFja2VuZFR5cGVzKG1vZHVsZSwgbGFuZ3VhZ2UsIHZpc2libGUgPSB7fSkge1xuICAvKipcbiAgICogQ29udmVydHMgb25lIGJhY2tlbmQgdmFsaWRhdGlvbiBmYWlsdXJlIGludG8gYW4gdW5zdXBwb3J0ZWQtY2FwYWJpbGl0eSBkaWFnbm9zdGljLlxuICAgKiBAdHlwZSB7U2VtYW50aWNGYWlsfVxuICAgKi9cbiAgY29uc3QgZmFpbCA9IChfY29kZSwgZGV0YWlsLCBsb2NhdGlvbikgPT4gdW5zdXBwb3J0ZWRDYXBhYmlsaXR5KGxhbmd1YWdlLCBkZXRhaWwsIGxvY2F0aW9uKVxuXG4gIHZhbGlkYXRlTW9kdWxlVHlwZXMobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCwgZmFsc2UsIHZpc2libGUpXG4gIHZhbGlkYXRlUmVzb3VyY2VMaWZldGltZXMobW9kdWxlLCBpbmZlckVzY2FwaW5nRXJyb3JFZmZlY3RzKG1vZHVsZSwgdmlzaWJsZS5jYWxsRWZmZWN0cyksIGZhaWwpXG59XG5cbi8qKlxuICogQ2hlY2tzIHBhcnNlci1hdXRob3JlZCBibG9jayBhbmQgc3RhdGVtZW50IGxheW91dHMgYmVmb3JlIHNlbWFudGljIHZhbGlkYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZSBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7KGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBTaGFwZSBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTW9kdWxlU2hhcGUobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCkge1xuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5jbGFzc2VzID8/IFtdKSB7XG4gICAgdmFsaWRhdGVCbG9ja1NoYXBlKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yPy5ib2R5LCBcImNvbnN0cnVjdG9yIGJvZHlcIiwgZmFpbClcbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzID8/IFtdKSB2YWxpZGF0ZUJsb2NrU2hhcGUobWV0aG9kLmJvZHksIFwibWV0aG9kIGJvZHlcIiwgZmFpbClcbiAgfVxuICBmb3IgKGNvbnN0IGZ1bmN0aW9uRGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykge1xuICAgIGlmICghdGFzazAwNUxhbmd1YWdlcy5oYXMobGFuZ3VhZ2UpICYmIGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGggIT0gMikge1xuICAgICAgZmFpbChcImZ1bmN0aW9uIHBhcmFtZXRlciBjb3VudCBvdGhlciB0aGFuIHR3b1wiLCBmdW5jdGlvbkRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHZhbGlkYXRlQmxvY2tTaGFwZShmdW5jdGlvbkRlY2xhcmF0aW9uLmJvZHksIFwiZnVuY3Rpb24gYm9keVwiLCBmYWlsKVxuICB9XG5cbiAgdmFsaWRhdGVCbG9ja1NoYXBlKG1vZHVsZS5lbnRyeVBvaW50LmJvZHksIFwiZW50cnkgcG9pbnRcIiwgZmFpbClcbn1cblxuLyoqXG4gKiBDaGVja3Mgb25lIHJlY3Vyc2l2ZWx5IG5lc3RlZCBzZW1hbnRpYyBibG9jayBwcm9kdWNlZCBieSBhIGZyb250ZW5kLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbCAtIERpYWdub3N0aWMgZGV0YWlsLlxuICogQHBhcmFtIHsoZGV0YWlsOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBuZXZlcn0gZmFpbCAtIFNoYXBlIGZhaWx1cmUuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCbG9ja1NoYXBlKGJsb2NrLCBkZXRhaWwsIGZhaWwpIHtcbiAgaWYgKCFibG9jayB8fCBibG9jay5raW5kICE9IFwiQmxvY2tcIiB8fCAhQXJyYXkuaXNBcnJheShibG9jay5zdGF0ZW1lbnRzKSkge1xuICAgIGZhaWwoYCR7ZGV0YWlsfSB3aXRob3V0IEJsb2NrYCwgYmxvY2s/LmxvY2F0aW9uID8/IC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICB9XG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgYmxvY2suc3RhdGVtZW50cykge1xuICAgIGlmICghW1wiQXNzaWdubWVudFN0YXRlbWVudFwiLCBcIkJyZWFrU3RhdGVtZW50XCIsIFwiQ29udGludWVTdGF0ZW1lbnRcIiwgXCJFeHByZXNzaW9uU3RhdGVtZW50XCIsIFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiLCBcIkZvckVhY2hTdGF0ZW1lbnRcIiwgXCJJZlN0YXRlbWVudFwiLCBcIkxvY2FsRGVjbGFyYXRpb25cIiwgXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiLCBcIlByaW50U3RhdGVtZW50XCIsIFwiUmFpc2VTdGF0ZW1lbnRcIiwgXCJSZXR1cm5TdGF0ZW1lbnRcIiwgXCJUcnlTdGF0ZW1lbnRcIiwgXCJXaGlsZVN0YXRlbWVudFwiXS5pbmNsdWRlcyhzdGF0ZW1lbnQua2luZCkpIHtcbiAgICAgIGZhaWwoYCR7ZGV0YWlsfSBzdGF0ZW1lbnQgJHtzdGF0ZW1lbnQua2luZH1gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuY29uc2VxdWVudCwgXCJpZiBjb25zZXF1ZW50XCIsIGZhaWwpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5hbHRlcm5hdGUsIFwiaWYgYWx0ZXJuYXRlXCIsIGZhaWwpXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIldoaWxlU3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuYm9keSwgXCJsb29wIGJvZHlcIiwgZmFpbClcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuYm9keSwgXCJ0cnkgYm9keVwiLCBmYWlsKVxuICAgICAgdmFsaWRhdGVCbG9ja1NoYXBlKHN0YXRlbWVudC5jYXRjaEJvZHksIFwiY2F0Y2ggYm9keVwiLCBmYWlsKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBkZWNsYXJhdGlvbnMgYW5kIGV4cHJlc3Npb24gdHlwZXMgd2l0aGluIGxleGljYWwgc2NvcGVzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBTb3VyY2Ugb3IgYmFja2VuZCBsYW5ndWFnZSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUHJvZ3JhbSBpbXBvcnRzIHZpc2libGUgZHVyaW5nIHZhbGlkYXRpb24uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVNb2R1bGVUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlID0ge30pIHtcbiAgY29uc3QgY2xhc3NlcyA9IHJlZ2lzdGVyQ2xhc3NEZWNsYXJhdGlvbnMobW9kdWxlLmNsYXNzZXMgPz8gW10sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHZpc2libGUuY2xhc3NlcylcbiAgY29uc3QgcmVjb3JkcyA9IHZhbGlkYXRlUmVjb3JkRGVjbGFyYXRpb25zKG1vZHVsZS5yZWNvcmRzID8/IFtdLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlLnJlY29yZHMsIGNsYXNzZXMpXG4gIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlRXJyb3JEZWNsYXJhdGlvbnMobW9kdWxlLmVycm9ycyA/PyBbXSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZS5lcnJvcnMpXG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gKi9cbiAgY29uc3QgZnVuY3Rpb25zID0gbmV3IE1hcCh2aXNpYmxlLmZ1bmN0aW9ucyA/PyBbXSlcbiAgY29uc3QgZGVjbGFyYXRpb25JZHMgPSBuZXcgU2V0KFsuLi5mdW5jdGlvbnMudmFsdWVzKCldLmZsYXRNYXAoKHtpZH0pID0+IHR5cGVvZiBpZCA9PSBcInN0cmluZ1wiID8gW2lkXSA6IFtdKSlcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgZnVuY3Rpb25EZWNsYXJhdGlvbl0gb2YgbW9kdWxlLmZ1bmN0aW9ucy5lbnRyaWVzKCkpIHtcbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCA9IGBmdW5jdGlvbjoke2luZGV4fWBcbiAgICBpZiAodHlwZW9mIGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fCAhL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2Z1bmN0aW9uOlswLTldKyQvdS50ZXN0KGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBkZWNsYXJhdGlvbklkcy5oYXMoZnVuY3Rpb25EZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQklORElOR1wiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBmdW5jdGlvbkRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZnVuY3Rpb25zLmhhcyhmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYGR1cGxpY2F0ZSBmdW5jdGlvbiAnJHtmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZnVuY3Rpb25EZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBkZWNsYXJhdGlvbklkcy5hZGQoZnVuY3Rpb25EZWNsYXJhdGlvbi5pZClcbiAgICB2YWxpZGF0ZVR5cGVQYXJhbWV0ZXJzKGZ1bmN0aW9uRGVjbGFyYXRpb24sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgZnVuY3Rpb25zLnNldChmdW5jdGlvbkRlY2xhcmF0aW9uLm5hbWUsIGZ1bmN0aW9uRGVjbGFyYXRpb24pXG4gIH1cblxuICB2YWxpZGF0ZUVmZmVjdEdyYXBoKG1vZHVsZSwgbGFuZ3VhZ2UsIGZ1bmN0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgY2xhc3NlcylcbiAgY29uc3QgY2FwYWJpbGl0eVJlc291cmNlcyA9IChtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mbGF0TWFwKCh7cmVzb3VyY2VzfSkgPT4gcmVzb3VyY2VzKVxuICBjb25zdCBjYXBhYmlsaXR5RmFpbHVyZXMgPSAobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpXG5cbiAgcmVzb3VyY2VJZHNCeVJlY29yZFJlZ2lzdHJ5LnNldChyZWNvcmRzLCBuZXcgU2V0KGNhcGFiaWxpdHlSZXNvdXJjZXMubWFwKCh7aWR9KSA9PiBpZCkpKVxuICBjb25zdCBleGlzdGluZ0Vycm9yTmFtZXMgPSBuZXcgU2V0KFsuLi5lcnJvcnMudmFsdWVzKCldLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGNhcGFiaWxpdHlGYWlsdXJlcykge1xuICAgIGlmIChlcnJvcnMuaGFzKGZhaWx1cmUuaWQpIHx8IGV4aXN0aW5nRXJyb3JOYW1lcy5oYXMoZmFpbHVyZS5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9FUlJPUlwiLCBgRHVwbGljYXRlIGNhcGFiaWxpdHkgZmFpbHVyZSAnJHtmYWlsdXJlLm5hbWV9Jy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIGVycm9ycy5zZXQoZmFpbHVyZS5pZCwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb259ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChmYWlsdXJlKSkpXG4gICAgZXhpc3RpbmdFcnJvck5hbWVzLmFkZChmYWlsdXJlLm5hbWUpXG4gIH1cblxuICBjb25zdCBsb29wT3duZXJzID0gcHJlcGFyZUxvb3BJZGVudGl0aWVzKG1vZHVsZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcblxuICBjb25zdCByZXNlcnZlZFZhbHVlTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi5mdW5jdGlvbnMua2V5cygpLFxuICAgIC4uLlsuLi5yZWNvcmRzLnZhbHVlcygpXS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5uYW1lKSxcbiAgICAuLi5bLi4uY2xhc3Nlcy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uWy4uLmVycm9ycy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uY2FwYWJpbGl0eVJlc291cmNlcy5tYXAoKHtuYW1lfSkgPT4gbmFtZSlcbiAgXSlcblxuICBjb25zdCBub21pbmFsTmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIFsuLi5tb2R1bGUucmVjb3JkcyA/PyBbXSwgLi4ubW9kdWxlLmNsYXNzZXMgPz8gW10sIC4uLm1vZHVsZS5lcnJvcnMgPz8gW11dKSB7XG4gICAgaWYgKG5vbWluYWxOYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQklORElOR1wiLCBgRHVwbGljYXRlIG5vbWluYWwgZGVjbGFyYXRpb24gJyR7ZGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBub21pbmFsTmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gIH1cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBbLi4uY2FwYWJpbGl0eVJlc291cmNlcywgLi4uY2FwYWJpbGl0eUZhaWx1cmVzXSkge1xuICAgIGlmIChub21pbmFsTmFtZXMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBub21pbmFsIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uLm5hbWV9Jy5gLCBtb2R1bGUubG9jYXRpb24pXG4gICAgfVxuICAgIG5vbWluYWxOYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgfVxuICBjb25zdCBsb2NhbEZ1bmN0aW9uTmFtZXMgPSBuZXcgU2V0KG1vZHVsZS5mdW5jdGlvbnMubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuICBjb25zdCBjYWxsRWZmZWN0cyA9IGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCB2aXNpYmxlLmNhbGxFZmZlY3RzLCBsb2NhbEZ1bmN0aW9uTmFtZXMpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIHZhbGlkYXRlQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wT3duZXJzKVxuICB9XG5cbiAgZm9yIChjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wT3duZXJzKVxuICB9XG5cbiAgY29uc3QgZW50cnlTY29wZSA9IGNyZWF0ZVNjb3BlKHVuZGVmaW5lZCwgbW9kdWxlLmVudHJ5UG9pbnQuYm9keS5zdGF0ZW1lbnRzLCByZXNlcnZlZFZhbHVlTmFtZXMpXG5cbiAgdmFsaWRhdGVCbG9jayhtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBlbnRyeVNjb3BlLCB1bmRlZmluZWQsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IG1vZHVsZS5lbnRyeVBvaW50LCBvd25lcnM6IGxvb3BPd25lcnN9KVxuICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgdmFsaWRhdGVFZmZlY3RHcmFwaChtb2R1bGUsIGxhbmd1YWdlLCBmdW5jdGlvbnMsIGZhaWwsIHRydWUsIGNsYXNzZXMpXG59XG5cbi8qKlxuICogQXNzaWducyBwYXJzZXItYXV0aG9yZWQgbG9vcC9jb250cm9sIGlkZW50aXRpZXMgYW5kIHZhbGlkYXRlcyBjYWxsZXItb3duZWQgaWRlbnRpdGllcyB3aXRob3V0IGNyb3NzaW5nIGEgZnVuY3Rpb24gYm91bmRhcnkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge01hcDxzdHJpbmcsIG9iamVjdD59IExvb3Agb3duZXIgYnkgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVMb29wSWRlbnRpdGllcyhtb2R1bGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpIHtcbiAgY29uc3Qgb3duZXJzID0gbmV3IE1hcCgpXG4gIGxldCBuZXh0TG9vcCA9IDBcblxuICBjb25zdCBjbGFzc093bmVycyA9IChtb2R1bGUuY2xhc3NlcyA/PyBbXSkuZmxhdE1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciwgLi4uZGVjbGFyYXRpb24ubWV0aG9kc10pXG5cbiAgZm9yIChjb25zdCBvd25lciBvZiBbLi4uY2xhc3NPd25lcnMsIC4uLm1vZHVsZS5mdW5jdGlvbnMsIG1vZHVsZS5lbnRyeVBvaW50XSkgdmlzaXQob3duZXIuYm9keSwgb3duZXIsIFtdKVxuXG4gIHJldHVybiBvd25lcnNcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBibG9jayBpbiBsZXhpY2FsIHNlbWFudGljIG9yZGVyLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ2FuZGlkYXRlIGJsb2NrLlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3duZXIgLSBFbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnkgcG9pbnQuXG4gICAqIEBwYXJhbSB7KGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuRm9yRWFjaE1hcFN0YXRlbWVudCB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuV2hpbGVTdGF0ZW1lbnQpW119IGFjdGl2ZSAtIEFjdGl2ZSBsb29wcy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdChibG9jaywgb3duZXIsIGFjdGl2ZSkge1xuICAgIGlmICghYmxvY2sgfHwgIUFycmF5LmlzQXJyYXkoYmxvY2suc3RhdGVtZW50cykpIHJldHVyblxuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICAgIGlmICghc3RhdGVtZW50IHx8IHR5cGVvZiBzdGF0ZW1lbnQgIT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICAgIGlmIChbXCJGb3JFYWNoU3RhdGVtZW50XCIsIFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiLCBcIldoaWxlU3RhdGVtZW50XCJdLmluY2x1ZGVzKHN0YXRlbWVudC5raW5kKSkge1xuICAgICAgICBjb25zdCBsb29wID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hNYXBTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLldoaWxlU3RhdGVtZW50fSAqLyAoc3RhdGVtZW50KVxuXG4gICAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBsb29wLmlkID0gYGxvb3A6JHtuZXh0TG9vcH1gXG4gICAgICAgIG5leHRMb29wICs9IDFcbiAgICAgICAgaWYgKHR5cGVvZiBsb29wLmlkICE9IFwic3RyaW5nXCIgfHwgIS9ebG9vcDpbMC05XSskL3UudGVzdChsb29wLmlkKSB8fCBvd25lcnMuaGFzKGxvb3AuaWQpKSB7XG4gICAgICAgICAgZmFpbChcIklOVkFMSURfTE9PUF9UQVJHRVRcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCBsb29wIGlkZW50aXR5LlwiLCBsb29wLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIG93bmVycy5zZXQobG9vcC5pZCwgb3duZXIpXG4gICAgICAgIHZpc2l0KGxvb3AuYm9keSwgb3duZXIsIFsuLi5hY3RpdmUsIGxvb3BdKVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJDb250aW51ZVN0YXRlbWVudFwiKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zICYmIGFjdGl2ZS5sZW5ndGggPiAwKSBzdGF0ZW1lbnQudGFyZ2V0TG9vcElkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChhY3RpdmUuYXQoLTEpPy5pZClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgIHZpc2l0KHN0YXRlbWVudC5jb25zZXF1ZW50LCBvd25lciwgYWN0aXZlKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgdmlzaXQoc3RhdGVtZW50LmFsdGVybmF0ZSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdChzdGF0ZW1lbnQuYm9keSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNhdGNoQm9keSwgb3duZXIsIGFjdGl2ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmVzIHZhbGlkYXRvci1vbmx5IHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGZvciBhIHZhbGlkYXRlZCBtb2R1bGUncyBsb2NhbCBmdW5jdGlvbnMuXG4gKiBUaGVzZSBlZmZlY3RzIG5ldmVyIGVudGVyIHNlbWFudGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBvciBwdWJsaWMgc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gVmFsaWRhdGVkIHNlbWFudGljIG1vZHVsZS5cbiAqIEBwYXJhbSB7e2Z1bmN0aW9ucz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gSW1wb3J0ZWQgZnVuY3Rpb25zIGFuZCBhbHJlYWR5LXJlc29sdmVkIGVmZmVjdHMgYnkgbG9jYWwgYmluZGluZy5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IExvY2FsIGZ1bmN0aW9uIGVmZmVjdHMgYnkgc291cmNlLXZpc2libGUgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZVVuY2hlY2tlZEVycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUgPSB7fSkge1xuICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgTWFwKHZpc2libGUuZnVuY3Rpb25zID8/IFtdKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgZnVuY3Rpb25zLnNldChkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbilcbiAgY29uc3QgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgY29uc3QgZWZmZWN0cyA9IGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCB2aXNpYmxlLmNhbGxFZmZlY3RzLCBsb2NhbEZ1bmN0aW9uTmFtZXMpXG5cbiAgcmV0dXJuIG5ldyBNYXAobW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24ubmFtZSwgbmV3IFNldChlZmZlY3RzLmdldChkZWNsYXJhdGlvbi5uYW1lKSA/PyBbXSldKSlcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFuZCB2YWxpZGF0ZXMgdGhlIGNsb3NlZCBub21pbmFsIGlkZW50aXRpZXMgb3duZWQgYnkgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IGRlY2xhcmF0aW9ucyAtIENhbmRpZGF0ZSBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHBhcnNlci1hdXRob3JlZCBpZGVudGl0aWVzIGFyZSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gW3Zpc2libGVDbGFzc2VzXSAtIEltcG9ydGVkIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7Q2xhc3NSZWdpc3RyeX0gQ2xhc3NlcyBieSBzdGFibGUgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ2xhc3NEZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlQ2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbnMgbXVzdCBiZSBhbiBvcmRlcmVkIGFycmF5LlwiLCAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgfVxuICAvKiogQHR5cGUge0NsYXNzUmVnaXN0cnl9ICovXG4gIGNvbnN0IGNsYXNzZXMgPSBuZXcgTWFwKHZpc2libGVDbGFzc2VzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoWy4uLnZpc2libGVDbGFzc2VzLnZhbHVlcygpXS5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG5cbiAgZm9yIChsZXQgY2xhc3NJbmRleCA9IDA7IGNsYXNzSW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBjbGFzc0luZGV4ICs9IDEpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSAqLyAoZGVjbGFyYXRpb25zW2NsYXNzSW5kZXhdKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiQ2xhc3NEZWNsYXJhdGlvblwiIHx8ICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLmZpZWxkcykgfHxcbiAgICAgICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLm1ldGhvZHMpIHx8ICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvciB8fCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5raW5kICE9IFwiQ29uc3RydWN0b3JEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBcIk1hbGZvcm1lZCBvciBpbnZhbGlkIHJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBcIlJlZmVyZW5jZSBjbGFzc2VzIG11c3QgZGVjbGFyZSBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmlkID0gYGNsYXNzOiR7Y2xhc3NJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8XG4gICAgICBjbGFzc2VzLmhhcyhkZWNsYXJhdGlvbi5pZCkgfHwgdHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBkZWNsYXJhdGlvbi5uYW1lLmxlbmd0aCA9PSAwIHx8IG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9DTEFTU1wiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcmVmZXJlbmNlIGNsYXNzICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBjbGFzc2VzLnNldChkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb24pXG5cbiAgICBjb25zdCBmaWVsZE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGxldCBmaWVsZEluZGV4ID0gMDsgZmllbGRJbmRleCA8IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGg7IGZpZWxkSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbZmllbGRJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06ZmllbGQ6JHtmaWVsZEluZGV4fWBcblxuICAgICAgaWYgKCFmaWVsZCB8fCBmaWVsZC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9QUklWQVRFX0ZJRUxEXCIsIFwiTWFsZm9ybWVkIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKGZpZWxkLmlkICE9IGV4cGVjdGVkSWQgfHwgdHlwZW9mIGZpZWxkLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBmaWVsZC5uYW1lLmxlbmd0aCA9PSAwIHx8IGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUFJJVkFURV9GSUVMRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgcHJpdmF0ZSBmaWVsZCAnJHtTdHJpbmcoZmllbGQubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24oZmllbGQsIFwibmFtZVwiKSlcbiAgICAgIH1cbiAgICAgIGZpZWxkTmFtZXMuYWRkKGZpZWxkLm5hbWUpXG4gICAgfVxuICAgIGNvbnN0IGludmFsaWRPd25lZEZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKHt0eXBlfSkgPT4gY29udGFpbnNPd25lZFR5cGUodHlwZSkgJiYgdHlwZS5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcblxuICAgIGlmIChpbnZhbGlkT3duZWRGaWVsZCkge1xuICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbWF5IGNvbnRhaW4gb3duZXJzaGlwIG9ubHkgaW4gb25lIGRpcmVjdCByZXNvdXJjZSBmaWVsZC5gLCBpbnZhbGlkT3duZWRGaWVsZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3duZWRGaWVsZHMgPSBkZWNsYXJhdGlvbi5maWVsZHMuZmlsdGVyKCh7dHlwZX0pID0+IHR5cGU/LmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKVxuXG4gICAgaWYgKG93bmVkRmllbGRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIG1heSBvd24gZXhhY3RseSBvbmUgZGlyZWN0IHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAob3duZWRGaWVsZHMubGVuZ3RoID09IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlByaXZhdGVGaWVsZCAmIHt0eXBlOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLk93bmVkUmVzb3VyY2VUeXBlfX0gKi8gKG93bmVkRmllbGRzWzBdKVxuICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7ZmllbGRJZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIm93bmVkUmVzb3VyY2VcIiksXG4gICAgICAgIHJlc291cmNlSWQ6IGZpZWxkLnR5cGUucmVzb3VyY2VJZH1cblxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLm93bmVyc2hpcCA9IGV4cGVjdGVkXG4gICAgICBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShkZWNsYXJhdGlvbi5vd25lcnNoaXApICE9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBtYWxmb3JtZWQgcmVzb3VyY2Ugb3duZXJzaGlwIG1ldGFkYXRhLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGNvbnRhaW4gaXRzIGRlY2xhcmVkIHJlc291cmNlIGZpZWxkLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbnN0cnVjdG9ySWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06Y29uc3RydWN0b3JgXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uY29uc3RydWN0b3IuaWQgPSBjb25zdHJ1Y3RvcklkXG4gICAgaWYgKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkICE9IGNvbnN0cnVjdG9ySWQgfHwgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycykgfHxcbiAgICAgICFkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5IHx8IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmJvZHkua2luZCAhPSBcIkJsb2NrXCIpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQ09OU1RSVUNUT1JcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24uY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZXMgPSBuZXcgU2V0KClcblxuICAgIGZvciAobGV0IG1ldGhvZEluZGV4ID0gMDsgbWV0aG9kSW5kZXggPCBkZWNsYXJhdGlvbi5tZXRob2RzLmxlbmd0aDsgbWV0aG9kSW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kc1ttZXRob2RJbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkSWQgPSBgJHtkZWNsYXJhdGlvbi5pZH06bWV0aG9kOiR7bWV0aG9kSW5kZXh9YFxuXG4gICAgICBpZiAoIW1ldGhvZCB8fCBtZXRob2Qua2luZCAhPSBcIk1ldGhvZERlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9NRVRIT0RcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCBtZXRob2QgZGVjbGFyYXRpb24uXCIsIG1ldGhvZD8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgbWV0aG9kLmlkID0gZXhwZWN0ZWRJZFxuICAgICAgaWYgKG1ldGhvZC5pZCAhPSBleHBlY3RlZElkIHx8IHR5cGVvZiBtZXRob2QubmFtZSAhPSBcInN0cmluZ1wiIHx8IG1ldGhvZC5uYW1lLmxlbmd0aCA9PSAwIHx8IG1ldGhvZE5hbWVzLmhhcyhtZXRob2QubmFtZSkgfHxcbiAgICAgICAgIUFycmF5LmlzQXJyYXkobWV0aG9kLnBhcmFtZXRlcnMpIHx8ICFtZXRob2QuYm9keSB8fCBtZXRob2QuYm9keS5raW5kICE9IFwiQmxvY2tcIikge1xuICAgICAgICBmYWlsKFwiRFVQTElDQVRFX01FVEhPRFwiLCBgRHVwbGljYXRlIG9yIGludmFsaWQgbWV0aG9kICcke1N0cmluZyhtZXRob2QubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24obWV0aG9kLCBcIm5hbWVcIikpXG4gICAgICB9XG4gICAgICBtZXRob2ROYW1lcy5hZGQobWV0aG9kLm5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsYXNzZXNcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZXhhY3QgY29uc3RydWN0aW9uLCBwcml2YXRlIHN0YXRlLCBhbmQgbWV0aG9kIGJvZGllcyBmb3Igb25lIGNsYXNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ2xhc3MgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIEZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGFuZCByZWZlcmVuY2UtY2xhc3MgcmVnaXN0cmllcy5cbiAqIEBwYXJhbSB7RXJyb3JSZWdpc3RyeX0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gRnVuY3Rpb24gY2FsbCBlZmZlY3RzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gcmVzZXJ2ZWRWYWx1ZU5hbWVzIC0gTW9kdWxlLXJlc2VydmVkIG5hbWVzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgcmVzb2x1dGlvbnMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lcnNoaXAgcmVnaXN0cnkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDbGFzc0RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIHJlc2VydmVkVmFsdWVOYW1lcywgZmFpbCxcbiAgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcE93bmVycykge1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGZpZWxkLnR5cGUsIGZpZWxkLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpXG4gIH1cblxuICBjb25zdCBjb25zdHJ1Y3RvciA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yXG4gIGNvbnN0IGFjcXVpc2l0aW9uU3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzWzBdXG4gIGNvbnN0IGFjcXVpc2l0aW9uRXhwcmVzc2lvbiA9IGFjcXVpc2l0aW9uU3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgID8gYWNxdWlzaXRpb25TdGF0ZW1lbnQuZXhwcmVzc2lvbiA6IHVuZGVmaW5lZFxuICBjb25zdCBvd25lZEFjcXVpc2l0aW9uID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiICYmIGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGggPT0gMSAmJlxuICAgIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggPT0gMSAmJiBhY3F1aXNpdGlvblN0YXRlbWVudD8ua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5maWVsZCA9PSBkZWNsYXJhdGlvbi5vd25lcnNoaXAuZmllbGRJZCAmJiBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvblN0YXRlbWVudC5yZWNlaXZlci5jbGFzc0lkID09IGRlY2xhcmF0aW9uLmlkICYmIGFjcXVpc2l0aW9uRXhwcmVzc2lvbj8ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgJiZcbiAgICBhY3F1aXNpdGlvbkV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cua2luZCA9PSBcImFjcXVpcmVcIiAmJlxuICAgIGFjcXVpc2l0aW9uRXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvdy5yZXNvdXJjZUlkID09IGRlY2xhcmF0aW9uLm93bmVyc2hpcC5yZXNvdXJjZUlkXG5cbiAgaWYgKHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhjb25zdHJ1Y3Rvci5ib2R5LCBjYWxsRWZmZWN0cykuc2l6ZSA+IDAgJiYgIW93bmVkQWNxdWlzaXRpb24pIHtcbiAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIFwiUmVmZXJlbmNlIGNvbnN0cnVjdG9ycyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLlwiLCBjb25zdHJ1Y3Rvci5sb2NhdGlvbilcbiAgfVxuXG4gIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJlxuICAgIChjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoIHx8IGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCkpIHtcbiAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgZXZlcnkgcHJpdmF0ZSBmaWVsZCBleGFjdGx5IG9uY2UgaW4gZGVjbGFyYXRpb24gb3JkZXIuYCxcbiAgICAgIGNvbnN0cnVjdG9yLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNvbnN0cnVjdG9yU2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBuZXcgU2V0KCksIGRlY2xhcmF0aW9uKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGNvbnN0cnVjdG9yLnBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHNbaW5kZXhdXG4gICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcylcblxuICAgIGlmICghb3duZWRBY3F1aXNpdGlvbiAmJiAhc2FtZVR5cGUodHlwZSwgZmllbGQudHlwZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9JyBtdXN0IGV4YWN0bHkgbWF0Y2ggcHJpdmF0ZSBmaWVsZCAnJHtmaWVsZC5uYW1lfScuYCwgcGFyYW1ldGVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIGNvbnN0cnVjdG9yU2NvcGUsIGZhaWwpXG4gICAgaWYgKG93bmVkQWNxdWlzaXRpb24pIGNvbnRpbnVlXG4gICAgY29uc3Qgc3RhdGVtZW50ID0gY29uc3RydWN0b3IuYm9keS5zdGF0ZW1lbnRzW2luZGV4XVxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gc3RhdGVtZW50Py5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIlxuICAgICAgPyBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiID8gc3RhdGVtZW50LmV4cHJlc3Npb24uZXhwcmVzc2lvbiA6IHN0YXRlbWVudC5leHByZXNzaW9uXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFzdGF0ZW1lbnQgfHwgc3RhdGVtZW50LmtpbmQgIT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5maWVsZCAhPSBmaWVsZC5pZCB8fFxuICAgICAgc3RhdGVtZW50LnJlY2VpdmVyPy5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHwgc3RhdGVtZW50LnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQgfHxcbiAgICAgIGluaXRpYWxpemVyPy5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIiB8fCBpbml0aWFsaXplci5uYW1lICE9IHBhcmFtZXRlci5uYW1lKSB7XG4gICAgICBmYWlsKFwiSU5DT01QTEVURV9JTklUSUFMSVpBVElPTlwiLCBgQ29uc3RydWN0b3IgZm9yICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtdXN0IGluaXRpYWxpemUgJyR7ZmllbGQubmFtZX0nIGZyb20gaXRzIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyLmAsXG4gICAgICAgIHN0YXRlbWVudD8ubG9jYXRpb24gPz8gY29uc3RydWN0b3IubG9jYXRpb24pXG4gICAgfVxuICB9XG4gIHZhbGlkYXRlQmxvY2soY29uc3RydWN0b3IuYm9keSwgY29uc3RydWN0b3JTY29wZSwge2tpbmQ6IFwiVHlwZVJlZmVyZW5jZVwiLCBuYW1lOiBcInZvaWRcIn0sIGZ1bmN0aW9ucywgcmVjb3JkcyxcbiAgICBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IGNvbnN0cnVjdG9yLCBvd25lcnM6IGxvb3BPd25lcnN9KVxuXG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICBjb25zdCB1bnN1cHBvcnRlZE1ldGhvZEVmZmVjdHMgPSBbLi4uc3ludGFjdGljQmxvY2tFZmZlY3RzKG1ldGhvZC5ib2R5LCBjYWxsRWZmZWN0cyldXG4gICAgICAuZmlsdGVyKChpZCkgPT4gIS9eKD86bW9kdWxlOlswLTldK1xcLyk/Y2FwYWJpbGl0eTpbMC05XStcXC9mYWlsdXJlOlswLTldKyQvdS50ZXN0KGlkKSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgIT0gXCJvd25lZFJlc291cmNlXCIgJiYgdW5zdXBwb3J0ZWRNZXRob2RFZmZlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZhaWwoXCJVTlNVUFBPUlRFRF9TVEFURU1FTlRcIiwgYFJlZmVyZW5jZSBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBjYW5ub3QgZXhwb3NlIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzIGluIFRhc2sgMDMzLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgc2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIG1ldGhvZC5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgbmV3IFNldCgpLCBkZWNsYXJhdGlvbilcblxuICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIG1ldGhvZC5wYXJhbWV0ZXJzKSB7XG4gICAgICBjb25zdCB0eXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhwYXJhbWV0ZXIubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGV9LCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIiksIHNjb3BlLCBmYWlsKVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG4gICAgY29uc3QgZmxvdyA9IHZhbGlkYXRlQmxvY2sobWV0aG9kLmJvZHksIHNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IG1ldGhvZCwgb3duZXJzOiBsb29wT3duZXJzfSlcblxuICAgIGlmIChkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIpIG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpXG5cbiAgICBpZiAoIWlzVm9pZFR5cGUocmV0dXJuVHlwZSkgJiYgZmxvdy5ub3JtYWwpIHtcbiAgICAgIGZhaWwoXCJNSVNTSU5HX1JFVFVSTlwiLCBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIG1ldGhvZC5sb2NhdGlvbilcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj59IFt2aXNpYmxlRXJyb3JzXSAtIEltcG9ydGVkIGVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtFcnJvclJlZ2lzdHJ5fSBWYWxpZGF0ZWQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUVycm9yRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZUVycm9ycyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRXJyb3IgZGVjbGFyYXRpb25zIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgLyoqIEB0eXBlIHtuZXZlcn0gKi8gKHVuZGVmaW5lZCkpXG4gIC8qKiBAdHlwZSB7RXJyb3JSZWdpc3RyeX0gKi9cbiAgY29uc3QgZXJyb3JzID0gbmV3IE1hcCh2aXNpYmxlRXJyb3JzKVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZWNsYXJhdGlvbnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbnNbaW5kZXhdXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uIHx8IGRlY2xhcmF0aW9uLmtpbmQgIT0gXCJFcnJvckRlY2xhcmF0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBlcnJvciBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uaWQgPSBgZXJyb3I6JHtpbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/ZXJyb3I6WzAtOV0rJC91LnRlc3QoZGVjbGFyYXRpb24uaWQpIHx8IGVycm9ycy5oYXMoZGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0VSUk9SXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXCIsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRVJST1JcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIGVycm9yICcke1N0cmluZyhkZWNsYXJhdGlvbi5uYW1lKX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICBlcnJvcnMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIHJldHVybiBlcnJvcnNcbn1cblxuLyoqXG4gKiBBc3NpZ25zIGFuZCB2YWxpZGF0ZXMgb25lIGRlY2xhcmF0aW9uJ3MgaW52YXJpYW50IHVuYm91bmRlZCB0eXBlIHBhcmFtZXRlcnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gT3duaW5nIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUeXBlUGFyYW1ldGVycyhkZWNsYXJhdGlvbiwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucykge1xuICBpZiAoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmICghQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycykpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlR5cGUgcGFyYW1ldGVycyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgcGFyYW1ldGVyID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnNbaW5kZXhdXG4gICAgY29uc3Qga2V5cyA9IHBhcmFtZXRlciAmJiB0eXBlb2YgcGFyYW1ldGVyID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkocGFyYW1ldGVyKVxuICAgICAgPyBPYmplY3Qua2V5cyhwYXJhbWV0ZXIpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSA6IFwiXCJcblxuICAgIGlmICghT2JqZWN0Lmhhc093bihkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycywgaW5kZXgpIHx8ICFwYXJhbWV0ZXIgfHwgcGFyYW1ldGVyLmtpbmQgIT0gXCJUeXBlUGFyYW1ldGVyXCIgfHxcbiAgICAgIGtleXMgIT0gXCJpZCxraW5kLGxvY2F0aW9uLG5hbWVcIiB8fCB0eXBlb2YgcGFyYW1ldGVyLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBwYXJhbWV0ZXIubmFtZS5sZW5ndGggPT0gMCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgdHlwZSBwYXJhbWV0ZXIgZGVjbGFyYXRpb24uXCIsIHBhcmFtZXRlcj8ubG9jYXRpb24gPz8gZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChuYW1lcy5oYXMocGFyYW1ldGVyLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX1RZUEVfUEFSQU1FVEVSXCIsIGBEdXBsaWNhdGUgdHlwZSBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24ocGFyYW1ldGVyLCBcIm5hbWVcIikpXG4gICAgfVxuICAgIG5hbWVzLmFkZChwYXJhbWV0ZXIubmFtZSlcbiAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9OnR5cGU6JHtpbmRleH1gXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgcGFyYW1ldGVyLmlkID0gZXhwZWN0ZWRJZFxuICAgIGlmIChwYXJhbWV0ZXIuaWQgIT0gZXhwZWN0ZWRJZCkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9UWVBFX1BBUkFNRVRFUlwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIHR5cGUgcGFyYW1ldGVyIGlkZW50aXR5LlwiLCBwYXJhbWV0ZXIubG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2xvc2VkIGlkZW50aXR5IHNjb3BlIG93bmVkIGJ5IG9uZSB2YWxpZGF0ZWQgZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gRGVjbGFyYXRpb24uXG4gKiBAcmV0dXJucyB7U2V0PHN0cmluZz59IFR5cGUtcGFyYW1ldGVyIGlkZW50aXRpZXMuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcklkcyhkZWNsYXJhdGlvbikge1xuICByZXR1cm4gbmV3IFNldCgoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMgPz8gW10pLm1hcCgoe2lkfSkgPT4gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChpZCkpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBub21pbmFsIGRlY2xhcmF0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBzdGFibGUgaWRlbnRpdHkgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge3Vua25vd259IGRlY2xhcmF0aW9ucyAtIENhbmRpZGF0ZSBvcmRlcmVkIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gW3Zpc2libGVSZWNvcmRzXSAtIEltcG9ydGVkIHJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0NsYXNzUmVnaXN0cnl9IFtjbGFzc2VzXSAtIE1vZHVsZSByZWZlcmVuY2UgY2xhc3NlcyBieSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtSZWNvcmRSZWdpc3RyeX0gVmFsaWRhdGVkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZWNvcmREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlUmVjb3JkcyA9IG5ldyBNYXAoKSwgY2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb25zKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjb3JkIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGFuIG9yZGVyZWQgYXJyYXkuXCIsIC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICAvKiogQHR5cGUge1JlY29yZFJlZ2lzdHJ5fSAqL1xuICBjb25zdCByZWNvcmRzID0gbmV3IE1hcCh2aXNpYmxlUmVjb3JkcylcblxuICByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeS5zZXQocmVjb3JkcywgY2xhc3NlcylcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCByZWNvcmRJbmRleCA9IDA7IHJlY29yZEluZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgcmVjb3JkSW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zW3JlY29yZEluZGV4XVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiUmVjb3JkRGVjbGFyYXRpb25cIiB8fCAhQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5maWVsZHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgcmVjb3JkIGRlY2xhcmF0aW9uLlwiLCBkZWNsYXJhdGlvbj8ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBkZWNsYXJhdGlvbi5pZCA9IGByZWNvcmQ6JHtyZWNvcmRJbmRleH1gXG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/cmVjb3JkOlswLTldKyQvdS50ZXN0KGRlY2xhcmF0aW9uLmlkKSB8fCByZWNvcmRzLmhhcyhkZWNsYXJhdGlvbi5pZCkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUkVDT1JEXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9SRUNPUkRcIiwgYER1cGxpY2F0ZSByZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihkZWNsYXJhdGlvbiwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQoZGVjbGFyYXRpb24ubmFtZSlcbiAgICB2YWxpZGF0ZVR5cGVQYXJhbWV0ZXJzKGRlY2xhcmF0aW9uLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIHJlY29yZHMuc2V0KGRlY2xhcmF0aW9uLmlkLCBkZWNsYXJhdGlvbilcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB7XG4gICAgY29uc3QgZmllbGROYW1lcyA9IG5ldyBTZXQoKVxuICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuXG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOyBmaWVsZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2ZpZWxkSW5kZXhdXG5cbiAgICAgIGlmICghZmllbGQgfHwgZmllbGQua2luZCAhPSBcIlJlY29yZEZpZWxkXCIpIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIHJlY29yZCBmaWVsZC5cIiwgZmllbGQ/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZpZWxkLmlkID0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gXG4gICAgICBpZiAodHlwZW9mIGZpZWxkLmlkICE9IFwic3RyaW5nXCIgfHwgZmllbGQuaWQgIT0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRklFTERcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCByZWNvcmQgZmllbGQgaWRlbnRpdHkuXCIsIGZpZWxkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkTmFtZXMuaGFzKGZpZWxkLm5hbWUpKSBmYWlsKFwiRFVQTElDQVRFX0ZJRUxEXCIsIGBEdXBsaWNhdGUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHJvbGVMb2NhdGlvbihmaWVsZCwgXCJuYW1lXCIpKVxuICAgICAgZmllbGROYW1lcy5hZGQoZmllbGQubmFtZSlcbiAgICAgIGlmIChjb250YWluc093bmVkVHlwZShmaWVsZC50eXBlKSkge1xuICAgICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgY2Fubm90IGJlIHN0b3JlZCBpbiBpbW11dGFibGUgcmVjb3Jkcy5cIiwgZmllbGQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgICB9XG4gIH1cbiAgdmFsaWRhdGVEaXJlY3RSZWNvcmRSZWN1cnNpb24oZGVjbGFyYXRpb25zLCByZWNvcmRzLCBmYWlsKVxuXG4gIHJldHVybiByZWNvcmRzXG59XG5cbi8qKlxuICogUmVqZWN0cyBjeWNsZXMgY29tcG9zZWQgc29sZWx5IG9mIHVubWVkaWF0ZWQgcmVjb3JkIGZpZWxkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbltdfSBkZWNsYXJhdGlvbnMgLSBWYWxpZCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gRGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGlyZWN0UmVjb3JkUmVjdXJzaW9uKGRlY2xhcmF0aW9ucywgcmVjb3JkcywgZmFpbCkge1xuICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQoKVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgb25lIGRlY2xhcmF0aW9uIGFsb25nIGFuIHVubWVkaWF0ZWQgcmVjb3JkIHBhdGguXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBDdXJyZW50IGRlY2xhcmF0aW9uLlxuICAgKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBhY3RpdmUgLSBEZWNsYXJhdGlvbiBpZGVudGl0aWVzIGFjdGl2ZSBvbiB0aGlzIHBhdGguXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQoZGVjbGFyYXRpb24sIGFjdGl2ZSkge1xuICAgIGlmIChjb21wbGV0ZS5oYXMoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCkpKSByZXR1cm5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChhY3RpdmUpXG5cbiAgICBuZXh0LmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRlY2xhcmF0aW9uLmZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikgY29udGludWVcbiAgICAgIGlmIChuZXh0LmhhcyhmaWVsZC50eXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgIGZhaWwoXCJJTExFR0FMX1JFQ09SRF9SRUNVUlNJT05cIiwgYERpcmVjdCB2YWx1ZS1yZWN1cnNpdmUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHR5cGVMb2NhdGlvbihmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCByZWZlcmVuY2VkID0gcmVjb3Jkcy5nZXQoZmllbGQudHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgICBpZiAocmVmZXJlbmNlZCkgdmlzaXQocmVmZXJlbmNlZCwgbmV4dClcbiAgICB9XG4gICAgY29tcGxldGUuYWRkKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpKVxuICB9XG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBkZWNsYXJhdGlvbnMpIHZpc2l0KGRlY2xhcmF0aW9uLCBuZXcgU2V0KCkpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBub24tdm9pZCBmdW5jdGlvbiBhbmQgaXRzIGNvbXBsZXRlIGNvbnRyb2wgZmxvdy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIEZ1bmN0aW9uIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBGdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEludGVybmFsbHkgaW5mZXJyZWQgdW5jaGVja2VkLWVycm9yIGVmZmVjdHMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSByZXNlcnZlZFZhbHVlTmFtZXMgLSBNb2R1bGUgZnVuY3Rpb25zIGFuZCBub21pbmFsIGNvbnN0cnVjdG9ycyB1bmF2YWlsYWJsZSB0byBsZXhpY2FsIGJpbmRpbmdzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBsb29wT3duZXJzIC0gTG9vcCBvd25lciBieSBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpIHtcbiAgY29uc3QgdHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZGVjbGFyYXRpb24pXG4gIGNvbnN0IHNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBkZWNsYXJhdGlvbi5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZGVjbGFyYXRpb24ucGFyYW1ldGVycykge1xuICAgIGNvbnN0IHR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgZGVjbGFyZUJpbmRpbmcocGFyYW1ldGVyLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlfSwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgfVxuXG4gIGNvbnN0IHJldHVyblR5cGUgPSB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgZGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuICBjb25zdCByZXR1cm5zID0gdmFsaWRhdGVCbG9jayhkZWNsYXJhdGlvbi5ib2R5LCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtvd25lcjogZGVjbGFyYXRpb24sIG93bmVyczogbG9vcE93bmVyc30pXG5cbiAgaWYgKCFpc1ZvaWRUeXBlKHJldHVyblR5cGUpICYmIHJldHVybnMubm9ybWFsKSB7XG4gICAgZmFpbChcIk1JU1NJTkdfUkVUVVJOXCIsIGBGdW5jdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScgZG9lcyBub3QgcmV0dXJuIG9uIGV2ZXJ5IHJlYWNoYWJsZSBwYXRoLmAsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBvcmRlcmVkIGJsb2NrIGFuZCByZXBvcnRzIHdoZXRoZXIgZXZlcnkgcGF0aCByZXR1cm5zLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIFNlbWFudGljIGJsb2NrLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBTY29wZSBiZWxvbmdpbmcgdG8gdGhpcyBibG9jay5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZSB8IHVuZGVmaW5lZH0gcmV0dXJuVHlwZSAtIEZ1bmN0aW9uIHJldHVybiB0eXBlLCBhYnNlbnQgZm9yIGVudHJ5IHBvaW50cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gRnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBJbnRlcm5hbGx5IGluZmVycmVkIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtMb29wRmxvd0NvbnRleHR9IGxvb3BDb250ZXh0IC0gQWN0aXZlIGxvb3AgYW5kIG93bmVyIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7e25vcm1hbDogYm9vbGVhbiwgcmFpc2VzOiBTZXQ8c3RyaW5nPn19IFJlYWNoYWJsZSBub3JtYWwgY29udGludWF0aW9uIGFuZCBlc2NhcGluZyBlcnJvciBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUJsb2NrKGJsb2NrLCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dCkge1xuICBsZXQgbm9ybWFsID0gdHJ1ZVxuICBjb25zdCByYWlzZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFub3JtYWwpIGZhaWwoXCJVTlJFQUNIQUJMRV9TVEFURU1FTlRcIiwgXCJTdGF0ZW1lbnQgaXMgdW5yZWFjaGFibGUuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcblxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikge1xuICAgICAgY29uc3QgZGVjbGFyZWRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LnR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBzY29wZS50eXBlUGFyYW1ldGVycylcbiAgICAgIHN0YXRlbWVudC5pbml0aWFsaXplciA9IG5vcm1hbGl6ZU93bmVkTW92ZShzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGRlY2xhcmVkVHlwZSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmluaXRpYWxpemVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIGluaXRpYWxpemVyXCIsIGRlY2xhcmVkVHlwZVxuICAgICAgKVxuXG4gICAgICBzY29wZS5wZW5kaW5nLmRlbGV0ZShzdGF0ZW1lbnQubmFtZSlcbiAgICAgIGlmICghc2FtZVR5cGUoaW5pdGlhbGl6ZXJUeXBlLCBkZWNsYXJlZFR5cGUpKSB7XG4gICAgICAgIGlmIChpbml0aWFsaXplclR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGRlY2xhcmVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgICBmYWlsKFwiRkFJTFVSRV9BQlNFTkNFX0NPTkZMQVRJT05cIiwgXCJPcHRpb25hbCBhYnNlbmNlIGNhbm5vdCBiZSBjb2VyY2VkIGludG8gYSB2YWx1ZSBvciB0eXBlZCBmYWlsdXJlLlwiLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEluaXRpYWxpemVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oaW5pdGlhbGl6ZXJUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGRlY2xhcmVkVHlwZSl9LmAsIHN0YXRlbWVudC5pbml0aWFsaXplci5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5uYW1lLCB7XG4gICAgICAgIGtub3duVmFsdWU6IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKHN0YXRlbWVudC5pbml0aWFsaXplciwgc2NvcGUpLFxuICAgICAgICBtdXRhYmxlOiBzdGF0ZW1lbnQubXV0YWJsZSxcbiAgICAgICAgdHlwZTogZGVjbGFyZWRUeXBlXG4gICAgICB9LCByb2xlTG9jYXRpb24oc3RhdGVtZW50LCBcIm5hbWVcIiksIHNjb3BlLCBmYWlsKVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gcmVzb2x2ZUJpbmRpbmcoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBzdGF0ZW1lbnQudGFyZ2V0LmxvY2F0aW9uLCBzY29wZSwgZmFpbClcblxuICAgICAgaWYgKGJpbmRpbmcudHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIklNTVVUQUJMRV9BU1NJR05NRU5UXCIsIGBDYW5ub3QgYXNzaWduIHRvIGltbXV0YWJsZSBjYXRjaCBiaW5kaW5nICcke3N0YXRlbWVudC50YXJnZXQubmFtZX0nLmAsIHN0YXRlbWVudC50YXJnZXQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoYmluZGluZy50eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IGJpbmRpbmcudHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIFwiT3duZWQgcmVzb3VyY2VzIGNhbm5vdCBiZSByZWFzc2lnbmVkIG9yIGFsaWFzZWQuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cHJlc3Npb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBhc3NpZ25tZW50XCIsIGJpbmRpbmcudHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIWJpbmRpbmcubXV0YWJsZSkge1xuICAgICAgICBmYWlsKFwiSU1NVVRBQkxFX0FTU0lHTk1FTlRcIiwgYENhbm5vdCBhc3NpZ24gdG8gaW1tdXRhYmxlIGJpbmRpbmcgJyR7c3RhdGVtZW50LnRhcmdldC5uYW1lfScuYCwgc3RhdGVtZW50LnRhcmdldC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc2FtZVR5cGUoZXhwcmVzc2lvblR5cGUsIGJpbmRpbmcudHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEFzc2lnbm1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihleHByZXNzaW9uVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihiaW5kaW5nLnR5cGUpfS5gLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSlcbiAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHNjb3BlLmN1cnJlbnRDbGFzc1xuXG4gICAgICBpZiAoIWRlY2xhcmF0aW9uIHx8ICFzdGF0ZW1lbnQucmVjZWl2ZXIgfHwgc3RhdGVtZW50LnJlY2VpdmVyLmtpbmQgIT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIiB8fFxuICAgICAgICBzdGF0ZW1lbnQucmVjZWl2ZXIuY2xhc3NJZCAhPSBkZWNsYXJhdGlvbi5pZCkge1xuICAgICAgICBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlByaXZhdGUgZmllbGQgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgZGVjbGFyaW5nIGNsYXNzIHJlY2VpdmVyLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBzdGF0ZW1lbnQuZmllbGQpXG5cbiAgICAgIGlmICghZmllbGQpIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCBpZGVudGl0eSBpcyBub3Qgb3duZWQgYnkgdGhlIGRlY2xhcmluZyBjbGFzcy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBub3JtYWxpemVPd25lZE1vdmUoc3RhdGVtZW50LmV4cHJlc3Npb24sIGZpZWxkLnR5cGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBleHByZXNzaW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBwcml2YXRlIGZpZWxkIGFzc2lnbm1lbnRcIiwgZmllbGQudHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGV4cHJlc3Npb25UeXBlLCBmaWVsZC50eXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUHJpdmF0ZSBmaWVsZCBhc3NpZ25tZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oZXhwcmVzc2lvblR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZmllbGQudHlwZSl9LmAsXG4gICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5leHByZXNzaW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlByaW50U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IHByaW50ZWRUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgcHJpbnQgdmFsdWVcIilcblxuICAgICAgaWYgKHByaW50ZWRUeXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiIHx8IHByaW50ZWRUeXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgICBmYWlsKFwiQk9SUk9XX0VTQ0FQRVwiLCBcIk93bmVkIHZhbHVlcyBjYW5ub3QgZXNjYXBlIHRocm91Z2ggcHJpbnRpbmcgb3Igc2VyaWFsaXphdGlvbi5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAocHJpbnRlZFR5cGUua2luZCAhPSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbGxlY3Rpb25zIGFuZCByZWNvcmRzIGNhbm5vdCBiZSBwcmludGVkIGRpcmVjdGx5LlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRXhwcmVzc2lvblN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5leHByZXNzaW9uIHx8ICFbXCJDYWxsRXhwcmVzc2lvblwiLCBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIsIFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIl0uaW5jbHVkZXMoc3RhdGVtZW50LmV4cHJlc3Npb24ua2luZCkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJFeHByZXNzaW9uIHN0YXRlbWVudCBtdXN0IGNvbnRhaW4gYSBkaXJlY3Qgb3IgcmVjZWl2ZXIgY2FsbC5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgZXhwcmVzc2lvblR5cGUgPSBpbmZlckV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuXG4gICAgICBpZiAoZXhwcmVzc2lvblR5cGUgIT0gXCJ2b2lkXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJFeHByZXNzaW9uIHN0YXRlbWVudHMgbWF5IGNvbnRhaW4gb25seSB2b2lkIGNhbGxzLlwiLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQnJlYWtTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQua2luZCA9PSBcIkNvbnRpbnVlU3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgPyBcImJyZWFrXCIgOiBcImNvbnRpbnVlXCJcblxuICAgICAgaWYgKCFsb29wQ29udGV4dC5uZWFyZXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50LnRhcmdldExvb3BJZCA9PSBcInN0cmluZ1wiICYmIGxvb3BDb250ZXh0Lm93bmVycy5oYXMoc3RhdGVtZW50LnRhcmdldExvb3BJZCkgJiZcbiAgICAgICAgICBsb29wQ29udGV4dC5vd25lcnMuZ2V0KHN0YXRlbWVudC50YXJnZXRMb29wSWQpICE9PSBsb29wQ29udGV4dC5vd25lcikge1xuICAgICAgICAgIGZhaWwoXCJDUk9TU19GVU5DVElPTl9MT09QX1RBUkdFVFwiLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSB0YXJnZXQgY3Jvc3NlcyBhIGZ1bmN0aW9uIGJvdW5kYXJ5LmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBmYWlsKGBJTExFR0FMXyR7Y29udHJvbC50b1VwcGVyQ2FzZSgpfV9DT05URVhUYCwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gc3RhdGVtZW50IG91dHNpZGUgYSBsb29wLmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2Ygc3RhdGVtZW50LnRhcmdldExvb3BJZCAhPSBcInN0cmluZ1wiIHx8ICFsb29wQ29udGV4dC5vd25lcnMuaGFzKHN0YXRlbWVudC50YXJnZXRMb29wSWQpKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IGhhcyBhbiBpbnZhbGlkIGxvb3AgdGFyZ2V0IGlkZW50aXR5LmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChsb29wQ29udGV4dC5vd25lcnMuZ2V0KHN0YXRlbWVudC50YXJnZXRMb29wSWQpICE9PSBsb29wQ29udGV4dC5vd25lcikge1xuICAgICAgICBmYWlsKFwiQ1JPU1NfRlVOQ1RJT05fTE9PUF9UQVJHRVRcIiwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gdGFyZ2V0IGNyb3NzZXMgYSBmdW5jdGlvbiBib3VuZGFyeS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LnRhcmdldExvb3BJZCAhPSBsb29wQ29udGV4dC5uZWFyZXN0LmlkKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IG11c3QgdGFyZ2V0IHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLmAsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIG5vcm1hbCA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFyZXR1cm5UeXBlKSBmYWlsKFwiSUxMRUdBTF9SRVRVUk5fQ09OVEVYVFwiLCBcIlJldHVybiBzdGF0ZW1lbnQgb3V0c2lkZSBhIGZ1bmN0aW9uLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICBpZiAoaXNWb2lkVHlwZShyZXR1cm5UeXBlKSkge1xuICAgICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmYWlsKFwiVk9JRF9SRVRVUk5fVkFMVUVcIiwgXCJWb2lkIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSB2YWx1ZS5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghc3RhdGVtZW50LmV4cHJlc3Npb24pIHtcbiAgICAgICAgICBmYWlsKFwiTUlTU0lOR19SRVRVUk5fVkFMVUVcIiwgYEZ1bmN0aW9uIHJldHVybiByZXF1aXJlcyBhICR7dHlwZURlc2NyaXB0aW9uKHJldHVyblR5cGUpfSB2YWx1ZS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24gPSBub3JtYWxpemVPd25lZE1vdmUoc3RhdGVtZW50LmV4cHJlc3Npb24sIHJldHVyblR5cGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sXG4gICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgZnVuY3Rpb25zLFxuICAgICAgICAgIHJlY29yZHMsXG4gICAgICAgICAgZmFpbCxcbiAgICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgICAgIFwiYSByZXR1cm5lZCB2YWx1ZVwiLFxuICAgICAgICAgIHJldHVyblR5cGVcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsVHlwZSwgcmV0dXJuVHlwZSkpIHtcbiAgICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUmV0dXJuIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXR1cm5UeXBlKX0uYCwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQuZXhwcmVzc2lvbikgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBub3JtYWwgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY29uZGl0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uXCIpXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKGNvbmRpdGlvblR5cGUsIFwiYm9vbGVhblwiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0JPT0xFQU5fQ09ORElUSU9OXCIsIGBJZiBjb25kaXRpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb25kaXRpb25UeXBlKX07IGV4cGVjdGVkIGJvb2xlYW4uYCwgc3RhdGVtZW50LmNvbmRpdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVCaW5kaW5ncyA9IGJpbmRpbmdzVmlzaWJsZUZyb20oc2NvcGUpXG4gICAgICBjb25zdCBpbml0aWFsS25vd25WYWx1ZXMgPSB2aXNpYmxlQmluZGluZ3MubWFwKChiaW5kaW5nKSA9PiBiaW5kaW5nLmtub3duVmFsdWUpXG4gICAgICBjb25zdCBjb25zZXF1ZW50U2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmNvbnNlcXVlbnQuc3RhdGVtZW50cylcbiAgICAgIGNvbnN0IGFsdGVybmF0ZVNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5hbHRlcm5hdGU/LnN0YXRlbWVudHMgPz8gW10pXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBjb25zZXF1ZW50U2NvcGUsIHRydWUpXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBhbHRlcm5hdGVTY29wZSwgZmFsc2UpXG4gICAgICBjb25zdCBjb25zZXF1ZW50UmV0dXJucyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmNvbnNlcXVlbnQsIGNvbnNlcXVlbnRTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcbiAgICAgIGNvbnN0IGNvbnNlcXVlbnRLbm93blZhbHVlcyA9IHZpc2libGVCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcua25vd25WYWx1ZSlcblxuICAgICAgdmlzaWJsZUJpbmRpbmdzLmZvckVhY2goKGJpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IGluaXRpYWxLbm93blZhbHVlc1tpbmRleF1cbiAgICAgIH0pXG4gICAgICBsZXQgYWx0ZXJuYXRlUmV0dXJucyA9IHtub3JtYWw6IHRydWUsIHJhaXNlczogbmV3IFNldCgpfVxuXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkge1xuICAgICAgICBhbHRlcm5hdGVSZXR1cm5zID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBhbHRlcm5hdGVTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsdGVybmF0ZUtub3duVmFsdWVzID0gdmlzaWJsZUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5rbm93blZhbHVlKVxuXG4gICAgICB2aXNpYmxlQmluZGluZ3MuZm9yRWFjaCgoYmluZGluZywgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCFjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWwpIGJpbmRpbmcua25vd25WYWx1ZSA9IGFsdGVybmF0ZUtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICBlbHNlIGlmIChjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgIWFsdGVybmF0ZVJldHVybnMubm9ybWFsKSBiaW5kaW5nLmtub3duVmFsdWUgPSBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICAgIGVsc2UgaWYgKGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbCAmJiBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdID09PSBhbHRlcm5hdGVLbm93blZhbHVlc1tpbmRleF0pIHtcbiAgICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSBjb25zZXF1ZW50S25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICAgIH0gZWxzZSBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgIH0pXG4gICAgICBjb25zdCBjb250aW51aW5nUHJvb2ZzID0gIWNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgICA/IGFsdGVybmF0ZVNjb3BlLnByZXNlbmNlUHJvb2ZzXG4gICAgICAgIDogY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmICFhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgICAgID8gY29uc2VxdWVudFNjb3BlLnByZXNlbmNlUHJvb2ZzXG4gICAgICAgICAgOiBjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgICAgID8gbmV3IFNldChbLi4uY29uc2VxdWVudFNjb3BlLnByZXNlbmNlUHJvb2ZzXS5maWx0ZXIoKGJpbmRpbmcpID0+IGFsdGVybmF0ZVNjb3BlLnByZXNlbmNlUHJvb2ZzLmhhcyhiaW5kaW5nKSkpXG4gICAgICAgICAgICA6IG5ldyBTZXQoKVxuICAgICAgY29uc3QgdmlzaWJsZVNldCA9IG5ldyBTZXQodmlzaWJsZUJpbmRpbmdzKVxuXG4gICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5jbGVhcigpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgY29udGludWluZ1Byb29mcykge1xuICAgICAgICBpZiAodmlzaWJsZVNldC5oYXMoYmluZGluZykpIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmFkZChiaW5kaW5nKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGNvbnNlcXVlbnRSZXR1cm5zLnJhaXNlcylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGFsdGVybmF0ZVJldHVybnMucmFpc2VzKVxuICAgICAgbm9ybWFsID0gY29uc2VxdWVudFJldHVybnMubm9ybWFsIHx8IGFsdGVybmF0ZVJldHVybnMubm9ybWFsXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25kaXRpb24tY29udHJvbGxlZCBsb29wIGNvbmRpdGlvblwiXG4gICAgICApXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKGNvbmRpdGlvblR5cGUsIFwiYm9vbGVhblwiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0JPT0xFQU5fQ09ORElUSU9OXCIsIGBXaGlsZSBjb25kaXRpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb25kaXRpb25UeXBlKX07IGV4cGVjdGVkIGJvb2xlYW4uYCwgc3RhdGVtZW50LmNvbmRpdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKHN0YXRlbWVudC5jb25kaXRpb24sIHNjb3BlLCBsb29wU2NvcGUsIHRydWUpXG4gICAgICBjb25zdCBib2R5RmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmJvZHksIGxvb3BTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7bmVhcmVzdDogc3RhdGVtZW50LCBvd25lcjogbG9vcENvbnRleHQub3duZXIsIG93bmVyczogbG9vcENvbnRleHQub3duZXJzfSlcblxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuY29uZGl0aW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBsaXN0VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQubGlzdCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBpdGVyYXRpb24gY29sbGVjdGlvblwiKVxuXG4gICAgICBpZiAobGlzdFR5cGUua2luZCAhPSBcIkxpc3RUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYEl0ZXJhdGlvbiBjb2xsZWN0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24obGlzdFR5cGUpfTsgZXhwZWN0ZWQgbGlzdC5gLCBzdGF0ZW1lbnQubGlzdC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdGVtZW50LnZhbHVlQmluZGluZyB8fCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkl0ZXJhdGlvbiByZXF1aXJlcyBvbmUgdHlwZWQgdmFsdWUgYmluZGluZy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJdGVyYXRpb24gYmluZGluZyBtdXN0IGJlIGltbXV0YWJsZS5cIiwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbiA/PyBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBzY29wZS50eXBlUGFyYW1ldGVycylcblxuICAgICAgaWYgKCFzYW1lVHlwZShiaW5kaW5nVHlwZSwgbGlzdFR5cGUuZWxlbWVudFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBJdGVyYXRpb24gYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmdUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGxpc3RUeXBlLmVsZW1lbnRUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuYm9keSwgc2NvcGUpXG5cbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgbG9vcFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5ib2R5LnN0YXRlbWVudHMpXG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG11dGFibGU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcsIFwibmFtZVwiKSwgbG9vcFNjb3BlLCBmYWlsKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBsb29wU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywge25lYXJlc3Q6IHN0YXRlbWVudCwgb3duZXI6IGxvb3BDb250ZXh0Lm93bmVyLCBvd25lcnM6IGxvb3BDb250ZXh0Lm93bmVyc30pXG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5saXN0LCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiRm9yRWFjaE1hcFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBtYXBUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKHN0YXRlbWVudC5tYXAsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICAgIFwiYSBtYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb25cIilcblxuICAgICAgaWYgKG1hcFR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24gY29sbGVjdGlvbiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUpfTsgZXhwZWN0ZWQgb3JkZXJlZCBtYXAuYCwgc3RhdGVtZW50Lm1hcC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmICghc3RhdGVtZW50LmtleUJpbmRpbmcgfHwgc3RhdGVtZW50LmtleUJpbmRpbmcua2luZCAhPSBcIlZhbHVlQmluZGluZ1wiIHx8XG4gICAgICAgICFzdGF0ZW1lbnQudmFsdWVCaW5kaW5nIHx8IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcua2luZCAhPSBcIlZhbHVlQmluZGluZ1wiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFwIGl0ZXJhdGlvbiByZXF1aXJlcyBleGFjdCBrZXkgYW5kIHZhbHVlIGJpbmRpbmdzLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LmtleUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UgfHwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5tdXRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBpdGVyYXRpb24gYmluZGluZ3MgbXVzdCBiZSBpbW11dGFibGUuXCIsXG4gICAgICAgICAgc3RhdGVtZW50LmtleUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UgPyBzdGF0ZW1lbnQua2V5QmluZGluZy5sb2NhdGlvbiA6IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBrZXlUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LmtleUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24sIGZhaWwsXG4gICAgICAgIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24sIGZhaWwsXG4gICAgICAgIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoa2V5VHlwZSwgbWFwVHlwZS5rZXlUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGl0ZXJhdGlvbiBrZXkgYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGtleVR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24obWFwVHlwZS5rZXlUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LmtleUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgaWYgKCFzYW1lVHlwZSh2YWx1ZVR5cGUsIG1hcFR5cGUudmFsdWVUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGl0ZXJhdGlvbiB2YWx1ZSBiaW5kaW5nIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24odmFsdWVUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUudmFsdWVUeXBlKX0uYCxcbiAgICAgICAgICB0eXBlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuYm9keSwgc2NvcGUpXG5cbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29uc3QgbG9vcFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5ib2R5LnN0YXRlbWVudHMpXG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5rZXlCaW5kaW5nLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlOiBrZXlUeXBlfSxcbiAgICAgICAgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC5rZXlCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubmFtZSwge2tub3duVmFsdWU6IHVuZGVmaW5lZCwgbXV0YWJsZTogZmFsc2UsIHR5cGU6IHZhbHVlVHlwZX0sXG4gICAgICAgIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGJvZHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYm9keSwgbG9vcFNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsXG4gICAgICAgIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtuZWFyZXN0OiBzdGF0ZW1lbnQsIG93bmVyOiBsb29wQ29udGV4dC5vd25lciwgb3duZXJzOiBsb29wQ29udGV4dC5vd25lcnN9KVxuXG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5tYXAsIGNhbGxFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJhaXNlcywgYm9keUZsb3cucmFpc2VzKVxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncykge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudC5lcnJvciB8fCBzdGF0ZW1lbnQuZXJyb3Iua2luZCAhPSBcIkVycm9yQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgICAgZmFpbChcIk5PTl9FUlJPUl9SQUlTRVwiLCBcIlJhaXNlIHJlcXVpcmVzIG9uZSBjb25zdHJ1Y3RlZCBzZW1hbnRpYyBlcnJvci5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgcmFpc2VkVHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5lcnJvci5lcnJvciwgc3RhdGVtZW50LmVycm9yLmxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpXG4gICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gZXJyb3IgbWVzc2FnZVwiLCBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gICAgICApXG5cbiAgICAgIGlmICghaXNTY2FsYXJUeXBlKG1lc3NhZ2VUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgICBmYWlsKFwiTk9OX0VSUk9SX1JBSVNFXCIsIGBFcnJvciBtZXNzYWdlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24obWVzc2FnZVR5cGUpfTsgZXhwZWN0ZWQgc3RyaW5nLmAsIHN0YXRlbWVudC5lcnJvci5tZXNzYWdlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZSwgY2FsbEVmZmVjdHMpXG4gICAgICByYWlzZXMuYWRkKHJhaXNlZFR5cGUuZGVjbGFyYXRpb25JZClcbiAgICAgIG5vcm1hbCA9IGZhbHNlXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY2F1Z2h0VHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5jYXRjaFR5cGUsIHN0YXRlbWVudC5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuXG4gICAgICBpZiAoIXN0YXRlbWVudC5jYXRjaEJpbmRpbmcgfHwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5raW5kICE9IFwiQ2F0Y2hCaW5kaW5nXCIgfHwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5tdXRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9FUlJPUl9IQU5ETEVSXCIsIFwiQ2F0Y2ggcmVxdWlyZXMgb25lIGltbXV0YWJsZSB0eXBlZCBiaW5kaW5nLlwiLCBzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nPy5sb2NhdGlvbiA/PyBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBiaW5kaW5nVHlwZSA9IHZhbGlkYXRlRXJyb3JUeXBlKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcudHlwZSwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuXG4gICAgICBpZiAoYmluZGluZ1R5cGUuZGVjbGFyYXRpb25JZCAhPSBjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfRVJST1JfSEFORExFUlwiLCBcIkNhdGNoIGJpbmRpbmcgdHlwZSBtdXN0IGV4YWN0bHkgbWF0Y2ggaXRzIGhhbmRsZXIgdHlwZS5cIiwgc3RhdGVtZW50LmNhdGNoQmluZGluZy5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJvZHlBc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuICAgICAgY29uc3QgYXNzaWduZWRPdXRlckJpbmRpbmdzID0gbmV3IFNldChib2R5QXNzaWduZWRPdXRlckJpbmRpbmdzKVxuXG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmNhdGNoQm9keSwgc2NvcGUsIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncylcbiAgICAgIGNvbnN0IGJvZHlTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBib2R5U2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICBjb25zdCBjYXRjaFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5jYXRjaEJvZHkuc3RhdGVtZW50cylcblxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGJvZHlBc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIGNhdGNoU2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG5cbiAgICAgIGRlY2xhcmVCaW5kaW5nKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgIG11dGFibGU6IGZhbHNlLFxuICAgICAgICB0eXBlOiBiaW5kaW5nVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudC5jYXRjaEJpbmRpbmcsIFwibmFtZVwiKSwgY2F0Y2hTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGNhdGNoRmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmNhdGNoQm9keSwgY2F0Y2hTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wQ29udGV4dClcblxuICAgICAgaWYgKCFib2R5Rmxvdy5yYWlzZXMuaGFzKGNhdWdodFR5cGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgICAgZmFpbChcIlVOUkVBQ0hBQkxFX0hBTkRMRVJcIiwgYEhhbmRsZXIgZm9yICcke2Vycm9ycy5nZXQoY2F1Z2h0VHlwZS5kZWNsYXJhdGlvbklkKT8ubmFtZX0nIGNhbm5vdCBiZSByZWFjaGVkLmAsIHR5cGVMb2NhdGlvbihzdGF0ZW1lbnQuY2F0Y2hUeXBlLCBzdGF0ZW1lbnQubG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgYm9keUZsb3cucmFpc2VzLmRlbGV0ZShjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBjYXRjaEZsb3cucmFpc2VzKVxuICAgICAgbm9ybWFsID0gYm9keUZsb3cubm9ybWFsIHx8IGNhdGNoRmxvdy5ub3JtYWxcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB1bmV4cGVjdGVkID0gLyoqIEB0eXBlIHt7a2luZDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn19ICovIChzdGF0ZW1lbnQpXG5cbiAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIHVuZXhwZWN0ZWQua2luZCwgdW5leHBlY3RlZC5sb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB7bm9ybWFsLCByYWlzZXN9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBleGFjdCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgbG9jYXRpb24uXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIFZpc2libGUgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSBWYWxpZGF0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFcnJvclR5cGUodHlwZSwgbG9jYXRpb24sIGVycm9ycywgZmFpbCkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0VSUk9SXCIsIFwiSGFuZGxlciBvciByYWlzZSBpcyBtaXNzaW5nIGFuIGV4YWN0IGVycm9yIHR5cGUuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvclR5cGV9ICovICh0eXBlKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIkVycm9yVHlwZVwiIHx8XG4gICAgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFlcnJvcnMuaGFzKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKSkge1xuICAgIGZhaWwoXCJVTktOT1dOX0VSUk9SXCIsIGBVbmtub3duIGVycm9yIGRlY2xhcmF0aW9uICcke1N0cmluZyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gIH1cblxuICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogQWRkcyBldmVyeSBzb3VyY2UgdmFsdWUgdG8gb25lIHNldC5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHRhcmdldCAtIERlc3RpbmF0aW9uIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBzb3VyY2UgLSBTb3VyY2UgaWRlbnRpdGllcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRBbGwodGFyZ2V0LCBzb3VyY2UpIHtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpIHRhcmdldC5hZGQodmFsdWUpXG59XG5cbi8qKlxuICogQWRkcyB1bmNoZWNrZWQgZXJyb3JzIHJhaXNlZCB3aGlsZSBldmFsdWF0aW5nIG9uZSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gdGFyZ2V0IC0gRGVzdGluYXRpb24gaWRlbnRpdGllcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBzZW1hbnRpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gSW5mZXJyZWQgY2FsbCBlZmZlY3RzLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFttZXRob2RFZmZlY3RzXSAtIEluZmVycmVkIGVmZmVjdHMgYnkgcmVzb2x2ZWQgbWV0aG9kIGlkZW50aXR5LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFkZEV4cHJlc3Npb25FZmZlY3RzKHRhcmdldCwgZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgcGVuZGluZyA9IFtleHByZXNzaW9uXVxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCBzZWVuLmhhcyh2YWx1ZSkpIGNvbnRpbnVlXG4gICAgc2Vlbi5hZGQodmFsdWUpXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSBhZGRBbGwodGFyZ2V0LCBjYWxsRWZmZWN0cy5nZXQoUmVmbGVjdC5nZXQodmFsdWUsIFwiY2FsbGVlXCIpKSA/PyBuZXcgU2V0KCkpXG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiIHx8IFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgICAgY29uc3QgZmFpbHVyZXMgPSBSZWZsZWN0LmdldCh2YWx1ZSwgXCJmYWlsdXJlSWRzXCIpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmYWlsdXJlcykpIGZvciAoY29uc3QgZmFpbHVyZSBvZiBmYWlsdXJlcykgaWYgKHR5cGVvZiBmYWlsdXJlID09IFwic3RyaW5nXCIpIHRhcmdldC5hZGQoZmFpbHVyZSlcbiAgICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgICBhZGRBbGwodGFyZ2V0LCBtZXRob2RFZmZlY3RzLmdldChSZWZsZWN0LmdldCh2YWx1ZSwgXCJtZXRob2RcIikpID8/IG5ldyBTZXQoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCByZXNvbHV0aW9uID0gUmVmbGVjdC5nZXQodmFsdWUsIFwicmVzb2x1dGlvblwiKVxuICAgICAgY29uc3QgZmFpbHVyZXMgPSByZXNvbHV0aW9uICYmIHR5cGVvZiByZXNvbHV0aW9uID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChyZXNvbHV0aW9uLCBcImZhaWx1cmVJZHNcIikgOiB1bmRlZmluZWRcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZXMpKSBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIGlmICh0eXBlb2YgZmFpbHVyZSA9PSBcInN0cmluZ1wiKSB0YXJnZXQuYWRkKGZhaWx1cmUpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwic291cmNlUHJvdmVuYW5jZVwiLCBcInJlc29sdXRpb25cIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgcGVuZGluZy5wdXNoKC4uLmNoaWxkKVxuICAgICAgZWxzZSBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXJpdmVzIHVuY2hlY2tlZC1lcnJvciBwcm9wYWdhdGlvbiBvdmVyIHRoZSByZXNvbHZlZCBmaW5pdGUgZnVuY3Rpb24gZ3JhcGguXG4gKiBUaGlzIGlzIHZhbGlkYXRvciBzdGF0ZSwgbmV2ZXIgYSBjaGVja2VkIGVmZmVjdCBpbiB0aGUgcHVibGljIGZ1bmN0aW9uIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gUmVzb2x2ZWQgZnVuY3Rpb25zLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFtzZWVkRWZmZWN0c10gLSBEZXBlbmRlbmN5IGVmZmVjdHMga2V5ZWQgYnkgbG9jYWwgaW1wb3J0IG5hbWUuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbbG9jYWxGdW5jdGlvbk5hbWVzXSAtIEZ1bmN0aW9ucyB3aG9zZSBib2RpZXMgYmVsb25nIHRvIHRoZSBjdXJyZW50IG1vZHVsZS5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IEVzY2FwaW5nIGVycm9yIGlkZW50aXRpZXMgYnkgc291cmNlLXZpc2libGUgZnVuY3Rpb24gbmFtZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJDYWxsRWZmZWN0cyhmdW5jdGlvbnMsIHNlZWRFZmZlY3RzID0gbmV3IE1hcCgpLCBsb2NhbEZ1bmN0aW9uTmFtZXMgPSBuZXcgU2V0KGZ1bmN0aW9ucy5rZXlzKCkpKSB7XG4gIGNvbnN0IGVmZmVjdHMgPSBuZXcgTWFwKFsuLi5mdW5jdGlvbnMua2V5cygpXS5tYXAoKG5hbWUpID0+IFtuYW1lLCBuZXcgU2V0KHNlZWRFZmZlY3RzLmdldChuYW1lKSA/PyBbXSldKSlcbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbG9jYWxGdW5jdGlvbk5hbWVzKSB7XG4gICAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGZ1bmN0aW9ucy5nZXQobmFtZSlcblxuICAgICAgaWYgKCFkZWNsYXJhdGlvbikgY29udGludWVcbiAgICAgIGNvbnN0IG5leHQgPSBzeW50YWN0aWNCbG9ja0VmZmVjdHMoZGVjbGFyYXRpb24uYm9keSwgZWZmZWN0cylcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAoZWZmZWN0cy5nZXQobmFtZSkpXG5cbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgbmV4dCkge1xuICAgICAgICBpZiAoIWN1cnJlbnQuaGFzKGVycm9yKSkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkKGVycm9yKVxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWZmZWN0c1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGVzY2FwaW5nIGlkZW50aXRpZXMgZnJvbSBvbmUgYmxvY2sgZm9yIHRoZSBjYWxsLWVmZmVjdCBmaXhlZCBwb2ludC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYmxvY2sgLSBDYW5kaWRhdGUgYmxvY2suXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBDdXJyZW50IGZpeGVkLXBvaW50IHN0YXRlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFttZXRob2RFZmZlY3RzXSAtIEN1cnJlbnQgbWV0aG9kIGZpeGVkLXBvaW50IHN0YXRlLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBFc2NhcGluZyBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBzeW50YWN0aWNCbG9ja0VmZmVjdHMoYmxvY2ssIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKVxuICBjb25zdCBzdGF0ZW1lbnRzID0gUmVmbGVjdC5nZXQoLyoqIEB0eXBlIHtvYmplY3R9ICovIChibG9jayA/PyB7fSksIFwic3RhdGVtZW50c1wiKVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZW1lbnRzKSkgcmV0dXJuIHJlc3VsdFxuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgaWYgKCFzdGF0ZW1lbnQgfHwgdHlwZW9mIHN0YXRlbWVudCAhPSBcIm9iamVjdFwiKSBjb250aW51ZVxuICAgIGNvbnN0IGtpbmQgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwia2luZFwiKVxuXG4gICAgaWYgKGtpbmQgPT0gXCJSYWlzZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3Rpb24gPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiZXJyb3JcIilcbiAgICAgIGNvbnN0IHR5cGUgPSBjb25zdHJ1Y3Rpb24gJiYgdHlwZW9mIGNvbnN0cnVjdGlvbiA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQoY29uc3RydWN0aW9uLCBcImVycm9yXCIpIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBkZWNsYXJhdGlvbklkID0gdHlwZSAmJiB0eXBlb2YgdHlwZSA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQodHlwZSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiKSByZXN1bHQuYWRkKGRlY2xhcmF0aW9uSWQpXG4gICAgICBpZiAoY29uc3RydWN0aW9uICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24gPT0gXCJvYmplY3RcIikge1xuICAgICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KGNvbnN0cnVjdGlvbiwgXCJtZXNzYWdlXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGJvZHlFZmZlY3RzID0gc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJib2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGNvbnN0IGNhdGNoVHlwZSA9IFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjYXRjaFR5cGVcIilcbiAgICAgIGNvbnN0IGNhdWdodElkID0gY2F0Y2hUeXBlICYmIHR5cGVvZiBjYXRjaFR5cGUgPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KGNhdGNoVHlwZSwgXCJkZWNsYXJhdGlvbklkXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmICh0eXBlb2YgY2F1Z2h0SWQgPT0gXCJzdHJpbmdcIiAmJiBib2R5RWZmZWN0cy5kZWxldGUoY2F1Z2h0SWQpKSB7XG4gICAgICAgIGFkZEFsbChib2R5RWZmZWN0cywgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjYXRjaEJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIH1cbiAgICAgIGFkZEFsbChyZXN1bHQsIGJvZHlFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25kaXRpb25cIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25zZXF1ZW50XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICBhZGRBbGwocmVzdWx0LCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImFsdGVybmF0ZVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwga2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIGtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgPyBcImxpc3RcIiA6IFwibWFwXCIpLCBjYWxsRWZmZWN0cyxcbiAgICAgICAgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYm9keVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJjb25kaXRpb25cIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJib2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbXCJleHByZXNzaW9uXCIsIFwiaW5pdGlhbGl6ZXJcIl0pIHtcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJlc3VsdCwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBrZXkpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRGVyaXZlcyB0aGUgZXNjYXBpbmcgdXNlci1kZWZpbmVkIGVycm9yIHNldHMgZm9yIGxvY2FsIGZ1bmN0aW9ucyBhbmQgcmVzb2x2ZWQgY2xhc3MgbWV0aG9kcy5cbiAqIFRoZSBmaXhlZCBwb2ludCBpcyBjb21wdXRlZCBvdmVyIGV2ZXJ5IHVuY2hlY2tlZCBlcnJvcjsgY2FwYWJpbGl0eSBmYWlsdXJlcyBhcmUgcHJvamVjdGVkIG91dFxuICogYmVjYXVzZSBjYWxsIHNpdGVzIGFscmVhZHkgY2FycnkgdGhlaXIgY2FwYWJpbGl0eS1mYWlsdXJlIGJvdW5kYXJ5IHRocm91Z2ggcmVzb2x1dGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUmVzb2x2ZWQgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IFtzZWVkRWZmZWN0c10gLSBEZXBlbmRlbmN5IGVmZmVjdHMga2V5ZWQgYnkgbG9jYWwgaW1wb3J0IG5hbWUuXG4gKiBAcmV0dXJucyB7e2Z1bmN0aW9uczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+LCBtZXRob2RzOiBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59fSBFc2NhcGluZyB1c2VyLWRlZmluZWQgZXJyb3IgaWRlbnRpdGllcyBieSBmdW5jdGlvbiBuYW1lIGFuZCBtZXRob2QgaWRlbnRpdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckVzY2FwaW5nRXJyb3JFZmZlY3RzKG1vZHVsZSwgc2VlZEVmZmVjdHMgPSBuZXcgTWFwKCkpIHtcbiAgY29uc3QgZnVuY3Rpb25zID0gbmV3IE1hcChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IFtkZWNsYXJhdGlvbi5uYW1lLCBkZWNsYXJhdGlvbl0pKVxuICBjb25zdCBmdW5jdGlvbkVmZmVjdHMgPSBuZXcgTWFwKFsuLi5mdW5jdGlvbnMua2V5cygpXS5tYXAoKG5hbWUpID0+IFtuYW1lLCBuZXcgU2V0KHNlZWRFZmZlY3RzLmdldChuYW1lKSA/PyBbXSldKSlcbiAgY29uc3QgY2xhc3NlcyA9IG1vZHVsZS5jbGFzc2VzID8/IFtdXG4gIGNvbnN0IG1ldGhvZEVmZmVjdHMgPSBuZXcgTWFwKClcbiAgY29uc3QgY2FwYWJpbGl0eUZhaWx1cmVJZHMgPSBuZXcgU2V0KChtb2R1bGUuY2FwYWJpbGl0aWVzID8/IFtdKS5mbGF0TWFwKCh7ZmFpbHVyZXN9KSA9PiBmYWlsdXJlcykubWFwKCh7aWR9KSA9PiBpZCkpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBjbGFzc2VzKSBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSBtZXRob2RFZmZlY3RzLnNldChtZXRob2QuaWQsIG5ldyBTZXQoKSlcbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAoZnVuY3Rpb25FZmZlY3RzLmdldChkZWNsYXJhdGlvbi5uYW1lKSlcbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2Ygc3ludGFjdGljQmxvY2tFZmZlY3RzKGRlY2xhcmF0aW9uLmJvZHksIGZ1bmN0aW9uRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHsgY3VycmVudC5hZGQoZXJyb3IpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3Nlcykge1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKG1ldGhvZEVmZmVjdHMuZ2V0KG1ldGhvZC5pZCkpXG4gICAgICAgIGZvciAoY29uc3QgZXJyb3Igb2Ygc3ludGFjdGljQmxvY2tFZmZlY3RzKG1ldGhvZC5ib2R5LCBmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKSB7XG4gICAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHsgY3VycmVudC5hZGQoZXJyb3IpOyBjaGFuZ2VkID0gdHJ1ZSB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGVmZmVjdHMgb2YgW2Z1bmN0aW9uRWZmZWN0cywgbWV0aG9kRWZmZWN0c10pIHtcbiAgICBmb3IgKGNvbnN0IGVycm9ycyBvZiBlZmZlY3RzLnZhbHVlcygpKSB7XG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIFsuLi5lcnJvcnNdKSBpZiAoY2FwYWJpbGl0eUZhaWx1cmVJZHMuaGFzKGVycm9yKSkgZXJyb3JzLmRlbGV0ZShlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge2Z1bmN0aW9uczogZnVuY3Rpb25FZmZlY3RzLCBtZXRob2RzOiBtZXRob2RFZmZlY3RzfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsZXhpY2FsIHNjb3BlIHdpdGggZGVjbGFyYXRpb25zIG1hcmtlZCBwZW5kaW5nIHVudGlsIHZpc2l0ZWQuXG4gKiBAcGFyYW0ge1Njb3BlIHwgdW5kZWZpbmVkfSBwYXJlbnQgLSBFbmNsb3Npbmcgc2NvcGUuXG4gKiBAcGFyYW0ge3traW5kOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmd9W119IHN0YXRlbWVudHMgLSBTY29wZSBzdGF0ZW1lbnRzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3Jlc2VydmVkTmFtZXNdIC0gTmFtZXMgdW5hdmFpbGFibGUgdG8gcm9vdCBiaW5kaW5ncy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBEZWNsYXJhdGlvbi1zY29wZWQgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb259IFtjdXJyZW50Q2xhc3NdIC0gRGVjbGFyaW5nIGNsYXNzIGZvciByZWNlaXZlci1wcml2YXRlIGFjY2Vzcy5cbiAqIEByZXR1cm5zIHtTY29wZX0gU2NvcGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHBhcmVudCwgc3RhdGVtZW50cywgcmVzZXJ2ZWROYW1lcyA9IG5ldyBTZXQoKSwgdHlwZVBhcmFtZXRlcnMgPSBwYXJlbnQ/LnR5cGVQYXJhbWV0ZXJzID8/IG5ldyBTZXQoKSxcbiAgY3VycmVudENsYXNzID0gcGFyZW50Py5jdXJyZW50Q2xhc3MpIHtcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBTZXQoc3RhdGVtZW50cy5maWx0ZXIoKHN0YXRlbWVudCkgPT4gc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpXG4gICAgLm1hcCgoc3RhdGVtZW50KSA9PiAvKiogQHR5cGUge3tuYW1lOiBzdHJpbmd9fSAqLyAoc3RhdGVtZW50KS5uYW1lKSlcblxuICByZXR1cm4ge1xuICAgIGJpbmRpbmdzOiBuZXcgTWFwKCksXG4gICAgY3VycmVudENsYXNzLFxuICAgIHBhcmVudCxcbiAgICBwZW5kaW5nLFxuICAgIHByZXNlbmNlUHJvb2ZzOiBuZXcgU2V0KHBhcmVudD8ucHJlc2VuY2VQcm9vZnMgPz8gW10pLFxuICAgIHR5cGVQYXJhbWV0ZXJzLFxuICAgIHVzZWROYW1lczogcGFyZW50Py51c2VkTmFtZXMgPz8gbmV3IFNldChyZXNlcnZlZE5hbWVzKVxuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHNpbXBsZS1pZGVudGlmaWVyIHByZXNlbmNlIHByb29mIHRvIGV4YWN0bHkgdGhlIGJyYW5jaCB3aGVyZSB0aGUgdGVzdCBpcyB0cnVlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGNvbmRpdGlvbiAtIFZhbGlkYXRlZCBicmFuY2ggY29uZGl0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc291cmNlU2NvcGUgLSBTY29wZSBjb250YWluaW5nIHRoZSB0ZXN0ZWQgYmluZGluZy5cbiAqIEBwYXJhbSB7U2NvcGV9IGJyYW5jaFNjb3BlIC0gQnJhbmNoLWxvY2FsIHByb29mIHNjb3BlLlxuICogQHBhcmFtIHtib29sZWFufSBicmFuY2hXaGVuVHJ1ZSAtIFdoZXRoZXIgdGhpcyBpcyB0aGUgY29uZGl0aW9uJ3MgdHJ1ZSBicmFuY2guXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhjb25kaXRpb24sIHNvdXJjZVNjb3BlLCBicmFuY2hTY29wZSwgYnJhbmNoV2hlblRydWUpIHtcbiAgbGV0IHRlc3QgPSBjb25kaXRpb25cbiAgbGV0IHByZXNlbnRXaGVuVHJ1ZSA9IHRydWVcblxuICBpZiAoY29uZGl0aW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIiAmJiBjb25kaXRpb24ub3BlcmF0aW9uID09IFwiQm9vbGVhbk5vdFwiICYmXG4gICAgY29uZGl0aW9uLm9wZXJhbmQua2luZCA9PSBcIk9wdGlvbmFsSXNQcmVzZW50XCIpIHtcbiAgICB0ZXN0ID0gY29uZGl0aW9uLm9wZXJhbmRcbiAgICBwcmVzZW50V2hlblRydWUgPSBmYWxzZVxuICB9XG4gIGlmICh0ZXN0LmtpbmQgIT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSByZXR1cm5cbiAgY29uc3QgYmluZGluZyA9IGZpbmRCaW5kaW5nKHRlc3Qub3BlcmFuZC5uYW1lLCBzb3VyY2VTY29wZSlcblxuICBpZiAoIWJpbmRpbmcpIHJldHVyblxuICBpZiAoYnJhbmNoV2hlblRydWUgPT0gcHJlc2VudFdoZW5UcnVlKSBicmFuY2hTY29wZS5wcmVzZW5jZVByb29mcy5hZGQoYmluZGluZylcbiAgZWxzZSBicmFuY2hTY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbn1cblxuLyoqXG4gKiBBZGRzIG9uZSBiaW5kaW5nIHdoaWxlIHJlamVjdGluZyBkdXBsaWNhdGVzIGFuZCBzaGFkb3dpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEJpbmRpbmcgbmFtZS5cbiAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyAtIEJpbmRpbmcgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIEN1cnJlbnQgc2NvcGUuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZUJpbmRpbmcobmFtZSwgYmluZGluZywgbG9jYXRpb24sIHNjb3BlLCBmYWlsKSB7XG4gIGlmIChzY29wZS51c2VkTmFtZXMuaGFzKG5hbWUpKSBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBvciBzaGFkb3dlZCBiaW5kaW5nICcke25hbWV9Jy5gLCBsb2NhdGlvbilcblxuICBzY29wZS5iaW5kaW5ncy5zZXQobmFtZSwgYmluZGluZylcbiAgc2NvcGUudXNlZE5hbWVzLmFkZChuYW1lKVxufVxuXG4vKipcbiAqIFJlc29sdmVzIG9uZSBpZGVudGlmaWVyIGFuZCBkaXN0aW5ndWlzaGVzIHVzZS1iZWZvcmUtZGVjbGFyYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIEJpbmRpbmcgbmFtZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIEN1cnJlbnQgc2NvcGUuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7QmluZGluZ30gQmluZGluZy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUJpbmRpbmcobmFtZSwgbG9jYXRpb24sIHNjb3BlLCBmYWlsKSB7XG4gIGZvciAobGV0IGN1cnJlbnQgPSAvKiogQHR5cGUge1Njb3BlIHwgdW5kZWZpbmVkfSAqLyAoc2NvcGUpOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQpIHtcbiAgICBjb25zdCBiaW5kaW5nID0gY3VycmVudC5iaW5kaW5ncy5nZXQobmFtZSlcblxuICAgIGlmIChiaW5kaW5nKSByZXR1cm4gYmluZGluZ1xuICAgIGlmIChjdXJyZW50LnBlbmRpbmcuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVTRV9CRUZPUkVfREVDTEFSQVRJT05cIiwgYEJpbmRpbmcgJyR7bmFtZX0nIGlzIHVzZWQgYmVmb3JlIGl0cyBkZWNsYXJhdGlvbi5gLCBsb2NhdGlvbilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFpbChcIlVOUkVTT0xWRURfQklORElOR1wiLCBgVW5rbm93biBiaW5kaW5nICcke25hbWV9Jy5gLCBsb2NhdGlvbilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHNlbWFudGljIHZhbHVlIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE93bmluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1NldDxvYmplY3Q+fSBbc2Vlbl0gLSBBY3RpdmUgcmVjdXJzaXZlIHR5cGUgcGF0aC5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IFtyZWNvcmRzXSAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbdHlwZVBhcmFtZXRlcnNdIC0gVHlwZS12YXJpYWJsZSBpZGVudGl0aWVzIGluIGRlY2xhcmF0aW9uIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IFZhbGlkYXRlZCB2YWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgY29uc3QgY2FuZGlkYXRlID0gdmFsaWRhdGVUeXBlUmVmZXJlbmNlKHR5cGUsIGxvY2F0aW9uLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICBpZiAoaXNWb2lkVHlwZShjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlZPSURfQVNfVkFMVUVcIiwgXCJWb2lkIGlzIHZhbGlkIG9ubHkgYXMgYSBmdW5jdGlvbiByZXR1cm4gdHlwZS5cIiwgdHlwZUxvY2F0aW9uKHR5cGUsIGxvY2F0aW9uKSlcblxuICByZXR1cm4gY2FuZGlkYXRlXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBmdW5jdGlvbiByZXR1cm4gdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgc2VtYW50aWMgcmV0dXJuIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE93bmluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBWYWxpZGF0ZWQgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgcmV0dXJuIHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgbmV3IFNldCgpLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgb25lIHJlY3Vyc2l2ZSBzZW1hbnRpYyB0eXBlLXJlZmVyZW5jZSBzaGFwZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2l2ZSB0eXBlIHBhdGguXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBWYWxpZGF0ZWQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVUeXBlUmVmZXJlbmNlKHR5cGUsIGxvY2F0aW9uLCBmYWlsLCBzZWVuID0gbmV3IFNldCgpLCByZWNvcmRzID0gbmV3IE1hcCgpLCB0eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQoKSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2VtYW50aWMgdHlwZS5cIiwgbG9jYXRpb24pXG4gIH1cblxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9ICovICh0eXBlKVxuXG4gIGlmIChbXCJMaXN0VHlwZVwiLCBcIk1hcFR5cGVcIiwgXCJPcHRpb25hbFR5cGVcIiwgXCJPcmRlcmVkTWFwVHlwZVwiLCBcIlJlY29yZFR5cGVcIl0uaW5jbHVkZXMoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgY29udGFpbnNPd25lZFR5cGUoY2FuZGlkYXRlKSkge1xuICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBhbmQgcmVmZXJlbmNlcyBjYW5ub3QgYmUgbmVzdGVkIGluIHZhbHVlIG9yIGdlbmVyaWMgdHlwZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgfVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIGlmICghaXNTY2FsYXJUeXBlTmFtZShjYW5kaWRhdGUubmFtZSkgJiYgY2FuZGlkYXRlLm5hbWUgIT0gXCJ2b2lkXCIpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2NhbGFyIG9yIHZvaWQgcmV0dXJuIHR5cGUuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLGxvY2F0aW9uLHBhcmFtZXRlcklkXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUucGFyYW1ldGVySWQgIT0gXCJzdHJpbmdcIiB8fCAhdHlwZVBhcmFtZXRlcnMuaGFzKGNhbmRpZGF0ZS5wYXJhbWV0ZXJJZCkpIHtcbiAgICAgIGZhaWwoXCJGUkVFX1RZUEVfVkFSSUFCTEVcIiwgYEZyZWUgb3IgdW5rbm93biB0eXBlIHZhcmlhYmxlICcke1N0cmluZyhjYW5kaWRhdGUucGFyYW1ldGVySWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIilcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY29yZHMuZ2V0KGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCEoW1wiYXJndW1lbnRzLGRlY2xhcmF0aW9uSWQsa2luZFwiLCBcImRlY2xhcmF0aW9uSWQsa2luZFwiXS5pbmNsdWRlcyhrZXlzKSkgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFkZWNsYXJhdGlvbikge1xuICAgICAgZmFpbChcIlVOS05PV05fUkVDT1JEXCIsIGBVbmtub3duIHJlY29yZCBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBleHBlY3RlZEFyaXR5ID0gZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwXG5cbiAgICBpZiAoZXhwZWN0ZWRBcml0eSA+IDAgJiYgY2FuZGlkYXRlLmFyZ3VtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmYWlsKFwiUkFXX0dFTkVSSUNfQVBQTElDQVRJT05cIiwgYEdlbmVyaWMgcmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyByZXF1aXJlcyAke2V4cGVjdGVkQXJpdHl9IHR5cGUgYXJndW1lbnRzLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkQXJpdHkgPT0gMCAmJiBjYW5kaWRhdGUuYXJndW1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZhaWwoXCJHRU5FUklDX0FSSVRZX01JU01BVENIXCIsIGBOb24tZ2VuZXJpYyByZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IGFjY2VwdCB0eXBlIGFyZ3VtZW50cy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGNhbmRpZGF0ZUFyZ3VtZW50cyA9IGNhbmRpZGF0ZS5hcmd1bWVudHNcblxuICAgIGlmIChjYW5kaWRhdGVBcmd1bWVudHMgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkoY2FuZGlkYXRlQXJndW1lbnRzKSB8fFxuICAgICAgY2FuZGlkYXRlQXJndW1lbnRzLnNvbWUoKF9hcmd1bWVudCwgaW5kZXgpID0+ICFPYmplY3QuaGFzT3duKGNhbmRpZGF0ZUFyZ3VtZW50cywgaW5kZXgpKSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiR2VuZXJpYyByZWNvcmQgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBjYW5kaWRhdGUuYXJndW1lbnRzID8/IFtdXG5cbiAgICBpZiAoYXJndW1lbnRzXy5sZW5ndGggIT0gZXhwZWN0ZWRBcml0eSkge1xuICAgICAgZmFpbChcIkdFTkVSSUNfQVJJVFlfTUlTTUFUQ0hcIiwgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzICR7YXJndW1lbnRzXy5sZW5ndGh9IHR5cGUgYXJndW1lbnRzOyBleHBlY3RlZCAke2V4cGVjdGVkQXJpdHl9LmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY3Vyc2l2ZSBnZW5lcmljIGFwcGxpY2F0aW9ucyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgYXJndW1lbnRzXykge1xuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoYXJndW1lbnQsIHR5cGVMb2NhdGlvbihhcmd1bWVudCwgbG9jYXRpb24pLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgICB9XG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikge1xuICAgIGNvbnN0IGNsYXNzZXMgPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgIWNsYXNzZXMuaGFzKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgZmFpbChcIlVOS05PV05fQ0xBU1NcIiwgYFVua25vd24gcmVmZXJlbmNlIGNsYXNzIGRlY2xhcmF0aW9uICcke1N0cmluZyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLHJlc291cmNlSWRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5yZXNvdXJjZUlkICE9IFwic3RyaW5nXCIgfHwgIXJlc291cmNlSWRzQnlSZWNvcmRSZWdpc3RyeS5nZXQocmVjb3Jkcyk/LmhhcyhjYW5kaWRhdGUucmVzb3VyY2VJZCkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIGBVbmtub3duIG93bmVkIHJlc291cmNlICcke1N0cmluZyhjYW5kaWRhdGUucmVzb3VyY2VJZCl9Jy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgIGNvbnN0IGNsYXNzZXMgPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIiB8fFxuICAgICAgdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IFwic3RyaW5nXCIgfHwgY2xhc3Nlcy5nZXQoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpPy5vd25lcnNoaXA/LmtpbmQgIT0gXCJvd25lZFJlc291cmNlXCIpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIGBVbmtub3duIG93bmVkIHJlZmVyZW5jZSAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiTGlzdFR5cGVcIikge1xuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgY29sbGVjdGlvbiB0eXBlcyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICBzZWVuLmFkZChjYW5kaWRhdGUpXG4gICAgY29uc3QgZWxlbWVudFR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUuZWxlbWVudFR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcImVsZW1lbnRUeXBlXCIpLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICAgIHNlZW4uZGVsZXRlKGNhbmRpZGF0ZSlcblxuICAgIGlmIChjYW5kaWRhdGUuZWxlbWVudFR5cGUgIT09IGVsZW1lbnRUeXBlKSBjYW5kaWRhdGUuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICBjb25zdCBleHBlY3RlZEZpZWxkcyA9IGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IFwia2V5VHlwZSxraW5kLG9yZGVyLHZhbHVlVHlwZVwiIDogXCJrZXlUeXBlLGtpbmQsdmFsdWVUeXBlXCJcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBleHBlY3RlZEZpZWxkcykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYWxmb3JtZWQgJHtjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBcIm9yZGVyZWQgbWFwXCIgOiBcIm1hcFwifSB0eXBlLmAsXG4gICAgICAgIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiBjYW5kaWRhdGUub3JkZXIgIT0gXCJpbnNlcnRpb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3JkZXJlZCBtYXAgdHlwZSByZXF1aXJlcyBpbnNlcnRpb24gb3JkZXIuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKGNhbmRpZGF0ZSkpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY3Vyc2l2ZSBjb2xsZWN0aW9uIHR5cGVzIGNhbm5vdCBjb250YWluIGN5Y2xlcy5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBjb25zdCBrZXlUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoY2FuZGlkYXRlLmtleVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcImtleVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgaWYgKCFpc1NjYWxhclR5cGUoa2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAga2V5IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oa2V5VHlwZSl9OyBleHBlY3RlZCBzdHJpbmcuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZS5rZXlUeXBlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS52YWx1ZVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG5cbiAgICBpZiAoY2FuZGlkYXRlLmtleVR5cGUgIT09IGtleVR5cGUpIGNhbmRpZGF0ZS5rZXlUeXBlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlR5cGVSZWZlcmVuY2V9ICovIChrZXlUeXBlKVxuICAgIGlmIChjYW5kaWRhdGUudmFsdWVUeXBlICE9PSB2YWx1ZVR5cGUpIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPSB2YWx1ZVR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT0gXCJzb3VyY2VQcm92ZW5hbmNlXCIpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcImtpbmQsdmFsdWVUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBvcHRpb25hbCB0eXBlLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgb3B0aW9uYWwgdHlwZXMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IHZhbHVlVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS52YWx1ZVR5cGUsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG4gICAgaWYgKHZhbHVlVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGZhaWwoXCJJTlZBTElEX09QVElPTkFMX0NPTlNUSVRVRU5UXCIsIFwiT3B0aW9uYWwgdmFsdWVzIGNhbm5vdCBkaXJlY3RseSBjb250YWluIGFub3RoZXIgb3B0aW9uYWwuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uLCBcInZhbHVlVHlwZVwiKSlcbiAgICB9XG4gICAgaWYgKGNhbmRpZGF0ZS52YWx1ZVR5cGUgIT09IHZhbHVlVHlwZSkgY2FuZGlkYXRlLnZhbHVlVHlwZSA9IHZhbHVlVHlwZVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiVW5zdXBwb3J0ZWQgc2VtYW50aWMgdHlwZS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgcmVmZXJlbmNlLWNsYXNzIHJlZ2lzdHJ5IGF0dGFjaGVkIHRvIHRoZSByZWNvcmQgdmFsaWRhdGlvbiBjb250ZXh0LlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCB2YWxpZGF0aW9uIHJlZ2lzdHJ5LlxuICogQHJldHVybnMge0NsYXNzUmVnaXN0cnl9IFJlZmVyZW5jZSBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpIHtcbiAgcmV0dXJuIHJlZmVyZW5jZUNsYXNzZXNCeVJlY29yZFJlZ2lzdHJ5LmdldChyZWNvcmRzKSA/PyBuZXcgTWFwKClcbn1cblxuLyoqXG4gKiBJbmZlcnMgYSB2YWx1ZSBleHByZXNzaW9uIGFuZCByZWplY3RzIHRoZSBub24tdmFsdWUgcmVzdWx0IG9mIGEgdm9pZCBjYWxsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBTZW1hbnRpYyBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIGxleGljYWwgc2NvcGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIE1vZHVsZSBmdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHRvIG5vcm1hbGl6ZSBmcm9udGVuZCBpbnRlbnQgYW5kIGNhbGwgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZXh0IC0gVmFsdWUgY29udGV4dCBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IFtleHBlY3RlZFR5cGVdIC0gQ29udGV4dHVhbCBjb2xsZWN0aW9uIHR5cGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbmZlckNvbGxlY3Rpb25FbGVtZW50c10gLSBXaGV0aGVyIGEgZ2VuZXJpYy1jYWxsIGV2aWRlbmNlIHBhc3MgbWF5IGluZmVyIG5vbmVtcHR5IGNvbGxlY3Rpb24gbGl0ZXJhbHMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gRXhwcmVzc2lvbiB2YWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgY29udGV4dCwgZXhwZWN0ZWRUeXBlLFxuICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cyA9IGZhbHNlKSB7XG4gIGNvbnN0IGFsbG93T3duZWRCb3Jyb3cgPSBjb250ZXh0ID09IFwiYW4gZWZmZWN0IGFyZ3VtZW50XCIgfHwgY29udGV4dCA9PSBcImEgbWV0aG9kIHJlY2VpdmVyXCJcbiAgY29uc3QgdHlwZSA9IGluZmVyRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgZXhwZWN0ZWRUeXBlLFxuICAgIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzLCBhbGxvd093bmVkQm9ycm93KVxuXG4gIGlmICh0eXBlID09IFwidm9pZFwiKSByZXR1cm4gZmFpbChcIlZPSURfQVNfVkFMVUVcIiwgYFZvaWQgY2FsbCBjYW5ub3QgYmUgdXNlZCBhcyAke2NvbnRleHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJFcnJvclR5cGVcIikgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBFcnJvciB2YWx1ZSBjYW5ub3QgYmUgdXNlZCBhcyAke2NvbnRleHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG5cbiAgcmV0dXJuIHR5cGVcbn1cblxuLyoqXG4gKiBJbmZlcnMgYW5kIHZhbGlkYXRlcyBvbmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byByZXBsYWNlIHRyYW5zaWVudCBmcm9udGVuZCBvcGVyYXRpb24gaW50ZW50LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBbZXhwZWN0ZWRUeXBlXSAtIENvbnRleHR1YWwgY29sbGVjdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNdIC0gV2hldGhlciBhIGdlbmVyaWMtY2FsbCBldmlkZW5jZSBwYXNzIG1heSBpbmZlciBub25lbXB0eSBjb2xsZWN0aW9uIGxpdGVyYWxzLlxuICogQHBhcmFtIHtib29sZWFufSBbYWxsb3dPd25lZEJvcnJvd10gLSBXaGV0aGVyIHRoaXMgZXhhY3QgY2FsbCBwb3NpdGlvbiBhZG1pdHMgYW4gaW1tZWRpYXRlIGJvcnJvdy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluZGluZ1R5cGUgfCBcInZvaWRcIn0gRXhwcmVzc2lvbiB0eXBlLlxuICovXG5mdW5jdGlvbiBpbmZlckV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGV4cGVjdGVkVHlwZSxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgPSBmYWxzZSwgYWxsb3dPd25lZEJvcnJvdyA9IGZhbHNlKSB7XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gcmVzb2x2ZUJpbmRpbmcoZXhwcmVzc2lvbi5uYW1lLCBleHByZXNzaW9uLmxvY2F0aW9uLCBzY29wZSwgZmFpbCkudHlwZVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWNlaXZlckV4cHJlc3Npb25cIikge1xuICAgIGlmICghc2NvcGUuY3VycmVudENsYXNzIHx8IGV4cHJlc3Npb24uY2xhc3NJZCAhPSBzY29wZS5jdXJyZW50Q2xhc3MuaWQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlJlY2VpdmVyIGV4cHJlc3Npb24gaXMgdmFsaWQgb25seSBpbnNpZGUgaXRzIGRlY2xhcmluZyBjbGFzcy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoc2NvcGUuY3VycmVudENsYXNzLmlkKSwga2luZDogXCJSZWZlcmVuY2VUeXBlXCJ9XG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUHJpdmF0ZUZpZWxkUmVhZFwiKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSBzY29wZS5jdXJyZW50Q2xhc3NcblxuICAgIGlmICghZGVjbGFyYXRpb24gfHwgIWV4cHJlc3Npb24ucmVjZWl2ZXIgfHwgZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHxcbiAgICAgIGV4cHJlc3Npb24ucmVjZWl2ZXIuY2xhc3NJZCAhPSBkZWNsYXJhdGlvbi5pZCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCByZWNlaXZlciBtdXN0IGJlIHRoZSBkZWNsYXJpbmcgY2xhc3MgcmVjZWl2ZXIuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGV4cHJlc3Npb24uZmllbGQpXG5cbiAgICBpZiAoIWZpZWxkKSByZXR1cm4gZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJQcml2YXRlIGZpZWxkIGlkZW50aXR5IGlzIG5vdCBvd25lZCBieSB0aGUgZGVjbGFyaW5nIGNsYXNzLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gICAgcmV0dXJuIGZpZWxkLnR5cGVcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIikge1xuICAgIGlmICghYWxsb3dPd25lZEJvcnJvdykge1xuICAgICAgcmV0dXJuIGZhaWwoXCJCT1JST1dfRVNDQVBFXCIsIFwiQk9SUk9XX0VTQ0FQRTogT3duZWQgYm9ycm93cyBhcmUgdmFsaWQgb25seSBhcyBpbW1lZGlhdGUgY2FwYWJpbGl0eSBhcmd1bWVudHMgb3IgbWV0aG9kIHJlY2VpdmVycy5cIixcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ubW9kZSAhPSBcInNoYXJlZFwiICYmIGV4cHJlc3Npb24ubW9kZSAhPSBcImV4Y2x1c2l2ZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1c6IE93bmVkIGJvcnJvdyBtb2RlIG11c3QgYmUgc2hhcmVkIG9yIGV4Y2x1c2l2ZS5cIixcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYm9ycm93ZWQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG93bmVkIGJvcnJvd1wiKVxuXG4gICAgaWYgKGJvcnJvd2VkLmtpbmQgIT0gXCJPd25lZFJlc291cmNlVHlwZVwiICYmIGJvcnJvd2VkLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIkJvcnJvd2VkIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBvd25lZCByZXNvdXJjZSBvciBvd25lZCByZWZlcmVuY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2FtZVR5cGUoYm9ycm93ZWQsIGV4cHJlc3Npb24udHlwZSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIFwiQm9ycm93IG1ldGFkYXRhIGRvZXMgbm90IG1hdGNoIGl0cyByZXNvdXJjZSBwbGFjZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIGJvcnJvd2VkXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRNb3ZlRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgbW92ZWQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG93bmVkIG1vdmVcIilcblxuICAgIGlmIChtb3ZlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBtb3ZlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9UUkFOU0ZFUlwiLCBcIk1vdmVkIGV4cHJlc3Npb24gbXVzdCBiZSBhbiBvd25lZCByZXNvdXJjZSBvciBvd25lZCByZWZlcmVuY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2FtZVR5cGUobW92ZWQsIGV4cHJlc3Npb24udHlwZSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIFwiTW92ZSBtZXRhZGF0YSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb3VyY2UgcGxhY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBtb3ZlZFxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVycm9yTWVzc2FnZVJlYWRcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5yZWNlaXZlciB8fCBleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfTUVNQkVSX1JFQ0VJVkVSXCIsIFwiRXJyb3IgbWVzc2FnZSByZWNlaXZlciBtdXN0IGJlIG9uZSBjYXRjaCBiaW5kaW5nLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCByZWNlaXZlciA9IHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ucmVjZWl2ZXIubmFtZSwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpXG5cbiAgICBpZiAocmVjZWl2ZXIudHlwZS5raW5kICE9IFwiRXJyb3JUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9NRU1CRVJfUkVDRUlWRVJcIiwgXCJNZXNzYWdlIG1lbWJlciByZXF1aXJlcyBhIHR5cGVkIGVycm9yIGNhdGNoIGJpbmRpbmcuXCIsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJzdHJpbmdcIilcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJJbnRlZ2VyTGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihleHByZXNzaW9uLnZhbHVlKSkgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJOb24tc2FmZSBpbnRlZ2VyIGxpdGVyYWwuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJvb2xlYW5MaXRlcmFsXCIpIHtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwidmFsdWVcIikgIT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSW52YWxpZCBib29sZWFuIGxpdGVyYWwgdmFsdWUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiYm9vbGVhblwiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIpIHtcbiAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KGV4cHJlc3Npb24sIFwidmFsdWVcIilcblxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCAhaGFzT25seVVuaWNvZGVTY2FsYXJzKHZhbHVlKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJbnZhbGlkIFVuaWNvZGUgc3RyaW5nIGxpdGVyYWwuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsTm9uZVwiKSB7XG4gICAgaWYgKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJPcHRpb25hbCBhYnNlbmNlIHJlcXVpcmVzIGFuIGV4cGxpY2l0IG9wdGlvbmFsIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikge1xuICAgIGlmICghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZXhwcmVzc2lvbi52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcHRpb25hbCBwcmVzZW50IHZhbHVlXCJcbiAgICAgIClcblxuICAgICAgaWYgKHZhbHVlVHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX09QVElPTkFMX0NPTlNUSVRVRU5UXCIsIFwiT3B0aW9uYWwgdmFsdWVzIGNhbm5vdCBkaXJlY3RseSBjb250YWluIGFub3RoZXIgb3B0aW9uYWwuXCIsIGV4cHJlc3Npb24udmFsdWUubG9jYXRpb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlfVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICBleHByZXNzaW9uLnZhbHVlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIG9wdGlvbmFsIHByZXNlbnQgdmFsdWVcIiwgZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZVxuICAgIClcblxuICAgIGlmICghc2FtZVR5cGUodmFsdWVUeXBlLCBleHBlY3RlZFR5cGUudmFsdWVUeXBlKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9wdGlvbmFsIHByZXNlbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbih2YWx1ZVR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSl9LmAsIGV4cHJlc3Npb24udmFsdWUubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSB7XG4gICAgaWYgKCFleHByZXNzaW9uLm9wZXJhbmQgfHwgZXhwcmVzc2lvbi5vcGVyYW5kLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJPcHRpb25hbCBwcmVzZW5jZSB0ZXN0IHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qgb3BlcmFuZFR5cGUgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLm9wZXJhbmQubmFtZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBzY29wZSwgZmFpbCkudHlwZVxuXG4gICAgaWYgKG9wZXJhbmRUeXBlLmtpbmQgIT0gXCJPcHRpb25hbFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBQcmVzZW5jZSB0ZXN0IHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKG9wZXJhbmRUeXBlKX07IGV4cGVjdGVkIG9wdGlvbmFsLmAsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImJvb2xlYW5cIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxVbndyYXBcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5vcGVyYW5kIHx8IGV4cHJlc3Npb24ub3BlcmFuZC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3B0aW9uYWwgdW53cmFwIHJlcXVpcmVzIG9uZSBzaW1wbGUgaWRlbnRpZmllci5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgYmluZGluZyA9IHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ub3BlcmFuZC5uYW1lLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIHNjb3BlLCBmYWlsKVxuXG4gICAgaWYgKGJpbmRpbmcudHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgT3B0aW9uYWwgdW53cmFwIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKGJpbmRpbmcudHlwZSl9OyBleHBlY3RlZCBvcHRpb25hbC5gLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghc2NvcGUucHJlc2VuY2VQcm9vZnMuaGFzKGJpbmRpbmcpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOQ0hFQ0tFRF9PUFRJT05BTF9VTldSQVBcIiwgYE9wdGlvbmFsIGJpbmRpbmcgJyR7ZXhwcmVzc2lvbi5vcGVyYW5kLm5hbWV9JyBpcyBub3QgcHJvdmVuIHByZXNlbnQuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gYmluZGluZy50eXBlLnZhbHVlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJMaXN0IGxpdGVyYWwgZWxlbWVudHMgbXVzdCBiZSBhIGRlbnNlIHNvdXJjZS1vcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoKCFleHBlY3RlZFR5cGUgfHwgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSAmJlxuICAgICAgKCFpbmZlckNvbGxlY3Rpb25FbGVtZW50cyB8fCBleHByZXNzaW9uLmVsZW1lbnRzLmxlbmd0aCA9PSAwKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJMaXN0IGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIGxpc3QgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBpbmZlcnJlZEVsZW1lbnRUeXBlXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uZWxlbWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oZXhwcmVzc2lvbi5lbGVtZW50cywgaW5kZXgpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIGxpc3QgbGl0ZXJhbHMgYXJlIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHN1YnNldC5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBleHByZXNzaW9uLmVsZW1lbnRzW2luZGV4XVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbGVtZW50LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbGlzdCBlbGVtZW50XCIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCIgPyBleHBlY3RlZFR5cGUuZWxlbWVudFR5cGUgOiBpbmZlcnJlZEVsZW1lbnRUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuXG4gICAgICBpbmZlcnJlZEVsZW1lbnRUeXBlID8/PSBhY3R1YWxcbiAgICAgIGNvbnN0IHJlcXVpcmVkRWxlbWVudFR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gZXhwZWN0ZWRUeXBlLmVsZW1lbnRUeXBlIDogaW5mZXJyZWRFbGVtZW50VHlwZVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcmVxdWlyZWRFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYExpc3QgZWxlbWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXF1aXJlZEVsZW1lbnRUeXBlKX0uYCwgZWxlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIlxuICAgICAgPyBleHBlY3RlZFR5cGVcbiAgICAgIDoge2VsZW1lbnRUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChpbmZlcnJlZEVsZW1lbnRUeXBlKSwga2luZDogXCJMaXN0VHlwZVwifVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIpIHtcbiAgICBpZiAoZXhwZWN0ZWRUeXBlICYmIGV4cGVjdGVkVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsaXRlcmFsIGNvbnRleHQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWRUeXBlKX07IGV4cGVjdGVkIG1hcC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiAhaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiTWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiICYmICFpc1NjYWxhclR5cGUoZXhwZWN0ZWRUeXBlLmtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAga2V5IHR5cGUgbXVzdCBiZSBzdHJpbmcuXCIsIHR5cGVMb2NhdGlvbihleHBlY3RlZFR5cGUua2V5VHlwZSwgZXhwcmVzc2lvbi5sb2NhdGlvbikpXG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXMgPSB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cylcblxuICAgIGlmICghZXhwZWN0ZWRUeXBlICYmIGVudHJpZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiRW1wdHkgbWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGUgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZW50cnkudmFsdWUsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtYXAgdmFsdWVcIixcbiAgICAgICAgZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPz89IGFjdHVhbFxuICAgICAgY29uc3QgcmVxdWlyZWRWYWx1ZVR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUudmFsdWVUeXBlIDogaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIHJlcXVpcmVkVmFsdWVUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIHZhbHVlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHJlcXVpcmVkVmFsdWVUeXBlKX0uYCwgZW50cnkudmFsdWUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZSA6IHtcbiAgICAgIGtleVR5cGU6IHNjYWxhclR5cGUoXCJzdHJpbmdcIiksXG4gICAgICBraW5kOiBcIk1hcFR5cGVcIixcbiAgICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoaW5mZXJyZWRWYWx1ZVR5cGUpXG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSB7XG4gICAgaWYgKGV4cGVjdGVkVHlwZSAmJiBleHBlY3RlZFR5cGUua2luZCAhPSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgT3JkZXJlZC1tYXAgbGl0ZXJhbCBjb250ZXh0ICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZSl9OyBleHBlY3RlZCBvcmRlcmVkIG1hcC5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiAhaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiT3JkZXJlZC1tYXAgbGl0ZXJhbCByZXF1aXJlcyBhbiBleHBsaWNpdCByZWN1cnNpdmUgb3JkZXJlZC1tYXAgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgIWlzU2NhbGFyVHlwZShleHBlY3RlZFR5cGUua2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk9yZGVyZWQtbWFwIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nLlwiLCB0eXBlTG9jYXRpb24oZXhwZWN0ZWRUeXBlLmtleVR5cGUsIGV4cHJlc3Npb24ubG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzID0gdmFsaWRhdGVNYXBMaXRlcmFsRW50cmllcyhleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpXG5cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiBlbnRyaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU1NJTkdfVFlQRVwiLCBcIkVtcHR5IG9yZGVyZWQtbWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG9yZGVyZWQtbWFwIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgaW5mZXJyZWRWYWx1ZVR5cGVcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBlbnRyeS52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcmRlcmVkLW1hcCB2YWx1ZVwiLFxuICAgICAgICBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlLCBpbmZlckNvbGxlY3Rpb25FbGVtZW50c1xuICAgICAgKVxuICAgICAgaW5mZXJyZWRWYWx1ZVR5cGUgPz89IGFjdHVhbFxuICAgICAgY29uc3QgcmVxdWlyZWRWYWx1ZVR5cGUgPSBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCByZXF1aXJlZFZhbHVlVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9yZGVyZWQtbWFwIHZhbHVlIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHJlcXVpcmVkVmFsdWVUeXBlKX0uYCxcbiAgICAgICAgICBlbnRyeS52YWx1ZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZSA6IHtcbiAgICAgIGtleVR5cGU6IHNjYWxhclR5cGUoXCJzdHJpbmdcIiksXG4gICAgICBraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsXG4gICAgICBvcmRlcjogXCJpbnNlcnRpb25cIixcbiAgICAgIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoaW5mZXJyZWRWYWx1ZVR5cGUpXG4gICAgfVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBsaXN0IHJlY2VpdmVyXCIpXG4gICAgY29uc3QgaW5kZXhUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBsaXN0IGluZGV4XCIsIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpKVxuXG4gICAgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYExpc3QgaW5kZXggcmVjZWl2ZXIgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb2xsZWN0aW9uVHlwZSl9OyBleHBlY3RlZCBsaXN0LmAsIGV4cHJlc3Npb24uY29sbGVjdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFpc1NjYWxhclR5cGUoaW5kZXhUeXBlLCBcImludGVnZXJcIikpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBMaXN0IGluZGV4IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oaW5kZXhUeXBlKX07IGV4cGVjdGVkIGludGVnZXIuYCwgZXhwcmVzc2lvbi5pbmRleC5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3Qga25vd25Db2xsZWN0aW9uID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSlcbiAgICBjb25zdCBrbm93bkluZGV4ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5pbmRleCwgc2NvcGUpXG5cbiAgICBpZiAoa25vd25Db2xsZWN0aW9uPy5raW5kID09IFwiTGlzdExpdGVyYWxcIiAmJiBrbm93bkluZGV4Py5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIiAmJlxuICAgICAgKGtub3duSW5kZXgudmFsdWUgPCAwIHx8IGtub3duSW5kZXgudmFsdWUgPj0ga25vd25Db2xsZWN0aW9uLmVsZW1lbnRzLmxlbmd0aCkpIHtcbiAgICAgIGZhaWwoXCJJTkRFWF9PVVRfT0ZfQk9VTkRTXCIsIGBMaXN0IGluZGV4ICR7a25vd25JbmRleC52YWx1ZX0gaXMgb3V0c2lkZSBhIGxpdGVyYWwgbGlzdCBvZiBzaXplICR7a25vd25Db2xsZWN0aW9uLmVsZW1lbnRzLmxlbmd0aH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcHJvdmVuID0gcHJvdmVuTGlzdEVsZW1lbnQoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmluZGV4LCBzY29wZSlcblxuICAgIHZhbGlkYXRlQWNjZXNzVG90YWxpdHkoZXhwcmVzc2lvbiwgcHJvdmVuICE9PSB1bmRlZmluZWQsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG5cbiAgICByZXR1cm4gY29sbGVjdGlvblR5cGUuZWxlbWVudFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIHJlY2VpdmVyXCIpXG4gICAgY29uc3Qga2V5VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmtleSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1hcCBrZXlcIiwgc2NhbGFyVHlwZShcInN0cmluZ1wiKSlcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiICYmIGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsb29rdXAgcmVjZWl2ZXIgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb2xsZWN0aW9uVHlwZSl9OyBleHBlY3RlZCBtYXAuYCwgZXhwcmVzc2lvbi5jb2xsZWN0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIWlzU2NhbGFyVHlwZShrZXlUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBsb29rdXAga2V5IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oa2V5VHlwZSl9OyBleHBlY3RlZCBzdHJpbmcuYCwgZXhwcmVzc2lvbi5rZXkubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUpXG4gICAgY29uc3Qga25vd25LZXkgPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgICBpZiAoKGtub3duQ29sbGVjdGlvbj8ua2luZCA9PSBcIk1hcExpdGVyYWxcIiB8fCBrbm93bkNvbGxlY3Rpb24/LmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSAmJlxuICAgICAga25vd25LZXk/LmtpbmQgPT0gXCJTdHJpbmdMaXRlcmFsXCIgJiZcbiAgICAgICFrbm93bkNvbGxlY3Rpb24uZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkua2V5LnZhbHVlID09IGtub3duS2V5LnZhbHVlKSkge1xuICAgICAgZmFpbChcIk1JU1NJTkdfTUFQX0tFWVwiLCBgTWFwIGtleSAnJHtrbm93bktleS52YWx1ZX0nIGlzIGFic2VudCBmcm9tIHRoZSBsaXRlcmFsIGluaXRpYWxpemVyLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHByb3ZlbiA9IHByb3Zlbk1hcFZhbHVlKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5rZXksIHNjb3BlKVxuXG4gICAgdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4gIT09IHVuZGVmaW5lZCwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcblxuICAgIHJldHVybiBjb2xsZWN0aW9uVHlwZS52YWx1ZVR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiQ29sbGVjdGlvblNpemVFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb2xsZWN0aW9uLXNpemUgcmVjZWl2ZXJcIilcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTGlzdFR5cGVcIiAmJiBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTWFwVHlwZVwiICYmIGNvbGxlY3Rpb25UeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENvbGxlY3Rpb24gc2l6ZSByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGNvbGxlY3Rpb25UeXBlKX07IGV4cGVjdGVkIGxpc3Qgb3IgbWFwLmAsIGV4cHJlc3Npb24uY29sbGVjdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgY29sbGVjdGlvbktpbmQgPSBjb2xsZWN0aW9uVHlwZS5raW5kID09IFwiTGlzdFR5cGVcIiA/IFwibGlzdFwiIDogXCJtYXBcIlxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHtcbiAgICAgIGlmIChleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kICE9PSB1bmRlZmluZWQgJiYgZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCAhPSBjb2xsZWN0aW9uS2luZCkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNvbGxlY3Rpb24gc2l6ZSBvcGVyYXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIHJlY2VpdmVyIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHByZXNzaW9uLmNvbGxlY3Rpb25LaW5kID0gY29sbGVjdGlvbktpbmRcbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCAhPSBjb2xsZWN0aW9uS2luZCkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb2xsZWN0aW9uIHNpemUga2luZCBkb2VzIG5vdCBtYXRjaCBpdHMgcmVjZWl2ZXIgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImludGVnZXJcIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmFyZ3VtZW50cykgfHwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5wYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkVmZmVjdCBjYWxsIGFyZ3VtZW50IGNvdW50IGRvZXMgbm90IG1hdGNoIGl0cyBhdXRob3JpemVkIG9wZXJhdGlvbi5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVzb3VyY2VGbG93ID0gZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvd1xuXG4gICAgaWYgKHJlc291cmNlRmxvdy5raW5kID09IFwiYm9ycm93XCIgfHwgcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJjbG9zZVwiKSB7XG4gICAgICBjb25zdCBib3Jyb3cgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tyZXNvdXJjZUZsb3cucGFyYW1ldGVySW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZE1vZGUgPSByZXNvdXJjZUZsb3cua2luZCA9PSBcImNsb3NlXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIlxuXG4gICAgICBpZiAoYm9ycm93Py5raW5kICE9IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgfHwgYm9ycm93Lm1vZGUgIT0gZXhwZWN0ZWRNb2RlKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBgSU5WQUxJRF9SRVNPVVJDRV9CT1JST1c6ICR7cmVzb3VyY2VGbG93LmtpbmR9IHJlcXVpcmVzIGFuIGltbWVkaWF0ZSAke2V4cGVjdGVkTW9kZX0gYm9ycm93LmAsXG4gICAgICAgICAgYm9ycm93Py5sb2NhdGlvbiA/PyBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGlkZW50aXR5QXNWYWx1ZVR5cGUoZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnBhcmFtZXRlclR5cGVzW2luZGV4XSwgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgICAgICAgXCJhbiBlZmZlY3QgYXJndW1lbnRcIiwgZXhwZWN0ZWQpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX1RZUEVfTUlTTUFUQ0hcIiwgYEVmZmVjdCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZCl9LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5yZXNvbHV0aW9uLnJldHVyblR5cGUgPT0gXCJ2b2lkXCIpIHJldHVybiBcInZvaWRcIlxuICAgIHJldHVybiBpZGVudGl0eUFzVmFsdWVUeXBlKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXR1cm5UeXBlLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJSZWZlcmVuY2VDb25zdHJ1Y3Rpb25cIikge1xuICAgIGNvbnN0IHJlZmVyZW5jZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShleHByZXNzaW9uLnJlZmVyZW5jZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLFxuICAgICAgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICBpZiAocmVmZXJlbmNlVHlwZS5raW5kICE9IFwiUmVmZXJlbmNlVHlwZVwiICYmIHJlZmVyZW5jZVR5cGUua2luZCAhPSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWZlcmVuY2UgY29uc3RydWN0aW9uIHJlcXVpcmVzIGEgbm9taW5hbCByZWZlcmVuY2UgY2xhc3MgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpLmdldChyZWZlcmVuY2VUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbChcIlVOS05PV05fQ0xBU1NcIiwgYFVua25vd24gcmVmZXJlbmNlIGNsYXNzICcke3JlZmVyZW5jZVR5cGUuZGVjbGFyYXRpb25JZH0nLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb25zdHJ1Y3RvciBhcmd1bWVudHMgbXVzdCBiZSBhIGRlbnNlIG9yZGVyZWQgYXJyYXkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiQ09OU1RSVUNUT1JfQVJJVFlfTUlTTUFUQ0hcIixcbiAgICAgICAgYENvbnN0cnVjdG9yIGZvciAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7ZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGh9LmAsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHBhcmFtZXRlclR5cGVzID0gZGVjbGFyYXRpb24uY29uc3RydWN0b3IucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcykpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0gPSBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uc3RydWN0b3IgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ29uc3RydWN0b3IgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocGFyYW1ldGVyVHlwZXNbaW5kZXhdKX0uYCxcbiAgICAgICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB7XG4gICAgICBkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIiksXG4gICAgICBwYXJhbWV0ZXJUeXBlczogcGFyYW1ldGVyVHlwZXMubWFwKCh0eXBlKSA9PiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZSkpKVxuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCBcImNvbnN0cnVjdG9yXCIpXG5cbiAgICByZXR1cm4gcmVmZXJlbmNlVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJNZXRob2RDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ucmVjZWl2ZXIsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWV0aG9kIHJlY2VpdmVyXCIpXG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgcmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FVEhPRF9SRUNFSVZFUlwiLCBcIk1ldGhvZCBjYWxsIHJlY2VpdmVyIG11c3QgaGF2ZSBhIHJlZmVyZW5jZSBjbGFzcyB0eXBlLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlZmVyZW5jZUNsYXNzZXNGb3IocmVjb3JkcykuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyAnJHtyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZH0nLmAsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgY29uc3QgbWV0aG9kID0gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLm1ldGhvZCkgPz9cbiAgICAgIChub3JtYWxpemVPcGVyYXRpb25zID8gZGVjbGFyYXRpb24ubWV0aG9kcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IGV4cHJlc3Npb24ubWV0aG9kKSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghbWV0aG9kKSByZXR1cm4gZmFpbChcIlVOS05PV05fTUVUSE9EXCIsIGBDbGFzcyAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzIG5vIG1ldGhvZCAnJHtleHByZXNzaW9uLm1ldGhvZH0nLmAsXG4gICAgICByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24ubWV0aG9kID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChtZXRob2QuaWQpXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNZXRob2QgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gbWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1FVEhPRF9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgTWV0aG9kICcke21ldGhvZC5uYW1lfScgaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7bWV0aG9kLnBhcmFtZXRlcnMubGVuZ3RofS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PlxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKSlcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZXRob2QgYXJndW1lbnRcIiwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWV0aG9kIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHBhcmFtZXRlclR5cGVzW2luZGV4XSl9LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKG1ldGhvZC5yZXR1cm5UeXBlLCBtZXRob2QubG9jYXRpb24sIGZhaWwsIHJlY29yZHMpXG4gICAgY29uc3QgcmVzb3VyY2VGbG93ID0gZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiXG4gICAgICA/IG93bmVkTWV0aG9kUmVzb3VyY2VGbG93KGRlY2xhcmF0aW9uLCBtZXRob2QsIGZhaWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgcmVzb2x1dGlvbiA9IHtcbiAgICAgIGRlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKSxcbiAgICAgIGtpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlXCIpLFxuICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlclR5cGVzLm1hcCgodHlwZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUpKSksXG4gICAgICByZXR1cm5UeXBlOiB0eXBlSWRlbnRpdHkocmV0dXJuVHlwZSksXG4gICAgICAuLi4ocmVzb3VyY2VGbG93ID8ge3Jlc291cmNlRmxvd30gOiB7fSlcbiAgICB9XG5cbiAgICBpZiAoZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIgJiYgcmVzb3VyY2VGbG93KSB7XG4gICAgICBjb25zdCBleHBlY3RlZE1vZGUgPSByZXNvdXJjZUZsb3cua2luZCA9PSBcInRlcm1pbmFsXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIlxuXG4gICAgICBpZiAoZXhwcmVzc2lvbi5yZWNlaXZlci5tb2RlICE9IGV4cGVjdGVkTW9kZSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgYElOVkFMSURfUkVTT1VSQ0VfQk9SUk9XOiBPd25lZCBtZXRob2QgcmVxdWlyZXMgYW4gaW1tZWRpYXRlICR7ZXhwZWN0ZWRNb2RlfSByZWNlaXZlciBib3Jyb3cuYCxcbiAgICAgICAgICBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNlaXZlclR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiICYmIGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiKSB7XG4gICAgICBpZiAoIW5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIk93bmVkIG1ldGhvZCByZWNlaXZlciByZXF1aXJlcyBhbiBpbW1lZGlhdGUgYm9ycm93LlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgZmFpbChcIkJPUlJPV19FU0NBUEVcIiwgXCJPd25lZCBtZXRob2QgcmVjZWl2ZXIgYm9ycm93IG11c3QgbmFtZSBvbmUgaW1tZWRpYXRlIGJpbmRpbmcuXCIsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBleHByZXNzaW9uLnJlY2VpdmVyID0ge1xuICAgICAgICBleHByZXNzaW9uOiBleHByZXNzaW9uLnJlY2VpdmVyLFxuICAgICAgICBraW5kOiBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiLFxuICAgICAgICBsb2NhdGlvbjogZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbixcbiAgICAgICAgbW9kZTogcmVzb3VyY2VGbG93Py5raW5kID09IFwidGVybWluYWxcIiA/IFwiZXhjbHVzaXZlXCIgOiBcInNoYXJlZFwiLFxuICAgICAgICBzb3VyY2VQcm92ZW5hbmNlOiBleHByZXNzaW9uLnJlY2VpdmVyLnNvdXJjZVByb3ZlbmFuY2UsXG4gICAgICAgIHR5cGU6IHJlY2VpdmVyVHlwZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlZmVyZW5jZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCBcIm1ldGhvZFwiKVxuXG4gICAgcmV0dXJuIGlzVm9pZFR5cGUocmV0dXJuVHlwZSkgPyBcInZvaWRcIiA6IHJldHVyblR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjb3JkQ29uc3RydWN0aW9uXCIpIHtcbiAgICBjb25zdCByZWNvcmRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoZXhwcmVzc2lvbi5yZWNvcmQsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICBpZiAocmVjb3JkVHlwZS5raW5kICE9IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWNvcmQgY29uc3RydWN0aW9uIHJlcXVpcmVzIGEgbm9taW5hbCByZWNvcmQgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChyZWNvcmRUeXBlLmRlY2xhcmF0aW9uSWQpXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uKSByZXR1cm4gZmFpbChcIlVOS05PV05fUkVDT1JEXCIsIGBVbmtub3duIHJlY29yZCBkZWNsYXJhdGlvbiAnJHtyZWNvcmRUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmFyZ3VtZW50cykgfHwgZXhwcmVzc2lvbi5hcmd1bWVudHMuc29tZSgoX2FyZ3VtZW50LCBpbmRleCkgPT4gIU9iamVjdC5oYXNPd24oZXhwcmVzc2lvbi5hcmd1bWVudHMsIGluZGV4KSkpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY29yZCBjb25zdHJ1Y3Rpb24gYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFxuICAgICAgICBcIlJFQ09SRF9BUklUWV9NSVNNQVRDSFwiLFxuICAgICAgICBgUmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyBjb25zdHJ1Y3Rpb24gaGFzICR7ZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RofSBhcmd1bWVudHM7IGV4cGVjdGVkICR7ZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aH0uYCxcbiAgICAgICAgZXhwcmVzc2lvbi5sb2NhdGlvblxuICAgICAgKVxuICAgIH1cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gcmVjb3JkVHlwZVN1YnN0aXR1dGlvbnMocmVjb3JkVHlwZSwgZGVjbGFyYXRpb24pXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF1cbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2luZGV4XVxuICAgICAgY29uc3QgZmllbGRUeXBlID0gc3Vic3RpdHV0ZVZhbHVlVHlwZShmaWVsZC50eXBlLCBzdWJzdGl0dXRpb25zKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBhcmd1bWVudCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgYHJlY29yZCBmaWVsZCAnJHtmaWVsZC5uYW1lfSdgLCBmaWVsZFR5cGVcbiAgICAgIClcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIGZpZWxkVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJlY29yZCBmaWVsZCAnJHtmaWVsZC5uYW1lfScgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZmllbGRUeXBlKX0uYCwgYXJndW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWVtYmVyUmVhZFwiKSB7XG4gICAgY29uc3QgcmVjZWl2ZXJUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ucmVjZWl2ZXIsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtZW1iZXIgcmVjZWl2ZXJcIilcblxuICAgIGlmIChyZWNlaXZlclR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FTUJFUl9SRUNFSVZFUlwiLCBgTWVtYmVyIHJlY2VpdmVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24ocmVjZWl2ZXJUeXBlKX07IGV4cGVjdGVkIHJlY29yZC5gLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IHJlY29yZHMuZ2V0KHJlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7cmVjZWl2ZXJUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGV4cHJlc3Npb24uZmllbGQpID8/XG4gICAgICAobm9ybWFsaXplT3BlcmF0aW9ucyA/IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5uYW1lID09IGV4cHJlc3Npb24uZmllbGQpIDogdW5kZWZpbmVkKVxuXG4gICAgaWYgKCFmaWVsZCkgZmFpbChcIlVOS05PV05fRklFTERcIiwgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgaGFzIG5vIGZpZWxkICcke2V4cHJlc3Npb24uZmllbGR9Jy5gLCByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJtZW1iZXJcIikpXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGV4cHJlc3Npb24uZmllbGQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGZpZWxkLmlkKVxuXG4gICAgcmV0dXJuIHN1YnN0aXR1dGVWYWx1ZVR5cGUoZmllbGQudHlwZSwgcmVjb3JkVHlwZVN1YnN0aXR1dGlvbnMocmVjZWl2ZXJUeXBlLCBkZWNsYXJhdGlvbikpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNhbGxFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uID0gZnVuY3Rpb25zLmdldChleHByZXNzaW9uLmNhbGxlZSlcblxuICAgIGlmICghZnVuY3Rpb25EZWNsYXJhdGlvbikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTlJFU09MVkVEX0JJTkRJTkdcIiwgYFVua25vd24gZnVuY3Rpb24gJyR7ZXhwcmVzc2lvbi5jYWxsZWV9Jy5gLCByb2xlTG9jYXRpb24oZXhwcmVzc2lvbiwgXCJjYWxsZWVcIikpXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGggIT0gZnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IGNvdW50IGZvciAnJHtleHByZXNzaW9uLmNhbGxlZX0nLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZnVuY3Rpb25EZWNsYXJhdGlvbilcbiAgICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSAqL1xuICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSBuZXcgTWFwKClcbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoXG4gICAgICBwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcnNcbiAgICApKVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSA9IG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHBhcmFtZXRlclR5cGVzW2luZGV4XSwgbm9ybWFsaXplT3BlcmF0aW9ucywgZmFpbClcbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgYXJndW1lbnQgPSBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF1cbiAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZSA9IHBhcmFtZXRlclR5cGVzW2luZGV4XVxuICAgICAgY29uc3QgZ2F0aGVyc0dlbmVyaWNFdmlkZW5jZSA9IHR5cGVDb250YWluc0FueVZhcmlhYmxlKGV4cGVjdGVkVHlwZSlcblxuICAgICAgaWYgKGdhdGhlcnNHZW5lcmljRXZpZGVuY2UpIHtcbiAgICAgICAgaW5mZXJHZW5lcmljQXJndW1lbnRFdmlkZW5jZShleHBlY3RlZFR5cGUsIGFyZ3VtZW50LCBzdWJzdGl0dXRpb25zLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBhcmd1bWVudCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNhbGwgYXJndW1lbnRcIiwgZXhwZWN0ZWRUeXBlXG4gICAgICApXG5cbiAgICAgIGlmICgoZnVuY3Rpb25EZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycz8ubGVuZ3RoID8/IDApID4gMCkge1xuICAgICAgICBpbmZlclR5cGVBcmd1bWVudHMoZXhwZWN0ZWRUeXBlLCBhY3R1YWxUeXBlLCBzdWJzdGl0dXRpb25zLCBhcmd1bWVudC5sb2NhdGlvbiwgZmFpbClcbiAgICAgIH0gZWxzZSBpZiAoIXNhbWVUeXBlKGFjdHVhbFR5cGUsIGV4cGVjdGVkVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWxUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZSl9LmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBmdW5jdGlvbkRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKSB7XG4gICAgICBpZiAoIXN1YnN0aXR1dGlvbnMuaGFzKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSkpIHtcbiAgICAgICAgY29uc3QgZXZpZGVuY2VGcmVlSW5kZXggPSBwYXJhbWV0ZXJUeXBlcy5maW5kSW5kZXgoKHR5cGUpID0+XG4gICAgICAgICAgdHlwZUNvbnRhaW5zVmFyaWFibGUodHlwZSwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXJhbWV0ZXIuaWQpKSlcblxuICAgICAgICBpZiAoZXZpZGVuY2VGcmVlSW5kZXggPj0gMCkge1xuICAgICAgICAgIGZhaWwoXCJHRU5FUklDX0lORkVSRU5DRV9GQUlMVVJFXCIsIFwiQ2Fubm90IGluZmVyIGEgdHlwZSBwYXJhbWV0ZXIgZnJvbSBhbiBldmlkZW5jZS1mcmVlIGNhbGwgYXJndW1lbnQuXCIsXG4gICAgICAgICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tldmlkZW5jZUZyZWVJbmRleF0ubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX0ZBSUxVUkVcIiwgYENhbm5vdCBpbmZlciB0eXBlIHBhcmFtZXRlciAnJHtwYXJhbWV0ZXIubmFtZX0nIGZyb20gY2FsbCBhcmd1bWVudHMuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFsuLi5zdWJzdGl0dXRpb25zLnZhbHVlcygpXS5zb21lKCh0eXBlKSA9PiBjb250YWluc093bmVkVHlwZSh0eXBlKSkpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBhbmQgcmVmZXJlbmNlcyBjYW5ub3QgYmUgaW5mZXJyZWQgYXMgZ2VuZXJpYyBhcmd1bWVudHMuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IHN1YnN0aXR1dGVWYWx1ZVR5cGUoZnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzW2luZGV4XS50eXBlLCBzdWJzdGl0dXRpb25zKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNhbGwgYXJndW1lbnRcIiwgZXhwZWN0ZWQpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWQpfS5gLCBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSBzaWduYXR1cmVGb3IoZnVuY3Rpb25EZWNsYXJhdGlvbiwgcmVjb3JkcywgZmFpbCwgc3Vic3RpdHV0aW9ucylcblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnJlc29sdXRpb24gPSByZXNvbHV0aW9uXG4gICAgZWxzZSB2YWxpZGF0ZVJlc29sdXRpb24oZXhwcmVzc2lvbi5yZXNvbHV0aW9uLCByZXNvbHV0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IHJldHVyblR5cGUgPSBzdWJzdGl0dXRlUmV0dXJuVHlwZSh2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZnVuY3Rpb25EZWNsYXJhdGlvbi5yZXR1cm5UeXBlLFxuICAgICAgZnVuY3Rpb25EZWNsYXJhdGlvbi5sb2NhdGlvbiwgZmFpbCwgcmVjb3JkcywgZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVycyksIHN1YnN0aXR1dGlvbnMpXG5cbiAgICByZXR1cm4gaXNWb2lkVHlwZShyZXR1cm5UeXBlKSA/IFwidm9pZFwiIDogcmV0dXJuVHlwZVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJVbmFyeUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IG9wZXJhbmQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5vcGVyYW5kLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgdW5hcnkgb3BlcmFuZFwiKVxuICAgIGNvbnN0IG9wZXJhbmRUeXBlID0gc2NhbGFyTmFtZUZvck9wZXJhdGlvbihvcGVyYW5kLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gbm9ybWFsaXplT3BlcmF0aW9uc1xuICAgICAgPyBub3JtYWxpemVVbmFyeU9wZXJhdGlvbihhZGFwdGVkT3BlcmF0aW9uRm9yKGV4cHJlc3Npb24pLCBvcGVyYW5kVHlwZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgOiBleHByZXNzaW9uLm9wZXJhdGlvblxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHNldE5vcm1hbGl6ZWRPcGVyYXRpb24oZXhwcmVzc2lvbiwgb3BlcmF0aW9uLCB1bmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXS5yZXN1bHQpXG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSB1bmFyeU9wZXJhdGlvblNpZ25hdHVyZXNbb3BlcmF0aW9uXVxuXG4gICAgaWYgKCFzaWduYXR1cmUpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biB1bmFyeSBvcGVyYXRpb24gJHtTdHJpbmcob3BlcmF0aW9uKX0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAob3BlcmFuZFR5cGUgIT0gc2lnbmF0dXJlLm9wZXJhbmQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5vcGVyYW5kfTsgcmVjZWl2ZWQgJHtvcGVyYW5kVHlwZX0uYCwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi50eXBlICE9IHNpZ25hdHVyZS5yZXN1bHQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgJHtvcGVyYXRpb259IHJlc3VsdCB0eXBlICR7U3RyaW5nKGV4cHJlc3Npb24udHlwZSl9OyBleHBlY3RlZCAke3NpZ25hdHVyZS5yZXN1bHR9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBzY2FsYXJUeXBlKHNpZ25hdHVyZS5yZXN1bHQpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGxlZnQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5sZWZ0LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgYmluYXJ5IG9wZXJhbmRcIilcbiAgICBjb25zdCByaWdodCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLnJpZ2h0LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgYmluYXJ5IG9wZXJhbmRcIilcbiAgICBjb25zdCBsZWZ0VHlwZSA9IHNjYWxhck5hbWVGb3JPcGVyYXRpb24obGVmdCwgZXhwcmVzc2lvbi5sZWZ0LmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IHJpZ2h0VHlwZSA9IHNjYWxhck5hbWVGb3JPcGVyYXRpb24ocmlnaHQsIGV4cHJlc3Npb24ucmlnaHQubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gbm9ybWFsaXplT3BlcmF0aW9uc1xuICAgICAgPyBub3JtYWxpemVCaW5hcnlPcGVyYXRpb24oYWRhcHRlZE9wZXJhdGlvbkZvcihleHByZXNzaW9uKSwgbGVmdFR5cGUsIHJpZ2h0VHlwZSwgZXhwcmVzc2lvbi5sZWZ0LmxvY2F0aW9uLCBleHByZXNzaW9uLnJpZ2h0LmxvY2F0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgOiBleHByZXNzaW9uLm9wZXJhdGlvblxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHNldE5vcm1hbGl6ZWRPcGVyYXRpb24oZXhwcmVzc2lvbiwgb3BlcmF0aW9uLCBiaW5hcnlPcGVyYXRpb25TaWduYXR1cmVzW29wZXJhdGlvbl0ucmVzdWx0KVxuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYmluYXJ5T3BlcmF0aW9uU2lnbmF0dXJlc1tvcGVyYXRpb25dXG5cbiAgICBpZiAoIXNpZ25hdHVyZSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIGJpbmFyeSBvcGVyYXRpb24gJHtTdHJpbmcob3BlcmF0aW9uKX0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAobGVmdFR5cGUgIT0gc2lnbmF0dXJlLmxlZnQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5sZWZ0fSBsZWZ0IG9wZXJhbmQ7IHJlY2VpdmVkICR7bGVmdFR5cGV9LmAsIGV4cHJlc3Npb24ubGVmdC5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHJpZ2h0VHlwZSAhPSBzaWduYXR1cmUucmlnaHQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5yaWdodH0gcmlnaHQgb3BlcmFuZDsgcmVjZWl2ZWQgJHtyaWdodFR5cGV9LmAsIGV4cHJlc3Npb24ucmlnaHQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLnR5cGUgIT0gc2lnbmF0dXJlLnJlc3VsdCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGAke29wZXJhdGlvbn0gcmVzdWx0IHR5cGUgJHtTdHJpbmcoZXhwcmVzc2lvbi50eXBlKX07IGV4cGVjdGVkICR7c2lnbmF0dXJlLnJlc3VsdH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoc2lnbmF0dXJlLnJlc3VsdClcbiAgfVxuXG4gIGNvbnN0IHVuZXhwZWN0ZWQgPSAvKiogQHR5cGUge3traW5kOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufX0gKi8gKGV4cHJlc3Npb24pXG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIHVuZXhwZWN0ZWQua2luZCwgdW5leHBlY3RlZC5sb2NhdGlvbilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbWFwIGxheW91dCBhbmQgZml4ZWQgc3RyaW5nIGtleXMgaW5kZXBlbmRlbnRseSBvZiBjb250ZXh0dWFsIHZhbHVlIGluZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBMaXRlcmFsIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5PcmRlcmVkTWFwTGl0ZXJhbH0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBtYXAgbGl0ZXJhbC5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byBub3JtYWxpemUgZnJvbnRlbmQgaW50ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBpbmZlckNvbGxlY3Rpb25FbGVtZW50cyAtIFdoZXRoZXIgbmVzdGVkIGNvbGxlY3Rpb24gZXZpZGVuY2UgbWF5IGJlIGluZmVycmVkLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuTWFwRW50cnlbXX0gVmFsaWRhdGVkIGRlbnNlIGVudHJpZXMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTWFwTGl0ZXJhbEVudHJpZXMoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZW50cmllcykpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgbGl0ZXJhbCBlbnRyaWVzIG11c3QgYmUgYSBkZW5zZSBzb3VyY2Utb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgfVxuICBpZiAoIWlzRGVuc2VBcnJheShleHByZXNzaW9uLmVudHJpZXMpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIG1hcCBsaXRlcmFscyBhcmUgb3V0c2lkZSB0aGUgaW1wbGVtZW50ZWQgc3Vic2V0LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4cHJlc3Npb24uZW50cmllcykge1xuICAgIGlmICghZW50cnkgfHwgZW50cnkua2luZCAhPSBcIk1hcEVudHJ5XCIgfHwgIWVudHJ5LmtleSB8fCBlbnRyeS5rZXkua2luZCAhPSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgZW50cmllcyByZXF1aXJlIGxpdGVyYWwgc3RyaW5nIGtleXMuXCIsIGVudHJ5Py5sb2NhdGlvbiA/PyBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZW50cnkua2V5LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIGtleVwiLFxuICAgICAgc2NhbGFyVHlwZShcInN0cmluZ1wiKSwgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpXG4gICAgaWYgKGlzTnVtZXJpY1N0cmluZyhlbnRyeS5rZXkudmFsdWUpKSB7XG4gICAgICBmYWlsKFwiSU5WQUxJRF9NQVBfS0VZXCIsIFwiTWFwIGluaXRpYWxpemVyIGtleXMgbXVzdCBiZSBub25udW1lcmljIHN0cmluZ3MuXCIsIGVudHJ5LmtleS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGtleXMuaGFzKGVudHJ5LmtleS52YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfTUFQX0tFWVwiLCBgRHVwbGljYXRlICR7ZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIiA/IFwib3JkZXJlZC1tYXBcIiA6IFwibWFwXCJ9IGtleSAnJHtlbnRyeS5rZXkudmFsdWV9Jy5gLFxuICAgICAgICBlbnRyeS5rZXkubG9jYXRpb24pXG4gICAgfVxuICAgIGtleXMuYWRkKGVudHJ5LmtleS52YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBleHByZXNzaW9uLmVudHJpZXNcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhcmd1bWVudC1vbmx5IGdlbmVyaWMgZXZpZGVuY2Ugd2hpbGUgZGVmZXJyaW5nIHJlY3Vyc2l2ZWx5IGNvbnRleHR1YWwgbGl0ZXJhbHMuXG4gKiBUaGUgY29tcGxldGUgYXJndW1lbnQgaXMgdmFsaWRhdGVkIGFnYWluc3QgaXRzIGNsb3NlZCBzdWJzdGl0dXRlZCB0eXBlIGFmdGVyIGluZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gZm9ybWFsIC0gT3BlbiBkZWNsYXJhdGlvbiBwYXJhbWV0ZXIgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQ2FsbCBhcmd1bWVudCBvciBuZXN0ZWQgY29sbGVjdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZT59IHN1YnN0aXR1dGlvbnMgLSBJbmZlcmVuY2Ugc3RhdGUuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgbGV4aWNhbCBzY29wZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gbm9ybWFsaXplIGZyb250ZW5kIGludGVudC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbCwgZXhwcmVzc2lvbiwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgbm9ybWFsaXplT3BlcmF0aW9ucykge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxOb25lXCIpIHJldHVyblxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikge1xuICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLnZhbHVlVHlwZSwgZXhwcmVzc2lvbi52YWx1ZSwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiTGlzdFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkxpc3QgbGl0ZXJhbCBlbGVtZW50cyBtdXN0IGJlIGEgZGVuc2Ugc291cmNlLW9yZGVyZWQgYXJyYXkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlNwYXJzZSBsaXN0IGxpdGVyYWxzIGFyZSBvdXRzaWRlIHRoZSBpbXBsZW1lbnRlZCBzdWJzZXQuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBleHByZXNzaW9uLmVsZW1lbnRzKSB7XG4gICAgICBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbC5lbGVtZW50VHlwZSwgZWxlbWVudCwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKChmb3JtYWwua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIpIHx8XG4gICAgKGZvcm1hbC5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHRydWUpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLnZhbHVlVHlwZSwgZW50cnkudmFsdWUsIHN1YnN0aXR1dGlvbnMsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICBleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY2FsbCBhcmd1bWVudFwiLCB1bmRlZmluZWQsIHRydWVcbiAgKVxuXG4gIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwsIGFjdHVhbCwgc3Vic3RpdHV0aW9ucywgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcbn1cblxuLyoqXG4gKiBVbmlmaWVzIG9uZSBkZWNsYXJhdGlvbi1vd25lZCBmb3JtYWwgdHlwZSB3aXRoIG9uZSBhcmd1bWVudCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBmb3JtYWwgLSBHZW5lcmljIHNpZ25hdHVyZSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBhY3R1YWwgLSBJbmZlcnJlZCBhcmd1bWVudCB0eXBlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gc3Vic3RpdHV0aW9ucyAtIEluZmVyZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBcmd1bWVudCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLCBhY3R1YWwsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgY29uc3QgcHJpb3IgPSBzdWJzdGl0dXRpb25zLmdldChmb3JtYWwucGFyYW1ldGVySWQpXG5cbiAgICBpZiAocHJpb3IpIHtcbiAgICAgIGlmICghc2FtZVR5cGUocHJpb3IsIGFjdHVhbCkpIHtcbiAgICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX0NPTkZMSUNUXCIsIGBDb25mbGljdGluZyBpbmZlcmVuY2UgZm9yIHR5cGUgcGFyYW1ldGVyICcke2Zvcm1hbC5wYXJhbWV0ZXJJZH0nLmAsIGxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghKGFjdHVhbC5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIgJiYgYWN0dWFsLnBhcmFtZXRlcklkID09IGZvcm1hbC5wYXJhbWV0ZXJJZCkgJiZcbiAgICAgIHR5cGVDb250YWluc1ZhcmlhYmxlKGFjdHVhbCwgZm9ybWFsLnBhcmFtZXRlcklkKSkge1xuICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX1JFQ1VSU0lPTlwiLCBgUmVjdXJzaXZlIGluZmVyZW5jZSBmb3IgdHlwZSBwYXJhbWV0ZXIgJyR7Zm9ybWFsLnBhcmFtZXRlcklkfScuYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHN1YnN0aXR1dGlvbnMuc2V0KGZvcm1hbC5wYXJhbWV0ZXJJZCwgYWN0dWFsKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCAhPSBhY3R1YWwua2luZCkge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZvcm1hbCl9LmAsIGxvY2F0aW9uKVxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIGlmICghc2FtZVR5cGUoZm9ybWFsLCBhY3R1YWwpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgaWYgKGZvcm1hbC5kZWNsYXJhdGlvbklkICE9IGFjdHVhbC5kZWNsYXJhdGlvbklkKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgaWYgKGZvcm1hbC5kZWNsYXJhdGlvbklkICE9IGFjdHVhbC5kZWNsYXJhdGlvbklkIHx8IChmb3JtYWwuYXJndW1lbnRzPy5sZW5ndGggPz8gMCkgIT0gKGFjdHVhbC5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZm9ybWFsKX0uYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAoZm9ybWFsLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDApOyBpbmRleCArPSAxKSB7XG4gICAgICBpbmZlclR5cGVBcmd1bWVudHMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoZm9ybWFsLmFyZ3VtZW50cz8uW2luZGV4XSksXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGFjdHVhbC5hcmd1bWVudHM/LltpbmRleF0pLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiTGlzdFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLmVsZW1lbnRUeXBlLCBhY3R1YWwuZWxlbWVudFR5cGUsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLnZhbHVlVHlwZSwgYWN0dWFsLnZhbHVlVHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKChmb3JtYWwua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIk1hcFR5cGVcIikgfHxcbiAgICAoZm9ybWFsLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLmtleVR5cGUsIGFjdHVhbC5rZXlUeXBlLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLnZhbHVlVHlwZSwgYWN0dWFsLnZhbHVlVHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIG9jY3VycyBjb25zdHJhaW50IGZvciBmaXJzdC1vcmRlciBpbmZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBDYW5kaWRhdGUgaW5mZXJyZWQgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbWV0ZXJJZCAtIFBhcmFtZXRlciBiZWluZyBpbmZlcnJlZC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSB0eXBlIHJlY3Vyc2l2ZWx5IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbmZ1bmN0aW9uIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUsIHBhcmFtZXRlcklkKSB7XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUucGFyYW1ldGVySWQgPT0gcGFyYW1ldGVySWRcbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHR5cGUuYXJndW1lbnRzPy5zb21lKChhcmd1bWVudCkgPT4gdHlwZUNvbnRhaW5zVmFyaWFibGUoYXJndW1lbnQsIHBhcmFtZXRlcklkKSkgPz8gZmFsc2VcbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLmVsZW1lbnRUeXBlLCBwYXJhbWV0ZXJJZClcbiAgaWYgKHR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUua2V5VHlwZSwgcGFyYW1ldGVySWQpIHx8IHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUudmFsdWVUeXBlLCBwYXJhbWV0ZXJJZClcbiAgfVxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLnZhbHVlVHlwZSwgcGFyYW1ldGVySWQpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQXBwbGllcyBzdWJzdGl0dXRpb25zIHRvIGEgdmFsdWUgb3Igdm9pZCByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIE9wZW4gcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBzdWJzdGl0dXRpb25zIC0gQ2xvc2VkIHN1YnN0aXR1dGlvbnMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gU3Vic3RpdHV0ZWQgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHN1YnN0aXR1dGVSZXR1cm5UeXBlKHR5cGUsIHN1YnN0aXR1dGlvbnMpIHtcbiAgcmV0dXJuIGlzVm9pZFR5cGUodHlwZSkgPyB0eXBlIDogc3Vic3RpdHV0ZVZhbHVlVHlwZSh0eXBlLCBzdWJzdGl0dXRpb25zKVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhhY3Qgc2VtYW50aWMgc2lnbmF0dXJlIGJvdW5kIHRvIG9uZSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFJlc29sdmVkIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBbc3Vic3RpdHV0aW9uc10gLSBJbmZlcnJlZCBnZW5lcmljIHN1YnN0aXR1dGlvbnMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBEZXRhY2hlZCBzaWduYXR1cmUgYmluZGluZy5cbiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlRm9yKGRlY2xhcmF0aW9uLCByZWNvcmRzLCBmYWlsLCBzdWJzdGl0dXRpb25zID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuICBjb25zdCBkZWNsYXJlZFBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXVxuICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgc3Vic3RpdHV0ZVZhbHVlVHlwZSh2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKSwgc3Vic3RpdHV0aW9ucykpXG4gIGNvbnN0IHJldHVyblR5cGUgPSBzdWJzdGl0dXRlUmV0dXJuVHlwZShcbiAgICB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgZGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKSwgc3Vic3RpdHV0aW9ucylcblxuICByZXR1cm4ge1xuICAgIGRlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLFxuICAgIGtpbmQ6IFwiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwiLFxuICAgIHBhcmFtZXRlclR5cGVzOiBwYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlKSkpLFxuICAgIHJldHVyblR5cGU6IHR5cGVJZGVudGl0eShyZXR1cm5UeXBlKSxcbiAgICAuLi4oZGVjbGFyZWRQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyB7XG4gICAgICB0eXBlQXJndW1lbnRzOiBkZWNsYXJlZFBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSgvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChcbiAgICAgICAgICBzdWJzdGl0dXRpb25zLmdldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmFtZXRlci5pZCkpXG4gICAgICAgICkpKSlcbiAgICB9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gZXh0ZXJuYWxseSBzdXBwbGllZCBjYWxsIGJpbmRpbmcgYWdhaW5zdCB0aGUgZGVjbGFyYXRpb24gY29sbGVjdGVkIGZvciB0aGlzIG1vZHVsZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIC0gQ2FuZGlkYXRlIGNhbGwgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBleHBlY3RlZCAtIEV4YWN0IGRlY2xhcmF0aW9uIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYWxsIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzb2x1dGlvbihhY3R1YWwsIGV4cGVjdGVkLCBsb2NhdGlvbiwgZmFpbCkge1xuICBjb25zdCBleHBlY3RlZEtleXMgPSBleHBlY3RlZC50eXBlQXJndW1lbnRzID8gXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXMscmV0dXJuVHlwZSx0eXBlQXJndW1lbnRzXCIgOlxuICAgIFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJldHVyblR5cGVcIlxuXG4gIGlmICghYWN0dWFsIHx8IHR5cGVvZiBhY3R1YWwgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGFjdHVhbCkgfHxcbiAgICBPYmplY3Qua2V5cyhhY3R1YWwpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBleHBlY3RlZEtleXMpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgaXMgbWlzc2luZyBhbiBleGFjdCByZXNvbHZlZCBmdW5jdGlvbiBzaWduYXR1cmUuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSAqLyAoYWN0dWFsKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcIiB8fCB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcykgfHwgIXZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5yZXR1cm5UeXBlLCB0cnVlKSB8fFxuICAgIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IGV4cGVjdGVkLmRlY2xhcmF0aW9uSWQgfHxcbiAgICAhc2FtZVR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgZXhwZWN0ZWQucmV0dXJuVHlwZSkgfHwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgcmVzb2x1dGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyYXRpb24gc2lnbmF0dXJlLlwiLCBsb2NhdGlvbilcbiAgfVxuICBpZiAoZXhwZWN0ZWQudHlwZUFyZ3VtZW50cykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMgPSBjYW5kaWRhdGUudHlwZUFyZ3VtZW50c1xuXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlVHlwZUFyZ3VtZW50cykgfHwgY2FuZGlkYXRlVHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZXhwZWN0ZWQudHlwZUFyZ3VtZW50cy5sZW5ndGggfHxcbiAgICAgIGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMuc29tZSgodHlwZSwgaW5kZXgpID0+XG4gICAgICAgICF2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBmYWxzZSkgfHwgIXNhbWVUeXBlSWRlbnRpdHkodHlwZSwgZXhwZWN0ZWQudHlwZUFyZ3VtZW50cz8uW2luZGV4XSkpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgcmVzb2x1dGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgaW5mZXJyZWQgdHlwZSBhcmd1bWVudHMuXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHR5cGUgPSBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXNbaW5kZXhdXG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLCBpbmRleCkgfHwgIXZhbGlkVHlwZUlkZW50aXR5KHR5cGUsIGZhbHNlKSB8fFxuICAgICAgIXNhbWVUeXBlSWRlbnRpdHkodHlwZSwgZXhwZWN0ZWQucGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDYWxsIHJlc29sdXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmF0aW9uIHNpZ25hdHVyZS5cIiwgbG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGV4YWN0IGNhbGxlci1vd25lZCBjb25zdHJ1Y3RvciBvciBtZXRob2QgcmVzb2x1dGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIC0gQ2FuZGlkYXRlIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZSB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IGV4cGVjdGVkIC0gRXhhY3QgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeHByZXNzaW9uIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwifSByb2xlIC0gUmVzb2x1dGlvbiByb2xlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVmZXJlbmNlUmVzb2x1dGlvbihhY3R1YWwsIGV4cGVjdGVkLCBsb2NhdGlvbiwgZmFpbCwgcm9sZSkge1xuICBjb25zdCBleHBlY3RlZE1ldGhvZCA9IHJvbGUgPT0gXCJtZXRob2RcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gKi8gKGV4cGVjdGVkKSA6IHVuZGVmaW5lZFxuICBjb25zdCBleHBlY3RlZEtleXMgPSByb2xlID09IFwiY29uc3RydWN0b3JcIiA/IFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzXCIgOlxuICAgIGV4cGVjdGVkTWV0aG9kPy5yZXNvdXJjZUZsb3cgPyBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlcyxyZXNvdXJjZUZsb3cscmV0dXJuVHlwZVwiIDpcbiAgICAgIFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJldHVyblR5cGVcIlxuXG4gIGlmICghYWN0dWFsIHx8IHR5cGVvZiBhY3R1YWwgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGFjdHVhbCkgfHwgT2JqZWN0LmtleXMoYWN0dWFsKS5zb3J0KCkuam9pbihcIixcIikgIT0gZXhwZWN0ZWRLZXlzKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJlZmVyZW5jZSAke3JvbGV9IGNhbGwgaXMgbWlzc2luZyBhbiBleGFjdCByZXNvbHZlZCAke3JvbGV9IHNpZ25hdHVyZS5gLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoYWN0dWFsKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBleHBlY3RlZC5raW5kIHx8IGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IGV4cGVjdGVkLmRlY2xhcmF0aW9uSWQgfHxcbiAgICAhaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcykgfHwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggfHxcbiAgICBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMuc29tZSgodHlwZSwgaW5kZXgpID0+ICF2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBmYWxzZSkgfHxcbiAgICAgICFzYW1lVHlwZUlkZW50aXR5KHR5cGUsIGV4cGVjdGVkLnBhcmFtZXRlclR5cGVzW2luZGV4XSkpIHx8XG4gICAgcm9sZSA9PSBcIm1ldGhvZFwiICYmICghdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnJldHVyblR5cGUsIHRydWUpIHx8XG4gICAgICAhc2FtZVR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSAqLyAoZXhwZWN0ZWQpLnJldHVyblR5cGUpIHx8XG4gICAgICBKU09OLnN0cmluZ2lmeShjYW5kaWRhdGUucmVzb3VyY2VGbG93KSAhPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZE1ldGhvZD8ucmVzb3VyY2VGbG93KSkpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUmVzb2x2ZWQgJHtyb2xlfSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmF0aW9uLmAsIGxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogTWFrZXMgYSBzb3VyY2UgaWRlbnRpZmllcidzIG93bmVyc2hpcCB0cmFuc2ZlciBleHBsaWNpdCBpbiBub3JtYWxpemVkIElSLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBDYW5kaWRhdGUgdHJhbnNmZXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gZXhwZWN0ZWQgLSBEZXN0aW5hdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemUgLSBXaGV0aGVyIHBhcnNlciBpbnRlbnQgbWF5IGJlIG5vcm1hbGl6ZWQuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IEV4cGxpY2l0IGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLCBleHBlY3RlZCwgbm9ybWFsaXplLCBmYWlsKSB7XG4gIGlmIChleHBlY3RlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBleHBlY3RlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBleHByZXNzaW9uXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPd25lZE1vdmVFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfVFJBTlNGRVJcIiwgXCJQcml2YXRlIHJlc291cmNlIGZpZWxkcyBjYW5ub3QgYmUgbW92ZWQgb3IgZXhwb3NlZDsgdHJhbnNmZXIgdGhlIG93bmluZyByZWZlcmVuY2UuXCIsXG4gICAgICBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoIW5vcm1hbGl6ZSkgcmV0dXJuIGZhaWwoXCJSRVNPVVJDRV9NT1ZFX1JFUVVJUkVEXCIsIFwiT3duZWQgdHJhbnNmZXIgcmVxdWlyZXMgYW4gZXhwbGljaXQgbW92ZSBleHByZXNzaW9uLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gIHJldHVybiB7XG4gICAgZXhwcmVzc2lvbixcbiAgICBraW5kOiBcIk93bmVkTW92ZUV4cHJlc3Npb25cIixcbiAgICBsb2NhdGlvbjogZXhwcmVzc2lvbi5sb2NhdGlvbixcbiAgICBzb3VyY2VQcm92ZW5hbmNlOiBleHByZXNzaW9uLnNvdXJjZVByb3ZlbmFuY2UsXG4gICAgdHlwZTogZXhwZWN0ZWRcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgdGhlIGRlbGliZXJhdGVseSBib3VuZGVkIFRhc2sgMDM0IHJlY2VpdmVyIHRyYW5zaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBPd25lZCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gbWV0aG9kIC0gQ2FuZGlkYXRlIG1ldGhvZC5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gUmVjZWl2ZXIgdHJhbnNpdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3duZWRNZXRob2RSZXNvdXJjZUZsb3coZGVjbGFyYXRpb24sIG1ldGhvZCwgZmFpbCkge1xuICBjb25zdCBlZmZlY3RTdGF0ZW1lbnRzID0gbWV0aG9kLmJvZHkuc3RhdGVtZW50cy5mbGF0TWFwKChzdGF0ZW1lbnQpID0+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIiA/IHN0YXRlbWVudC5leHByZXNzaW9uIDpcbiAgICAgIHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiID8gc3RhdGVtZW50LmluaXRpYWxpemVyIDogdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbj8ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgPyBbZXhwcmVzc2lvbl0gOiBbXVxuICB9KVxuICBjb25zdCBhbGxFZmZlY3RzID0gbWV0aG9kRWZmZWN0RXhwcmVzc2lvbnMobWV0aG9kLmJvZHkpXG5cbiAgaWYgKGFsbEVmZmVjdHMubGVuZ3RoID09IDApIHJldHVybiB7a2luZDogXCJwcmVzZXJ2ZVwifVxuICBpZiAobWV0aG9kLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggIT0gMSB8fCBlZmZlY3RTdGF0ZW1lbnRzLmxlbmd0aCAhPSAxIHx8IGFsbEVmZmVjdHMubGVuZ3RoICE9IDEgfHxcbiAgICBhbGxFZmZlY3RzWzBdICE9PSBlZmZlY3RTdGF0ZW1lbnRzWzBdKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJVTlNVUFBPUlRFRF9TVEFURU1FTlRcIixcbiAgICAgIGBPd25lZCBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBtdXN0IGNvbnRhaW4gb25lIGRpcmVjdCByZXNvdXJjZSBvcGVyYXRpb24gb3Igb25seSBwdXJlIHN0YXRlbWVudHMuYCwgbWV0aG9kLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG9wZXJhdGlvbiA9IGVmZmVjdFN0YXRlbWVudHNbMF1cbiAgY29uc3QgZmxvdyA9IG9wZXJhdGlvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvd1xuXG4gIGlmIChmbG93LmtpbmQgPT0gXCJub25lXCIgfHwgZmxvdy5raW5kID09IFwiYWNxdWlyZVwiKSByZXR1cm4ge2tpbmQ6IFwicHJlc2VydmVcIn1cbiAgY29uc3QgYXJndW1lbnQgPSBvcGVyYXRpb24uYXJndW1lbnRzW2Zsb3cucGFyYW1ldGVySW5kZXhdXG5cbiAgY29uc3Qgb3duZWQgPSBkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIgPyBkZWNsYXJhdGlvbi5vd25lcnNoaXAgOiB1bmRlZmluZWRcbiAgY29uc3QgYm9ycm93ZWRQYXJhbWV0ZXJOYW1lID0gYXJndW1lbnQ/LmtpbmQgPT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIiAmJiBhcmd1bWVudC5leHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiXG4gICAgPyBhcmd1bWVudC5leHByZXNzaW9uLm5hbWUgOiB1bmRlZmluZWRcbiAgY29uc3QgYm9ycm93ZWRQYXJhbWV0ZXIgPSBib3Jyb3dlZFBhcmFtZXRlck5hbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgIG1ldGhvZC5wYXJhbWV0ZXJzLnNvbWUoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLm5hbWUgPT0gYm9ycm93ZWRQYXJhbWV0ZXJOYW1lICYmIGNvbnRhaW5zT3duZWRUeXBlKHBhcmFtZXRlci50eXBlKSlcblxuICBpZiAoYm9ycm93ZWRQYXJhbWV0ZXIpIHJldHVybiB7a2luZDogXCJwcmVzZXJ2ZVwifVxuXG4gIGlmICghYXJndW1lbnQgfHwgYXJndW1lbnQua2luZCAhPSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiIHx8IGFyZ3VtZW50LmV4cHJlc3Npb24ua2luZCAhPSBcIlByaXZhdGVGaWVsZFJlYWRcIiB8fFxuICAgIGFyZ3VtZW50LmV4cHJlc3Npb24uZmllbGQgIT0gb3duZWQ/LmZpZWxkSWQpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBPd25lZCBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBtdXN0IG9wZXJhdGUgb24gaXRzIHByaXZhdGUgcmVzb3VyY2UgZmllbGQuYCwgb3BlcmF0aW9uLmxvY2F0aW9uKVxuICB9XG4gIHJldHVybiB7a2luZDogZmxvdy5raW5kID09IFwiY2xvc2VcIiA/IFwidGVybWluYWxcIiA6IFwicHJlc2VydmVcIiwgdGVybWluYWxGYWlsdXJlSWQ6IGZsb3cudGVybWluYWxGYWlsdXJlSWR9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgZXZlcnkgaG9zdC1lZmZlY3Qgc2l0ZSBuZXN0ZWQgaW4gb25lIG93bmVkIG1ldGhvZCBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIE1ldGhvZCBib2R5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBFZmZlY3RmdWwgZXhwcmVzc2lvbnMuXG4gKi9cbmZ1bmN0aW9uIG1ldGhvZEVmZmVjdEV4cHJlc3Npb25zKGJsb2NrKSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uW119ICovXG4gIGNvbnN0IGVmZmVjdHMgPSBbXVxuICBjb25zdCBwZW5kaW5nID0gWy8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGJsb2NrKV1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiIHx8XG4gICAgICB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCIpKSB7XG4gICAgICBlZmZlY3RzLnB1c2goLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICh2YWx1ZSkpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgcGVuZGluZy5wdXNoKC4uLmNoaWxkKVxuICAgICAgZWxzZSBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVmZmVjdHNcbn1cblxuLyoqXG4gKiBSZWh5ZHJhdGVzIGEgY2xvc2VkIGNhcGFiaWxpdHkgdHlwZSBpZGVudGl0eSBmb3Igb3JkaW5hcnkgZXhwcmVzc2lvbiBjaGVja3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IGlkZW50aXR5IC0gQ2xvc2VkIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERpYWdub3N0aWMgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBWYWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eUFzVmFsdWVUeXBlKGlkZW50aXR5LCBsb2NhdGlvbiwgZmFpbCkge1xuICBpZiAodHlwZW9mIGlkZW50aXR5ID09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIWlzU2NhbGFyVHlwZU5hbWUoaWRlbnRpdHkpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJWb2lkIG9yIGludmFsaWQgaWRlbnRpdHkgdXNlZCBhcyBhbiBlZmZlY3QgdmFsdWUgdHlwZS5cIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoaWRlbnRpdHkpXG4gIH1cbiAgaWYgKCFpZGVudGl0eSB8fCB0eXBlb2YgaWRlbnRpdHkgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGlkZW50aXR5KSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBlZmZlY3QgdHlwZSBpZGVudGl0eS5cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtFeGNsdWRlPGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHksIHN0cmluZz59ICovIChpZGVudGl0eSlcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogY2FuZGlkYXRlLnJlc291cmNlSWR9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkLCBraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwifVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IGlkZW50aXR5QXNWYWx1ZVR5cGUoY2FuZGlkYXRlLnZhbHVlVHlwZSwgbG9jYXRpb24sIGZhaWwpfVxuICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJVbnN1cHBvcnRlZCBlZmZlY3QgdHlwZSBpZGVudGl0eS5cIiwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzZW1hbnRpYyB0eXBlIHRvIGl0cyBkZXRhY2hlZCBjYWxsLXJlc29sdXRpb24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBWYWxpZGF0ZWQgc2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSBEZXRhY2hlZCBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdHlwZUlkZW50aXR5KHR5cGUpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUubmFtZVxuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHJldHVybiB7a2luZDogXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiwgcGFyYW1ldGVySWQ6IHR5cGUucGFyYW1ldGVySWR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHJldHVybiB7XG4gICAgZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLFxuICAgIGtpbmQ6IFwiUmVjb3JkVHlwZVwiLFxuICAgIC4uLih0eXBlLmFyZ3VtZW50cyA/IHthcmd1bWVudHM6IHR5cGUuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+XG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkoYXJndW1lbnQpKSl9IDoge30pXG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiB0eXBlLmRlY2xhcmF0aW9uSWQsIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHR5cGUucmVzb3VyY2VJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiB7ZWxlbWVudFR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmVsZW1lbnRUeXBlKSksIGtpbmQ6IFwiTGlzdFR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUudmFsdWVUeXBlKSl9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSByZXR1cm4ge1xuICAgIGtleVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmtleVR5cGUpKSxcbiAgICBraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsXG4gICAgb3JkZXI6IFwiaW5zZXJ0aW9uXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5rZXlUeXBlKSksXG4gICAga2luZDogXCJNYXBUeXBlXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBleHRlcm5hbGx5IHN1cHBsaWVkIHJlY3Vyc2l2ZSB0eXBlIGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd1ZvaWQgLSBXaGV0aGVyIHZvaWQgaXMgcGVybWl0dGVkLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2lvbiBwYXRoLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGlkZW50aXR5IGlzIGNsb3NlZCBhbmQgYWN5Y2xpYy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgYWxsb3dWb2lkLCBzZWVuID0gbmV3IFNldCgpKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gaXNTY2FsYXJUeXBlTmFtZSh0eXBlKSB8fCBhbGxvd1ZvaWQgJiYgdHlwZSA9PSBcInZvaWRcIlxuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcblxuICBzZWVuLmFkZCh0eXBlKVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodHlwZSlcbiAgbGV0IHZhbGlkID0gZmFsc2VcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJMaXN0VHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwiZWxlbWVudFR5cGUsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUuZWxlbWVudFR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiTWFwVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIHZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS52YWx1ZVR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJlxuICAgIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLG9yZGVyLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS5vcmRlciA9PSBcImluc2VydGlvblwiICYmXG4gICAgICB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUudmFsdWVUeXBlLCBmYWxzZSwgc2VlbilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCx2YWx1ZVR5cGVcIikge1xuICAgIHZhbGlkID0gdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnZhbHVlVHlwZSwgZmFsc2UsIHNlZW4pICYmXG4gICAgICAhKGNhbmRpZGF0ZS52YWx1ZVR5cGUgJiYgdHlwZW9mIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPT0gXCJvYmplY3RcIiAmJiBSZWZsZWN0LmdldChjYW5kaWRhdGUudmFsdWVUeXBlLCBcImtpbmRcIikgPT0gXCJPcHRpb25hbFR5cGVcIilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCxwYXJhbWV0ZXJJZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLnBhcmFtZXRlcklkID09IFwic3RyaW5nXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpPyg/OnJlY29yZHxmdW5jdGlvbik6WzAtOV0rOnR5cGU6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLnBhcmFtZXRlcklkKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmXG4gICAgW1wiYXJndW1lbnRzLGRlY2xhcmF0aW9uSWQsa2luZFwiLCBcImRlY2xhcmF0aW9uSWQsa2luZFwiXS5pbmNsdWRlcyhPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSkpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVBcmd1bWVudHMgPSBjYW5kaWRhdGUuYXJndW1lbnRzXG5cbiAgICB2YWxpZCA9IHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9yZWNvcmQ6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpICYmXG4gICAgICAoY2FuZGlkYXRlQXJndW1lbnRzID09PSB1bmRlZmluZWQgfHwgaXNEZW5zZUFycmF5KGNhbmRpZGF0ZUFyZ3VtZW50cykgJiZcbiAgICAgICAgY2FuZGlkYXRlQXJndW1lbnRzLmV2ZXJ5KChhcmd1bWVudCkgPT4gdmFsaWRUeXBlSWRlbnRpdHkoYXJndW1lbnQsIGZhbHNlLCBzZWVuKSkpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiZcbiAgICAgIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9jbGFzczpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJraW5kLHJlc291cmNlSWRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5yZXNvdXJjZUlkID09IFwic3RyaW5nXCIgJiYgL14oPzptb2R1bGU6WzAtOV0rXFwvKT9jYXBhYmlsaXR5OlswLTldK1xcL3Jlc291cmNlOlswLTldKyQvdVxuICAgICAgLnRlc3QoY2FuZGlkYXRlLnJlc291cmNlSWQpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImRlY2xhcmF0aW9uSWQsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpXG4gIH1cbiAgc2Vlbi5kZWxldGUodHlwZSlcblxuICByZXR1cm4gdmFsaWRcbn1cblxuLyoqXG4gKiBDaGVja3MgYXJyYXkgaWRlbnRpdHkgd2l0aG91dCByZWx5aW5nIG9uIGl0ZXJhdGlvbiBtZXRob2RzIHRoYXQgc2tpcCBzcGFyc2Ugc2xvdHMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHVua25vd25bXX0gV2hldGhlciBldmVyeSBpbmRleGVkIHNsb3QgaXMgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gaXNEZW5zZUFycmF5KHZhbHVlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24odmFsdWUsIGluZGV4KSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBjbG9zZWQgdHlwZSBpZGVudGl0aWVzIHN0cnVjdHVyYWxseS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIEZpcnN0IGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFNlY29uZCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBpZGVudGl0aWVzIGFyZSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVR5cGVJZGVudGl0eShsZWZ0LCByaWdodCkge1xuICBpZiAodHlwZW9mIGxlZnQgPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcmlnaHQgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gIGlmICghbGVmdCB8fCAhcmlnaHQgfHwgdHlwZW9mIGxlZnQgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgcmlnaHQgIT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRUeXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGxlZnQpXG4gIGNvbnN0IHJpZ2h0VHlwZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChyaWdodClcblxuICBpZiAobGVmdFR5cGUua2luZCAhPSByaWdodFR5cGUua2luZCkgcmV0dXJuIGZhbHNlXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUuZWxlbWVudFR5cGUsIHJpZ2h0VHlwZS5lbGVtZW50VHlwZSlcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUudmFsdWVUeXBlLCByaWdodFR5cGUudmFsdWVUeXBlKVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4gbGVmdFR5cGUucGFyYW1ldGVySWQgPT0gcmlnaHRUeXBlLnBhcmFtZXRlcklkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3QgbGVmdEFyZ3VtZW50cyA9IEFycmF5LmlzQXJyYXkobGVmdFR5cGUuYXJndW1lbnRzKSA/IGxlZnRUeXBlLmFyZ3VtZW50cyA6IFtdXG4gICAgY29uc3QgcmlnaHRBcmd1bWVudHMgPSBBcnJheS5pc0FycmF5KHJpZ2h0VHlwZS5hcmd1bWVudHMpID8gcmlnaHRUeXBlLmFyZ3VtZW50cyA6IFtdXG5cbiAgICByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZCAmJiBsZWZ0QXJndW1lbnRzLmxlbmd0aCA9PSByaWdodEFyZ3VtZW50cy5sZW5ndGggJiZcbiAgICAgIGxlZnRBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50LCBpbmRleCkgPT4gc2FtZVR5cGVJZGVudGl0eShhcmd1bWVudCwgcmlnaHRBcmd1bWVudHNbaW5kZXhdKSlcbiAgfVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGxlZnRUeXBlLmRlY2xhcmF0aW9uSWQgPT0gcmlnaHRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4gbGVmdFR5cGUucmVzb3VyY2VJZCA9PSByaWdodFR5cGUucmVzb3VyY2VJZFxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZFxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBsZWZ0VHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIHJldHVybiBzYW1lVHlwZUlkZW50aXR5KGxlZnRUeXBlLmtleVR5cGUsIHJpZ2h0VHlwZS5rZXlUeXBlKSAmJiBzYW1lVHlwZUlkZW50aXR5KGxlZnRUeXBlLnZhbHVlVHlwZSwgcmlnaHRUeXBlLnZhbHVlVHlwZSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2YWxpZGF0ZWQgc2VtYW50aWMgdHlwZXMgc3RydWN0dXJhbGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBsZWZ0IC0gRmlyc3QgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmlnaHQgLSBTZWNvbmQgdHlwZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSB0eXBlcyBhcmUgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNhbWVUeXBlKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBzYW1lVHlwZUlkZW50aXR5KHR5cGVJZGVudGl0eShsZWZ0KSwgdHlwZUlkZW50aXR5KHJpZ2h0KSlcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG9uZSB2YWxpZGF0ZWQgc2VtYW50aWMgdHlwZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgcmVjdXJzaXZlIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiB0eXBlRGVzY3JpcHRpb24odHlwZSkge1xuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSByZXR1cm4gdHlwZS5uYW1lXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIGB0eXBlLXZhcmlhYmxlPCR7dHlwZS5wYXJhbWV0ZXJJZH0+YFxuICBpZiAodHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gYHJlY29yZDwke3R5cGUuZGVjbGFyYXRpb25JZH0ke3R5cGUuYXJndW1lbnRzPy5sZW5ndGhcbiAgICA/IGAsICR7dHlwZS5hcmd1bWVudHMubWFwKHR5cGVEZXNjcmlwdGlvbikuam9pbihcIiwgXCIpfWAgOiBcIlwifT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBgcmVmZXJlbmNlPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4gYG93bmVkLXJlc291cmNlPCR7dHlwZS5yZXNvdXJjZUlkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGBvd25lZC1yZWZlcmVuY2U8JHt0eXBlLmRlY2xhcmF0aW9uSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiKSByZXR1cm4gYGVycm9yPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gYGxpc3Q8JHt0eXBlRGVzY3JpcHRpb24odHlwZS5lbGVtZW50VHlwZSl9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gYG9wdGlvbmFsPCR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0+YFxuICBpZiAodHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikgcmV0dXJuIGBvcmRlcmVkLW1hcDxzdHJpbmcsICR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0sIGluc2VydGlvbj5gXG5cbiAgcmV0dXJuIGBtYXA8c3RyaW5nLCAke3R5cGVEZXNjcmlwdGlvbih0eXBlLnZhbHVlVHlwZSl9PmBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHR5cGUgZ3JhcGggY29udGFpbnMgbGluZWFyIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gVmlzaXRlZCB0eXBlIGNvbnRhaW5lcnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBvd25lcnNoaXAgb2NjdXJzIGF0IGFueSBkZXB0aC5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNPd25lZFR5cGUodHlwZSwgc2VlbiA9IG5ldyBTZXQoKSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQodHlwZSlcbiAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHR5cGUsIFwia2luZFwiKVxuXG4gIGlmIChraW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBraW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB0cnVlXG4gIGlmIChraW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIGNvbnRhaW5zT3duZWRUeXBlKFJlZmxlY3QuZ2V0KHR5cGUsIFwiZWxlbWVudFR5cGVcIiksIHNlZW4pXG4gIGlmIChraW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgaWYgKGtpbmQgPT0gXCJNYXBUeXBlXCIgfHwga2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gY29udGFpbnNPd25lZFR5cGUoUmVmbGVjdC5nZXQodHlwZSwgXCJrZXlUeXBlXCIpLCBzZWVuKSB8fCBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgfVxuICBpZiAoa2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBSZWZsZWN0LmdldCh0eXBlLCBcImFyZ3VtZW50c1wiKVxuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzXykgJiYgYXJndW1lbnRzXy5zb21lKChhcmd1bWVudCkgPT4gY29udGFpbnNPd25lZFR5cGUoYXJndW1lbnQsIHNlZW4pKVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrcyBvbmUgc2NhbGFyIHNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IFtuYW1lXSAtIE9wdGlvbmFsIHJlcXVpcmVkIHNjYWxhci5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuVHlwZVJlZmVyZW5jZX0gV2hldGhlciBpdCBpcyB0aGUgcmVxdWVzdGVkIHNjYWxhci5cbiAqL1xuZnVuY3Rpb24gaXNTY2FsYXJUeXBlKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBpc1NjYWxhclR5cGVOYW1lKHR5cGUubmFtZSkgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlLm5hbWUgPT0gbmFtZSlcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHNvbGUgbm9uLXZhbHVlIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBXaGV0aGVyIGl0IGlzIHZvaWQuXG4gKi9cbmZ1bmN0aW9uIGlzVm9pZFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiICYmIHR5cGUubmFtZSA9PSBcInZvaWRcIlxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgc2NhbGFyIHR5cGUgZm9yIHRoZSBwcmUtY29sbGVjdGlvbiBvcGVyYXRvciBjb250cmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIE9wZXJhbmQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gU2NhbGFyIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNjYWxhck5hbWVGb3JPcGVyYXRpb24odHlwZSwgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKCFpc1NjYWxhclR5cGUodHlwZSkpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTY2FsYXIgb3BlcmF0aW9uIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKHR5cGUpfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB0eXBlLm5hbWVcbn1cblxuLyoqXG4gKiBFbmZvcmNlcyB0aGF0IGEgdG90YWwgY29sbGVjdGlvbiBhY2Nlc3MgaXMgcHJvdmVuIG9yIHVzZXMgYSBzb3VyY2Ugb3BlcmF0aW9uIHRoYXQgZmFpbHMgb24gYWJzZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5MaXN0SW5kZXhFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBMb29rdXBFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQWNjZXNzLlxuICogQHBhcmFtIHtib29sZWFufSBwcm92ZW4gLSBXaGV0aGVyIHN0YXRpYyBsaXRlcmFsIHByb3BhZ2F0aW9uIHByb3ZlcyBwcmVzZW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdGhpcyBpcyBmcm9udGVuZCBhZG1pc3Npb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpIHtcbiAgaWYgKHByb3Zlbikge1xuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnRvdGFsaXR5ID0gXCJwcm92ZW5cIlxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24udG90YWxpdHkgIT0gXCJwcm92ZW5cIiAmJiBleHByZXNzaW9uLnRvdGFsaXR5ICE9IFwiZmFpbC1vbi1hYnNlbmNlXCIpIHtcbiAgICAgIGZhaWwoXCJVTkNIRUNLRURfQ09MTEVDVElPTl9BQ0NFU1NcIiwgXCJDb2xsZWN0aW9uIGFjY2VzcyBsYWNrcyBhIHRvdGFsaXR5IGd1YXJhbnRlZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi50b3RhbGl0eSAhPSBcImZhaWwtb24tYWJzZW5jZVwiKSB7XG4gICAgZmFpbChcIlVOQ0hFQ0tFRF9DT0xMRUNUSU9OX0FDQ0VTU1wiLCBcIkNvbGxlY3Rpb24gYWNjZXNzIGlzIG5vdCBzdGF0aWNhbGx5IHByb3ZlbiBhbmQgZG9lcyBub3QgZmFpbCBvbiBhYnNlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBiaW5kaW5nIHdpdGhvdXQgcHJvZHVjaW5nIGEgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQmluZGluZyBuYW1lLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge0JpbmRpbmcgfCB1bmRlZmluZWR9IEJpbmRpbmcgd2hlbiB2aXNpYmxlLlxuICovXG5mdW5jdGlvbiBmaW5kQmluZGluZyhuYW1lLCBzY29wZSkge1xuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGN1cnJlbnQuYmluZGluZ3MuZ2V0KG5hbWUpXG5cbiAgICBpZiAoYmluZGluZykgcmV0dXJuIGJpbmRpbmdcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyBiaW5kaW5ncyB3aG9zZSBrbm93biB2YWx1ZXMgbXVzdCBiZSBtZXJnZWQgYWNyb3NzIGEgY29uZGl0aW9uYWwuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7QmluZGluZ1tdfSBOZWFyZXN0LXRvLWZhcnRoZXN0IGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBiaW5kaW5nc1Zpc2libGVGcm9tKHNjb3BlKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gW11cblxuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgYmluZGluZ3MucHVzaCguLi5jdXJyZW50LmJpbmRpbmdzLnZhbHVlcygpKVxuICB9XG5cbiAgcmV0dXJuIGJpbmRpbmdzXG59XG5cbi8qKlxuICogRmluZHMgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRoYXQgYSBsb29wIGJvZHkgbWF5IGFzc2lnbiBvbiBhbnkgbmVzdGVkIHBhdGguXG4gKiBUaGUgc2V0IGlzIGNvbXB1dGVkIGFmdGVyIHZhbGlkYXRpbmcgdGhlIGxpc3QgZXhwcmVzc2lvbiBiZWNhdXNlIGNvbGxlY3Rpb24gZXZhbHVhdGlvbiBwcmVjZWRlcyBib2R5IGVmZmVjdHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ2FuZGlkYXRlIGxvb3AgYm9keS5cbiAqIEBwYXJhbSB7U2NvcGV9IG91dGVyU2NvcGUgLSBTY29wZSB2aXNpYmxlIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcC5cbiAqIEBwYXJhbSB7U2V0PEJpbmRpbmc+fSBbYXNzaWduZWRdIC0gQWNjdW11bGF0ZWQgYmluZGluZyBpZGVudGl0aWVzLlxuICogQHJldHVybnMge1NldDxCaW5kaW5nPn0gRXhhY3RseSB0aGUgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRhcmdldGVkIGJ5IG5lc3RlZCBhc3NpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KGJsb2NrLCBvdXRlclNjb3BlLCBhc3NpZ25lZCA9IG5ldyBTZXQoKSkge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gZmluZEJpbmRpbmcoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBvdXRlclNjb3BlKVxuXG4gICAgICBpZiAoYmluZGluZz8ubXV0YWJsZSkgYXNzaWduZWQuYWRkKGJpbmRpbmcpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuY29uc2VxdWVudCwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5hbHRlcm5hdGUsIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXNzaWduZWRcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIG9ubHkgaW1tdXRhYmxlIHZhbHVlcyB3aG9zZSBleGFjdCBjb2xsZWN0aW9uIGNvbnRlbnRzIHJlbWFpbiBrbm93bi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9IEtub3duIHZhbHVlLlxuICovXG5mdW5jdGlvbiBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLCBzY29wZSkge1xuICBpZiAoW1wiSW50ZWdlckxpdGVyYWxcIiwgXCJCb29sZWFuTGl0ZXJhbFwiLCBcIlN0cmluZ0xpdGVyYWxcIiwgXCJMaXN0TGl0ZXJhbFwiLCBcIk1hcExpdGVyYWxcIiwgXCJPcmRlcmVkTWFwTGl0ZXJhbFwiXS5pbmNsdWRlcyhleHByZXNzaW9uLmtpbmQpKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIGZpbmRCaW5kaW5nKGV4cHJlc3Npb24ubmFtZSwgc2NvcGUpPy5rbm93blZhbHVlXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHJldHVybiBwcm92ZW5MaXN0RWxlbWVudChleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSByZXR1cm4gcHJvdmVuTWFwVmFsdWUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIGxpc3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdCByZWNlaXZlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBpbmRleCAtIEluZGV4IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkfSBQcm92ZW4gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcHJvdmVuTGlzdEVsZW1lbnQoY29sbGVjdGlvbiwgaW5kZXgsIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bkluZGV4ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oaW5kZXgsIHNjb3BlKVxuXG4gIGlmIChrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJMaXN0TGl0ZXJhbFwiIHx8IGtub3duSW5kZXg/LmtpbmQgIT0gXCJJbnRlZ2VyTGl0ZXJhbFwiIHx8XG4gICAga25vd25JbmRleC52YWx1ZSA8IDAgfHwga25vd25JbmRleC52YWx1ZSA+PSBrbm93bkNvbGxlY3Rpb24uZWxlbWVudHMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGtub3duQ29sbGVjdGlvbi5lbGVtZW50c1trbm93bkluZGV4LnZhbHVlXVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIG1hcCB2YWx1ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwIHJlY2VpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGtleSAtIEtleSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0gUHJvdmVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBwcm92ZW5NYXBWYWx1ZShjb2xsZWN0aW9uLCBrZXksIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bktleSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGtleSwgc2NvcGUpXG5cbiAgaWYgKGtub3duQ29sbGVjdGlvbj8ua2luZCAhPSBcIk1hcExpdGVyYWxcIiAmJiBrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiIHx8XG4gICAga25vd25LZXk/LmtpbmQgIT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ga25vd25Db2xsZWN0aW9uLmVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LmtleS52YWx1ZSA9PSBrbm93bktleS52YWx1ZSk/LnZhbHVlXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBudW1lcmljIHN0cmluZ3MgaW5kZXBlbmRlbnRseSBmcm9tIGFueSB0YXJnZXQncyBrZXkgY29lcmNpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gTGl0ZXJhbCBrZXkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBpcyBudW1lcmljLlxuICovXG5mdW5jdGlvbiBpc051bWVyaWNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIC9eWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/JC9pdS50ZXN0KHZhbHVlLnRyaW0oKSlcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGFuIGV4YWN0IHNlbWFudGljIHRva2VuIGxvY2F0aW9uIHdoZW4gcGFyc2VyIHByb3ZlbmFuY2UgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHt7bG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVByb3ZlbmFuY2U/OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9fSBub2RlIC0gTG9jYXRlZCBzZW1hbnRpYyBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBUb2tlbiByb2xlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IEV4YWN0IG9yIG93bmluZyBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcm9sZUxvY2F0aW9uKG5vZGUsIHJvbGUpIHtcbiAgcmV0dXJuIG5vZGUuc291cmNlUHJvdmVuYW5jZT8ucmFuZ2VzW3JvbGVdID8/IHBhcnNlclJhbmdlRm9yKG5vZGUsIHJvbGUpID8/IG5vZGUubG9jYXRpb25cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBleGFjdCB0eXBlIHRva2VuIG9yIHRoZSBvd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IG93bmVyTG9jYXRpb24gLSBPd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JvbGVdIC0gUmVjdXJzaXZlIHR5cGUgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBFeGFjdCB0eXBlIGxvY2F0aW9uIHdoZW4ga25vd24uXG4gKi9cbmZ1bmN0aW9uIHR5cGVMb2NhdGlvbih0eXBlLCBvd25lckxvY2F0aW9uLCByb2xlID0gXCJ0eXBlXCIpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkgcmV0dXJuIG93bmVyTG9jYXRpb25cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAodHlwZSlcblxuICByZXR1cm4gY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlc1tyb2xlXSA/PyBwYXJzZXJSYW5nZUZvcihjYW5kaWRhdGUsIHJvbGUpID8/XG4gICAgY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlcy50eXBlID8/IHBhcnNlclJhbmdlRm9yKGNhbmRpZGF0ZSwgXCJ0eXBlXCIpID8/IG93bmVyTG9jYXRpb25cbn1cblxuLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uLCB7b3BlcmFuZDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IHVuYXJ5T3BlcmF0aW9uU2lnbmF0dXJlcyA9IE9iamVjdC5mcmVlemUoe1xuICBCb29sZWFuTm90OiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyTmVnYXRlOiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIn0pXG59KVxuXG4vKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9uLCB7bGVmdDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByaWdodDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IGJpbmFyeU9wZXJhdGlvblNpZ25hdHVyZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgQm9vbGVhbkFuZDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBCb29sZWFuRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiYm9vbGVhblwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJib29sZWFuXCJ9KSxcbiAgQm9vbGVhbk5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiYm9vbGVhblwifSksXG4gIEJvb2xlYW5PcjogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyQWRkOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyR3JlYXRlclRoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTGVzc1RoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckxlc3NUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTXVsdGlwbHk6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiaW50ZWdlclwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlck5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJTdWJ0cmFjdDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJpbnRlZ2VyXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBTdHJpbmdDb25jYXQ6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJzdHJpbmdcIiwgcmlnaHQ6IFwic3RyaW5nXCJ9KSxcbiAgU3RyaW5nRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcInN0cmluZ1wifSksXG4gIFN0cmluZ05vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcInN0cmluZ1wiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJzdHJpbmdcIn0pXG59KVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIHVuYXJ5IG1lYW5pbmcgZnJvbSBwYXJzZXItbm9ybWFsaXplZCBzb3VyY2UgaW50ZW50LlxuICogQHBhcmFtIHt1bmtub3dufSBzb3VyY2VPcGVyYXRpb24gLSBUcmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IG9wZXJhbmRUeXBlIC0gUmVzb2x2ZWQgb3BlcmFuZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBTZW1hbnRpYyBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuYXJ5T3BlcmF0aW9uKHNvdXJjZU9wZXJhdGlvbiwgb3BlcmFuZFR5cGUsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOZWdhdGVcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImludGVnZXJcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBJbnRlZ2VyIG5lZ2F0aW9uIHJlcXVpcmVzIGludGVnZXI7IHJlY2VpdmVkICR7b3BlcmFuZFR5cGV9LmAsIGxvY2F0aW9uKVxuICAgIHJldHVybiBcIkludGVnZXJOZWdhdGVcIlxuICB9XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOb3RcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImJvb2xlYW5cIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBCb29sZWFuIG5vdCByZXF1aXJlcyBib29sZWFuOyByZWNlaXZlZCAke29wZXJhbmRUeXBlfS5gLCBsb2NhdGlvbilcbiAgICByZXR1cm4gXCJCb29sZWFuTm90XCJcbiAgfVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biB1bmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIGJpbmFyeSBtZWFuaW5nIGZyb20gcGFyc2VyLW5vcm1hbGl6ZWQgc291cmNlIGludGVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gc291cmNlT3BlcmF0aW9uIC0gVHJhbnNpZW50IGZyb250ZW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSBsZWZ0VHlwZSAtIFJlc29sdmVkIGxlZnQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSByaWdodFR5cGUgLSBSZXNvbHZlZCByaWdodCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsZWZ0TG9jYXRpb24gLSBMZWZ0IG9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IHJpZ2h0TG9jYXRpb24gLSBSaWdodCBvcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBleHByZXNzaW9uTG9jYXRpb24gLSBXaG9sZSBvcGVyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gU2VtYW50aWMgb3BlcmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVCaW5hcnlPcGVyYXRpb24oc291cmNlT3BlcmF0aW9uLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBsZWZ0TG9jYXRpb24sIHJpZ2h0TG9jYXRpb24sIGV4cHJlc3Npb25Mb2NhdGlvbiwgZmFpbCkge1xuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiUGhwQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTlNVUFBPUlRFRF9TWU5UQVhcIiwgXCJQSFAgYmluYXJ5ICsgZG9lcyBub3QgY29uY2F0ZW5hdGUgc3RyaW5nczsgdXNlIC4gaW5zdGVhZC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IFwiQWRkXCJcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikge1xuICAgIGlmIChsZWZ0VHlwZSAhPSBcInN0cmluZ1wiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFN0cmluZyBjb25jYXRlbmF0aW9uIHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgY29uY2F0ZW5hdGlvbiByZXF1aXJlcyBzdHJpbmc7IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIHJldHVybiBcIlN0cmluZ0NvbmNhdFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgJiYgcmlnaHRUeXBlID09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJJbnRlZ2VyQWRkXCJcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiU3RyaW5nQ29uY2F0XCJcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gbGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgfHwgbGVmdFR5cGUgPT0gXCJzdHJpbmdcIiA/IHJpZ2h0TG9jYXRpb24gOiBsZWZ0TG9jYXRpb25cblxuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYEFkZGl0aW9uIHJlcXVpcmVzIHR3byBpbnRlZ2VycyBvciB0d28gc3RyaW5nczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIGNvbnN0IGZpeGVkT3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gICAgQW5kOiBbXCJib29sZWFuXCIsIFwiQm9vbGVhbkFuZFwiXSxcbiAgICBHcmVhdGVyVGhhbjogW1wiaW50ZWdlclwiLCBcIkludGVnZXJHcmVhdGVyVGhhblwiXSxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWw6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICAgIExlc3NUaGFuOiBbXCJpbnRlZ2VyXCIsIFwiSW50ZWdlckxlc3NUaGFuXCJdLFxuICAgIExlc3NUaGFuT3JFcXVhbDogW1wiaW50ZWdlclwiLCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIl0sXG4gICAgTXVsdGlwbHk6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyTXVsdGlwbHlcIl0sXG4gICAgT3I6IFtcImJvb2xlYW5cIiwgXCJCb29sZWFuT3JcIl0sXG4gICAgU3VidHJhY3Q6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyU3VidHJhY3RcIl1cbiAgfSlcbiAgY29uc3QgZml4ZWQgPSBSZWZsZWN0LmdldChmaXhlZE9wZXJhdGlvbnMsIFN0cmluZyhzb3VyY2VPcGVyYXRpb24pKVxuXG4gIGlmIChmaXhlZCkge1xuICAgIGNvbnN0IFtyZXF1aXJlZFR5cGUsIG9wZXJhdGlvbl0gPSBmaXhlZFxuXG4gICAgaWYgKGxlZnRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7bGVmdFR5cGV9LmAsIGxlZnRMb2NhdGlvbilcbiAgICBpZiAocmlnaHRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKG9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhTm90RXF1YWxcIikge1xuICAgIGlmIChsZWZ0VHlwZSA9PSBcInN0cmluZ1wiIHx8IHJpZ2h0VHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOU1VQUE9SVEVEX1NZTlRBWFwiLCBcIkphdmEgcmVmZXJlbmNlIGVxdWFsaXR5IGlzIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHNlbWFudGljIHN1YnNldC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IHNvdXJjZU9wZXJhdGlvbiA9PSBcIkphdmFFcXVhbFwiID8gXCJFcXVhbFwiIDogXCJOb3RFcXVhbFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiU3RyaW5nRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdOb3RFcXVhbFwiKSB7XG4gICAgaWYgKGxlZnRUeXBlICE9IFwic3RyaW5nXCIpIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgU3RyaW5nIGVxdWFsaXR5IHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgZXF1YWxpdHkgcmVxdWlyZXMgc3RyaW5nOyByZWNlaXZlZCAke3JpZ2h0VHlwZX0uYCwgcmlnaHRMb2NhdGlvbilcblxuICAgIHJldHVybiAvKiogQHR5cGUge1wiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIn0gKi8gKHNvdXJjZU9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJFcXVhbFwiIHx8IHNvdXJjZU9wZXJhdGlvbiA9PSBcIk5vdEVxdWFsXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgIT0gcmlnaHRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU01BVENIRURfRVFVQUxJVFlfVFlQRVNcIiwgYEVxdWFsaXR5IHJlcXVpcmVzIG1hdGNoaW5nIHNjYWxhciB0eXBlczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGxlZnRUeXBlID09IFwiaW50ZWdlclwiID8gXCJJbnRlZ2VyXCIgOiBsZWZ0VHlwZSA9PSBcImJvb2xlYW5cIiA/IFwiQm9vbGVhblwiIDogXCJTdHJpbmdcIlxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKGAke3ByZWZpeH0ke3NvdXJjZU9wZXJhdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIGJpbmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxlZnRMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0cmFuc2llbnQgZnJvbnRlbmQgaW50ZW50IHdpdGggdGhlIHB1YmxpYyB0eXBlZCBvcGVyYXRpb24gZmllbGRzLlxuICogQHBhcmFtIHtvYmplY3R9IGV4cHJlc3Npb24gLSBNdXRhYmxlIGFkYXB0ZWQgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gVHlwZWQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCByZXN1bHQgdHlwZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBzZXROb3JtYWxpemVkT3BlcmF0aW9uKGV4cHJlc3Npb24sIG9wZXJhdGlvbiwgdHlwZSkge1xuICBSZWZsZWN0LnNldChleHByZXNzaW9uLCBcIm9wZXJhdGlvblwiLCBvcGVyYXRpb24pXG4gIFJlZmxlY3Quc2V0KGV4cHJlc3Npb24sIFwidHlwZVwiLCB0eXBlKVxufVxuIl19
2967
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdmFsaWRhdGUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxlQUFlLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUMxRixPQUFPLEVBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDbkcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUE7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBQ2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUV2RCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUVwRyxvRkFBb0Y7QUFDcEYsa0ZBQWtGO0FBQ2xGLGtGQUFrRjtBQUNsRixxREFBcUQ7QUFDckQsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFBO0FBQ3RELG1EQUFtRDtBQUNuRCxNQUFNLDJCQUEyQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFakQ7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxFQUFFO0lBQ2pFLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdkQsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUMxRzs7O09BR0c7SUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFMUYsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzFELHlCQUF5QixDQUFDLE1BQU0sRUFBRSx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBRS9GLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyw4QkFBOEIsQ0FBQyxNQUFNLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ3hFLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLFNBQVMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWUsQ0FBQztTQUNuSCxHQUFHLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUU3QyxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLG1CQUFtQixDQUFDLENBQUE7UUFDdkYsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7WUFBRSxTQUFRO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLGlHQUFpRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFM0gsV0FBVyxDQUFDLFNBQVMsR0FBRyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBQyxDQUFBO1FBQzdILGFBQWEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBQ0Qsd0JBQXdCO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEIsMEJBQTBCO0lBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFdEIsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUMzQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVE7UUFDbkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLGVBQWU7WUFDeEUsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxDQUFBO1FBQzFHLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUM1RCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDNUQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDakU7OztPQUdHO0lBQ0gsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUUzRixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDM0QseUJBQXlCLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDakcsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQ2pELEtBQUssTUFBTSxXQUFXLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUMvQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUMzRSxLQUFLLE1BQU0sTUFBTSxJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksRUFBRTtZQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3RHLENBQUM7SUFDRCxLQUFLLE1BQU0sbUJBQW1CLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsRixJQUFJLENBQUMseUNBQXlDLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUVELGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUNqRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUk7SUFDN0MsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLEdBQUcsTUFBTSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUN0RixDQUFDO0lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLDRCQUE0QixFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6VCxJQUFJLENBQUMsR0FBRyxNQUFNLGNBQWMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuRSxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQy9ELElBQUksU0FBUyxDQUFDLFNBQVM7Z0JBQUUsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDeEYsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxrQkFBa0IsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMxSCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3JDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ3BELGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEdBQUcsRUFBRTtJQUNwRixNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNHLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3JILE1BQU0sTUFBTSxHQUFHLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEcsb0VBQW9FO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUE7SUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUU1RyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDdEUsSUFBSSxtQkFBbUI7WUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsWUFBWSxLQUFLLEVBQUUsQ0FBQTtRQUNyRSxJQUFJLE9BQU8sbUJBQW1CLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDeEgsY0FBYyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxxREFBcUQsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoSCxDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixtQkFBbUIsQ0FBQyxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUMzSCxDQUFDO1FBQ0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxQyxzQkFBc0IsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtRQUN0RSxTQUFTLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDcEYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0YsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxRQUFRLEVBQUMsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFeEYsMkJBQTJCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDeEYsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM5RSxLQUFLLE1BQU0sT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDekMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGlDQUFpQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdGLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsb0RBQW9ELENBQUMsRUFBQyxzQkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDL0csa0JBQWtCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO0lBRTNFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDakMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFO1FBQ25CLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUMvRCxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDL0QsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzlELEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0tBQzdDLENBQUMsQ0FBQTtJQUVGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFOUIsS0FBSyxNQUFNLFdBQVcsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNyRyxJQUFJLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGtDQUFrQyxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3RILENBQUM7UUFDRCxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBQ0QsS0FBSyxNQUFNLFdBQVcsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDMUUsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxrQ0FBa0MsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNwRyxDQUFDO1FBQ0QsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDcEMsQ0FBQztJQUNELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUE7SUFFeEYsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQy9DLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUNyRyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsS0FBSyxNQUFNLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuRCxnQkFBZ0IsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzNJLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO0lBRWhHLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQ3hHLG1CQUFtQixFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFDdEUsSUFBSSxtQkFBbUI7UUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ2hHLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJO0lBQzlELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDeEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBRWhCLE1BQU0sV0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBRXRILEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUUxRyxPQUFPLE1BQU0sQ0FBQTtJQUViOzs7Ozs7T0FNRztJQUNILFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUNqQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTTtRQUN0RCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsU0FBUyxJQUFJLE9BQU8sU0FBUyxJQUFJLFFBQVE7Z0JBQUUsU0FBUTtZQUN4RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNGLE1BQU0sSUFBSSxHQUFHLHFJQUFxSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBRTlKLElBQUksbUJBQW1CO29CQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxRQUFRLEVBQUUsQ0FBQTtnQkFDckQsUUFBUSxJQUFJLENBQUMsQ0FBQTtnQkFDYixJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQ3pGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7Z0JBQ25GLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQzVDLENBQUM7aUJBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDdkYsSUFBSSxtQkFBbUIsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsU0FBUyxDQUFDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUNsSCxDQUFDO2lCQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDM0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUMxQyxJQUFJLFNBQVMsQ0FBQyxTQUFTO29CQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUNwRSxDQUFDO2lCQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDNUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFBO2dCQUNwQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDM0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxHQUFHLEVBQUU7SUFDOUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUVsRCxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxTQUFTO1FBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3hGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQzFFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUE7SUFFcEYsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQ3pILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUNwRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSx3REFBd0QsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDMUgsQ0FBQztJQUNELDRCQUE0QjtJQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUV6RSxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0UsTUFBTSxXQUFXLEdBQUcsb0RBQW9ELENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtRQUVuRyxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksa0JBQWtCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDOUYsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUM5SCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxtREFBbUQsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDNUcsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLHdEQUF3RCxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuSCxDQUFDO1FBQ0QsSUFBSSxtQkFBbUI7WUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFNBQVMsVUFBVSxFQUFFLENBQUE7UUFDL0QsSUFBSSxPQUFPLFdBQVcsQ0FBQyxFQUFFLElBQUksUUFBUSxJQUFJLENBQUMsd0NBQXdDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDckcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUseUNBQXlDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDbkksQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQTtRQUV4QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTVCLEtBQUssSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QyxNQUFNLFVBQVUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFVBQVUsVUFBVSxFQUFFLENBQUE7WUFFMUQsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMseUJBQXlCLEVBQUUscUNBQXFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDakgsQ0FBQztZQUNELElBQUksbUJBQW1CO2dCQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsVUFBVSxDQUFBO1lBQzlDLElBQUksS0FBSyxDQUFDLEVBQUUsSUFBSSxVQUFVLElBQUksT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEgsSUFBSSxDQUFDLHlCQUF5QixFQUFFLHVDQUF1QyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQzdILENBQUM7WUFDRCxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM1QixDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsQ0FBQTtRQUUxSCxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsV0FBVyxDQUFDLElBQUksNERBQTRELEVBQUUsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxDQUFBO1FBRTVGLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxXQUFXLENBQUMsSUFBSSw4Q0FBOEMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEgsQ0FBQztRQUNELElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLEtBQUssR0FBRyxpR0FBaUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hJLE1BQU0sUUFBUSxHQUFHLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLGVBQWUsQ0FBQztnQkFDdkcsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUE7WUFFcEMsSUFBSSxtQkFBbUI7Z0JBQUUsV0FBVyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUE7aUJBQ3BELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsVUFBVSxXQUFXLENBQUMsSUFBSSw4Q0FBOEMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEksQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxVQUFVLFdBQVcsQ0FBQyxJQUFJLGlEQUFpRCxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuSSxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxjQUFjLENBQUE7UUFFckQsSUFBSSxtQkFBbUI7WUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUE7UUFDbkUsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxhQUFhLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1lBQ25HLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyx1QkFBdUIsRUFBRSwrQ0FBK0MsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTdCLEtBQUssSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckYsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMvQyxNQUFNLFVBQVUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFdBQVcsV0FBVyxFQUFFLENBQUE7WUFFNUQsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxrQkFBa0IsRUFBRSwwQ0FBMEMsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoSCxDQUFDO1lBQ0QsSUFBSSxtQkFBbUI7Z0JBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUE7WUFDL0MsSUFBSSxNQUFNLENBQUMsRUFBRSxJQUFJLFVBQVUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3RILENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNuRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsZ0NBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFDakgsQ0FBQztZQUNELFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQzlHLG1CQUFtQixFQUFFLFVBQVU7SUFDL0IsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDbEYsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUE7SUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMzRCxNQUFNLHFCQUFxQixHQUFHLG9CQUFvQixFQUFFLElBQUksSUFBSSw0QkFBNEI7UUFDdEYsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksZUFBZSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDdkcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxJQUFJLElBQUksNEJBQTRCO1FBQ3JHLG9CQUFvQixDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLG9CQUFvQjtRQUN6SCxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxFQUFFLElBQUkscUJBQXFCLEVBQUUsSUFBSSxJQUFJLHNCQUFzQjtRQUNoSCxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxTQUFTO1FBQy9ELHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsVUFBVSxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFBO0lBRTlGLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN2RixJQUFJLENBQUMsdUJBQXVCLEVBQUUsMkVBQTJFLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2xJLENBQUM7SUFFRCxJQUFJLENBQUMsZ0JBQWdCO1FBQ25CLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsb0JBQW9CLFdBQVcsQ0FBQyxJQUFJLDBFQUEwRSxFQUM5SSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUNELE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXhILEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUMvQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRXJHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsU0FBUyxDQUFDLElBQUksdUNBQXVDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUksQ0FBQztRQUNELGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDdEksSUFBSSxnQkFBZ0I7WUFBRSxTQUFRO1FBQzlCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3BELE1BQU0sV0FBVyxHQUFHLFNBQVMsRUFBRSxJQUFJLElBQUksNEJBQTRCO1lBQ2pFLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVO1lBQzdHLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFYixJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksNEJBQTRCLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRTtZQUM3RixTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxvQkFBb0IsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxXQUFXLENBQUMsRUFBRTtZQUNoRyxXQUFXLEVBQUUsSUFBSSxJQUFJLHNCQUFzQixJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BGLElBQUksQ0FBQywyQkFBMkIsRUFBRSxvQkFBb0IsV0FBVyxDQUFDLElBQUksc0JBQXNCLEtBQUssQ0FBQyxJQUFJLHFDQUFxQyxFQUN6SSxTQUFTLEVBQUUsUUFBUSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUNELGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFDekcsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO0lBRTNGLEtBQUssTUFBTSxNQUFNLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDbEYsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLDBEQUEwRCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBRXZGLElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksZUFBZSxJQUFJLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxRixJQUFJLENBQUMsdUJBQXVCLEVBQUUscUJBQXFCLE1BQU0sQ0FBQyxJQUFJLHNEQUFzRCxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4SSxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRXhHLEtBQUssTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBRXJHLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzdILENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQ2pHLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFDdEcsbUJBQW1CLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFBO1FBRTNELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksZUFBZTtZQUFFLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFdEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsTUFBTSxDQUFDLElBQUksNENBQTRDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdHLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHlCQUF5QixDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ25HLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw4Q0FBOEMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDaEosNEJBQTRCO0lBQzVCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFdkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVELE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV2QyxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3JGLENBQUM7UUFDRCxJQUFJLG1CQUFtQjtZQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxLQUFLLEVBQUUsQ0FBQTtRQUMxRCxJQUFJLE9BQU8sV0FBVyxDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdEksSUFBSSxDQUFDLGlCQUFpQixFQUFFLGtEQUFrRCxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuRyxDQUFDO1FBQ0QsSUFBSSxPQUFPLFdBQVcsQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLCtCQUErQixNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3pILENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDekMsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUI7SUFDcEUsSUFBSSxXQUFXLENBQUMsY0FBYyxLQUFLLFNBQVM7UUFBRSxPQUFNO0lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0RBQWdELEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9GLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXZCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNuRCxNQUFNLElBQUksR0FBRyxTQUFTLElBQUksT0FBTyxTQUFTLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDakYsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUUzRixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZUFBZTtZQUN0RyxJQUFJLElBQUksdUJBQXVCLElBQUksT0FBTyxTQUFTLENBQUMsSUFBSSxJQUFJLFFBQVEsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyRyxJQUFJLENBQUMsZUFBZSxFQUFFLHVDQUF1QyxFQUFFLFNBQVMsRUFBRSxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdHLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLDBCQUEwQixFQUFFLDZCQUE2QixTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ3BILENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QixNQUFNLFVBQVUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxFQUFFLFNBQVMsS0FBSyxFQUFFLENBQUE7UUFFcEQsSUFBSSxtQkFBbUI7WUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLFVBQVUsQ0FBQTtRQUNsRCxJQUFJLFNBQVMsQ0FBQyxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLDBCQUEwQixFQUFFLCtDQUErQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2RyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxXQUFXO0lBQzlDLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQzlGLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDMUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLCtDQUErQyxFQUFFLG9CQUFvQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtJQUNqSiw2QkFBNkI7SUFDN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7SUFFdkMsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXZCLEtBQUssSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5RSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFN0MsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLG1CQUFtQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsRyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsK0JBQStCLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RGLENBQUM7UUFDRCxJQUFJLG1CQUFtQjtZQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsVUFBVSxXQUFXLEVBQUUsQ0FBQTtRQUNqRSxJQUFJLE9BQU8sV0FBVyxDQUFDLEVBQUUsSUFBSSxRQUFRLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEksSUFBSSxDQUFDLGtCQUFrQixFQUFFLG1EQUFtRCxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyRyxDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsV0FBVyxDQUFDLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUN4RyxDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDM0Isc0JBQXNCLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBQzlELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUMxQyxDQUFDO0lBRUQsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQzVCLE1BQU0sY0FBYyxHQUFHLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRS9ELEtBQUssSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakYsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUU1QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksYUFBYTtnQkFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3BJLElBQUksbUJBQW1CO2dCQUFFLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxXQUFXLENBQUMsRUFBRSxVQUFVLFVBQVUsRUFBRSxDQUFBO1lBQzNFLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEdBQUcsV0FBVyxDQUFDLEVBQUUsVUFBVSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUN2RixJQUFJLENBQUMsaUJBQWlCLEVBQUUsNkNBQTZDLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hGLENBQUM7WUFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7WUFDeEgsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDMUIsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLHdEQUF3RCxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNsRyxDQUFDO1lBQ0QsMEJBQTBCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ2xHLENBQUM7SUFDSCxDQUFDO0lBQ0QsNkJBQTZCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUUxRCxPQUFPLE9BQU8sQ0FBQTtBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyw2QkFBNkIsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLElBQUk7SUFDaEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUUxQjs7Ozs7T0FLRztJQUNILFNBQVMsS0FBSyxDQUFDLFdBQVcsRUFBRSxNQUFNO1FBQ2hDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUFFLE9BQU07UUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ2hELEtBQUssTUFBTSxLQUFLLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksWUFBWTtnQkFBRSxTQUFRO1lBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxpQ0FBaUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQzdILENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7WUFFeEQsSUFBSSxVQUFVO2dCQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekMsQ0FBQztRQUNELFFBQVEsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN0RCxDQUFDO0lBRUQsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZO1FBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDdkUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsVUFBVTtJQUN2SSxNQUFNLGNBQWMsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBRXJHLEtBQUssTUFBTSxTQUFTLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUVySCxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUM3SCxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsMkJBQTJCLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDM0gsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUM5RyxtQkFBbUIsRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUE7SUFFaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsV0FBVyxDQUFDLElBQUksNENBQTRDLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVztJQUM5SCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUE7SUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQTtJQUV4QixLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFM0YsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUNuSSxTQUFTLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzFHLE1BQU0sZUFBZSxHQUFHLHdCQUF3QixDQUM5QyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLENBQzVHLENBQUE7WUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxlQUFlLENBQUMsSUFBSSxJQUFJLGNBQWMsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNsRixJQUFJLENBQUMsNEJBQTRCLEVBQUUsbUVBQW1FLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDekksQ0FBQztnQkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLG9CQUFvQixlQUFlLENBQUMsZUFBZSxDQUFDLGNBQWMsZUFBZSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzSixDQUFDO1lBQ0QsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzdCLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQztnQkFDakUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMxQixJQUFJLEVBQUUsWUFBWTthQUNuQixFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ2hELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ2hFLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUU3RixJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsNkNBQTZDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNqSSxDQUFDO1lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUIsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUMxRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsa0RBQWtELEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2hHLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FDN0MsU0FBUyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQzFHLENBQUE7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsdUNBQXVDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLGVBQWUsQ0FBQyxjQUFjLENBQUMsY0FBYyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN4SixDQUFDO1lBQ0QsT0FBTyxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3pFLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3BDLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQy9ELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLDRCQUE0QixFQUFFLENBQUM7WUFDbkQsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQTtZQUV0QyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxvQkFBb0I7Z0JBQ3hGLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLHdCQUF3QixFQUFFLDhEQUE4RCxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNwSCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRXJGLElBQUksQ0FBQyxLQUFLO2dCQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSw2REFBNkQsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDN0gsU0FBUyxDQUFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDdEcsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQzdDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQ3JILENBQUE7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxpQ0FBaUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxjQUFjLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFDaEksU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNsQyxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDL0QsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxlQUFlLENBQUMsQ0FBQTtZQUV6SSxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUN4RixJQUFJLENBQUMsZUFBZSxFQUFFLCtEQUErRCxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdkgsQ0FBQztZQUNELElBQUksV0FBVyxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxxREFBcUQsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzdHLENBQUM7WUFDRCxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUMvRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JJLElBQUksQ0FBQyxlQUFlLEVBQUUsOERBQThELEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNHLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1lBRXRILElBQUksY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsZUFBZSxFQUFFLG9EQUFvRCxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDNUcsQ0FBQztZQUNELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQy9ELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUNoRixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtZQUV6RSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN6QixJQUFJLE9BQU8sU0FBUyxDQUFDLFlBQVksSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDN0YsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNDQUFzQyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDOUksQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxPQUFPLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDbEosQ0FBQztZQUNELElBQUksT0FBTyxTQUFTLENBQUMsWUFBWSxJQUFJLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUNqRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsdUNBQXVDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hJLENBQUM7WUFDRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxzQ0FBc0MsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDOUksQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNyRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMENBQTBDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNJLENBQUM7WUFDRCxNQUFNLEdBQUcsS0FBSyxDQUFBO1lBQ2QsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsc0NBQXNDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNHLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsc0NBQXNDLEVBQUUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDbEcsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsOEJBQThCLGVBQWUsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDdEgsQ0FBQztnQkFDRCxTQUFTLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO2dCQUN0RyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FDekMsU0FBUyxDQUFDLFVBQVUsRUFDcEIsS0FBSyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsSUFBSSxFQUNKLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsVUFBVSxDQUNYLENBQUE7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxlQUFlLGVBQWUsQ0FBQyxVQUFVLENBQUMsY0FBYyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUM5SSxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksU0FBUyxDQUFDLFVBQVU7Z0JBQUUsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekYsTUFBTSxHQUFHLEtBQUssQ0FBQTtZQUNkLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBRXhJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsZUFBZSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3ZJLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNsRCxNQUFNLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMvRSxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDM0UsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUNoRixzQkFBc0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDekUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3pFLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQzNLLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRWxGLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDaEQsQ0FBQyxDQUFDLENBQUE7WUFDRixJQUFJLGdCQUFnQixHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBQyxDQUFBO1lBRXhELElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixnQkFBZ0IsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDcEssQ0FBQztZQUNELE1BQU0sb0JBQW9CLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRWpGLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTTtvQkFBRSxPQUFPLENBQUMsVUFBVSxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFBO3FCQUNyRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU07b0JBQUUsT0FBTyxDQUFDLFVBQVUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtxQkFDM0csSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTSxJQUFJLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxLQUFLLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzdILE9BQU8sQ0FBQyxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQ25ELENBQUM7O29CQUFNLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO1lBQ3ZDLENBQUMsQ0FBQyxDQUFBO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUMzRSxDQUFDLENBQUMsY0FBYyxDQUFDLGNBQWM7Z0JBQy9CLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO29CQUNwRCxDQUFDLENBQUMsZUFBZSxDQUFDLGNBQWM7b0JBQ2hDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTTt3QkFDbkQsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO3dCQUM5RyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtZQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUUzQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQzVCLEtBQUssTUFBTSxPQUFPLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztvQkFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNoRSxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDOUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN4QyxNQUFNLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsTUFBTSxDQUFBO1lBQzVELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdkMsTUFBTSxxQkFBcUIsR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBRW5GLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FDNUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsdUNBQXVDLENBQ25ILENBQUE7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsd0JBQXdCLGVBQWUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMxSSxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRS9ELHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNuRSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQ2pILG1CQUFtQixFQUFFLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFFbEcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDOUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUseUJBQXlCLENBQUMsQ0FBQTtZQUUxSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsNkJBQTZCLGVBQWUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMxSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxlQUFlLEVBQUUsNkNBQTZDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzFGLENBQUM7WUFDRCxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsZUFBZSxFQUFFLHNDQUFzQyxFQUFFLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN0SCxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBRTVKLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsZUFBZSxFQUFFLDBCQUEwQixlQUFlLENBQUMsV0FBVyxDQUFDLGNBQWMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUNoSSxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQy9FLENBQUM7WUFDRCxNQUFNLHFCQUFxQixHQUFHLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFFbkYsS0FBSyxNQUFNLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUUvRCxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUU7Z0JBQzFDLFVBQVUsRUFBRSxTQUFTO2dCQUNyQixPQUFPLEVBQUUsS0FBSztnQkFDZCxJQUFJLEVBQUUsV0FBVzthQUNsQixFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNqRSxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQ2pILG1CQUFtQixFQUFFLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFDbEcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDekQsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDL0IsS0FBSyxNQUFNLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDNUMsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQzFHLDRCQUE0QixDQUFDLENBQUE7WUFFL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsaUNBQWlDLGVBQWUsQ0FBQyxPQUFPLENBQUMseUJBQXlCLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNuSSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksY0FBYztnQkFDdEUsQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLENBQUMsZUFBZSxFQUFFLHNEQUFzRCxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNuRyxDQUFDO1lBQ0QsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sS0FBSyxLQUFLLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQyxlQUFlLEVBQUUsMkNBQTJDLEVBQy9ELFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDN0csQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFDdkcsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDM0MsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUM3RyxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUUzQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxrQ0FBa0MsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFDL0gsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUMzRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsb0NBQW9DLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQ3JJLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7WUFDL0UsQ0FBQztZQUNELE1BQU0scUJBQXFCLEdBQUcsOEJBQThCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUVuRixLQUFLLE1BQU0sT0FBTyxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO2dCQUM5QixLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRS9ELGNBQWMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLEVBQzlGLFlBQVksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUM5RCxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxFQUNsRyxZQUFZLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDaEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQzNHLElBQUksRUFBRSxtQkFBbUIsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFBO1lBRXhHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3hELE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9CLEtBQUssTUFBTSxPQUFPLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUE7Z0JBQzlCLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxnREFBZ0QsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDL0YsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNuRyxNQUFNLFdBQVcsR0FBRyx3QkFBd0IsQ0FDMUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FDeEgsQ0FBQTtZQUVELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsZUFBZSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNuSSxDQUFDO1lBQ0Qsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ3BDLE1BQU0sR0FBRyxLQUFLLENBQUE7WUFDZCxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBRTNGLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsSUFBSSxTQUFTLENBQUMsWUFBWSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDekgsSUFBSSxDQUFDLHVCQUF1QixFQUFFLDZDQUE2QyxFQUFFLFNBQVMsQ0FBQyxZQUFZLEVBQUUsUUFBUSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN0SSxDQUFDO1lBQ0QsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBRWpILElBQUksV0FBVyxDQUFDLGFBQWEsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyx1QkFBdUIsRUFBRSx5REFBeUQsRUFBRSxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNILENBQUM7WUFDRCxNQUFNLHlCQUF5QixHQUFHLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDdkYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1lBRWhFLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixDQUFDLENBQUE7WUFDakYsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQy9ELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUN0SixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFckUsS0FBSyxNQUFNLE9BQU8sSUFBSSx5QkFBeUIsRUFBRSxDQUFDO2dCQUNoRCxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDM0MsQ0FBQztZQUVELGNBQWMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRTtnQkFDMUMsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxXQUFXO2FBQ2xCLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUU3SixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxnQkFBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxzQkFBc0IsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtZQUN0SyxDQUFDO1lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2hDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUE7WUFDNUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQTtnQkFDOUIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsNEVBQTRFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUUzRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVELE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUE7QUFDekIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUk7SUFDckQsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxrREFBa0QsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUM1RixDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsNkNBQTZDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV0RSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksV0FBVztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQjtRQUMxRyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNyRixJQUFJLENBQUMsZUFBZSxFQUFFLDhCQUE4QixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBQzdILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTTtJQUM1QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU07UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQy9DLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDdEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBRXRCLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7UUFFM0IsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFBRSxTQUFRO1FBQ25FLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDZixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLGdCQUFnQjtZQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUM5SCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHVCQUF1QixFQUFFLENBQUM7WUFDbEgsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDakQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVE7b0JBQUUsSUFBSSxPQUFPLE9BQU8sSUFBSSxRQUFRO3dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDaEgsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN6RCxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDOUUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUE7WUFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLE9BQU8sVUFBVSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtZQUVoSCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUFFLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUTtvQkFBRSxJQUFJLE9BQU8sT0FBTyxJQUFJLFFBQVE7d0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUMxRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQTtpQkFDM0MsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUcsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxRyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUE7SUFFbEIsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNmLE9BQU8sR0FBRyxLQUFLLENBQUE7UUFDZixLQUFLLE1BQU0sSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUV2QyxJQUFJLENBQUMsV0FBVztnQkFBRSxTQUFRO1lBQzFCLE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDN0QsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7WUFFOUQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQTtnQkFDaEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUVqRixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQTtJQUM3QyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxTQUFTLElBQUksUUFBUTtZQUFFLFNBQVE7UUFDeEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFFM0MsSUFBSSxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtZQUNwRCxNQUFNLElBQUksR0FBRyxZQUFZLElBQUksT0FBTyxZQUFZLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1lBQzdHLE1BQU0sYUFBYSxHQUFHLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFdEcsSUFBSSxPQUFPLGFBQWEsSUFBSSxRQUFRO2dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDL0QsSUFBSSxZQUFZLElBQUksT0FBTyxZQUFZLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3BELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDaEcsQ0FBQztZQUNELFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDM0IsTUFBTSxXQUFXLEdBQUcscUJBQXFCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ3JHLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3JELE1BQU0sUUFBUSxHQUFHLFNBQVMsSUFBSSxPQUFPLFNBQVMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7WUFFaEgsSUFBSSxPQUFPLFFBQVEsSUFBSSxRQUFRLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNoRSxNQUFNLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO1lBQzdHLENBQUM7WUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLFNBQVE7UUFDVixDQUFDO1FBQ0QsSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7WUFDMUIsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQTtZQUM3RixNQUFNLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO1lBQ3ZHLE1BQU0sQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUE7WUFDdEcsU0FBUTtRQUNWLENBQUM7UUFDRCxJQUFJLElBQUksSUFBSSxrQkFBa0IsSUFBSSxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUNoRSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFdBQVcsRUFDM0csYUFBYSxDQUFDLENBQUE7WUFDaEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQTtZQUNqRyxTQUFRO1FBQ1YsQ0FBQztRQUNELElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDN0Isb0JBQW9CLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQTtZQUM3RixNQUFNLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFBO1lBQ2pHLFNBQVE7UUFDVixDQUFDO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ2hELG9CQUFvQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDdkYsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDdkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakcsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQTtJQUNwQyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO0lBQy9CLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsUUFBUSxFQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFFckgsS0FBSyxNQUFNLFdBQVcsSUFBSSxPQUFPO1FBQUUsS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTztZQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDcEgsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFBO0lBRWxCLE9BQU8sT0FBTyxFQUFFLENBQUM7UUFDZixPQUFPLEdBQUcsS0FBSyxDQUFBO1FBQ2YsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ2xGLEtBQUssTUFBTSxLQUFLLElBQUkscUJBQXFCLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7Z0JBQUMsQ0FBQztZQUNqRSxDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxXQUFXLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbEMsS0FBSyxNQUFNLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sT0FBTyxHQUFHLDBCQUEwQixDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDekUsS0FBSyxNQUFNLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO29CQUN2RixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtvQkFBQyxDQUFDO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3ZELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUFFLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzVGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBQyxDQUFBO0FBQzdELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsV0FBVyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsY0FBYyxHQUFHLE1BQU0sRUFBRSxjQUFjLElBQUksSUFBSSxHQUFHLEVBQUUsRUFDdEgsWUFBWSxHQUFHLE1BQU0sRUFBRSxZQUFZO0lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLENBQUM7U0FDM0YsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFdEUsT0FBTztRQUNMLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUNuQixZQUFZO1FBQ1osTUFBTTtRQUNOLE9BQU87UUFDUCxjQUFjLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDckQsY0FBYztRQUNkLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQztLQUN2RCxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWM7SUFDakYsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFBO0lBQ3BCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQTtJQUUxQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksaUJBQWlCLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxZQUFZO1FBQzVFLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDaEQsSUFBSSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUE7UUFDeEIsZUFBZSxHQUFHLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQjtRQUFFLE9BQU07SUFDNUMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRTNELElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTTtJQUNwQixJQUFJLGNBQWMsSUFBSSxlQUFlO1FBQUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7O1FBQ3pFLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQzFELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGtDQUFrQyxJQUFJLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUU5RyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ2pELEtBQUssSUFBSSxPQUFPLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvRixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUxQyxJQUFJLE9BQU87WUFBRSxPQUFPLE9BQU8sQ0FBQTtRQUMzQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsWUFBWSxJQUFJLG1DQUFtQyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3RHLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLElBQUksSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0FBQzNFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLDBCQUEwQixDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDN0csTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUU1RixJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsK0NBQStDLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBRXRJLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ3hHLE9BQU8scUJBQXFCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7QUFDeEYsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsY0FBYyxHQUFHLElBQUksR0FBRyxFQUFFO0lBQ3BILElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLDhEQUE4RCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFdkYsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQ2xHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLDRFQUE0RSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtJQUN6SSxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsRSxJQUFJLENBQUMsZUFBZSxFQUFFLHlDQUF5QyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNyRyxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSwyQkFBMkI7WUFDbkgsT0FBTyxTQUFTLENBQUMsV0FBVyxJQUFJLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDekYsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGtDQUFrQyxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3BJLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0YsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFeEQsSUFBSSxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLCtCQUErQixNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQy9ILENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUE7UUFFN0QsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLG1CQUFtQixXQUFXLENBQUMsSUFBSSxjQUFjLGFBQWEsa0JBQWtCLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3RKLENBQUM7UUFDRCxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsdUJBQXVCLFdBQVcsQ0FBQyxJQUFJLG1DQUFtQyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMvSSxDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFBO1FBRTlDLElBQUksa0JBQWtCLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQ3pFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RixJQUFJLENBQUMsZUFBZSxFQUFFLHlEQUF5RCxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNySCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUE7UUFFNUMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxXQUFXLFdBQVcsQ0FBQyxJQUFJLFNBQVMsVUFBVSxDQUFDLE1BQU0sNkJBQTZCLGFBQWEsR0FBRyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN2SyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLHVEQUF1RCxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMxSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQixLQUFLLE1BQU0sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2xDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQzdHLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRCLE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFNUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQjtZQUM1RyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN0RixJQUFJLENBQUMsZUFBZSxFQUFFLHdDQUF3QyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3ZJLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGlCQUFpQjtZQUN6RyxPQUFPLFNBQVMsQ0FBQyxVQUFVLElBQUksUUFBUSxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNsSCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsMkJBQTJCLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDaEksQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUU1QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksb0JBQW9CO1lBQzVHLE9BQU8sU0FBUyxDQUFDLGFBQWEsSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN6SCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsNEJBQTRCLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDcEksQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxtREFBbUQsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDN0ksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNuQixNQUFNLFdBQVcsR0FBRywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBRTVKLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFdEIsSUFBSSxTQUFTLENBQUMsV0FBVyxLQUFLLFdBQVc7WUFBRSxTQUFTLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUU5RSxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBQ0QsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdEUsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFBO1FBRXJILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUN6RyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUMxRyxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0Q0FBNEMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDL0csQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsbURBQW1ELEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQzdJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbkIsTUFBTSxPQUFPLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUVoSixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLGVBQWUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUNoSSxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsMEJBQTBCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUV0SixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRCLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxPQUFPO1lBQUUsU0FBUyxDQUFDLE9BQU8sR0FBRyxpREFBaUQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2xILElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFFdEUsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUMzRyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQzdGLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGlEQUFpRCxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUMzSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ25CLE1BQU0sU0FBUyxHQUFHLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFFdEosSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0QixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLDJEQUEyRCxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDbkosQ0FBQztRQUNELElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7UUFFdEUsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsRUFBRSxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7QUFDL0YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLE9BQU87SUFDbEMsT0FBTyxnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQTtBQUNuRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQ3ZILHVCQUF1QixHQUFHLEtBQUs7SUFDL0IsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLElBQUksb0JBQW9CLElBQUksT0FBTyxJQUFJLG1CQUFtQixDQUFBO0lBQzFGLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUM3Ryx1QkFBdUIsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBRTVDLElBQUksSUFBSSxJQUFJLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsK0JBQStCLE9BQU8sR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNoSCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpQ0FBaUMsT0FBTyxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRTVILE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQ3pHLHVCQUF1QixHQUFHLEtBQUssRUFBRSxnQkFBZ0IsR0FBRyxLQUFLO0lBQ3pELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0I7UUFBRSxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtJQUU1SCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsK0RBQStELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdILENBQUM7UUFFRCxPQUFPLEVBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFDLENBQUE7SUFDOUYsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7UUFFdEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksb0JBQW9CO1lBQzFGLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsRUFBRSw4REFBOEQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUgsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUV0RixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixFQUFFLDZEQUE2RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVySSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFDbkIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxvR0FBb0csRUFDL0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3hCLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7WUFDbEUsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUseUVBQXlFLEVBQzlHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQUV6SSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1lBQ2xGLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLG1FQUFtRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsSSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLG9EQUFvRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBRXBJLElBQUksS0FBSyxDQUFDLElBQUksSUFBSSxtQkFBbUIsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDNUUsT0FBTyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsZ0VBQWdFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2pJLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsa0RBQWtELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3pHLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQy9FLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLG1EQUFtRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVwRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLHNEQUFzRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUgsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEgsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsZUFBZSxFQUFFLGdDQUFnQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM5RSxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUU5QyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxpQ0FBaUMsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDL0UsQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzdCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3pELE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxzREFBc0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUcsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUN4QyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsQ0FDcEcsQ0FBQTtZQUVELElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxJQUFJLENBQUMsOEJBQThCLEVBQUUsMkRBQTJELEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNySSxDQUFDO1lBRUQsT0FBTyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFDLENBQUE7UUFDMUMsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUN4QyxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxZQUFZLENBQUMsU0FBUyxDQUM1SCxDQUFBO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSx5QkFBeUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxjQUFjLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQy9KLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUM3RSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsd0RBQXdELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzdHLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQTtRQUUxRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDBCQUEwQixlQUFlLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekksQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1lBQzdFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpREFBaUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDdEcsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFakcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLHFCQUFxQixVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksMEJBQTBCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3ZJLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQy9CLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDZEQUE2RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDO1lBQ3BELENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSx3REFBd0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUcsQ0FBQztRQUNELGlFQUFpRTtRQUNqRSxJQUFJLG1CQUFtQixDQUFBO1FBQ3ZCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGVBQWUsRUFBRSwwREFBMEQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDeEcsQ0FBQztZQUNELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUMsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQ3JDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQy9FLFlBQVksRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSx1QkFBdUIsQ0FDM0csQ0FBQTtZQUVELG1CQUFtQixLQUFLLE1BQU0sQ0FBQTtZQUM5QixNQUFNLG1CQUFtQixHQUFHLFlBQVksRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQTtZQUU3RyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1SSxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sWUFBWSxFQUFFLElBQUksSUFBSSxVQUFVO1lBQ3JDLENBQUMsQ0FBQyxZQUFZO1lBQ2QsQ0FBQyxDQUFDLEVBQUMsV0FBVyxFQUFFLHFEQUFxRCxDQUFDLENBQUMsbUJBQW1CLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUE7SUFDbEgsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSx1QkFBdUIsZUFBZSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUgsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxzREFBc0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUcsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLElBQUksSUFBSSxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JGLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtRQUN2SCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFDeEcsdUJBQXVCLENBQUMsQ0FBQTtRQUUxQixJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLDREQUE0RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoSCxDQUFDO1FBQ0QsaUVBQWlFO1FBQ2pFLElBQUksaUJBQWlCLENBQUE7UUFFckIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FDckMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsYUFBYSxFQUNoRixZQUFZLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQ3RHLENBQUE7WUFDRCxpQkFBaUIsS0FBSyxNQUFNLENBQUE7WUFDNUIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUE7WUFFdEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLENBQUMsZUFBZSxFQUFFLGtCQUFrQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQzNJLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxZQUFZLEVBQUUsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUN0RCxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLEVBQUUsU0FBUztZQUNmLFNBQVMsRUFBRSxxREFBcUQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1NBQ3JGLENBQUE7SUFDSCxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDM0MsSUFBSSxZQUFZLElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSwrQkFBK0IsZUFBZSxDQUFDLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUksQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxzRUFBc0UsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDMUgsQ0FBQztRQUNELElBQUksWUFBWSxFQUFFLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUYsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLHNDQUFzQyxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQy9ILENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUN4Ryx1QkFBdUIsQ0FBQyxDQUFBO1FBRTFCLElBQUksQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsNEVBQTRFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2hJLENBQUM7UUFDRCxpRUFBaUU7UUFDakUsSUFBSSxpQkFBaUIsQ0FBQTtRQUVyQixLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUNyQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFDekYsWUFBWSxFQUFFLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQzdHLENBQUE7WUFDRCxpQkFBaUIsS0FBSyxNQUFNLENBQUE7WUFDNUIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLEVBQUUsSUFBSSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQTtZQUU3RyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUUsMEJBQTBCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUN4SCxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxZQUFZLEVBQUUsSUFBSSxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQzdELE9BQU8sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzdCLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsU0FBUyxFQUFFLHFEQUFxRCxDQUFDLENBQUMsaUJBQWlCLENBQUM7U0FDckYsQ0FBQTtJQUNILENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO1FBQy9JLE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUV6SixJQUFJLGNBQWMsQ0FBQyxJQUFJLElBQUksVUFBVSxFQUFFLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDRCQUE0QixlQUFlLENBQUMsY0FBYyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDN0ksQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3RILENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzdFLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFbkUsSUFBSSxlQUFlLEVBQUUsSUFBSSxJQUFJLGFBQWEsSUFBSSxVQUFVLEVBQUUsSUFBSSxJQUFJLGdCQUFnQjtZQUNoRixDQUFDLFVBQVUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLFVBQVUsQ0FBQyxLQUFLLHNDQUFzQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxSixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRWhGLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxNQUFNLEtBQUssU0FBUyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFBO1FBRW5GLE9BQU8sY0FBYyxDQUFDLFdBQVcsQ0FBQTtJQUNuQyxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUM5SSxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFFakosSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDaEYsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDRCQUE0QixlQUFlLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSx1QkFBdUIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JILENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzdFLE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFFL0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksWUFBWSxJQUFJLGVBQWUsRUFBRSxJQUFJLElBQUksbUJBQW1CLENBQUM7WUFDekYsUUFBUSxFQUFFLElBQUksSUFBSSxlQUFlO1lBQ2pDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLFFBQVEsQ0FBQyxLQUFLLDJDQUEyQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNySCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUUzRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxLQUFLLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVuRixPQUFPLGNBQWMsQ0FBQyxTQUFTLENBQUE7SUFDakMsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1FBQ2xELE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLDRCQUE0QixDQUFDLENBQUE7UUFFMUosSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLFVBQVUsSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLFNBQVMsSUFBSSxjQUFjLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckgsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGlDQUFpQyxlQUFlLENBQUMsY0FBYyxDQUFDLHlCQUF5QixFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekosQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUV6RSxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsSUFBSSxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVMsSUFBSSxVQUFVLENBQUMsY0FBYyxJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUMzRixJQUFJLENBQUMsZUFBZSxFQUFFLDZEQUE2RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMzRyxDQUFDO1lBQ0QsVUFBVSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUE7UUFDNUMsQ0FBQzthQUNJLElBQUksVUFBVSxDQUFDLGNBQWMsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNyRCxJQUFJLENBQUMsZUFBZSxFQUFFLHdEQUF3RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0RyxDQUFDO1FBRUQsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2SCxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUscUVBQXFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzFILENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQTtRQUV2RCxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksT0FBTyxFQUFFLENBQUM7WUFDbEUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDaEUsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO1lBRTFFLElBQUksTUFBTSxFQUFFLElBQUksSUFBSSx1QkFBdUIsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMzRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsNEJBQTRCLFlBQVksQ0FBQyxJQUFJLDBCQUEwQixZQUFZLFVBQVUsRUFDM0gsTUFBTSxFQUFFLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzdILE1BQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUN2SCxvQkFBb0IsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUVqQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsd0JBQXdCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFDdEgsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFBO1FBQzdELE9BQU8sbUJBQW1CLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN6RixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUNsSCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7UUFFdkIsSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDeEYsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGlFQUFpRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0SCxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVqRixJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsYUFBYSxDQUFDLGFBQWEsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxzREFBc0QsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0csQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0UsT0FBTyxJQUFJLENBQUMsNEJBQTRCLEVBQ3RDLG9CQUFvQixXQUFXLENBQUMsSUFBSSxTQUFTLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSx3QkFBd0IsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEVBQzVJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDMUUsMEJBQTBCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUUzRixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDL0gsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2xHLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBRXZFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxlQUFlLEVBQUUsNkJBQTZCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFDL0gsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUN6QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHO1lBQ2pCLGFBQWEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ2pFLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLDhCQUE4QixDQUFDO1lBQzNELGNBQWMsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQzVILENBQUE7UUFFRCxJQUFJLG1CQUFtQjtZQUFFLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFBOztZQUN0RCwyQkFBMkIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQTtRQUU3RyxPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2hHLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFFM0MsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxZQUFZLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDdEYsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsd0RBQXdELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNoSSxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUVoRixJQUFJLENBQUMsV0FBVztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsWUFBWSxDQUFDLGFBQWEsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDeEksTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUN2RixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWxILElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxXQUFXLENBQUMsSUFBSSxvQkFBb0IsVUFBVSxDQUFDLE1BQU0sSUFBSSxFQUM1RyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDckMsSUFBSSxtQkFBbUI7WUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpREFBaUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDN0ksSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixFQUNqQyxXQUFXLE1BQU0sQ0FBQyxJQUFJLFNBQVMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLHdCQUF3QixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2SSxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUN6RCwwQkFBMEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBRTNGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUMvSCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDbEcsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFFbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUMxSCxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3pDLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNqRyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxlQUFlO1lBQ2pFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFDbEUsTUFBTSxVQUFVLEdBQUc7WUFDakIsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQztZQUN0RCxjQUFjLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzSCxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUNwQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDeEMsQ0FBQTtRQUVELElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksdUJBQXVCLElBQUksWUFBWSxFQUFFLENBQUM7WUFDeEUsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFBO1lBRTdFLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSwrREFBK0QsWUFBWSxtQkFBbUIsRUFDNUgsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLElBQUksSUFBSSxvQkFBb0IsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JHLElBQUksQ0FBQyxtQkFBbUI7Z0JBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLHFEQUFxRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDOUksSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxzQkFBc0IsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsZUFBZSxFQUFFLCtEQUErRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDdEgsQ0FBQztZQUNELFVBQVUsQ0FBQyxRQUFRLEdBQUc7Z0JBQ3BCLFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUTtnQkFDL0IsSUFBSSxFQUFFLHVCQUF1QjtnQkFDN0IsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDdEMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQy9ELGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO2dCQUN0RCxJQUFJLEVBQUUsWUFBWTthQUNuQixDQUFBO1FBQ0gsQ0FBQztRQUVELElBQUksbUJBQW1CO1lBQUUsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7O1lBQ3RELDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRXhHLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtJQUNyRCxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUVySSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLHFEQUFxRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxRyxDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFekQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSwrQkFBK0IsVUFBVSxDQUFDLGFBQWEsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekksT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDhEQUE4RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuSCxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdELE9BQU8sSUFBSSxDQUNULHVCQUF1QixFQUN2QixXQUFXLFdBQVcsQ0FBQyxJQUFJLHNCQUFzQixVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sd0JBQXdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEVBQ2hJLFVBQVUsQ0FBQyxRQUFRLENBQ3BCLENBQUE7UUFDSCxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ3RFLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUM1QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDaEUsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQ3JDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLEdBQUcsRUFBRSxTQUFTLENBQzFHLENBQUE7WUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixLQUFLLENBQUMsSUFBSSxtQkFBbUIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUM1SixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFBO0lBQ25CLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtRQUU3SSxJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsd0JBQXdCLGVBQWUsQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqSixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7UUFFM0QsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSwrQkFBK0IsWUFBWSxDQUFDLGFBQWEsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDNUksTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNwRixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRWhILElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxXQUFXLFdBQVcsQ0FBQyxJQUFJLG1CQUFtQixVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3pJLElBQUksbUJBQW1CO1lBQUUsVUFBVSxDQUFDLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUU1RSxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7SUFDNUYsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFNUQsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUscUJBQXFCLFVBQVUsQ0FBQyxNQUFNLElBQUksRUFBRSxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDbkgsQ0FBQztRQUNELElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksbUJBQW1CLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSw0QkFBNEIsVUFBVSxDQUFDLE1BQU0sSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0RyxDQUFDO1FBQ0QsTUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1FBQ2xGLGtFQUFrRTtRQUNsRSxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQy9CLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLDBCQUEwQixDQUNqRyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUseUJBQXlCLENBQ3hGLENBQUMsQ0FBQTtRQUNGLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNqSSxDQUFDO1FBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakUsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUM1QyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUMsTUFBTSxzQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUVwRSxJQUFJLHNCQUFzQixFQUFFLENBQUM7Z0JBQzNCLDRCQUE0QixDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDakcsbUJBQW1CLENBQUMsQ0FBQTtnQkFDdEIsU0FBUTtZQUNWLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FDekMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQ2hHLENBQUE7WUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUN0RixDQUFDO2lCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLGVBQWUsQ0FBQyxVQUFVLENBQUMsY0FBYyxlQUFlLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDM0ksQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sU0FBUyxJQUFJLG1CQUFtQixDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdELE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzFELG9CQUFvQixDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBRW5FLElBQUksaUJBQWlCLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxvRUFBb0UsRUFDcEcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUNyRCxDQUFDO2dCQUNELElBQUksQ0FBQywyQkFBMkIsRUFBRSxnQ0FBZ0MsU0FBUyxDQUFDLElBQUksd0JBQXdCLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ2hJLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLHlFQUF5RSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4SCxDQUFDO1FBQ0QsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlFLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7WUFDL0YsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2xHLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBRW5ELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3RKLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFbEYsSUFBSSxtQkFBbUI7WUFBRSxVQUFVLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTs7WUFDdEQsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNyRixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQ2hHLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLHlCQUF5QixDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFekYsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO0lBQ3JELENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO1FBQ3JJLE1BQU0sV0FBVyxHQUFHLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN0RixNQUFNLFNBQVMsR0FBRyxtQkFBbUI7WUFDbkMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDMUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUE7UUFFeEIsSUFBSSxtQkFBbUI7WUFBRSxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRWxILE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXJELElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLDJCQUEyQixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDbEgsSUFBSSxXQUFXLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsU0FBUyxhQUFhLFNBQVMsQ0FBQyxPQUFPLGNBQWMsV0FBVyxHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMxSSxDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxTQUFTLGdCQUFnQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekksQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHVCQUF1QixFQUFFLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQ2xHLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBRXJDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLHlDQUF5QyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUN4SCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xDLENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFN0Msc0JBQXNCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQzFFLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMxRSxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDOUcsbUJBQW1CLEVBQUUscUNBQXFDLENBQUMsQ0FBQTtRQUM3RCxNQUFNLGFBQWEsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDM0csbUJBQW1CLEVBQUUsb0NBQW9DLENBQUMsQ0FBQTtRQUU1RCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxlQUFlLEVBQUUsK0JBQStCLGVBQWUsQ0FBQyxjQUFjLENBQUMsUUFBUSxlQUFlLENBQUMsYUFBYSxDQUFDLDZCQUE2QixFQUNySixVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xDLENBQUM7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUE7UUFFL0MsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUNELElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDaEksTUFBTSxLQUFLLEdBQUcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUNsSSxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDN0UsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLG1CQUFtQjtZQUNuQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQztZQUNoSyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQTtRQUV4QixJQUFJLG1CQUFtQjtZQUFFLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7UUFFbkgsTUFBTSxTQUFTLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFdEQsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNuSCxJQUFJLFFBQVEsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0IsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxTQUFTLGFBQWEsU0FBUyxDQUFDLElBQUksMkJBQTJCLFFBQVEsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUksQ0FBQztRQUNELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLFNBQVMsYUFBYSxTQUFTLENBQUMsS0FBSyw0QkFBNEIsU0FBUyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNsSixDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsR0FBRyxTQUFTLGdCQUFnQixNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDekksQ0FBQztRQUNELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsNEVBQTRFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUU1RyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQ2pHLHVCQUF1QjtJQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsMkRBQTJELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ2hILENBQUM7SUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSx5REFBeUQsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDOUcsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFdEIsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLGVBQWUsRUFBRSwwQ0FBMEMsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBQ0Qsd0JBQXdCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUNuRyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtRQUNoRCxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDakcsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsVUFBVSxDQUFDLElBQUksSUFBSSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFDL0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLENBQUM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUE7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUN0RyxtQkFBbUI7SUFDbkIsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFNO0lBQzdDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxjQUFjLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUN2RSw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDN0csbUJBQW1CLENBQUMsQ0FBQTtRQUN0QixPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsZUFBZSxFQUFFLDZEQUE2RCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsZUFBZSxFQUFFLDBEQUEwRCxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN4RyxDQUFDO1FBQ0QsS0FBSyxNQUFNLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDdEcsbUJBQW1CLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxZQUFZLENBQUM7UUFDL0QsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLGdCQUFnQixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1FBQzlFLE1BQU0sT0FBTyxHQUFHLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFFakgsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM1Qiw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFDeEcsbUJBQW1CLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBQ0QsT0FBTTtJQUNSLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyx3QkFBd0IsQ0FDckMsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUNyRyxDQUFBO0lBRUQsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtBQUM5RSxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQ3ZFLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRW5ELElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsNEJBQTRCLEVBQUUsNkNBQTZDLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNuSCxDQUFDO1lBQ0QsT0FBTTtRQUNSLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLHVCQUF1QixJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUN2RixvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLDJDQUEyQyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDbEgsQ0FBQztRQUNELGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUM3QyxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3hILENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEgsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3JFLElBQUksTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxzQkFBc0IsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3hILENBQUM7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxZQUFZLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2SCxJQUFJLENBQUMsZUFBZSxFQUFFLHNCQUFzQixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDeEgsQ0FBQztRQUNELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4RSxrQkFBa0IsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRyxxREFBcUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDckgsQ0FBQztRQUNELE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzNELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3pGLE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGNBQWMsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ25FLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3JGLE9BQU07SUFDUixDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO1FBQ3hELENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN2RSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNqRixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN2RixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsV0FBVztJQUM3QyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksdUJBQXVCO1FBQUUsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQTtJQUNoRixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQTtJQUM5SCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVTtRQUFFLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUN2RixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUM1RCxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM3RyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFPLG9CQUFvQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFFekYsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG9CQUFvQixDQUFDLElBQUksRUFBRSxhQUFhO0lBQy9DLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQTtBQUMzRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsWUFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRTtJQUN6RSxNQUFNLGNBQWMsR0FBRywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvRCxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFBO0lBQzNELE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDOUQsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUE7SUFDL0ksTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQ3JDLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBRTFILE9BQU87UUFDTCxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3JELElBQUksRUFBRSwyQkFBMkI7UUFDakMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0gsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDcEMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNsRCx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxxREFBcUQsQ0FBQyxDQUMzSCxhQUFhLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3hELENBQUMsQ0FBQyxDQUFDO1NBQ1AsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1IsQ0FBQTtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQzFELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDMUcsOENBQThDLENBQUE7SUFFaEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGVBQWUsRUFBRSx1REFBdUQsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMxRixDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsNkRBQTZELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUV4RixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksMkJBQTJCLElBQUksT0FBTyxTQUFTLENBQUMsYUFBYSxJQUFJLFFBQVE7UUFDN0YsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDO1FBQzFGLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWE7UUFDakQsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BJLElBQUksQ0FBQyxlQUFlLEVBQUUsMkRBQTJELEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDOUYsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQTtRQUV0RCxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDLElBQUksc0JBQXNCLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTTtZQUN6RyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FDMUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pHLElBQUksQ0FBQyxlQUFlLEVBQUUsNkRBQTZELEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDaEcsQ0FBQztJQUNILENBQUM7SUFDRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTVDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ3BGLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxlQUFlLEVBQUUsMkRBQTJELEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDOUYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLDJCQUEyQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJO0lBQ3pFLE1BQU0sY0FBYyxHQUFHLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLDJEQUEyRCxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUM1SCxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2hGLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7WUFDMUYsOENBQThDLENBQUE7SUFFbEQsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLE1BQU0sSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxSCxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsSUFBSSxzQ0FBc0MsSUFBSSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0csQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLHNDQUFzQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFakUsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYTtRQUN0RixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1FBQzVHLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQzVFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztZQUNqRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsMkRBQTJELENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUM7WUFDMUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVGLElBQUksQ0FBQyxlQUFlLEVBQUUsWUFBWSxJQUFJLDRDQUE0QyxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQy9GLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSTtJQUMvRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxvQkFBb0I7UUFBRSxPQUFPLFVBQVUsQ0FBQTtJQUNwRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUkscUJBQXFCO1FBQUUsT0FBTyxVQUFVLENBQUE7SUFDL0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsb0ZBQW9GLEVBQzNILFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN4QixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHNCQUFzQjtRQUFFLE9BQU8sVUFBVSxDQUFBO0lBQ2hFLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsc0RBQXNELEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRWxJLE9BQU87UUFDTCxVQUFVO1FBQ1YsSUFBSSxFQUFFLHFCQUFxQjtRQUMzQixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7UUFDN0IsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQjtRQUM3QyxJQUFJLEVBQUUsUUFBUTtLQUNmLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUk7SUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtRQUNwRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4SCxTQUFTLENBQUMsSUFBSSxJQUFJLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFMUUsT0FBTyxVQUFVLEVBQUUsSUFBSSxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDdkUsQ0FBQyxDQUFDLENBQUE7SUFDRixNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFBO0lBQ3JELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQztRQUM5RixVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFDakMsaUJBQWlCLE1BQU0sQ0FBQyxJQUFJLHVFQUF1RSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN6SCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUE7SUFFOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFBO0lBQzVFLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRXpELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBQ2hHLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxFQUFFLElBQUksSUFBSSx1QkFBdUIsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxzQkFBc0I7UUFDM0gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDeEMsTUFBTSxpQkFBaUIsR0FBRyxxQkFBcUIsS0FBSyxTQUFTO1FBQzNELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLHFCQUFxQixJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRXJILElBQUksaUJBQWlCO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUMsQ0FBQTtJQUVoRCxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksdUJBQXVCLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksa0JBQWtCO1FBQ3pHLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxpQkFBaUIsTUFBTSxDQUFDLElBQUksK0NBQStDLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3pJLENBQUM7SUFDRCxPQUFPLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUMsQ0FBQTtBQUMxRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsdUJBQXVCLENBQUMsS0FBSztJQUNwQyxnREFBZ0Q7SUFDaEQsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQ2xCLE1BQU0sT0FBTyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFFdEIsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtRQUUzQixJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVE7UUFDbkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksc0JBQXNCO1lBQ2hGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxDQUFDO1FBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUMxRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQTtpQkFDM0MsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtnQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQ25ELElBQUksT0FBTyxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSx3REFBd0QsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUNqSSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxpQ0FBaUMsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMzRSxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcseUVBQXlFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUV0RyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksbUJBQW1CO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBQyxDQUFBO0lBQy9HLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxvQkFBb0I7UUFBRSxPQUFPLEVBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFDLENBQUE7SUFDdkgsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQTtJQUN4SSxPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsbUNBQW1DLEVBQUUsUUFBUSxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFJO0lBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQ2xELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSx1QkFBdUI7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFDLENBQUE7SUFDL0csSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFlBQVk7UUFBRSxPQUFPO1lBQ3BDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxJQUFJLEVBQUUsWUFBWTtZQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDL0Qsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RixDQUFBO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWU7UUFBRSxPQUFPLEVBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBQyxDQUFBO0lBQ25HLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxtQkFBbUI7UUFBRSxPQUFPLEVBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUE7SUFDckcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG9CQUFvQjtRQUFFLE9BQU8sRUFBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQTtJQUM3RyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVTtRQUFFLE9BQU8sRUFBQyxXQUFXLEVBQUUsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQyxDQUFBO0lBQzlKLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxjQUFjO1FBQUUsT0FBTyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUE7SUFDbEssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGdCQUFnQjtRQUFFLE9BQU87WUFDeEMsT0FBTyxFQUFFLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RixJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLEtBQUssRUFBRSxXQUFXO1lBQ2xCLFNBQVMsRUFBRSx3REFBd0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDbkcsQ0FBQTtJQUVELE9BQU87UUFDTCxPQUFPLEVBQUUsd0RBQXdELENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUyxFQUFFLHdEQUF3RCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNuRyxDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDMUQsSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRO1FBQUUsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQTtJQUN6RixJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFM0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNkLE1BQU0sU0FBUyxHQUFHLHNDQUFzQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDL0QsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBRWpCLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxVQUFVLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUNsRyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDL0QsQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUM5RyxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksaUJBQWlCLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDOUYsQ0FBQztTQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxnQkFBZ0I7UUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksOEJBQThCLEVBQUUsQ0FBQztRQUM1RSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDLEtBQUssSUFBSSxXQUFXO1lBQ3JFLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3ZELENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksY0FBYyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDM0csS0FBSyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQztZQUN6RCxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxTQUFTLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxjQUFjLENBQUMsQ0FBQTtJQUNsSSxDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLHVCQUF1QixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdEgsS0FBSyxHQUFHLE9BQU8sU0FBUyxDQUFDLFdBQVcsSUFBSSxRQUFRLElBQUksa0VBQWtFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNwSixDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLFlBQVk7UUFDdkMsQ0FBQyw4QkFBOEIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0csTUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFBO1FBRTlDLEtBQUssR0FBRyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUSxJQUFJLHlDQUF5QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO1lBQzNILENBQUMsa0JBQWtCLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDbkUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2RixDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ2hILEtBQUssR0FBRyxPQUFPLFNBQVMsQ0FBQyxhQUFhLElBQUksUUFBUTtZQUNoRCx3Q0FBd0MsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQzFFLENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksbUJBQW1CLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNqSCxLQUFLLEdBQUcsT0FBTyxTQUFTLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSwyREFBMkQ7YUFDM0csSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMvQixDQUFDO1NBQU0sSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLG9CQUFvQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDckgsS0FBSyxHQUFHLE9BQU8sU0FBUyxDQUFDLGFBQWEsSUFBSSxRQUFRLElBQUksd0NBQXdDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM5SCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVqQixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUV2QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ2hELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUs7SUFDbkMsSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksT0FBTyxLQUFLLElBQUksUUFBUTtRQUFFLE9BQU8sSUFBSSxLQUFLLEtBQUssQ0FBQTtJQUM5RSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxPQUFPLEtBQUssSUFBSSxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDeEYsTUFBTSxRQUFRLEdBQUcsc0NBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUM5RCxNQUFNLFNBQVMsR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWhFLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ2pELElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxVQUFVO1FBQUUsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNyRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksY0FBYztRQUFFLE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDckcsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLHVCQUF1QjtRQUFFLE9BQU8sUUFBUSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFBO0lBQ2xHLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2pGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFcEYsT0FBTyxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsTUFBTTtZQUN2RyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0YsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxlQUFlO1FBQUUsT0FBTyxRQUFRLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQyxhQUFhLENBQUE7SUFDOUYsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLG1CQUFtQjtRQUFFLE9BQU8sUUFBUSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFBO0lBQzVGLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxvQkFBb0I7UUFBRSxPQUFPLFFBQVEsQ0FBQyxhQUFhLElBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQTtJQUNuRyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRSxPQUFPLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLO0lBQzNCLE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0FBQ2xFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsSUFBSTtJQUMzQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZTtRQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtJQUNsRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksdUJBQXVCO1FBQUUsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFBO0lBQ3JGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxZQUFZO1FBQUUsT0FBTyxVQUFVLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNO1lBQ3pGLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQTtJQUNqRSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZTtRQUFFLE9BQU8sYUFBYSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUE7SUFDM0UsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQjtRQUFFLE9BQU8sa0JBQWtCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQTtJQUNqRixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksb0JBQW9CO1FBQUUsT0FBTyxtQkFBbUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFBO0lBQ3RGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXO1FBQUUsT0FBTyxTQUFTLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQTtJQUNuRSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksVUFBVTtRQUFFLE9BQU8sUUFBUSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUE7SUFDaEYsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLGNBQWM7UUFBRSxPQUFPLFlBQVksZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFBO0lBQ3RGLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxnQkFBZ0I7UUFBRSxPQUFPLHVCQUF1QixlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7SUFFOUcsT0FBTyxlQUFlLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQTtBQUMxRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUU7SUFDL0MsSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQzNGLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDZCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUV0QyxJQUFJLElBQUksSUFBSSxtQkFBbUIsSUFBSSxJQUFJLElBQUksb0JBQW9CO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDNUUsSUFBSSxJQUFJLElBQUksVUFBVTtRQUFFLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEYsSUFBSSxJQUFJLElBQUksY0FBYztRQUFFLE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDMUYsSUFBSSxJQUFJLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2xELE9BQU8saUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDekgsQ0FBQztJQUNELElBQUksSUFBSSxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBRWpELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSTtJQUM5QixPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksZUFBZSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQTtBQUNqSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQUk7SUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQTtBQUM1RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUk7SUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLDZCQUE2QixlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLElBQUk7SUFDM0UsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLElBQUksbUJBQW1CO1lBQUUsVUFBVSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7YUFDbEQsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxVQUFVLENBQUMsUUFBUSxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDckYsSUFBSSxDQUFDLDZCQUE2QixFQUFFLCtDQUErQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBRUQsT0FBTTtJQUNSLENBQUM7SUFDRCxJQUFJLFVBQVUsQ0FBQyxRQUFRLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsMEVBQTBFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3RJLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSztJQUM5QixLQUFLLElBQUksT0FBTyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0YsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFMUMsSUFBSSxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUE7SUFDN0IsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUFLO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQTtJQUVuQixLQUFLLElBQUksT0FBTyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0YsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLDhCQUE4QixDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFFO0lBQzdFLEtBQUssTUFBTSxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3pDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUU5RCxJQUFJLE9BQU8sRUFBRSxPQUFPO2dCQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0MsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUMzQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUMxRSxJQUFJLFNBQVMsQ0FBQyxTQUFTO2dCQUFFLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ3BHLENBQUM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksa0JBQWtCLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxxQkFBcUIsSUFBSSxTQUFTLENBQUMsSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDakksOEJBQThCLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDdEUsQ0FBQzthQUFNLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUM1Qyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtZQUNwRSw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUMzRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUs7SUFDaEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLFVBQVUsQ0FBQTtJQUN4SixJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksc0JBQXNCO1FBQUUsT0FBTyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUE7SUFDckcsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLHFCQUFxQjtRQUFFLE9BQU8saUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ3RILElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxxQkFBcUI7UUFBRSxPQUFPLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFakgsT0FBTyxTQUFTLENBQUE7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLO0lBQ2pELE1BQU0sZUFBZSxHQUFHLHVCQUF1QixDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNsRSxNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFeEQsSUFBSSxlQUFlLEVBQUUsSUFBSSxJQUFJLGFBQWEsSUFBSSxVQUFVLEVBQUUsSUFBSSxJQUFJLGdCQUFnQjtRQUNoRixVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBRS9GLE9BQU8sZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDbkQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSztJQUM1QyxNQUFNLGVBQWUsR0FBRyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDbEUsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBRXBELElBQUksZUFBZSxFQUFFLElBQUksSUFBSSxZQUFZLElBQUksZUFBZSxFQUFFLElBQUksSUFBSSxtQkFBbUI7UUFDdkYsUUFBUSxFQUFFLElBQUksSUFBSSxlQUFlO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFFckQsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQTtBQUMxRixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUs7SUFDNUIsT0FBTyxnREFBZ0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7QUFDNUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUk7SUFDOUIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtBQUMzRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEdBQUcsTUFBTTtJQUN0RCxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sYUFBYSxDQUFBO0lBQ2pGLE1BQU0sU0FBUyxHQUFHLDhEQUE4RCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFdkYsT0FBTyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1FBQ2hGLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFBO0FBQ2pHLENBQUM7QUFFRCw2S0FBNks7QUFDN0ssTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDbEUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsQ0FBQztDQUN0RSxDQUFDLENBQUE7QUFFRix5TkFBeU47QUFDek4sTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzlDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUNqRixZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDbkYsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3RGLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUNoRixVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDakYsWUFBWSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ25GLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3pGLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ2hHLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixzQkFBc0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUM3RixlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFDdEYsZUFBZSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3RGLGVBQWUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUN0RixZQUFZLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDaEYsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ2hGLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQztDQUNwRixDQUFDLENBQUE7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQzNFLElBQUksZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksV0FBVyxJQUFJLFNBQVM7WUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsK0NBQStDLFdBQVcsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQ25JLE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7SUFDRCxJQUFJLGVBQWUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLFdBQVcsSUFBSSxTQUFTO1lBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLDBDQUEwQyxXQUFXLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUM5SCxPQUFPLFlBQVksQ0FBQTtJQUNyQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLGtDQUFrQyxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtBQUN0RyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxJQUFJO0lBQzNILElBQUksZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsMkRBQTJELEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUNwSCxDQUFDO1FBRUQsZUFBZSxHQUFHLEtBQUssQ0FBQTtJQUN6QixDQUFDO0lBRUQsSUFBSSxlQUFlLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdEMsSUFBSSxRQUFRLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxrREFBa0QsUUFBUSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDbkksSUFBSSxTQUFTLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxrREFBa0QsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDdEksT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUVELElBQUksZUFBZSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksUUFBUSxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUztZQUFFLE9BQU8sWUFBWSxDQUFBO1FBQ3hFLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUTtZQUFFLE9BQU8sY0FBYyxDQUFBO1FBRXhFLE1BQU0sUUFBUSxHQUFHLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7UUFFN0YsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsMkRBQTJELFFBQVEsUUFBUSxTQUFTLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN4SSxDQUFDO0lBRUQsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUMsQ0FBQztRQUM1QyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQzlCLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsQ0FBQztRQUM5QyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBRSwyQkFBMkIsQ0FBQztRQUM1RCxRQUFRLEVBQUUsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUM7UUFDeEMsZUFBZSxFQUFFLENBQUMsU0FBUyxFQUFFLHdCQUF3QixDQUFDO1FBQ3RELFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztRQUN4QyxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDO1FBQzVCLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQztLQUN6QyxDQUFDLENBQUE7SUFDRixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQTtJQUVuRSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUE7UUFFdkMsSUFBSSxRQUFRLElBQUksWUFBWTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxZQUFZLGNBQWMsUUFBUSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDdEosSUFBSSxTQUFTLElBQUksWUFBWTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxZQUFZLGNBQWMsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFekosT0FBTywyREFBMkQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ2hGLENBQUM7SUFFRCxJQUFJLGVBQWUsSUFBSSxXQUFXLElBQUksZUFBZSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3hFLElBQUksUUFBUSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbEQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLEVBQUUscUVBQXFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtRQUM5SCxDQUFDO1FBRUQsZUFBZSxHQUFHLGVBQWUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFBO0lBQ3pFLENBQUM7SUFFRCxJQUFJLGVBQWUsSUFBSSxhQUFhLElBQUksZUFBZSxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDNUUsSUFBSSxRQUFRLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSw2Q0FBNkMsUUFBUSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFDOUgsSUFBSSxTQUFTLElBQUksUUFBUTtZQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSw2Q0FBNkMsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFFakksT0FBTywrQ0FBK0MsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxJQUFJLGVBQWUsSUFBSSxPQUFPLElBQUksZUFBZSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hFLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixFQUFFLHFEQUFxRCxRQUFRLFFBQVEsU0FBUyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDNUksQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFL0YsT0FBTywyREFBMkQsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxtQ0FBbUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUE7QUFDM0csQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsc0JBQXNCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJO0lBQ3pELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge3NlbWFudGljRmFpbHVyZSwgdW5zdXBwb3J0ZWRDYXBhYmlsaXR5LCB1bnN1cHBvcnRlZFN5bnRheH0gZnJvbSBcIi4uL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtyZWNvcmRUeXBlU3Vic3RpdHV0aW9ucywgc3Vic3RpdHV0ZVZhbHVlVHlwZSwgdHlwZUNvbnRhaW5zQW55VmFyaWFibGV9IGZyb20gXCIuL2dlbmVyaWNzLmpzXCJcbmltcG9ydCB7aGFzT25seVVuaWNvZGVTY2FsYXJzLCBpc1NjYWxhclR5cGVOYW1lLCBzY2FsYXJUeXBlfSBmcm9tIFwiLi9zY2FsYXJzLmpzXCJcbmltcG9ydCB7YWRhcHRlZE9wZXJhdGlvbkZvcn0gZnJvbSBcIi4vb3BlcmF0b3JzLmpzXCJcbmltcG9ydCB7cGFyc2VyUmFuZ2VGb3J9IGZyb20gXCIuL3Byb3ZlbmFuY2UuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZUVmZmVjdEdyYXBofSBmcm9tIFwiLi9lZmZlY3RzLmpzXCJcbmltcG9ydCB7dmFsaWRhdGVSZXNvdXJjZUxpZmV0aW1lc30gZnJvbSBcIi4vbGlmZXRpbWUuanNcIlxuXG5jb25zdCB0YXNrMDA1TGFuZ3VhZ2VzID0gbmV3IFNldChbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCIsIFwiZGFydFwiLCBcInppZ1wiXSlcblxuLyoqIEB0eXBlZGVmIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9uPn0gUmVjb3JkUmVnaXN0cnkgKi9cbi8qKiBAdHlwZWRlZiB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPn0gQ2xhc3NSZWdpc3RyeSAqL1xuLyoqIEB0eXBlZGVmIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBFcnJvclJlZ2lzdHJ5ICovXG4vKiogQHR5cGUge1dlYWtNYXA8UmVjb3JkUmVnaXN0cnksIENsYXNzUmVnaXN0cnk+fSAqL1xuY29uc3QgcmVmZXJlbmNlQ2xhc3Nlc0J5UmVjb3JkUmVnaXN0cnkgPSBuZXcgV2Vha01hcCgpXG4vKiogQHR5cGUge1dlYWtNYXA8UmVjb3JkUmVnaXN0cnksIFNldDxzdHJpbmc+Pn0gKi9cbmNvbnN0IHJlc291cmNlSWRzQnlSZWNvcmRSZWdpc3RyeSA9IG5ldyBXZWFrTWFwKClcblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5kaW5nXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11dGFibGUgLSBXaGV0aGVyIGFzc2lnbm1lbnQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmRpbmdUeXBlfSB0eXBlIC0gQmluZGluZyB0eXBlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9IGtub3duVmFsdWUgLSBDdXJyZW50IHN0YXRpY2FsbHkga25vd24gaW1tdXRhYmxlIHZhbHVlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2NvcGVcbiAqIEBwcm9wZXJ0eSB7TWFwPHN0cmluZywgQmluZGluZz59IGJpbmRpbmdzIC0gQmluZGluZ3MgZGVjbGFyZWQgZGlyZWN0bHkgaW4gdGhpcyBzY29wZS5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHBlbmRpbmcgLSBOYW1lcyBkZWNsYXJlZCBsYXRlciBpbiB0aGlzIHNjb3BlLlxuICogQHByb3BlcnR5IHtTZXQ8QmluZGluZz59IHByZXNlbmNlUHJvb2ZzIC0gT3B0aW9uYWwgYmluZGluZ3MgcHJvdmVuIHByZXNlbnQgb24gdGhpcyBwYXRoLlxuICogQHByb3BlcnR5IHtTY29wZSB8IHVuZGVmaW5lZH0gcGFyZW50IC0gRW5jbG9zaW5nIGxleGljYWwgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NldDxzdHJpbmc+fSB0eXBlUGFyYW1ldGVycyAtIFR5cGUgcGFyYW1ldGVycyB2aXNpYmxlIHRocm91Z2hvdXQgdGhlIGVuY2xvc2luZyBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2V0PHN0cmluZz59IHVzZWROYW1lcyAtIEFsbCBuYW1lcyB1c2VkIGJ5IHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gb3IgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZH0gY3VycmVudENsYXNzIC0gRGVjbGFyaW5nIGNsYXNzIGZvciByZWNlaXZlci1wcml2YXRlIGFjY2Vzcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvb3BGbG93Q29udGV4dFxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hNYXBTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLldoaWxlU3RhdGVtZW50fSBbbmVhcmVzdF0gLSBOZWFyZXN0IGFjdGl2ZSBsb29wLlxuICogQHByb3BlcnR5IHtvYmplY3R9IG93bmVyIC0gRW5jbG9zaW5nIGZ1bmN0aW9uIG9yIGVudHJ5LXBvaW50IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBvd25lcnMgLSBMb29wIG93bmVyIGJ5IG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNGYWlsXG4gKiBAdHlwZSB7KGNvZGU6IHN0cmluZywgZGV0YWlsOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9uKSA9PiBuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEVuZm9yY2VzIHRoZSBjb2hlcmVudCByZWxlYXNlLWNhbmRpZGF0ZSBzZW1hbnRpYyBzdWJzZXQgYWZ0ZXIgYWRhcHRhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gQWRhcHRlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge3tjbGFzc2VzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPiwgZnVuY3Rpb25zPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3Jkcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+LCBjYWxsRWZmZWN0cz86IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn19IFt2aXNpYmxlXSAtIFByb2dyYW0gaW1wb3J0cyB2aXNpYmxlIGR1cmluZyB2YWxpZGF0aW9uLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IFZhbGlkYXRlZCBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBhcnNlZE1vZHVsZShtb2R1bGUsIGxhbmd1YWdlLCB2aXNpYmxlID0ge30pIHtcbiAgbm9ybWFsaXplUGFyc2VkT3duZWRSZWZlcmVuY2VzKG1vZHVsZSwgdmlzaWJsZS5jbGFzc2VzKVxuICB2YWxpZGF0ZU1vZHVsZVNoYXBlKG1vZHVsZSwgbGFuZ3VhZ2UsIChkZXRhaWwsIGxvY2F0aW9uKSA9PiB1bnN1cHBvcnRlZFN5bnRheChsYW5ndWFnZSwgZGV0YWlsLCBsb2NhdGlvbikpXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBvbmUgcGFyc2VyIGZhaWx1cmUgaW50byBhIGxvY2F0ZWQgc2VtYW50aWMgZGlhZ25vc3RpYy5cbiAgICogQHR5cGUge1NlbWFudGljRmFpbH1cbiAgICovXG4gIGNvbnN0IGZhaWwgPSAoY29kZSwgZGV0YWlsLCBsb2NhdGlvbikgPT4gc2VtYW50aWNGYWlsdXJlKGxhbmd1YWdlLCBjb2RlLCBkZXRhaWwsIGxvY2F0aW9uKVxuXG4gIHZhbGlkYXRlTW9kdWxlVHlwZXMobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCwgdHJ1ZSwgdmlzaWJsZSlcbiAgdmFsaWRhdGVSZXNvdXJjZUxpZmV0aW1lcyhtb2R1bGUsIGluZmVyRXNjYXBpbmdFcnJvckVmZmVjdHMobW9kdWxlLCB2aXNpYmxlLmNhbGxFZmZlY3RzKSwgZmFpbClcblxuICByZXR1cm4gbW9kdWxlXG59XG5cbi8qKlxuICogUHJvbW90ZXMgcGFyc2VyLWF1dGhvcmVkIGNsYXNzIHNwZWxsaW5ncyBhZnRlciBhbGwgcHJpdmF0ZSBmaWVsZCB0eXBlcyBhcmUga25vd24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFBhcnNlci1hdXRob3JlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IFt2aXNpYmxlQ2xhc3Nlc10gLSBJbXBvcnRlZCByZWZlcmVuY2UgY2xhc3Nlcy5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXJzZWRPd25lZFJlZmVyZW5jZXMobW9kdWxlLCB2aXNpYmxlQ2xhc3NlcyA9IG5ldyBNYXAoKSkge1xuICBjb25zdCBvd25lZENsYXNzSWRzID0gbmV3IFNldChbLi4udmlzaWJsZUNsYXNzZXMudmFsdWVzKCldLmZpbHRlcigoe293bmVyc2hpcH0pID0+IG93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIilcbiAgICAubWFwKCh7aWR9KSA9PiAvKiogQHR5cGUge3N0cmluZ30gKi8gKGlkKSkpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maWx0ZXIoKHt0eXBlfSkgPT4gdHlwZT8ua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpXG4gICAgaWYgKGZpZWxkcy5sZW5ndGggIT0gMSkgY29udGludWVcbiAgICBjb25zdCBmaWVsZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Qcml2YXRlRmllbGQgJiB7dHlwZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Pd25lZFJlc291cmNlVHlwZX19ICovIChmaWVsZHNbMF0pXG5cbiAgICBkZWNsYXJhdGlvbi5vd25lcnNoaXAgPSB7ZmllbGRJZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZCksIGtpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCByZXNvdXJjZUlkOiBmaWVsZC50eXBlLnJlc291cmNlSWR9XG4gICAgb3duZWRDbGFzc0lkcy5hZGQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCkpXG4gIH1cbiAgLyoqIEB0eXBlIHt1bmtub3duW119ICovXG4gIGNvbnN0IHBlbmRpbmcgPSBbbW9kdWxlXVxuICAvKiogQHR5cGUge1NldDxvYmplY3Q+fSAqL1xuICBjb25zdCBzZWVuID0gbmV3IFNldCgpXG5cbiAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGVuZGluZy5wb3AoKVxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIlJlZmVyZW5jZVR5cGVcIiAmJlxuICAgICAgb3duZWRDbGFzc0lkcy5oYXMoUmVmbGVjdC5nZXQodmFsdWUsIFwiZGVjbGFyYXRpb25JZFwiKSkpIFJlZmxlY3Quc2V0KHZhbHVlLCBcImtpbmRcIiwgXCJPd25lZFJlZmVyZW5jZVR5cGVcIilcbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NhdGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChjaGlsZCAmJiB0eXBlb2YgY2hpbGQgPT0gXCJvYmplY3RcIikgcGVuZGluZy5wdXNoKGNoaWxkKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBzY2FsYXIgdHlwZXMgYW5kIGJpbmRpbmdzIGZvciBhIGNhbGxlci1zdXBwbGllZCBzZW1hbnRpYyBtb2R1bGUgYmVmb3JlIGVtaXNzaW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmFja2VuZExhbmd1YWdlfSBsYW5ndWFnZSAtIEJhY2tlbmQgbGFuZ3VhZ2Ugb3IgYmluYXJ5IHRhcmdldC5cbiAqIEBwYXJhbSB7e2NsYXNzZXM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkNsYXNzRGVjbGFyYXRpb24+LCBmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCByZWNvcmRzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj4sIGVycm9ycz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JEZWNsYXJhdGlvbj4sIGNhbGxFZmZlY3RzPzogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gW3Zpc2libGVdIC0gUmVzb2x2ZWQgcHJvZ3JhbSBpbXBvcnRzLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJhY2tlbmRUeXBlcyhtb2R1bGUsIGxhbmd1YWdlLCB2aXNpYmxlID0ge30pIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBiYWNrZW5kIHZhbGlkYXRpb24gZmFpbHVyZSBpbnRvIGFuIHVuc3VwcG9ydGVkLWNhcGFiaWxpdHkgZGlhZ25vc3RpYy5cbiAgICogQHR5cGUge1NlbWFudGljRmFpbH1cbiAgICovXG4gIGNvbnN0IGZhaWwgPSAoX2NvZGUsIGRldGFpbCwgbG9jYXRpb24pID0+IHVuc3VwcG9ydGVkQ2FwYWJpbGl0eShsYW5ndWFnZSwgZGV0YWlsLCBsb2NhdGlvbilcblxuICB2YWxpZGF0ZU1vZHVsZVR5cGVzKG1vZHVsZSwgbGFuZ3VhZ2UsIGZhaWwsIGZhbHNlLCB2aXNpYmxlKVxuICB2YWxpZGF0ZVJlc291cmNlTGlmZXRpbWVzKG1vZHVsZSwgaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHZpc2libGUuY2FsbEVmZmVjdHMpLCBmYWlsKVxufVxuXG4vKipcbiAqIENoZWNrcyBwYXJzZXItYXV0aG9yZWQgYmxvY2sgYW5kIHN0YXRlbWVudCBsYXlvdXRzIGJlZm9yZSBzZW1hbnRpYyB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBTb3VyY2UgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0geyhkZXRhaWw6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24pID0+IG5ldmVyfSBmYWlsIC0gU2hhcGUgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZU1vZHVsZVNoYXBlKG1vZHVsZSwgbGFuZ3VhZ2UsIGZhaWwpIHtcbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuY2xhc3NlcyA/PyBbXSkge1xuICAgIHZhbGlkYXRlQmxvY2tTaGFwZShkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvcj8uYm9keSwgXCJjb25zdHJ1Y3RvciBib2R5XCIsIGZhaWwpXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcyA/PyBbXSkgdmFsaWRhdGVCbG9ja1NoYXBlKG1ldGhvZC5ib2R5LCBcIm1ldGhvZCBib2R5XCIsIGZhaWwpXG4gIH1cbiAgZm9yIChjb25zdCBmdW5jdGlvbkRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIHtcbiAgICBpZiAoIXRhc2swMDVMYW5ndWFnZXMuaGFzKGxhbmd1YWdlKSAmJiBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubGVuZ3RoICE9IDIpIHtcbiAgICAgIGZhaWwoXCJmdW5jdGlvbiBwYXJhbWV0ZXIgY291bnQgb3RoZXIgdGhhbiB0d29cIiwgZnVuY3Rpb25EZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUJsb2NrU2hhcGUoZnVuY3Rpb25EZWNsYXJhdGlvbi5ib2R5LCBcImZ1bmN0aW9uIGJvZHlcIiwgZmFpbClcbiAgfVxuXG4gIHZhbGlkYXRlQmxvY2tTaGFwZShtb2R1bGUuZW50cnlQb2ludC5ib2R5LCBcImVudHJ5IHBvaW50XCIsIGZhaWwpXG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSByZWN1cnNpdmVseSBuZXN0ZWQgc2VtYW50aWMgYmxvY2sgcHJvZHVjZWQgYnkgYSBmcm9udGVuZC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwgLSBEaWFnbm9zdGljIGRldGFpbC5cbiAqIEBwYXJhbSB7KGRldGFpbDogc3RyaW5nLCBsb2NhdGlvbjogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbikgPT4gbmV2ZXJ9IGZhaWwgLSBTaGFwZSBmYWlsdXJlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQmxvY2tTaGFwZShibG9jaywgZGV0YWlsLCBmYWlsKSB7XG4gIGlmICghYmxvY2sgfHwgYmxvY2sua2luZCAhPSBcIkJsb2NrXCIgfHwgIUFycmF5LmlzQXJyYXkoYmxvY2suc3RhdGVtZW50cykpIHtcbiAgICBmYWlsKGAke2RldGFpbH0gd2l0aG91dCBCbG9ja2AsIGJsb2NrPy5sb2NhdGlvbiA/PyAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgfVxuXG4gIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIGJsb2NrLnN0YXRlbWVudHMpIHtcbiAgICBpZiAoIVtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiwgXCJCcmVha1N0YXRlbWVudFwiLCBcIkNvbnRpbnVlU3RhdGVtZW50XCIsIFwiRXhwcmVzc2lvblN0YXRlbWVudFwiLCBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiwgXCJGb3JFYWNoU3RhdGVtZW50XCIsIFwiSWZTdGF0ZW1lbnRcIiwgXCJMb2NhbERlY2xhcmF0aW9uXCIsIFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiwgXCJQcmludFN0YXRlbWVudFwiLCBcIlJhaXNlU3RhdGVtZW50XCIsIFwiUmV0dXJuU3RhdGVtZW50XCIsIFwiVHJ5U3RhdGVtZW50XCIsIFwiV2hpbGVTdGF0ZW1lbnRcIl0uaW5jbHVkZXMoc3RhdGVtZW50LmtpbmQpKSB7XG4gICAgICBmYWlsKGAke2RldGFpbH0gc3RhdGVtZW50ICR7c3RhdGVtZW50LmtpbmR9YCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICB2YWxpZGF0ZUJsb2NrU2hhcGUoc3RhdGVtZW50LmNvbnNlcXVlbnQsIFwiaWYgY29uc2VxdWVudFwiLCBmYWlsKVxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBcImlmIGFsdGVybmF0ZVwiLCBmYWlsKVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICB2YWxpZGF0ZUJsb2NrU2hhcGUoc3RhdGVtZW50LmJvZHksIFwibG9vcCBib2R5XCIsIGZhaWwpXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICB2YWxpZGF0ZUJsb2NrU2hhcGUoc3RhdGVtZW50LmJvZHksIFwidHJ5IGJvZHlcIiwgZmFpbClcbiAgICAgIHZhbGlkYXRlQmxvY2tTaGFwZShzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBcImNhdGNoIGJvZHlcIiwgZmFpbClcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgZGVjbGFyYXRpb25zIGFuZCBleHByZXNzaW9uIHR5cGVzIHdpdGhpbiBsZXhpY2FsIHNjb3Blcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gU2VtYW50aWMgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIC0gU291cmNlIG9yIGJhY2tlbmQgbGFuZ3VhZ2UgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHRvIHJlcGxhY2UgdHJhbnNpZW50IGZyb250ZW5kIG9wZXJhdGlvbiBpbnRlbnQuXG4gKiBAcGFyYW0ge3tjbGFzc2VzPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9uPiwgZnVuY3Rpb25zPzogTWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPiwgcmVjb3Jkcz86IE1hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb24+LCBlcnJvcnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+LCBjYWxsRWZmZWN0cz86IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn19IFt2aXNpYmxlXSAtIFByb2dyYW0gaW1wb3J0cyB2aXNpYmxlIGR1cmluZyB2YWxpZGF0aW9uLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTW9kdWxlVHlwZXMobW9kdWxlLCBsYW5ndWFnZSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZSA9IHt9KSB7XG4gIGNvbnN0IGNsYXNzZXMgPSByZWdpc3RlckNsYXNzRGVjbGFyYXRpb25zKG1vZHVsZS5jbGFzc2VzID8/IFtdLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB2aXNpYmxlLmNsYXNzZXMpXG4gIGNvbnN0IHJlY29yZHMgPSB2YWxpZGF0ZVJlY29yZERlY2xhcmF0aW9ucyhtb2R1bGUucmVjb3JkcyA/PyBbXSwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZS5yZWNvcmRzLCBjbGFzc2VzKVxuICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZUVycm9yRGVjbGFyYXRpb25zKG1vZHVsZS5lcnJvcnMgPz8gW10sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHZpc2libGUuZXJyb3JzKVxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59ICovXG4gIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBNYXAodmlzaWJsZS5mdW5jdGlvbnMgPz8gW10pXG4gIGNvbnN0IGRlY2xhcmF0aW9uSWRzID0gbmV3IFNldChbLi4uZnVuY3Rpb25zLnZhbHVlcygpXS5mbGF0TWFwKCh7aWR9KSA9PiB0eXBlb2YgaWQgPT0gXCJzdHJpbmdcIiA/IFtpZF0gOiBbXSkpXG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIGZ1bmN0aW9uRGVjbGFyYXRpb25dIG9mIG1vZHVsZS5mdW5jdGlvbnMuZW50cmllcygpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQgPSBgZnVuY3Rpb246JHtpbmRleH1gXG4gICAgaWYgKHR5cGVvZiBmdW5jdGlvbkRlY2xhcmF0aW9uLmlkICE9IFwic3RyaW5nXCIgfHwgIS9eKD86W2Etel1bYS16MC05Ll8tXSojKT9mdW5jdGlvbjpbMC05XSskL3UudGVzdChmdW5jdGlvbkRlY2xhcmF0aW9uLmlkKSB8fFxuICAgICAgZGVjbGFyYXRpb25JZHMuaGFzKGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cIiwgZnVuY3Rpb25EZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGZ1bmN0aW9ucy5oYXMoZnVuY3Rpb25EZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBkdXBsaWNhdGUgZnVuY3Rpb24gJyR7ZnVuY3Rpb25EZWNsYXJhdGlvbi5uYW1lfScuYCwgcm9sZUxvY2F0aW9uKGZ1bmN0aW9uRGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgZGVjbGFyYXRpb25JZHMuYWRkKGZ1bmN0aW9uRGVjbGFyYXRpb24uaWQpXG4gICAgdmFsaWRhdGVUeXBlUGFyYW1ldGVycyhmdW5jdGlvbkRlY2xhcmF0aW9uLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgIGZ1bmN0aW9ucy5zZXQoZnVuY3Rpb25EZWNsYXJhdGlvbi5uYW1lLCBmdW5jdGlvbkRlY2xhcmF0aW9uKVxuICB9XG5cbiAgdmFsaWRhdGVFZmZlY3RHcmFwaChtb2R1bGUsIGxhbmd1YWdlLCBmdW5jdGlvbnMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGNsYXNzZXMpXG4gIGNvbnN0IGNhcGFiaWxpdHlSZXNvdXJjZXMgPSAobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZmxhdE1hcCgoe3Jlc291cmNlc30pID0+IHJlc291cmNlcylcbiAgY29uc3QgY2FwYWJpbGl0eUZhaWx1cmVzID0gKG1vZHVsZS5jYXBhYmlsaXRpZXMgPz8gW10pLmZsYXRNYXAoKHtmYWlsdXJlc30pID0+IGZhaWx1cmVzKVxuXG4gIHJlc291cmNlSWRzQnlSZWNvcmRSZWdpc3RyeS5zZXQocmVjb3JkcywgbmV3IFNldChjYXBhYmlsaXR5UmVzb3VyY2VzLm1hcCgoe2lkfSkgPT4gaWQpKSlcbiAgY29uc3QgZXhpc3RpbmdFcnJvck5hbWVzID0gbmV3IFNldChbLi4uZXJyb3JzLnZhbHVlcygpXS5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG4gIGZvciAoY29uc3QgZmFpbHVyZSBvZiBjYXBhYmlsaXR5RmFpbHVyZXMpIHtcbiAgICBpZiAoZXJyb3JzLmhhcyhmYWlsdXJlLmlkKSB8fCBleGlzdGluZ0Vycm9yTmFtZXMuaGFzKGZhaWx1cmUubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfRVJST1JcIiwgYER1cGxpY2F0ZSBjYXBhYmlsaXR5IGZhaWx1cmUgJyR7ZmFpbHVyZS5uYW1lfScuYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBlcnJvcnMuc2V0KGZhaWx1cmUuaWQsIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FcnJvckRlY2xhcmF0aW9ufSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoZmFpbHVyZSkpKVxuICAgIGV4aXN0aW5nRXJyb3JOYW1lcy5hZGQoZmFpbHVyZS5uYW1lKVxuICB9XG5cbiAgY29uc3QgbG9vcE93bmVycyA9IHByZXBhcmVMb29wSWRlbnRpdGllcyhtb2R1bGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG5cbiAgY29uc3QgcmVzZXJ2ZWRWYWx1ZU5hbWVzID0gbmV3IFNldChbXG4gICAgLi4uZnVuY3Rpb25zLmtleXMoKSxcbiAgICAuLi5bLi4ucmVjb3Jkcy52YWx1ZXMoKV0ubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24ubmFtZSksXG4gICAgLi4uWy4uLmNsYXNzZXMudmFsdWVzKCldLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLm5hbWUpLFxuICAgIC4uLlsuLi5lcnJvcnMudmFsdWVzKCldLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLm5hbWUpLFxuICAgIC4uLmNhcGFiaWxpdHlSZXNvdXJjZXMubWFwKCh7bmFtZX0pID0+IG5hbWUpXG4gIF0pXG5cbiAgY29uc3Qgbm9taW5hbE5hbWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBbLi4ubW9kdWxlLnJlY29yZHMgPz8gW10sIC4uLm1vZHVsZS5jbGFzc2VzID8/IFtdLCAuLi5tb2R1bGUuZXJyb3JzID8/IFtdXSkge1xuICAgIGlmIChub21pbmFsTmFtZXMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0JJTkRJTkdcIiwgYER1cGxpY2F0ZSBub21pbmFsIGRlY2xhcmF0aW9uICcke2RlY2xhcmF0aW9uLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgbm9taW5hbE5hbWVzLmFkZChkZWNsYXJhdGlvbi5uYW1lKVxuICB9XG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgWy4uLmNhcGFiaWxpdHlSZXNvdXJjZXMsIC4uLmNhcGFiaWxpdHlGYWlsdXJlc10pIHtcbiAgICBpZiAobm9taW5hbE5hbWVzLmhhcyhkZWNsYXJhdGlvbi5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBEdXBsaWNhdGUgbm9taW5hbCBkZWNsYXJhdGlvbiAnJHtkZWNsYXJhdGlvbi5uYW1lfScuYCwgbW9kdWxlLmxvY2F0aW9uKVxuICAgIH1cbiAgICBub21pbmFsTmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gIH1cbiAgY29uc3QgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChtb2R1bGUuZnVuY3Rpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKSlcbiAgY29uc3QgY2FsbEVmZmVjdHMgPSBpbmZlckNhbGxFZmZlY3RzKGZ1bmN0aW9ucywgdmlzaWJsZS5jYWxsRWZmZWN0cywgbG9jYWxGdW5jdGlvbk5hbWVzKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmNsYXNzZXMgPz8gW10pIHtcbiAgICB2YWxpZGF0ZUNsYXNzRGVjbGFyYXRpb24oZGVjbGFyYXRpb24sIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcE93bmVycylcbiAgfVxuXG4gIGZvciAoY29uc3QgZnVuY3Rpb25EZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB7XG4gICAgdmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvbkRlY2xhcmF0aW9uLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIHJlc2VydmVkVmFsdWVOYW1lcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcE93bmVycylcbiAgfVxuXG4gIGNvbnN0IGVudHJ5U2NvcGUgPSBjcmVhdGVTY29wZSh1bmRlZmluZWQsIG1vZHVsZS5lbnRyeVBvaW50LmJvZHkuc3RhdGVtZW50cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzKVxuXG4gIHZhbGlkYXRlQmxvY2sobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgZW50cnlTY29wZSwgdW5kZWZpbmVkLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgbm9ybWFsaXplT3BlcmF0aW9ucywge293bmVyOiBtb2R1bGUuZW50cnlQb2ludCwgb3duZXJzOiBsb29wT3duZXJzfSlcbiAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHZhbGlkYXRlRWZmZWN0R3JhcGgobW9kdWxlLCBsYW5ndWFnZSwgZnVuY3Rpb25zLCBmYWlsLCB0cnVlLCBjbGFzc2VzKVxufVxuXG4vKipcbiAqIEFzc2lnbnMgcGFyc2VyLWF1dGhvcmVkIGxvb3AvY29udHJvbCBpZGVudGl0aWVzIGFuZCB2YWxpZGF0ZXMgY2FsbGVyLW93bmVkIGlkZW50aXRpZXMgd2l0aG91dCBjcm9zc2luZyBhIGZ1bmN0aW9uIGJvdW5kYXJ5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBtb2R1bGUgLSBTZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHBhcnNlci1hdXRob3JlZCBpZGVudGl0aWVzIGFyZSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtNYXA8c3RyaW5nLCBvYmplY3Q+fSBMb29wIG93bmVyIGJ5IGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiBwcmVwYXJlTG9vcElkZW50aXRpZXMobW9kdWxlLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKSB7XG4gIGNvbnN0IG93bmVycyA9IG5ldyBNYXAoKVxuICBsZXQgbmV4dExvb3AgPSAwXG5cbiAgY29uc3QgY2xhc3NPd25lcnMgPSAobW9kdWxlLmNsYXNzZXMgPz8gW10pLmZsYXRNYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24uY29uc3RydWN0b3IsIC4uLmRlY2xhcmF0aW9uLm1ldGhvZHNdKVxuXG4gIGZvciAoY29uc3Qgb3duZXIgb2YgWy4uLmNsYXNzT3duZXJzLCAuLi5tb2R1bGUuZnVuY3Rpb25zLCBtb2R1bGUuZW50cnlQb2ludF0pIHZpc2l0KG93bmVyLmJvZHksIG93bmVyLCBbXSlcblxuICByZXR1cm4gb3duZXJzXG5cbiAgLyoqXG4gICAqIFZpc2l0cyBvbmUgYmxvY2sgaW4gbGV4aWNhbCBzZW1hbnRpYyBvcmRlci5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIENhbmRpZGF0ZSBibG9jay5cbiAgICogQHBhcmFtIHtvYmplY3R9IG93bmVyIC0gRW5jbG9zaW5nIGZ1bmN0aW9uIG9yIGVudHJ5IHBvaW50LlxuICAgKiBAcGFyYW0geyhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZvckVhY2hNYXBTdGF0ZW1lbnQgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLldoaWxlU3RhdGVtZW50KVtdfSBhY3RpdmUgLSBBY3RpdmUgbG9vcHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXQoYmxvY2ssIG93bmVyLCBhY3RpdmUpIHtcbiAgICBpZiAoIWJsb2NrIHx8ICFBcnJheS5pc0FycmF5KGJsb2NrLnN0YXRlbWVudHMpKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgICBpZiAoIXN0YXRlbWVudCB8fCB0eXBlb2Ygc3RhdGVtZW50ICE9IFwib2JqZWN0XCIpIGNvbnRpbnVlXG4gICAgICBpZiAoW1wiRm9yRWFjaFN0YXRlbWVudFwiLCBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIiwgXCJXaGlsZVN0YXRlbWVudFwiXS5pbmNsdWRlcyhzdGF0ZW1lbnQua2luZCkpIHtcbiAgICAgICAgY29uc3QgbG9vcCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Gb3JFYWNoU3RhdGVtZW50IHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Gb3JFYWNoTWFwU3RhdGVtZW50IHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5XaGlsZVN0YXRlbWVudH0gKi8gKHN0YXRlbWVudClcblxuICAgICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgbG9vcC5pZCA9IGBsb29wOiR7bmV4dExvb3B9YFxuICAgICAgICBuZXh0TG9vcCArPSAxXG4gICAgICAgIGlmICh0eXBlb2YgbG9vcC5pZCAhPSBcInN0cmluZ1wiIHx8ICEvXmxvb3A6WzAtOV0rJC91LnRlc3QobG9vcC5pZCkgfHwgb3duZXJzLmhhcyhsb29wLmlkKSkge1xuICAgICAgICAgIGZhaWwoXCJJTlZBTElEX0xPT1BfVEFSR0VUXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgbG9vcCBpZGVudGl0eS5cIiwgbG9vcC5sb2NhdGlvbilcbiAgICAgICAgfVxuICAgICAgICBvd25lcnMuc2V0KGxvb3AuaWQsIG93bmVyKVxuICAgICAgICB2aXNpdChsb29wLmJvZHksIG93bmVyLCBbLi4uYWN0aXZlLCBsb29wXSlcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJCcmVha1N0YXRlbWVudFwiIHx8IHN0YXRlbWVudC5raW5kID09IFwiQ29udGludWVTdGF0ZW1lbnRcIikge1xuICAgICAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucyAmJiBhY3RpdmUubGVuZ3RoID4gMCkgc3RhdGVtZW50LnRhcmdldExvb3BJZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYWN0aXZlLmF0KC0xKT8uaWQpXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgICB2aXNpdChzdGF0ZW1lbnQuY29uc2VxdWVudCwgb3duZXIsIGFjdGl2ZSlcbiAgICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHZpc2l0KHN0YXRlbWVudC5hbHRlcm5hdGUsIG93bmVyLCBhY3RpdmUpXG4gICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgICAgdmlzaXQoc3RhdGVtZW50LmJvZHksIG93bmVyLCBhY3RpdmUpXG4gICAgICAgIHZpc2l0KHN0YXRlbWVudC5jYXRjaEJvZHksIG93bmVyLCBhY3RpdmUpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyB2YWxpZGF0b3Itb25seSB1bmNoZWNrZWQtZXJyb3IgZWZmZWN0cyBmb3IgYSB2YWxpZGF0ZWQgbW9kdWxlJ3MgbG9jYWwgZnVuY3Rpb25zLlxuICogVGhlc2UgZWZmZWN0cyBuZXZlciBlbnRlciBzZW1hbnRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgb3IgcHVibGljIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFZhbGlkYXRlZCBzZW1hbnRpYyBtb2R1bGUuXG4gKiBAcGFyYW0ge3tmdW5jdGlvbnM/OiBNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+LCBjYWxsRWZmZWN0cz86IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn19IFt2aXNpYmxlXSAtIEltcG9ydGVkIGZ1bmN0aW9ucyBhbmQgYWxyZWFkeS1yZXNvbHZlZCBlZmZlY3RzIGJ5IGxvY2FsIGJpbmRpbmcuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBMb2NhbCBmdW5jdGlvbiBlZmZlY3RzIGJ5IHNvdXJjZS12aXNpYmxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2R1bGVVbmNoZWNrZWRFcnJvckVmZmVjdHMobW9kdWxlLCB2aXNpYmxlID0ge30pIHtcbiAgY29uc3QgZnVuY3Rpb25zID0gbmV3IE1hcCh2aXNpYmxlLmZ1bmN0aW9ucyA/PyBbXSlcblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIG1vZHVsZS5mdW5jdGlvbnMpIGZ1bmN0aW9ucy5zZXQoZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb24pXG4gIGNvbnN0IGxvY2FsRnVuY3Rpb25OYW1lcyA9IG5ldyBTZXQobW9kdWxlLmZ1bmN0aW9ucy5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG4gIGNvbnN0IGVmZmVjdHMgPSBpbmZlckNhbGxFZmZlY3RzKGZ1bmN0aW9ucywgdmlzaWJsZS5jYWxsRWZmZWN0cywgbG9jYWxGdW5jdGlvbk5hbWVzKVxuXG4gIHJldHVybiBuZXcgTWFwKG1vZHVsZS5mdW5jdGlvbnMubWFwKChkZWNsYXJhdGlvbikgPT4gW2RlY2xhcmF0aW9uLm5hbWUsIG5ldyBTZXQoZWZmZWN0cy5nZXQoZGVjbGFyYXRpb24ubmFtZSkgPz8gW10pXSkpXG59XG5cbi8qKlxuICogQXNzaWducyBhbmQgdmFsaWRhdGVzIHRoZSBjbG9zZWQgbm9taW5hbCBpZGVudGl0aWVzIG93bmVkIGJ5IHJlZmVyZW5jZSBjbGFzc2VzLlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciBwYXJzZXItYXV0aG9yZWQgaWRlbnRpdGllcyBhcmUgYXNzaWduZWQuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbj59IFt2aXNpYmxlQ2xhc3Nlc10gLSBJbXBvcnRlZCBjbGFzc2VzIGJ5IGlkZW50aXR5LlxuICogQHJldHVybnMge0NsYXNzUmVnaXN0cnl9IENsYXNzZXMgYnkgc3RhYmxlIGlkZW50aXR5LlxuICovXG5mdW5jdGlvbiByZWdpc3RlckNsYXNzRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZUNsYXNzZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9ucykpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWZlcmVuY2UgY2xhc3MgZGVjbGFyYXRpb25zIG11c3QgYmUgYW4gb3JkZXJlZCBhcnJheS5cIiwgLyoqIEB0eXBlIHtuZXZlcn0gKi8gKHVuZGVmaW5lZCkpXG4gIH1cbiAgLyoqIEB0eXBlIHtDbGFzc1JlZ2lzdHJ5fSAqL1xuICBjb25zdCBjbGFzc2VzID0gbmV3IE1hcCh2aXNpYmxlQ2xhc3NlcylcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KFsuLi52aXNpYmxlQ2xhc3Nlcy52YWx1ZXMoKV0ubWFwKCh7bmFtZX0pID0+IG5hbWUpKVxuXG4gIGZvciAobGV0IGNsYXNzSW5kZXggPSAwOyBjbGFzc0luZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgY2xhc3NJbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gKi8gKGRlY2xhcmF0aW9uc1tjbGFzc0luZGV4XSlcblxuICAgIGlmICghZGVjbGFyYXRpb24gfHwgZGVjbGFyYXRpb24ua2luZCAhPSBcIkNsYXNzRGVjbGFyYXRpb25cIiB8fCAhQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5maWVsZHMpIHx8XG4gICAgICAhQXJyYXkuaXNBcnJheShkZWNsYXJhdGlvbi5tZXRob2RzKSB8fCAhZGVjbGFyYXRpb24uY29uc3RydWN0b3IgfHwgZGVjbGFyYXRpb24uY29uc3RydWN0b3Iua2luZCAhPSBcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJEVVBMSUNBVEVfQ0xBU1NcIiwgXCJNYWxmb3JtZWQgb3IgaW52YWxpZCByZWZlcmVuY2UgY2xhc3MgZGVjbGFyYXRpb24uXCIsIGRlY2xhcmF0aW9uPy5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGggPT0gMCkge1xuICAgICAgZmFpbChcIklOQ09NUExFVEVfSU5JVElBTElaQVRJT05cIiwgXCJSZWZlcmVuY2UgY2xhc3NlcyBtdXN0IGRlY2xhcmUgcHJpdmF0ZSBpbnN0YW5jZSBzdGF0ZS5cIiwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBkZWNsYXJhdGlvbi5pZCA9IGBjbGFzczoke2NsYXNzSW5kZXh9YFxuICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fCAhL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2NsYXNzOlswLTldKyQvdS50ZXN0KGRlY2xhcmF0aW9uLmlkKSB8fFxuICAgICAgY2xhc3Nlcy5oYXMoZGVjbGFyYXRpb24uaWQpIHx8IHR5cGVvZiBkZWNsYXJhdGlvbi5uYW1lICE9IFwic3RyaW5nXCIgfHwgZGVjbGFyYXRpb24ubmFtZS5sZW5ndGggPT0gMCB8fCBuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfQ0xBU1NcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIHJlZmVyZW5jZSBjbGFzcyAnJHtTdHJpbmcoZGVjbGFyYXRpb24ubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24oZGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgbmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gICAgY2xhc3Nlcy5zZXQoZGVjbGFyYXRpb24uaWQsIGRlY2xhcmF0aW9uKVxuXG4gICAgY29uc3QgZmllbGROYW1lcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChsZXQgZmllbGRJbmRleCA9IDA7IGZpZWxkSW5kZXggPCBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoOyBmaWVsZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2ZpZWxkSW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9OmZpZWxkOiR7ZmllbGRJbmRleH1gXG5cbiAgICAgIGlmICghZmllbGQgfHwgZmllbGQua2luZCAhPSBcIlByaXZhdGVGaWVsZFwiKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUFJJVkFURV9GSUVMRFwiLCBcIk1hbGZvcm1lZCBvciBpbnZhbGlkIHByaXZhdGUgZmllbGQuXCIsIGZpZWxkPy5sb2NhdGlvbiA/PyBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBmaWVsZC5pZCA9IGV4cGVjdGVkSWRcbiAgICAgIGlmIChmaWVsZC5pZCAhPSBleHBlY3RlZElkIHx8IHR5cGVvZiBmaWVsZC5uYW1lICE9IFwic3RyaW5nXCIgfHwgZmllbGQubmFtZS5sZW5ndGggPT0gMCB8fCBmaWVsZE5hbWVzLmhhcyhmaWVsZC5uYW1lKSkge1xuICAgICAgICBmYWlsKFwiRFVQTElDQVRFX1BSSVZBVEVfRklFTERcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIHByaXZhdGUgZmllbGQgJyR7U3RyaW5nKGZpZWxkLm5hbWUpfScuYCwgcm9sZUxvY2F0aW9uKGZpZWxkLCBcIm5hbWVcIikpXG4gICAgICB9XG4gICAgICBmaWVsZE5hbWVzLmFkZChmaWVsZC5uYW1lKVxuICAgIH1cbiAgICBjb25zdCBpbnZhbGlkT3duZWRGaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKCh7dHlwZX0pID0+IGNvbnRhaW5zT3duZWRUeXBlKHR5cGUpICYmIHR5cGUua2luZCAhPSBcIk93bmVkUmVzb3VyY2VUeXBlXCIpXG5cbiAgICBpZiAoaW52YWxpZE93bmVkRmllbGQpIHtcbiAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIG1heSBjb250YWluIG93bmVyc2hpcCBvbmx5IGluIG9uZSBkaXJlY3QgcmVzb3VyY2UgZmllbGQuYCwgaW52YWxpZE93bmVkRmllbGQubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IG93bmVkRmllbGRzID0gZGVjbGFyYXRpb24uZmllbGRzLmZpbHRlcigoe3R5cGV9KSA9PiB0eXBlPy5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIilcblxuICAgIGlmIChvd25lZEZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgYENsYXNzICcke2RlY2xhcmF0aW9uLm5hbWV9JyBtYXkgb3duIGV4YWN0bHkgb25lIGRpcmVjdCByZXNvdXJjZSBmaWVsZC5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG93bmVkRmllbGRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Qcml2YXRlRmllbGQgJiB7dHlwZTogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Pd25lZFJlc291cmNlVHlwZX19ICovIChvd25lZEZpZWxkc1swXSlcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0ge2ZpZWxkSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZmllbGQuaWQpLCBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJvd25lZFJlc291cmNlXCIpLFxuICAgICAgICByZXNvdXJjZUlkOiBmaWVsZC50eXBlLnJlc291cmNlSWR9XG5cbiAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBkZWNsYXJhdGlvbi5vd25lcnNoaXAgPSBleHBlY3RlZFxuICAgICAgZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkoZGVjbGFyYXRpb24ub3duZXJzaGlwKSAhPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZCkpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX1RZUEVfTUlTTUFUQ0hcIiwgYENsYXNzICcke2RlY2xhcmF0aW9uLm5hbWV9JyBoYXMgbWFsZm9ybWVkIHJlc291cmNlIG93bmVyc2hpcCBtZXRhZGF0YS5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRlY2xhcmF0aW9uLm93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIikge1xuICAgICAgZmFpbChcIlJFU09VUkNFX1RZUEVfTUlTTUFUQ0hcIiwgYENsYXNzICcke2RlY2xhcmF0aW9uLm5hbWV9JyBkb2VzIG5vdCBjb250YWluIGl0cyBkZWNsYXJlZCByZXNvdXJjZSBmaWVsZC5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICBjb25zdCBjb25zdHJ1Y3RvcklkID0gYCR7ZGVjbGFyYXRpb24uaWR9OmNvbnN0cnVjdG9yYFxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmlkID0gY29uc3RydWN0b3JJZFxuICAgIGlmIChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5pZCAhPSBjb25zdHJ1Y3RvcklkIHx8ICFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnMpIHx8XG4gICAgICAhZGVjbGFyYXRpb24uY29uc3RydWN0b3IuYm9keSB8fCBkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5ib2R5LmtpbmQgIT0gXCJCbG9ja1wiKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0NPTlNUUlVDVE9SXCIsIFwiTWFsZm9ybWVkIG9yIGludmFsaWQgY29uc3RydWN0b3IgZGVjbGFyYXRpb24uXCIsIGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZE5hbWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGxldCBtZXRob2RJbmRleCA9IDA7IG1ldGhvZEluZGV4IDwgZGVjbGFyYXRpb24ubWV0aG9kcy5sZW5ndGg7IG1ldGhvZEluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IG1ldGhvZCA9IGRlY2xhcmF0aW9uLm1ldGhvZHNbbWV0aG9kSW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZElkID0gYCR7ZGVjbGFyYXRpb24uaWR9Om1ldGhvZDoke21ldGhvZEluZGV4fWBcblxuICAgICAgaWYgKCFtZXRob2QgfHwgbWV0aG9kLmtpbmQgIT0gXCJNZXRob2REZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIGZhaWwoXCJEVVBMSUNBVEVfTUVUSE9EXCIsIFwiTWFsZm9ybWVkIG9yIGludmFsaWQgbWV0aG9kIGRlY2xhcmF0aW9uLlwiLCBtZXRob2Q/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIG1ldGhvZC5pZCA9IGV4cGVjdGVkSWRcbiAgICAgIGlmIChtZXRob2QuaWQgIT0gZXhwZWN0ZWRJZCB8fCB0eXBlb2YgbWV0aG9kLm5hbWUgIT0gXCJzdHJpbmdcIiB8fCBtZXRob2QubmFtZS5sZW5ndGggPT0gMCB8fCBtZXRob2ROYW1lcy5oYXMobWV0aG9kLm5hbWUpIHx8XG4gICAgICAgICFBcnJheS5pc0FycmF5KG1ldGhvZC5wYXJhbWV0ZXJzKSB8fCAhbWV0aG9kLmJvZHkgfHwgbWV0aG9kLmJvZHkua2luZCAhPSBcIkJsb2NrXCIpIHtcbiAgICAgICAgZmFpbChcIkRVUExJQ0FURV9NRVRIT0RcIiwgYER1cGxpY2F0ZSBvciBpbnZhbGlkIG1ldGhvZCAnJHtTdHJpbmcobWV0aG9kLm5hbWUpfScuYCwgcm9sZUxvY2F0aW9uKG1ldGhvZCwgXCJuYW1lXCIpKVxuICAgICAgfVxuICAgICAgbWV0aG9kTmFtZXMuYWRkKG1ldGhvZC5uYW1lKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjbGFzc2VzXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGV4YWN0IGNvbnN0cnVjdGlvbiwgcHJpdmF0ZSBzdGF0ZSwgYW5kIG1ldGhvZCBib2RpZXMgZm9yIG9uZSBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIENsYXNzIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBGdW5jdGlvbiBzaWduYXR1cmVzLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBhbmQgcmVmZXJlbmNlLWNsYXNzIHJlZ2lzdHJpZXMuXG4gKiBAcGFyYW0ge0Vycm9yUmVnaXN0cnl9IGVycm9ycyAtIEVycm9yIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEZ1bmN0aW9uIGNhbGwgZWZmZWN0cy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHJlc2VydmVkVmFsdWVOYW1lcyAtIE1vZHVsZS1yZXNlcnZlZCBuYW1lcy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIHJlc29sdXRpb25zIGFyZSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgb2JqZWN0Pn0gbG9vcE93bmVycyAtIExvb3Agb3duZXJzaGlwIHJlZ2lzdHJ5LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2xhc3NEZWNsYXJhdGlvbihkZWNsYXJhdGlvbiwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCByZXNlcnZlZFZhbHVlTmFtZXMsIGZhaWwsXG4gIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BPd25lcnMpIHtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBkZWNsYXJhdGlvbi5maWVsZHMpIHtcbiAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShmaWVsZC50eXBlLCBmaWVsZC5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzKVxuICB9XG5cbiAgY29uc3QgY29uc3RydWN0b3IgPSBkZWNsYXJhdGlvbi5jb25zdHJ1Y3RvclxuICBjb25zdCBhY3F1aXNpdGlvblN0YXRlbWVudCA9IGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50c1swXVxuICBjb25zdCBhY3F1aXNpdGlvbkV4cHJlc3Npb24gPSBhY3F1aXNpdGlvblN0YXRlbWVudD8ua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCJcbiAgICA/IGFjcXVpc2l0aW9uU3RhdGVtZW50LmV4cHJlc3Npb24gOiB1bmRlZmluZWRcbiAgY29uc3Qgb3duZWRBY3F1aXNpdGlvbiA9IGRlY2xhcmF0aW9uLm93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIiAmJiBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoID09IDEgJiZcbiAgICBjb25zdHJ1Y3Rvci5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID09IDEgJiYgYWNxdWlzaXRpb25TdGF0ZW1lbnQ/LmtpbmQgPT0gXCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwiICYmXG4gICAgYWNxdWlzaXRpb25TdGF0ZW1lbnQuZmllbGQgPT0gZGVjbGFyYXRpb24ub3duZXJzaGlwLmZpZWxkSWQgJiYgYWNxdWlzaXRpb25TdGF0ZW1lbnQucmVjZWl2ZXIua2luZCA9PSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiICYmXG4gICAgYWNxdWlzaXRpb25TdGF0ZW1lbnQucmVjZWl2ZXIuY2xhc3NJZCA9PSBkZWNsYXJhdGlvbi5pZCAmJiBhY3F1aXNpdGlvbkV4cHJlc3Npb24/LmtpbmQgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiICYmXG4gICAgYWNxdWlzaXRpb25FeHByZXNzaW9uLnJlc29sdXRpb24ucmVzb3VyY2VGbG93LmtpbmQgPT0gXCJhY3F1aXJlXCIgJiZcbiAgICBhY3F1aXNpdGlvbkV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3cucmVzb3VyY2VJZCA9PSBkZWNsYXJhdGlvbi5vd25lcnNoaXAucmVzb3VyY2VJZFxuXG4gIGlmIChzeW50YWN0aWNCbG9ja0VmZmVjdHMoY29uc3RydWN0b3IuYm9keSwgY2FsbEVmZmVjdHMpLnNpemUgPiAwICYmICFvd25lZEFjcXVpc2l0aW9uKSB7XG4gICAgZmFpbChcIlVOU1VQUE9SVEVEX1NUQVRFTUVOVFwiLCBcIlJlZmVyZW5jZSBjb25zdHJ1Y3RvcnMgY2Fubm90IGV4cG9zZSB1bmNoZWNrZWQtZXJyb3IgZWZmZWN0cyBpbiBUYXNrIDAzMy5cIiwgY29uc3RydWN0b3IubG9jYXRpb24pXG4gIH1cblxuICBpZiAoIW93bmVkQWNxdWlzaXRpb24gJiZcbiAgICAoY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGggIT0gZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aCB8fCBjb25zdHJ1Y3Rvci5ib2R5LnN0YXRlbWVudHMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGgpKSB7XG4gICAgZmFpbChcIklOQ09NUExFVEVfSU5JVElBTElaQVRJT05cIiwgYENvbnN0cnVjdG9yIGZvciAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbXVzdCBpbml0aWFsaXplIGV2ZXJ5IHByaXZhdGUgZmllbGQgZXhhY3RseSBvbmNlIGluIGRlY2xhcmF0aW9uIG9yZGVyLmAsXG4gICAgICBjb25zdHJ1Y3Rvci5sb2NhdGlvbilcbiAgfVxuICBjb25zdCBjb25zdHJ1Y3RvclNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBjb25zdHJ1Y3Rvci5ib2R5LnN0YXRlbWVudHMsIHJlc2VydmVkVmFsdWVOYW1lcywgbmV3IFNldCgpLCBkZWNsYXJhdGlvbilcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29uc3RydWN0b3IucGFyYW1ldGVycy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSBjb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzW2luZGV4XVxuICAgIGNvbnN0IGZpZWxkID0gZGVjbGFyYXRpb24uZmllbGRzW2luZGV4XVxuICAgIGNvbnN0IHR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpXG5cbiAgICBpZiAoIW93bmVkQWNxdWlzaXRpb24gJiYgIXNhbWVUeXBlKHR5cGUsIGZpZWxkLnR5cGUpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ29uc3RydWN0b3IgcGFyYW1ldGVyICcke3BhcmFtZXRlci5uYW1lfScgbXVzdCBleGFjdGx5IG1hdGNoIHByaXZhdGUgZmllbGQgJyR7ZmllbGQubmFtZX0nLmAsIHBhcmFtZXRlci5sb2NhdGlvbilcbiAgICB9XG4gICAgZGVjbGFyZUJpbmRpbmcocGFyYW1ldGVyLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlfSwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpLCBjb25zdHJ1Y3RvclNjb3BlLCBmYWlsKVxuICAgIGlmIChvd25lZEFjcXVpc2l0aW9uKSBjb250aW51ZVxuICAgIGNvbnN0IHN0YXRlbWVudCA9IGNvbnN0cnVjdG9yLmJvZHkuc3RhdGVtZW50c1tpbmRleF1cbiAgICBjb25zdCBpbml0aWFsaXplciA9IHN0YXRlbWVudD8ua2luZCA9PSBcIlByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50XCJcbiAgICAgID8gc3RhdGVtZW50LmV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIiA/IHN0YXRlbWVudC5leHByZXNzaW9uLmV4cHJlc3Npb24gOiBzdGF0ZW1lbnQuZXhwcmVzc2lvblxuICAgICAgOiB1bmRlZmluZWRcblxuICAgIGlmICghc3RhdGVtZW50IHx8IHN0YXRlbWVudC5raW5kICE9IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIiB8fCBzdGF0ZW1lbnQuZmllbGQgIT0gZmllbGQuaWQgfHxcbiAgICAgIHN0YXRlbWVudC5yZWNlaXZlcj8ua2luZCAhPSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiIHx8IHN0YXRlbWVudC5yZWNlaXZlci5jbGFzc0lkICE9IGRlY2xhcmF0aW9uLmlkIHx8XG4gICAgICBpbml0aWFsaXplcj8ua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIgfHwgaW5pdGlhbGl6ZXIubmFtZSAhPSBwYXJhbWV0ZXIubmFtZSkge1xuICAgICAgZmFpbChcIklOQ09NUExFVEVfSU5JVElBTElaQVRJT05cIiwgYENvbnN0cnVjdG9yIGZvciAnJHtkZWNsYXJhdGlvbi5uYW1lfScgbXVzdCBpbml0aWFsaXplICcke2ZpZWxkLm5hbWV9JyBmcm9tIGl0cyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlci5gLFxuICAgICAgICBzdGF0ZW1lbnQ/LmxvY2F0aW9uID8/IGNvbnN0cnVjdG9yLmxvY2F0aW9uKVxuICAgIH1cbiAgfVxuICB2YWxpZGF0ZUJsb2NrKGNvbnN0cnVjdG9yLmJvZHksIGNvbnN0cnVjdG9yU2NvcGUsIHtraW5kOiBcIlR5cGVSZWZlcmVuY2VcIiwgbmFtZTogXCJ2b2lkXCJ9LCBmdW5jdGlvbnMsIHJlY29yZHMsXG4gICAgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywge293bmVyOiBjb25zdHJ1Y3Rvciwgb3duZXJzOiBsb29wT3duZXJzfSlcblxuICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBkZWNsYXJhdGlvbi5tZXRob2RzKSB7XG4gICAgY29uc3QgdW5zdXBwb3J0ZWRNZXRob2RFZmZlY3RzID0gWy4uLnN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhtZXRob2QuYm9keSwgY2FsbEVmZmVjdHMpXVxuICAgICAgLmZpbHRlcigoaWQpID0+ICEvXig/Om1vZHVsZTpbMC05XStcXC8pP2NhcGFiaWxpdHk6WzAtOV0rXFwvZmFpbHVyZTpbMC05XSskL3UudGVzdChpZCkpXG5cbiAgICBpZiAoZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kICE9IFwib3duZWRSZXNvdXJjZVwiICYmIHVuc3VwcG9ydGVkTWV0aG9kRWZmZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICBmYWlsKFwiVU5TVVBQT1JURURfU1RBVEVNRU5UXCIsIGBSZWZlcmVuY2UgbWV0aG9kICcke21ldGhvZC5uYW1lfScgY2Fubm90IGV4cG9zZSB1bmNoZWNrZWQtZXJyb3IgZWZmZWN0cyBpbiBUYXNrIDAzMy5gLCBtZXRob2QubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHNjb3BlID0gY3JlYXRlU2NvcGUodW5kZWZpbmVkLCBtZXRob2QuYm9keS5zdGF0ZW1lbnRzLCByZXNlcnZlZFZhbHVlTmFtZXMsIG5ldyBTZXQoKSwgZGVjbGFyYXRpb24pXG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBtZXRob2QucGFyYW1ldGVycykge1xuICAgICAgY29uc3QgdHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcylcblxuICAgICAgZGVjbGFyZUJpbmRpbmcocGFyYW1ldGVyLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlfSwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgICB9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShtZXRob2QucmV0dXJuVHlwZSwgbWV0aG9kLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzKVxuICAgIGNvbnN0IGZsb3cgPSB2YWxpZGF0ZUJsb2NrKG1ldGhvZC5ib2R5LCBzY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywge293bmVyOiBtZXRob2QsIG93bmVyczogbG9vcE93bmVyc30pXG5cbiAgICBpZiAoZGVjbGFyYXRpb24ub3duZXJzaGlwPy5raW5kID09IFwib3duZWRSZXNvdXJjZVwiKSBvd25lZE1ldGhvZFJlc291cmNlRmxvdyhkZWNsYXJhdGlvbiwgbWV0aG9kLCBmYWlsKVxuXG4gICAgaWYgKCFpc1ZvaWRUeXBlKHJldHVyblR5cGUpICYmIGZsb3cubm9ybWFsKSB7XG4gICAgICBmYWlsKFwiTUlTU0lOR19SRVRVUk5cIiwgYE1ldGhvZCAnJHttZXRob2QubmFtZX0nIGRvZXMgbm90IHJldHVybiBvbiBldmVyeSByZWFjaGFibGUgcGF0aC5gLCBtZXRob2QubG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG5vbWluYWwgdW5jaGVja2VkLWVycm9yIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZGVjbGFyYXRpb25zIC0gQ2FuZGlkYXRlIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yRGVjbGFyYXRpb24+fSBbdmlzaWJsZUVycm9yc10gLSBJbXBvcnRlZCBlcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7RXJyb3JSZWdpc3RyeX0gVmFsaWRhdGVkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVFcnJvckRlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHZpc2libGVFcnJvcnMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9ucykpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkVycm9yIGRlY2xhcmF0aW9ucyBtdXN0IGJlIGFuIG9yZGVyZWQgYXJyYXkuXCIsIC8qKiBAdHlwZSB7bmV2ZXJ9ICovICh1bmRlZmluZWQpKVxuICAvKiogQHR5cGUge0Vycm9yUmVnaXN0cnl9ICovXG4gIGNvbnN0IGVycm9ycyA9IG5ldyBNYXAodmlzaWJsZUVycm9ycylcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZGVjbGFyYXRpb25zLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb25zW2luZGV4XVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbiB8fCBkZWNsYXJhdGlvbi5raW5kICE9IFwiRXJyb3JEZWNsYXJhdGlvblwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgZXJyb3IgZGVjbGFyYXRpb24uXCIsIGRlY2xhcmF0aW9uPy5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIGRlY2xhcmF0aW9uLmlkID0gYGVycm9yOiR7aW5kZXh9YFxuICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fCAhL14oPzpbYS16XVthLXowLTkuXy1dKiMpP2Vycm9yOlswLTldKyQvdS50ZXN0KGRlY2xhcmF0aW9uLmlkKSB8fCBlcnJvcnMuaGFzKGRlY2xhcmF0aW9uLmlkKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9FUlJPUlwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIGVycm9yIGRlY2xhcmF0aW9uIGlkZW50aXR5LlwiLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkZWNsYXJhdGlvbi5uYW1lICE9IFwic3RyaW5nXCIgfHwgbmFtZXMuaGFzKGRlY2xhcmF0aW9uLm5hbWUpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX0VSUk9SXCIsIGBEdXBsaWNhdGUgb3IgaW52YWxpZCBlcnJvciAnJHtTdHJpbmcoZGVjbGFyYXRpb24ubmFtZSl9Jy5gLCByb2xlTG9jYXRpb24oZGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgbmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gICAgZXJyb3JzLnNldChkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb24pXG4gIH1cblxuICByZXR1cm4gZXJyb3JzXG59XG5cbi8qKlxuICogQXNzaWducyBhbmQgdmFsaWRhdGVzIG9uZSBkZWNsYXJhdGlvbidzIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXJzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIE93bmluZyBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgcGFyc2VyLWF1dGhvcmVkIGlkZW50aXRpZXMgYXJlIGFzc2lnbmVkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZVBhcmFtZXRlcnMoZGVjbGFyYXRpb24sIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHtcbiAgaWYgKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHJldHVyblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMpKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJUeXBlIHBhcmFtZXRlcnMgbXVzdCBiZSBhIGRlbnNlIG9yZGVyZWQgYXJyYXkuXCIsIGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzW2luZGV4XVxuICAgIGNvbnN0IGtleXMgPSBwYXJhbWV0ZXIgJiYgdHlwZW9mIHBhcmFtZXRlciA9PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHBhcmFtZXRlcilcbiAgICAgID8gT2JqZWN0LmtleXMocGFyYW1ldGVyKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgOiBcIlwiXG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oZGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnMsIGluZGV4KSB8fCAhcGFyYW1ldGVyIHx8IHBhcmFtZXRlci5raW5kICE9IFwiVHlwZVBhcmFtZXRlclwiIHx8XG4gICAgICBrZXlzICE9IFwiaWQsa2luZCxsb2NhdGlvbixuYW1lXCIgfHwgdHlwZW9mIHBhcmFtZXRlci5uYW1lICE9IFwic3RyaW5nXCIgfHwgcGFyYW1ldGVyLm5hbWUubGVuZ3RoID09IDApIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIHR5cGUgcGFyYW1ldGVyIGRlY2xhcmF0aW9uLlwiLCBwYXJhbWV0ZXI/LmxvY2F0aW9uID8/IGRlY2xhcmF0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobmFtZXMuaGFzKHBhcmFtZXRlci5uYW1lKSkge1xuICAgICAgZmFpbChcIkRVUExJQ0FURV9UWVBFX1BBUkFNRVRFUlwiLCBgRHVwbGljYXRlIHR5cGUgcGFyYW1ldGVyICcke3BhcmFtZXRlci5uYW1lfScuYCwgcm9sZUxvY2F0aW9uKHBhcmFtZXRlciwgXCJuYW1lXCIpKVxuICAgIH1cbiAgICBuYW1lcy5hZGQocGFyYW1ldGVyLm5hbWUpXG4gICAgY29uc3QgZXhwZWN0ZWRJZCA9IGAke2RlY2xhcmF0aW9uLmlkfTp0eXBlOiR7aW5kZXh9YFxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHBhcmFtZXRlci5pZCA9IGV4cGVjdGVkSWRcbiAgICBpZiAocGFyYW1ldGVyLmlkICE9IGV4cGVjdGVkSWQpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfVFlQRV9QQVJBTUVURVJcIiwgXCJEdXBsaWNhdGUgb3IgaW52YWxpZCB0eXBlIHBhcmFtZXRlciBpZGVudGl0eS5cIiwgcGFyYW1ldGVyLmxvY2F0aW9uKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGNsb3NlZCBpZGVudGl0eSBzY29wZSBvd25lZCBieSBvbmUgdmFsaWRhdGVkIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24gfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlY29yZERlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIERlY2xhcmF0aW9uLlxuICogQHJldHVybnMge1NldDxzdHJpbmc+fSBUeXBlLXBhcmFtZXRlciBpZGVudGl0aWVzLlxuICovXG5mdW5jdGlvbiBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJJZHMoZGVjbGFyYXRpb24pIHtcbiAgcmV0dXJuIG5ldyBTZXQoKGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHtpZH0pID0+IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoaWQpKSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbm9taW5hbCBkZWNsYXJhdGlvbnMgYW5kIHJldHVybnMgdGhlaXIgc3RhYmxlIGlkZW50aXR5IHJlZ2lzdHJ5LlxuICogQHBhcmFtIHt1bmtub3dufSBkZWNsYXJhdGlvbnMgLSBDYW5kaWRhdGUgb3JkZXJlZCBkZWNsYXJhdGlvbnMuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vcm1hbGl6ZU9wZXJhdGlvbnMgLSBXaGV0aGVyIHBhcnNlci1hdXRob3JlZCBpZGVudGl0aWVzIGFyZSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZWNvcmREZWNsYXJhdGlvbj59IFt2aXNpYmxlUmVjb3Jkc10gLSBJbXBvcnRlZCByZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtDbGFzc1JlZ2lzdHJ5fSBbY2xhc3Nlc10gLSBNb2R1bGUgcmVmZXJlbmNlIGNsYXNzZXMgYnkgaWRlbnRpdHkuXG4gKiBAcmV0dXJucyB7UmVjb3JkUmVnaXN0cnl9IFZhbGlkYXRlZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVjb3JkRGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgdmlzaWJsZVJlY29yZHMgPSBuZXcgTWFwKCksIGNsYXNzZXMgPSBuZXcgTWFwKCkpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGRlY2xhcmF0aW9ucykpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlJlY29yZCBkZWNsYXJhdGlvbnMgbXVzdCBiZSBhbiBvcmRlcmVkIGFycmF5LlwiLCAvKiogQHR5cGUge25ldmVyfSAqLyAodW5kZWZpbmVkKSlcbiAgLyoqIEB0eXBlIHtSZWNvcmRSZWdpc3RyeX0gKi9cbiAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXAodmlzaWJsZVJlY29yZHMpXG5cbiAgcmVmZXJlbmNlQ2xhc3Nlc0J5UmVjb3JkUmVnaXN0cnkuc2V0KHJlY29yZHMsIGNsYXNzZXMpXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChsZXQgcmVjb3JkSW5kZXggPSAwOyByZWNvcmRJbmRleCA8IGRlY2xhcmF0aW9ucy5sZW5ndGg7IHJlY29yZEluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBkZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uc1tyZWNvcmRJbmRleF1cblxuICAgIGlmICghZGVjbGFyYXRpb24gfHwgZGVjbGFyYXRpb24ua2luZCAhPSBcIlJlY29yZERlY2xhcmF0aW9uXCIgfHwgIUFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24uZmllbGRzKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFsZm9ybWVkIHJlY29yZCBkZWNsYXJhdGlvbi5cIiwgZGVjbGFyYXRpb24/LmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZGVjbGFyYXRpb24uaWQgPSBgcmVjb3JkOiR7cmVjb3JkSW5kZXh9YFxuICAgIGlmICh0eXBlb2YgZGVjbGFyYXRpb24uaWQgIT0gXCJzdHJpbmdcIiB8fCAhL14oPzpbYS16XVthLXowLTkuXy1dKiMpP3JlY29yZDpbMC05XSskL3UudGVzdChkZWNsYXJhdGlvbi5pZCkgfHwgcmVjb3Jkcy5oYXMoZGVjbGFyYXRpb24uaWQpKSB7XG4gICAgICBmYWlsKFwiRFVQTElDQVRFX1JFQ09SRFwiLCBcIkR1cGxpY2F0ZSBvciBpbnZhbGlkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cIiwgZGVjbGFyYXRpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChuYW1lcy5oYXMoZGVjbGFyYXRpb24ubmFtZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfUkVDT1JEXCIsIGBEdXBsaWNhdGUgcmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZGVjbGFyYXRpb24sIFwibmFtZVwiKSlcbiAgICB9XG4gICAgbmFtZXMuYWRkKGRlY2xhcmF0aW9uLm5hbWUpXG4gICAgdmFsaWRhdGVUeXBlUGFyYW1ldGVycyhkZWNsYXJhdGlvbiwgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICByZWNvcmRzLnNldChkZWNsYXJhdGlvbi5pZCwgZGVjbGFyYXRpb24pXG4gIH1cblxuICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGRlY2xhcmF0aW9ucykge1xuICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBuZXcgU2V0KClcbiAgICBjb25zdCB0eXBlUGFyYW1ldGVycyA9IGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcklkcyhkZWNsYXJhdGlvbilcblxuICAgIGZvciAobGV0IGZpZWxkSW5kZXggPSAwOyBmaWVsZEluZGV4IDwgZGVjbGFyYXRpb24uZmllbGRzLmxlbmd0aDsgZmllbGRJbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tmaWVsZEluZGV4XVxuXG4gICAgICBpZiAoIWZpZWxkIHx8IGZpZWxkLmtpbmQgIT0gXCJSZWNvcmRGaWVsZFwiKSBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCByZWNvcmQgZmllbGQuXCIsIGZpZWxkPy5sb2NhdGlvbiA/PyBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBmaWVsZC5pZCA9IGAke2RlY2xhcmF0aW9uLmlkfTpmaWVsZDoke2ZpZWxkSW5kZXh9YFxuICAgICAgaWYgKHR5cGVvZiBmaWVsZC5pZCAhPSBcInN0cmluZ1wiIHx8IGZpZWxkLmlkICE9IGAke2RlY2xhcmF0aW9uLmlkfTpmaWVsZDoke2ZpZWxkSW5kZXh9YCkge1xuICAgICAgICBmYWlsKFwiRFVQTElDQVRFX0ZJRUxEXCIsIFwiRHVwbGljYXRlIG9yIGludmFsaWQgcmVjb3JkIGZpZWxkIGlkZW50aXR5LlwiLCBmaWVsZC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZE5hbWVzLmhhcyhmaWVsZC5uYW1lKSkgZmFpbChcIkRVUExJQ0FURV9GSUVMRFwiLCBgRHVwbGljYXRlIGZpZWxkICcke2ZpZWxkLm5hbWV9Jy5gLCByb2xlTG9jYXRpb24oZmllbGQsIFwibmFtZVwiKSlcbiAgICAgIGZpZWxkTmFtZXMuYWRkKGZpZWxkLm5hbWUpXG4gICAgICBpZiAoY29udGFpbnNPd25lZFR5cGUoZmllbGQudHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlJFU09VUkNFX0FMSUFTXCIsIFwiT3duZWQgcmVzb3VyY2VzIGNhbm5vdCBiZSBzdG9yZWQgaW4gaW1tdXRhYmxlIHJlY29yZHMuXCIsIGZpZWxkLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoZmllbGQudHlwZSwgZmllbGQubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG4gICAgfVxuICB9XG4gIHZhbGlkYXRlRGlyZWN0UmVjb3JkUmVjdXJzaW9uKGRlY2xhcmF0aW9ucywgcmVjb3JkcywgZmFpbClcblxuICByZXR1cm4gcmVjb3Jkc1xufVxuXG4vKipcbiAqIFJlamVjdHMgY3ljbGVzIGNvbXBvc2VkIHNvbGVseSBvZiB1bm1lZGlhdGVkIHJlY29yZCBmaWVsZHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb25bXX0gZGVjbGFyYXRpb25zIC0gVmFsaWQgZGVjbGFyYXRpb25zLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIERlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdFJlY29yZFJlY3Vyc2lvbihkZWNsYXJhdGlvbnMsIHJlY29yZHMsIGZhaWwpIHtcbiAgY29uc3QgY29tcGxldGUgPSBuZXcgU2V0KClcblxuICAvKipcbiAgICogVmlzaXRzIG9uZSBkZWNsYXJhdGlvbiBhbG9uZyBhbiB1bm1lZGlhdGVkIHJlY29yZCBwYXRoLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVjb3JkRGVjbGFyYXRpb259IGRlY2xhcmF0aW9uIC0gQ3VycmVudCBkZWNsYXJhdGlvbi5cbiAgICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gYWN0aXZlIC0gRGVjbGFyYXRpb24gaWRlbnRpdGllcyBhY3RpdmUgb24gdGhpcyBwYXRoLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KGRlY2xhcmF0aW9uLCBhY3RpdmUpIHtcbiAgICBpZiAoY29tcGxldGUuaGFzKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpKSkgcmV0dXJuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQoYWN0aXZlKVxuXG4gICAgbmV4dC5hZGQoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5pZCkpXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBkZWNsYXJhdGlvbi5maWVsZHMpIHtcbiAgICAgIGlmIChmaWVsZC50eXBlLmtpbmQgIT0gXCJSZWNvcmRUeXBlXCIpIGNvbnRpbnVlXG4gICAgICBpZiAobmV4dC5oYXMoZmllbGQudHlwZS5kZWNsYXJhdGlvbklkKSkge1xuICAgICAgICBmYWlsKFwiSUxMRUdBTF9SRUNPUkRfUkVDVVJTSU9OXCIsIGBEaXJlY3QgdmFsdWUtcmVjdXJzaXZlIGZpZWxkICcke2ZpZWxkLm5hbWV9Jy5gLCB0eXBlTG9jYXRpb24oZmllbGQudHlwZSwgZmllbGQubG9jYXRpb24pKVxuICAgICAgfVxuICAgICAgY29uc3QgcmVmZXJlbmNlZCA9IHJlY29yZHMuZ2V0KGZpZWxkLnR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgICAgaWYgKHJlZmVyZW5jZWQpIHZpc2l0KHJlZmVyZW5jZWQsIG5leHQpXG4gICAgfVxuICAgIGNvbXBsZXRlLmFkZCgvKiogQHR5cGUge3N0cmluZ30gKi8gKGRlY2xhcmF0aW9uLmlkKSlcbiAgfVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgZGVjbGFyYXRpb25zKSB2aXNpdChkZWNsYXJhdGlvbiwgbmV3IFNldCgpKVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgbm9uLXZvaWQgZnVuY3Rpb24gYW5kIGl0cyBjb21wbGV0ZSBjb250cm9sIGZsb3cuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBGdW5jdGlvbiBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gRnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBFcnJvciBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY2FsbEVmZmVjdHMgLSBJbnRlcm5hbGx5IGluZmVycmVkIHVuY2hlY2tlZC1lcnJvciBlZmZlY3RzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gcmVzZXJ2ZWRWYWx1ZU5hbWVzIC0gTW9kdWxlIGZ1bmN0aW9ucyBhbmQgbm9taW5hbCBjb25zdHJ1Y3RvcnMgdW5hdmFpbGFibGUgdG8gbGV4aWNhbCBiaW5kaW5ncy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgb2JqZWN0Pn0gbG9vcE93bmVycyAtIExvb3Agb3duZXIgYnkgbW9kdWxlLWxvY2FsIGlkZW50aXR5LlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRnVuY3Rpb24oZGVjbGFyYXRpb24sIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgcmVzZXJ2ZWRWYWx1ZU5hbWVzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBsb29wT3duZXJzKSB7XG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuICBjb25zdCBzY29wZSA9IGNyZWF0ZVNjb3BlKHVuZGVmaW5lZCwgZGVjbGFyYXRpb24uYm9keS5zdGF0ZW1lbnRzLCByZXNlcnZlZFZhbHVlTmFtZXMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB0eXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UocGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICAgIGRlY2xhcmVCaW5kaW5nKHBhcmFtZXRlci5uYW1lLCB7a25vd25WYWx1ZTogdW5kZWZpbmVkLCBtdXRhYmxlOiBmYWxzZSwgdHlwZX0sIHJvbGVMb2NhdGlvbihwYXJhbWV0ZXIsIFwibmFtZVwiKSwgc2NvcGUsIGZhaWwpXG4gIH1cblxuICBjb25zdCByZXR1cm5UeXBlID0gdmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKGRlY2xhcmF0aW9uLnJldHVyblR5cGUsIGRlY2xhcmF0aW9uLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcbiAgY29uc3QgcmV0dXJucyA9IHZhbGlkYXRlQmxvY2soZGVjbGFyYXRpb24uYm9keSwgc2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICBub3JtYWxpemVPcGVyYXRpb25zLCB7b3duZXI6IGRlY2xhcmF0aW9uLCBvd25lcnM6IGxvb3BPd25lcnN9KVxuXG4gIGlmICghaXNWb2lkVHlwZShyZXR1cm5UeXBlKSAmJiByZXR1cm5zLm5vcm1hbCkge1xuICAgIGZhaWwoXCJNSVNTSU5HX1JFVFVSTlwiLCBgRnVuY3Rpb24gJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGRvZXMgbm90IHJldHVybiBvbiBldmVyeSByZWFjaGFibGUgcGF0aC5gLCBkZWNsYXJhdGlvbi5sb2NhdGlvbilcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgb3JkZXJlZCBibG9jayBhbmQgcmVwb3J0cyB3aGV0aGVyIGV2ZXJ5IHBhdGggcmV0dXJucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5CbG9ja30gYmxvY2sgLSBTZW1hbnRpYyBibG9jay5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gU2NvcGUgYmVsb25naW5nIHRvIHRoaXMgYmxvY2suXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCB1bmRlZmluZWR9IHJldHVyblR5cGUgLSBGdW5jdGlvbiByZXR1cm4gdHlwZSwgYWJzZW50IGZvciBlbnRyeSBwb2ludHMuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIEZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7RXJyb3JSZWdpc3RyeX0gZXJyb3JzIC0gRXJyb3IgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gSW50ZXJuYWxseSBpbmZlcnJlZCB1bmNoZWNrZWQtZXJyb3IgZWZmZWN0cy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7TG9vcEZsb3dDb250ZXh0fSBsb29wQ29udGV4dCAtIEFjdGl2ZSBsb29wIGFuZCBvd25lciBpZGVudGl0aWVzLlxuICogQHJldHVybnMge3tub3JtYWw6IGJvb2xlYW4sIHJhaXNlczogU2V0PHN0cmluZz59fSBSZWFjaGFibGUgbm9ybWFsIGNvbnRpbnVhdGlvbiBhbmQgZXNjYXBpbmcgZXJyb3IgaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCbG9jayhibG9jaywgc2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpIHtcbiAgbGV0IG5vcm1hbCA9IHRydWVcbiAgY29uc3QgcmFpc2VzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2YgYmxvY2suc3RhdGVtZW50cykge1xuICAgIGlmICghbm9ybWFsKSBmYWlsKFwiVU5SRUFDSEFCTEVfU1RBVEVNRU5UXCIsIFwiU3RhdGVtZW50IGlzIHVucmVhY2hhYmxlLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG5cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGRlY2xhcmVkVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHN0YXRlbWVudC50eXBlLCBzdGF0ZW1lbnQubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG4gICAgICBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIgPSBub3JtYWxpemVPd25lZE1vdmUoc3RhdGVtZW50LmluaXRpYWxpemVyLCBkZWNsYXJlZFR5cGUsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBpbml0aWFsaXplclR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5pbml0aWFsaXplciwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBpbml0aWFsaXplclwiLCBkZWNsYXJlZFR5cGVcbiAgICAgIClcblxuICAgICAgc2NvcGUucGVuZGluZy5kZWxldGUoc3RhdGVtZW50Lm5hbWUpXG4gICAgICBpZiAoIXNhbWVUeXBlKGluaXRpYWxpemVyVHlwZSwgZGVjbGFyZWRUeXBlKSkge1xuICAgICAgICBpZiAoaW5pdGlhbGl6ZXJUeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiAmJiBkZWNsYXJlZFR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICAgICAgZmFpbChcIkZBSUxVUkVfQUJTRU5DRV9DT05GTEFUSU9OXCIsIFwiT3B0aW9uYWwgYWJzZW5jZSBjYW5ub3QgYmUgY29lcmNlZCBpbnRvIGEgdmFsdWUgb3IgdHlwZWQgZmFpbHVyZS5cIiwgc3RhdGVtZW50LmluaXRpYWxpemVyLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBJbml0aWFsaXplciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGluaXRpYWxpemVyVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihkZWNsYXJlZFR5cGUpfS5gLCBzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQubmFtZSwge1xuICAgICAgICBrbm93blZhbHVlOiBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihzdGF0ZW1lbnQuaW5pdGlhbGl6ZXIsIHNjb3BlKSxcbiAgICAgICAgbXV0YWJsZTogc3RhdGVtZW50Lm11dGFibGUsXG4gICAgICAgIHR5cGU6IGRlY2xhcmVkVHlwZVxuICAgICAgfSwgcm9sZUxvY2F0aW9uKHN0YXRlbWVudCwgXCJuYW1lXCIpLCBzY29wZSwgZmFpbClcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmluaXRpYWxpemVyLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYmluZGluZyA9IHJlc29sdmVCaW5kaW5nKHN0YXRlbWVudC50YXJnZXQubmFtZSwgc3RhdGVtZW50LnRhcmdldC5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpXG5cbiAgICAgIGlmIChiaW5kaW5nLnR5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJJTU1VVEFCTEVfQVNTSUdOTUVOVFwiLCBgQ2Fubm90IGFzc2lnbiB0byBpbW11dGFibGUgY2F0Y2ggYmluZGluZyAnJHtzdGF0ZW1lbnQudGFyZ2V0Lm5hbWV9Jy5gLCBzdGF0ZW1lbnQudGFyZ2V0LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKGJpbmRpbmcudHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBiaW5kaW5nLnR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJSRVNPVVJDRV9BTElBU1wiLCBcIk93bmVkIHJlc291cmNlcyBjYW5ub3QgYmUgcmVhc3NpZ25lZCBvciBhbGlhc2VkLlwiLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBleHByZXNzaW9uVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgc3RhdGVtZW50LmV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gYXNzaWdubWVudFwiLCBiaW5kaW5nLnR5cGVcbiAgICAgIClcblxuICAgICAgaWYgKCFiaW5kaW5nLm11dGFibGUpIHtcbiAgICAgICAgZmFpbChcIklNTVVUQUJMRV9BU1NJR05NRU5UXCIsIGBDYW5ub3QgYXNzaWduIHRvIGltbXV0YWJsZSBiaW5kaW5nICcke3N0YXRlbWVudC50YXJnZXQubmFtZX0nLmAsIHN0YXRlbWVudC50YXJnZXQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIXNhbWVUeXBlKGV4cHJlc3Npb25UeXBlLCBiaW5kaW5nLnR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBBc3NpZ25tZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oZXhwcmVzc2lvblR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oYmluZGluZy50eXBlKX0uYCwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUpXG4gICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBzY29wZS5jdXJyZW50Q2xhc3NcblxuICAgICAgaWYgKCFkZWNsYXJhdGlvbiB8fCAhc3RhdGVtZW50LnJlY2VpdmVyIHx8IHN0YXRlbWVudC5yZWNlaXZlci5raW5kICE9IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIgfHxcbiAgICAgICAgc3RhdGVtZW50LnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQpIHtcbiAgICAgICAgZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJQcml2YXRlIGZpZWxkIHJlY2VpdmVyIG11c3QgYmUgdGhlIGRlY2xhcmluZyBjbGFzcyByZWNlaXZlci5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgZmllbGQgPSBkZWNsYXJhdGlvbi5maWVsZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gc3RhdGVtZW50LmZpZWxkKVxuXG4gICAgICBpZiAoIWZpZWxkKSBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlByaXZhdGUgZmllbGQgaWRlbnRpdHkgaXMgbm90IG93bmVkIGJ5IHRoZSBkZWNsYXJpbmcgY2xhc3MuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gbm9ybWFsaXplT3duZWRNb3ZlKHN0YXRlbWVudC5leHByZXNzaW9uLCBmaWVsZC50eXBlLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuICAgICAgY29uc3QgZXhwcmVzc2lvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgcHJpdmF0ZSBmaWVsZCBhc3NpZ25tZW50XCIsIGZpZWxkLnR5cGVcbiAgICAgIClcblxuICAgICAgaWYgKCFzYW1lVHlwZShleHByZXNzaW9uVHlwZSwgZmllbGQudHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFByaXZhdGUgZmllbGQgYXNzaWdubWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGV4cHJlc3Npb25UeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZpZWxkLnR5cGUpfS5gLFxuICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBwcmludGVkVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIHByaW50IHZhbHVlXCIpXG5cbiAgICAgIGlmIChwcmludGVkVHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBwcmludGVkVHlwZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgICAgZmFpbChcIkJPUlJPV19FU0NBUEVcIiwgXCJPd25lZCB2YWx1ZXMgY2Fubm90IGVzY2FwZSB0aHJvdWdoIHByaW50aW5nIG9yIHNlcmlhbGl6YXRpb24uXCIsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHByaW50ZWRUeXBlLmtpbmQgIT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb2xsZWN0aW9ucyBhbmQgcmVjb3JkcyBjYW5ub3QgYmUgcHJpbnRlZCBkaXJlY3RseS5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5leHByZXNzaW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkV4cHJlc3Npb25TdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFzdGF0ZW1lbnQuZXhwcmVzc2lvbiB8fCAhW1wiQ2FsbEV4cHJlc3Npb25cIiwgXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiLCBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCJdLmluY2x1ZGVzKHN0YXRlbWVudC5leHByZXNzaW9uLmtpbmQpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRXhwcmVzc2lvbiBzdGF0ZW1lbnQgbXVzdCBjb250YWluIGEgZGlyZWN0IG9yIHJlY2VpdmVyIGNhbGwuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4cHJlc3Npb25UeXBlID0gaW5mZXJFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucylcblxuICAgICAgaWYgKGV4cHJlc3Npb25UeXBlICE9IFwidm9pZFwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiRXhwcmVzc2lvbiBzdGF0ZW1lbnRzIG1heSBjb250YWluIG9ubHkgdm9pZCBjYWxscy5cIiwgc3RhdGVtZW50LmV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyYWlzZXMsIHN0YXRlbWVudC5leHByZXNzaW9uLCBjYWxsRWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkJyZWFrU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJDb250aW51ZVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gc3RhdGVtZW50LmtpbmQgPT0gXCJCcmVha1N0YXRlbWVudFwiID8gXCJicmVha1wiIDogXCJjb250aW51ZVwiXG5cbiAgICAgIGlmICghbG9vcENvbnRleHQubmVhcmVzdCkge1xuICAgICAgICBpZiAodHlwZW9mIHN0YXRlbWVudC50YXJnZXRMb29wSWQgPT0gXCJzdHJpbmdcIiAmJiBsb29wQ29udGV4dC5vd25lcnMuaGFzKHN0YXRlbWVudC50YXJnZXRMb29wSWQpICYmXG4gICAgICAgICAgbG9vcENvbnRleHQub3duZXJzLmdldChzdGF0ZW1lbnQudGFyZ2V0TG9vcElkKSAhPT0gbG9vcENvbnRleHQub3duZXIpIHtcbiAgICAgICAgICBmYWlsKFwiQ1JPU1NfRlVOQ1RJT05fTE9PUF9UQVJHRVRcIiwgYCR7Y29udHJvbFswXS50b1VwcGVyQ2FzZSgpfSR7Y29udHJvbC5zbGljZSgxKX0gdGFyZ2V0IGNyb3NzZXMgYSBmdW5jdGlvbiBib3VuZGFyeS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICAgIH1cbiAgICAgICAgZmFpbChgSUxMRUdBTF8ke2NvbnRyb2wudG9VcHBlckNhc2UoKX1fQ09OVEVYVGAsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IHN0YXRlbWVudCBvdXRzaWRlIGEgbG9vcC5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHN0YXRlbWVudC50YXJnZXRMb29wSWQgIT0gXCJzdHJpbmdcIiB8fCAhbG9vcENvbnRleHQub3duZXJzLmhhcyhzdGF0ZW1lbnQudGFyZ2V0TG9vcElkKSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9MT09QX1RBUkdFVFwiLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSBoYXMgYW4gaW52YWxpZCBsb29wIHRhcmdldCBpZGVudGl0eS5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAobG9vcENvbnRleHQub3duZXJzLmdldChzdGF0ZW1lbnQudGFyZ2V0TG9vcElkKSAhPT0gbG9vcENvbnRleHQub3duZXIpIHtcbiAgICAgICAgZmFpbChcIkNST1NTX0ZVTkNUSU9OX0xPT1BfVEFSR0VUXCIsIGAke2NvbnRyb2xbMF0udG9VcHBlckNhc2UoKX0ke2NvbnRyb2wuc2xpY2UoMSl9IHRhcmdldCBjcm9zc2VzIGEgZnVuY3Rpb24gYm91bmRhcnkuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlbWVudC50YXJnZXRMb29wSWQgIT0gbG9vcENvbnRleHQubmVhcmVzdC5pZCkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9MT09QX1RBUkdFVFwiLCBgJHtjb250cm9sWzBdLnRvVXBwZXJDYXNlKCl9JHtjb250cm9sLnNsaWNlKDEpfSBtdXN0IHRhcmdldCB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5gLCBzdGF0ZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBub3JtYWwgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmV0dXJuU3RhdGVtZW50XCIpIHtcbiAgICAgIGlmICghcmV0dXJuVHlwZSkgZmFpbChcIklMTEVHQUxfUkVUVVJOX0NPTlRFWFRcIiwgXCJSZXR1cm4gc3RhdGVtZW50IG91dHNpZGUgYSBmdW5jdGlvbi5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgaWYgKGlzVm9pZFR5cGUocmV0dXJuVHlwZSkpIHtcbiAgICAgICAgaWYgKHN0YXRlbWVudC5leHByZXNzaW9uKSB7XG4gICAgICAgICAgZmFpbChcIlZPSURfUkVUVVJOX1ZBTFVFXCIsIFwiVm9pZCBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGEgdmFsdWUuXCIsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXN0YXRlbWVudC5leHByZXNzaW9uKSB7XG4gICAgICAgICAgZmFpbChcIk1JU1NJTkdfUkVUVVJOX1ZBTFVFXCIsIGBGdW5jdGlvbiByZXR1cm4gcmVxdWlyZXMgYSAke3R5cGVEZXNjcmlwdGlvbihyZXR1cm5UeXBlKX0gdmFsdWUuYCwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uID0gbm9ybWFsaXplT3duZWRNb3ZlKHN0YXRlbWVudC5leHByZXNzaW9uLCByZXR1cm5UeXBlLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuICAgICAgICBjb25zdCBhY3R1YWxUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICAgIHN0YXRlbWVudC5leHByZXNzaW9uLFxuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGZ1bmN0aW9ucyxcbiAgICAgICAgICByZWNvcmRzLFxuICAgICAgICAgIGZhaWwsXG4gICAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgICAgICAgICBcImEgcmV0dXJuZWQgdmFsdWVcIixcbiAgICAgICAgICByZXR1cm5UeXBlXG4gICAgICAgIClcblxuICAgICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbFR5cGUsIHJldHVyblR5cGUpKSB7XG4gICAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJldHVybiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbFR5cGUpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocmV0dXJuVHlwZSl9LmAsIHN0YXRlbWVudC5leHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGVtZW50LmV4cHJlc3Npb24pIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmV4cHJlc3Npb24sIGNhbGxFZmZlY3RzKVxuICAgICAgbm9ybWFsID0gZmFsc2VcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50LmNvbmRpdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbmRpdGlvblwiKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShjb25kaXRpb25UeXBlLCBcImJvb2xlYW5cIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9CT09MRUFOX0NPTkRJVElPTlwiLCBgSWYgY29uZGl0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29uZGl0aW9uVHlwZSl9OyBleHBlY3RlZCBib29sZWFuLmAsIHN0YXRlbWVudC5jb25kaXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQmluZGluZ3MgPSBiaW5kaW5nc1Zpc2libGVGcm9tKHNjb3BlKVxuICAgICAgY29uc3QgaW5pdGlhbEtub3duVmFsdWVzID0gdmlzaWJsZUJpbmRpbmdzLm1hcCgoYmluZGluZykgPT4gYmluZGluZy5rbm93blZhbHVlKVxuICAgICAgY29uc3QgY29uc2VxdWVudFNjb3BlID0gY3JlYXRlU2NvcGUoc2NvcGUsIHN0YXRlbWVudC5jb25zZXF1ZW50LnN0YXRlbWVudHMpXG4gICAgICBjb25zdCBhbHRlcm5hdGVTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYWx0ZXJuYXRlPy5zdGF0ZW1lbnRzID8/IFtdKVxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgY29uc2VxdWVudFNjb3BlLCB0cnVlKVxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgYWx0ZXJuYXRlU2NvcGUsIGZhbHNlKVxuICAgICAgY29uc3QgY29uc2VxdWVudFJldHVybnMgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5jb25zZXF1ZW50LCBjb25zZXF1ZW50U2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICBjb25zdCBjb25zZXF1ZW50S25vd25WYWx1ZXMgPSB2aXNpYmxlQmluZGluZ3MubWFwKChiaW5kaW5nKSA9PiBiaW5kaW5nLmtub3duVmFsdWUpXG5cbiAgICAgIHZpc2libGVCaW5kaW5ncy5mb3JFYWNoKChiaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSBpbml0aWFsS25vd25WYWx1ZXNbaW5kZXhdXG4gICAgICB9KVxuICAgICAgbGV0IGFsdGVybmF0ZVJldHVybnMgPSB7bm9ybWFsOiB0cnVlLCByYWlzZXM6IG5ldyBTZXQoKX1cblxuICAgICAgaWYgKHN0YXRlbWVudC5hbHRlcm5hdGUpIHtcbiAgICAgICAgYWx0ZXJuYXRlUmV0dXJucyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmFsdGVybmF0ZSwgYWx0ZXJuYXRlU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG4gICAgICB9XG4gICAgICBjb25zdCBhbHRlcm5hdGVLbm93blZhbHVlcyA9IHZpc2libGVCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcua25vd25WYWx1ZSlcblxuICAgICAgdmlzaWJsZUJpbmRpbmdzLmZvckVhY2goKGJpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmICghY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmIGFsdGVybmF0ZVJldHVybnMubm9ybWFsKSBiaW5kaW5nLmtub3duVmFsdWUgPSBhbHRlcm5hdGVLbm93blZhbHVlc1tpbmRleF1cbiAgICAgICAgZWxzZSBpZiAoY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmICFhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbCkgYmluZGluZy5rbm93blZhbHVlID0gY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICBlbHNlIGlmIChjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWwgJiYgY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XSA9PT0gYWx0ZXJuYXRlS25vd25WYWx1ZXNbaW5kZXhdKSB7XG4gICAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gY29uc2VxdWVudEtub3duVmFsdWVzW2luZGV4XVxuICAgICAgICB9IGVsc2UgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICB9KVxuICAgICAgY29uc3QgY29udGludWluZ1Byb29mcyA9ICFjb25zZXF1ZW50UmV0dXJucy5ub3JtYWwgJiYgYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgPyBhbHRlcm5hdGVTY29wZS5wcmVzZW5jZVByb29mc1xuICAgICAgICA6IGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCAmJiAhYWx0ZXJuYXRlUmV0dXJucy5ub3JtYWxcbiAgICAgICAgICA/IGNvbnNlcXVlbnRTY29wZS5wcmVzZW5jZVByb29mc1xuICAgICAgICAgIDogY29uc2VxdWVudFJldHVybnMubm9ybWFsICYmIGFsdGVybmF0ZVJldHVybnMubm9ybWFsXG4gICAgICAgICAgICA/IG5ldyBTZXQoWy4uLmNvbnNlcXVlbnRTY29wZS5wcmVzZW5jZVByb29mc10uZmlsdGVyKChiaW5kaW5nKSA9PiBhbHRlcm5hdGVTY29wZS5wcmVzZW5jZVByb29mcy5oYXMoYmluZGluZykpKVxuICAgICAgICAgICAgOiBuZXcgU2V0KClcbiAgICAgIGNvbnN0IHZpc2libGVTZXQgPSBuZXcgU2V0KHZpc2libGVCaW5kaW5ncylcblxuICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuY2xlYXIoKVxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGNvbnRpbnVpbmdQcm9vZnMpIHtcbiAgICAgICAgaWYgKHZpc2libGVTZXQuaGFzKGJpbmRpbmcpKSBzY29wZS5wcmVzZW5jZVByb29mcy5hZGQoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmNvbmRpdGlvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBjb25zZXF1ZW50UmV0dXJucy5yYWlzZXMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBhbHRlcm5hdGVSZXR1cm5zLnJhaXNlcylcbiAgICAgIG5vcm1hbCA9IGNvbnNlcXVlbnRSZXR1cm5zLm5vcm1hbCB8fCBhbHRlcm5hdGVSZXR1cm5zLm5vcm1hbFxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgYXNzaWduZWRPdXRlckJpbmRpbmdzID0gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBzY29wZSlcblxuICAgICAgZm9yIChjb25zdCBiaW5kaW5nIG9mIGFzc2lnbmVkT3V0ZXJCaW5kaW5ncykge1xuICAgICAgICBiaW5kaW5nLmtub3duVmFsdWUgPSB1bmRlZmluZWRcbiAgICAgICAgc2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG4gICAgICB9XG4gICAgICBjb25zdCBjb25kaXRpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgICBzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uLWNvbnRyb2xsZWQgbG9vcCBjb25kaXRpb25cIlxuICAgICAgKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShjb25kaXRpb25UeXBlLCBcImJvb2xlYW5cIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9CT09MRUFOX0NPTkRJVElPTlwiLCBgV2hpbGUgY29uZGl0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29uZGl0aW9uVHlwZSl9OyBleHBlY3RlZCBib29sZWFuLmAsIHN0YXRlbWVudC5jb25kaXRpb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBsb29wU2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmJvZHkuc3RhdGVtZW50cylcblxuICAgICAgYXBwbHlQcmVzZW5jZU5hcnJvd2luZyhzdGF0ZW1lbnQuY29uZGl0aW9uLCBzY29wZSwgbG9vcFNjb3BlLCB0cnVlKVxuICAgICAgY29uc3QgYm9keUZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5ib2R5LCBsb29wU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywge25lYXJlc3Q6IHN0YXRlbWVudCwgb3duZXI6IGxvb3BDb250ZXh0Lm93bmVyLCBvd25lcnM6IGxvb3BDb250ZXh0Lm93bmVyc30pXG5cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmNvbmRpdGlvbiwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgbGlzdFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoc3RhdGVtZW50Lmxpc3QsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gaXRlcmF0aW9uIGNvbGxlY3Rpb25cIilcblxuICAgICAgaWYgKGxpc3RUeXBlLmtpbmQgIT0gXCJMaXN0VHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBJdGVyYXRpb24gY29sbGVjdGlvbiB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGxpc3RUeXBlKX07IGV4cGVjdGVkIGxpc3QuYCwgc3RhdGVtZW50Lmxpc3QubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIXN0YXRlbWVudC52YWx1ZUJpbmRpbmcgfHwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5raW5kICE9IFwiVmFsdWVCaW5kaW5nXCIpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJJdGVyYXRpb24gcmVxdWlyZXMgb25lIHR5cGVkIHZhbHVlIGJpbmRpbmcuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSXRlcmF0aW9uIGJpbmRpbmcgbXVzdCBiZSBpbW11dGFibGUuXCIsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24gPz8gc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgYmluZGluZ1R5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3Jkcywgc2NvcGUudHlwZVBhcmFtZXRlcnMpXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYmluZGluZ1R5cGUsIGxpc3RUeXBlLmVsZW1lbnRUeXBlKSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgSXRlcmF0aW9uIGJpbmRpbmcgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihiaW5kaW5nVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihsaXN0VHlwZS5lbGVtZW50VHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIHtcbiAgICAgICAga25vd25WYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogYmluZGluZ1R5cGVcbiAgICAgIH0sIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLCBcIm5hbWVcIiksIGxvb3BTY29wZSwgZmFpbClcbiAgICAgIGNvbnN0IGJvZHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYm9keSwgbG9vcFNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHtuZWFyZXN0OiBzdGF0ZW1lbnQsIG93bmVyOiBsb29wQ29udGV4dC5vd25lciwgb3duZXJzOiBsb29wQ29udGV4dC5vd25lcnN9KVxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQubGlzdCwgY2FsbEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmFpc2VzLCBib2R5Rmxvdy5yYWlzZXMpXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgbWFwVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShzdGF0ZW1lbnQubWFwLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgICBcImEgbWFwIGl0ZXJhdGlvbiBjb2xsZWN0aW9uXCIpXG5cbiAgICAgIGlmIChtYXBUeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAgaXRlcmF0aW9uIGNvbGxlY3Rpb24gdHlwZSAke3R5cGVEZXNjcmlwdGlvbihtYXBUeXBlKX07IGV4cGVjdGVkIG9yZGVyZWQgbWFwLmAsIHN0YXRlbWVudC5tYXAubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBpZiAoIXN0YXRlbWVudC5rZXlCaW5kaW5nIHx8IHN0YXRlbWVudC5rZXlCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIiB8fFxuICAgICAgICAhc3RhdGVtZW50LnZhbHVlQmluZGluZyB8fCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmtpbmQgIT0gXCJWYWx1ZUJpbmRpbmdcIikge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hcCBpdGVyYXRpb24gcmVxdWlyZXMgZXhhY3Qga2V5IGFuZCB2YWx1ZSBiaW5kaW5ncy5cIiwgc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgaWYgKHN0YXRlbWVudC5rZXlCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlIHx8IHN0YXRlbWVudC52YWx1ZUJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgaXRlcmF0aW9uIGJpbmRpbmdzIG11c3QgYmUgaW1tdXRhYmxlLlwiLFxuICAgICAgICAgIHN0YXRlbWVudC5rZXlCaW5kaW5nLm11dGFibGUgIT09IGZhbHNlID8gc3RhdGVtZW50LmtleUJpbmRpbmcubG9jYXRpb24gOiBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3Qga2V5VHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHN0YXRlbWVudC5rZXlCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC5rZXlCaW5kaW5nLmxvY2F0aW9uLCBmYWlsLFxuICAgICAgICB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2Uoc3RhdGVtZW50LnZhbHVlQmluZGluZy50eXBlLCBzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLmxvY2F0aW9uLCBmYWlsLFxuICAgICAgICB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGtleVR5cGUsIG1hcFR5cGUua2V5VHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24ga2V5IGJpbmRpbmcgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihrZXlUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKG1hcFR5cGUua2V5VHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC5rZXlCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC5rZXlCaW5kaW5nLmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGlmICghc2FtZVR5cGUodmFsdWVUeXBlLCBtYXBUeXBlLnZhbHVlVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCBpdGVyYXRpb24gdmFsdWUgYmluZGluZyB0eXBlICR7dHlwZURlc2NyaXB0aW9uKHZhbHVlVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihtYXBUeXBlLnZhbHVlVHlwZSl9LmAsXG4gICAgICAgICAgdHlwZUxvY2F0aW9uKHN0YXRlbWVudC52YWx1ZUJpbmRpbmcudHlwZSwgc3RhdGVtZW50LnZhbHVlQmluZGluZy5sb2NhdGlvbikpXG4gICAgICB9XG4gICAgICBjb25zdCBhc3NpZ25lZE91dGVyQmluZGluZ3MgPSBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIHNjb3BlKVxuXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb3BTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuYm9keS5zdGF0ZW1lbnRzKVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQua2V5QmluZGluZy5uYW1lLCB7a25vd25WYWx1ZTogdW5kZWZpbmVkLCBtdXRhYmxlOiBmYWxzZSwgdHlwZToga2V5VHlwZX0sXG4gICAgICAgIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQua2V5QmluZGluZywgXCJuYW1lXCIpLCBsb29wU2NvcGUsIGZhaWwpXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQudmFsdWVCaW5kaW5nLm5hbWUsIHtrbm93blZhbHVlOiB1bmRlZmluZWQsIG11dGFibGU6IGZhbHNlLCB0eXBlOiB2YWx1ZVR5cGV9LFxuICAgICAgICByb2xlTG9jYXRpb24oc3RhdGVtZW50LnZhbHVlQmluZGluZywgXCJuYW1lXCIpLCBsb29wU2NvcGUsIGZhaWwpXG4gICAgICBjb25zdCBib2R5RmxvdyA9IHZhbGlkYXRlQmxvY2soc3RhdGVtZW50LmJvZHksIGxvb3BTY29wZSwgcmV0dXJuVHlwZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBlcnJvcnMsIGNhbGxFZmZlY3RzLFxuICAgICAgICBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCB7bmVhcmVzdDogc3RhdGVtZW50LCBvd25lcjogbG9vcENvbnRleHQub3duZXIsIG93bmVyczogbG9vcENvbnRleHQub3duZXJzfSlcblxuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmFpc2VzLCBzdGF0ZW1lbnQubWFwLCBjYWxsRWZmZWN0cylcbiAgICAgIGFkZEFsbChyYWlzZXMsIGJvZHlGbG93LnJhaXNlcylcbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBhc3NpZ25lZE91dGVyQmluZGluZ3MpIHtcbiAgICAgICAgYmluZGluZy5rbm93blZhbHVlID0gdW5kZWZpbmVkXG4gICAgICAgIHNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgICAgaWYgKCFzdGF0ZW1lbnQuZXJyb3IgfHwgc3RhdGVtZW50LmVycm9yLmtpbmQgIT0gXCJFcnJvckNvbnN0cnVjdGlvblwiKSB7XG4gICAgICAgIGZhaWwoXCJOT05fRVJST1JfUkFJU0VcIiwgXCJSYWlzZSByZXF1aXJlcyBvbmUgY29uc3RydWN0ZWQgc2VtYW50aWMgZXJyb3IuXCIsIHN0YXRlbWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhaXNlZFR5cGUgPSB2YWxpZGF0ZUVycm9yVHlwZShzdGF0ZW1lbnQuZXJyb3IuZXJyb3IsIHN0YXRlbWVudC5lcnJvci5sb2NhdGlvbiwgZXJyb3JzLCBmYWlsKVxuICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIHN0YXRlbWVudC5lcnJvci5tZXNzYWdlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImFuIGVycm9yIG1lc3NhZ2VcIiwgc2NhbGFyVHlwZShcInN0cmluZ1wiKVxuICAgICAgKVxuXG4gICAgICBpZiAoIWlzU2NhbGFyVHlwZShtZXNzYWdlVHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgICAgZmFpbChcIk5PTl9FUlJPUl9SQUlTRVwiLCBgRXJyb3IgbWVzc2FnZSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKG1lc3NhZ2VUeXBlKX07IGV4cGVjdGVkIHN0cmluZy5gLCBzdGF0ZW1lbnQuZXJyb3IubWVzc2FnZS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJhaXNlcywgc3RhdGVtZW50LmVycm9yLm1lc3NhZ2UsIGNhbGxFZmZlY3RzKVxuICAgICAgcmFpc2VzLmFkZChyYWlzZWRUeXBlLmRlY2xhcmF0aW9uSWQpXG4gICAgICBub3JtYWwgPSBmYWxzZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiVHJ5U3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNhdWdodFR5cGUgPSB2YWxpZGF0ZUVycm9yVHlwZShzdGF0ZW1lbnQuY2F0Y2hUeXBlLCBzdGF0ZW1lbnQubG9jYXRpb24sIGVycm9ycywgZmFpbClcblxuICAgICAgaWYgKCFzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nIHx8IHN0YXRlbWVudC5jYXRjaEJpbmRpbmcua2luZCAhPSBcIkNhdGNoQmluZGluZ1wiIHx8IHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubXV0YWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfRVJST1JfSEFORExFUlwiLCBcIkNhdGNoIHJlcXVpcmVzIG9uZSBpbW11dGFibGUgdHlwZWQgYmluZGluZy5cIiwgc3RhdGVtZW50LmNhdGNoQmluZGluZz8ubG9jYXRpb24gPz8gc3RhdGVtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgYmluZGluZ1R5cGUgPSB2YWxpZGF0ZUVycm9yVHlwZShzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLnR5cGUsIHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubG9jYXRpb24sIGVycm9ycywgZmFpbClcblxuICAgICAgaWYgKGJpbmRpbmdUeXBlLmRlY2xhcmF0aW9uSWQgIT0gY2F1Z2h0VHlwZS5kZWNsYXJhdGlvbklkKSB7XG4gICAgICAgIGZhaWwoXCJJTlZBTElEX0VSUk9SX0hBTkRMRVJcIiwgXCJDYXRjaCBiaW5kaW5nIHR5cGUgbXVzdCBleGFjdGx5IG1hdGNoIGl0cyBoYW5kbGVyIHR5cGUuXCIsIHN0YXRlbWVudC5jYXRjaEJpbmRpbmcubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBib2R5QXNzaWduZWRPdXRlckJpbmRpbmdzID0gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBzY29wZSlcbiAgICAgIGNvbnN0IGFzc2lnbmVkT3V0ZXJCaW5kaW5ncyA9IG5ldyBTZXQoYm9keUFzc2lnbmVkT3V0ZXJCaW5kaW5ncylcblxuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5jYXRjaEJvZHksIHNjb3BlLCBhc3NpZ25lZE91dGVyQmluZGluZ3MpXG4gICAgICBjb25zdCBib2R5U2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgc3RhdGVtZW50LmJvZHkuc3RhdGVtZW50cylcbiAgICAgIGNvbnN0IGJvZHlGbG93ID0gdmFsaWRhdGVCbG9jayhzdGF0ZW1lbnQuYm9keSwgYm9keVNjb3BlLCByZXR1cm5UeXBlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGVycm9ycywgY2FsbEVmZmVjdHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGxvb3BDb250ZXh0KVxuICAgICAgY29uc3QgY2F0Y2hTY29wZSA9IGNyZWF0ZVNjb3BlKHNjb3BlLCBzdGF0ZW1lbnQuY2F0Y2hCb2R5LnN0YXRlbWVudHMpXG5cbiAgICAgIGZvciAoY29uc3QgYmluZGluZyBvZiBib2R5QXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBjYXRjaFNjb3BlLnByZXNlbmNlUHJvb2ZzLmRlbGV0ZShiaW5kaW5nKVxuICAgICAgfVxuXG4gICAgICBkZWNsYXJlQmluZGluZyhzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLm5hbWUsIHtcbiAgICAgICAga25vd25WYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBtdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogYmluZGluZ1R5cGVcbiAgICAgIH0sIHJvbGVMb2NhdGlvbihzdGF0ZW1lbnQuY2F0Y2hCaW5kaW5nLCBcIm5hbWVcIiksIGNhdGNoU2NvcGUsIGZhaWwpXG4gICAgICBjb25zdCBjYXRjaEZsb3cgPSB2YWxpZGF0ZUJsb2NrKHN0YXRlbWVudC5jYXRjaEJvZHksIGNhdGNoU2NvcGUsIHJldHVyblR5cGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZXJyb3JzLCBjYWxsRWZmZWN0cywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgbG9vcENvbnRleHQpXG5cbiAgICAgIGlmICghYm9keUZsb3cucmFpc2VzLmhhcyhjYXVnaHRUeXBlLmRlY2xhcmF0aW9uSWQpKSB7XG4gICAgICAgIGZhaWwoXCJVTlJFQUNIQUJMRV9IQU5ETEVSXCIsIGBIYW5kbGVyIGZvciAnJHtlcnJvcnMuZ2V0KGNhdWdodFR5cGUuZGVjbGFyYXRpb25JZCk/Lm5hbWV9JyBjYW5ub3QgYmUgcmVhY2hlZC5gLCB0eXBlTG9jYXRpb24oc3RhdGVtZW50LmNhdGNoVHlwZSwgc3RhdGVtZW50LmxvY2F0aW9uKSlcbiAgICAgIH1cbiAgICAgIGJvZHlGbG93LnJhaXNlcy5kZWxldGUoY2F1Z2h0VHlwZS5kZWNsYXJhdGlvbklkKVxuICAgICAgYWRkQWxsKHJhaXNlcywgYm9keUZsb3cucmFpc2VzKVxuICAgICAgYWRkQWxsKHJhaXNlcywgY2F0Y2hGbG93LnJhaXNlcylcbiAgICAgIG5vcm1hbCA9IGJvZHlGbG93Lm5vcm1hbCB8fCBjYXRjaEZsb3cubm9ybWFsXG4gICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYXNzaWduZWRPdXRlckJpbmRpbmdzKSB7XG4gICAgICAgIGJpbmRpbmcua25vd25WYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgICBzY29wZS5wcmVzZW5jZVByb29mcy5kZWxldGUoYmluZGluZylcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdW5leHBlY3RlZCA9IC8qKiBAdHlwZSB7e2tpbmQ6IHN0cmluZywgbG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259fSAqLyAoc3RhdGVtZW50KVxuXG4gICAgZmFpbChcIlVOU1VQUE9SVEVEX1NUQVRFTUVOVFwiLCB1bmV4cGVjdGVkLmtpbmQsIHVuZXhwZWN0ZWQubG9jYXRpb24pXG4gIH1cblxuICByZXR1cm4ge25vcm1hbCwgcmFpc2VzfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIGxvY2F0aW9uLlxuICogQHBhcmFtIHtFcnJvclJlZ2lzdHJ5fSBlcnJvcnMgLSBWaXNpYmxlIGVycm9yIGRlY2xhcmF0aW9ucy5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZX0gVmFsaWRhdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXJyb3JUeXBlKHR5cGUsIGxvY2F0aW9uLCBlcnJvcnMsIGZhaWwpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBmYWlsKFwiVU5LTk9XTl9FUlJPUlwiLCBcIkhhbmRsZXIgb3IgcmFpc2UgaXMgbWlzc2luZyBhbiBleGFjdCBlcnJvciB0eXBlLlwiLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXJyb3JUeXBlfSAqLyAodHlwZSlcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgIT0gXCJFcnJvclR5cGVcIiB8fFxuICAgIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhZXJyb3JzLmhhcyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICBmYWlsKFwiVU5LTk9XTl9FUlJPUlwiLCBgVW5rbm93biBlcnJvciBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICB9XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZVxufVxuXG4vKipcbiAqIEFkZHMgZXZlcnkgc291cmNlIHZhbHVlIHRvIG9uZSBzZXQuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSB0YXJnZXQgLSBEZXN0aW5hdGlvbiBpZGVudGl0aWVzLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gc291cmNlIC0gU291cmNlIGlkZW50aXRpZXMuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYWRkQWxsKHRhcmdldCwgc291cmNlKSB7XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygc291cmNlKSB0YXJnZXQuYWRkKHZhbHVlKVxufVxuXG4vKipcbiAqIEFkZHMgdW5jaGVja2VkIGVycm9ycyByYWlzZWQgd2hpbGUgZXZhbHVhdGluZyBvbmUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IHRhcmdldCAtIERlc3RpbmF0aW9uIGlkZW50aXRpZXMuXG4gKiBAcGFyYW0ge3Vua25vd259IGV4cHJlc3Npb24gLSBDYW5kaWRhdGUgc2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjYWxsRWZmZWN0cyAtIEluZmVycmVkIGNhbGwgZWZmZWN0cy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbbWV0aG9kRWZmZWN0c10gLSBJbmZlcnJlZCBlZmZlY3RzIGJ5IHJlc29sdmVkIG1ldGhvZCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhZGRFeHByZXNzaW9uRWZmZWN0cyh0YXJnZXQsIGV4cHJlc3Npb24sIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBbZXhwcmVzc2lvbl1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiQ2FsbEV4cHJlc3Npb25cIikgYWRkQWxsKHRhcmdldCwgY2FsbEVmZmVjdHMuZ2V0KFJlZmxlY3QuZ2V0KHZhbHVlLCBcImNhbGxlZVwiKSkgPz8gbmV3IFNldCgpKVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIiB8fCBSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGZhaWx1cmVzID0gUmVmbGVjdC5nZXQodmFsdWUsIFwiZmFpbHVyZUlkc1wiKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmFpbHVyZXMpKSBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIGlmICh0eXBlb2YgZmFpbHVyZSA9PSBcInN0cmluZ1wiKSB0YXJnZXQuYWRkKGZhaWx1cmUpXG4gICAgICBpZiAoUmVmbGVjdC5nZXQodmFsdWUsIFwia2luZFwiKSA9PSBcIk1ldGhvZENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICAgICAgYWRkQWxsKHRhcmdldCwgbWV0aG9kRWZmZWN0cy5nZXQoUmVmbGVjdC5nZXQodmFsdWUsIFwibWV0aG9kXCIpKSA/PyBuZXcgU2V0KCkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChSZWZsZWN0LmdldCh2YWx1ZSwgXCJraW5kXCIpID09IFwiRWZmZWN0Q2FsbEV4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgcmVzb2x1dGlvbiA9IFJlZmxlY3QuZ2V0KHZhbHVlLCBcInJlc29sdXRpb25cIilcbiAgICAgIGNvbnN0IGZhaWx1cmVzID0gcmVzb2x1dGlvbiAmJiB0eXBlb2YgcmVzb2x1dGlvbiA9PSBcIm9iamVjdFwiID8gUmVmbGVjdC5nZXQocmVzb2x1dGlvbiwgXCJmYWlsdXJlSWRzXCIpIDogdW5kZWZpbmVkXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGZhaWx1cmVzKSkgZm9yIChjb25zdCBmYWlsdXJlIG9mIGZhaWx1cmVzKSBpZiAodHlwZW9mIGZhaWx1cmUgPT0gXCJzdHJpbmdcIikgdGFyZ2V0LmFkZChmYWlsdXJlKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChbXCJsb2NhdGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIiwgXCJyZXNvbHV0aW9uXCJdLmluY2x1ZGVzKGtleSkpIGNvbnRpbnVlXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHBlbmRpbmcucHVzaCguLi5jaGlsZClcbiAgICAgIGVsc2UgaWYgKGNoaWxkICYmIHR5cGVvZiBjaGlsZCA9PSBcIm9iamVjdFwiKSBwZW5kaW5nLnB1c2goY2hpbGQpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVyaXZlcyB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24gb3ZlciB0aGUgcmVzb2x2ZWQgZmluaXRlIGZ1bmN0aW9uIGdyYXBoLlxuICogVGhpcyBpcyB2YWxpZGF0b3Igc3RhdGUsIG5ldmVyIGEgY2hlY2tlZCBlZmZlY3QgaW4gdGhlIHB1YmxpYyBmdW5jdGlvbiBzaWduYXR1cmUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25EZWNsYXJhdGlvbj59IGZ1bmN0aW9ucyAtIFJlc29sdmVkIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbc2VlZEVmZmVjdHNdIC0gRGVwZW5kZW5jeSBlZmZlY3RzIGtleWVkIGJ5IGxvY2FsIGltcG9ydCBuYW1lLlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW2xvY2FsRnVuY3Rpb25OYW1lc10gLSBGdW5jdGlvbnMgd2hvc2UgYm9kaWVzIGJlbG9uZyB0byB0aGUgY3VycmVudCBtb2R1bGUuXG4gKiBAcmV0dXJucyB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBFc2NhcGluZyBlcnJvciBpZGVudGl0aWVzIGJ5IHNvdXJjZS12aXNpYmxlIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGluZmVyQ2FsbEVmZmVjdHMoZnVuY3Rpb25zLCBzZWVkRWZmZWN0cyA9IG5ldyBNYXAoKSwgbG9jYWxGdW5jdGlvbk5hbWVzID0gbmV3IFNldChmdW5jdGlvbnMua2V5cygpKSkge1xuICBjb25zdCBlZmZlY3RzID0gbmV3IE1hcChbLi4uZnVuY3Rpb25zLmtleXMoKV0ubWFwKChuYW1lKSA9PiBbbmFtZSwgbmV3IFNldChzZWVkRWZmZWN0cy5nZXQobmFtZSkgPz8gW10pXSkpXG4gIGxldCBjaGFuZ2VkID0gdHJ1ZVxuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGxvY2FsRnVuY3Rpb25OYW1lcykge1xuICAgICAgY29uc3QgZGVjbGFyYXRpb24gPSBmdW5jdGlvbnMuZ2V0KG5hbWUpXG5cbiAgICAgIGlmICghZGVjbGFyYXRpb24pIGNvbnRpbnVlXG4gICAgICBjb25zdCBuZXh0ID0gc3ludGFjdGljQmxvY2tFZmZlY3RzKGRlY2xhcmF0aW9uLmJvZHksIGVmZmVjdHMpXG4gICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKGVmZmVjdHMuZ2V0KG5hbWUpKVxuXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIG5leHQpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50LmhhcyhlcnJvcikpIHtcbiAgICAgICAgICBjdXJyZW50LmFkZChlcnJvcilcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVmZmVjdHNcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBlc2NhcGluZyBpZGVudGl0aWVzIGZyb20gb25lIGJsb2NrIGZvciB0aGUgY2FsbC1lZmZlY3QgZml4ZWQgcG9pbnQuXG4gKiBAcGFyYW0ge3Vua25vd259IGJsb2NrIC0gQ2FuZGlkYXRlIGJsb2NrLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNhbGxFZmZlY3RzIC0gQ3VycmVudCBmaXhlZC1wb2ludCBzdGF0ZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbbWV0aG9kRWZmZWN0c10gLSBDdXJyZW50IG1ldGhvZCBmaXhlZC1wb2ludCBzdGF0ZS5cbiAqIEByZXR1cm5zIHtTZXQ8c3RyaW5nPn0gRXNjYXBpbmcgaWRlbnRpdGllcy5cbiAqL1xuZnVuY3Rpb24gc3ludGFjdGljQmxvY2tFZmZlY3RzKGJsb2NrLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cyA9IG5ldyBNYXAoKSkge1xuICBjb25zdCByZXN1bHQgPSBuZXcgU2V0KClcbiAgY29uc3Qgc3RhdGVtZW50cyA9IFJlZmxlY3QuZ2V0KC8qKiBAdHlwZSB7b2JqZWN0fSAqLyAoYmxvY2sgPz8ge30pLCBcInN0YXRlbWVudHNcIilcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RhdGVtZW50cykpIHJldHVybiByZXN1bHRcbiAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgIGlmICghc3RhdGVtZW50IHx8IHR5cGVvZiBzdGF0ZW1lbnQgIT0gXCJvYmplY3RcIikgY29udGludWVcbiAgICBjb25zdCBraW5kID0gUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImtpbmRcIilcblxuICAgIGlmIChraW5kID09IFwiUmFpc2VTdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgY29uc3RydWN0aW9uID0gUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImVycm9yXCIpXG4gICAgICBjb25zdCB0eXBlID0gY29uc3RydWN0aW9uICYmIHR5cGVvZiBjb25zdHJ1Y3Rpb24gPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KGNvbnN0cnVjdGlvbiwgXCJlcnJvclwiKSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgZGVjbGFyYXRpb25JZCA9IHR5cGUgJiYgdHlwZW9mIHR5cGUgPT0gXCJvYmplY3RcIiA/IFJlZmxlY3QuZ2V0KHR5cGUsIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIGRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIikgcmVzdWx0LmFkZChkZWNsYXJhdGlvbklkKVxuICAgICAgaWYgKGNvbnN0cnVjdGlvbiAmJiB0eXBlb2YgY29uc3RydWN0aW9uID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChjb25zdHJ1Y3Rpb24sIFwibWVzc2FnZVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpXG4gICAgICB9XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoa2luZCA9PSBcIlRyeVN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBib2R5RWZmZWN0cyA9IHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYm9keVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpXG4gICAgICBjb25zdCBjYXRjaFR5cGUgPSBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY2F0Y2hUeXBlXCIpXG4gICAgICBjb25zdCBjYXVnaHRJZCA9IGNhdGNoVHlwZSAmJiB0eXBlb2YgY2F0Y2hUeXBlID09IFwib2JqZWN0XCIgPyBSZWZsZWN0LmdldChjYXRjaFR5cGUsIFwiZGVjbGFyYXRpb25JZFwiKSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAodHlwZW9mIGNhdWdodElkID09IFwic3RyaW5nXCIgJiYgYm9keUVmZmVjdHMuZGVsZXRlKGNhdWdodElkKSkge1xuICAgICAgICBhZGRBbGwoYm9keUVmZmVjdHMsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY2F0Y2hCb2R5XCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cykpXG4gICAgICB9XG4gICAgICBhZGRBbGwocmVzdWx0LCBib2R5RWZmZWN0cylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiSWZTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uZGl0aW9uXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uc2VxdWVudFwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgYWRkQWxsKHJlc3VsdCwgc3ludGFjdGljQmxvY2tFZmZlY3RzKFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwgXCJhbHRlcm5hdGVcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiIHx8IGtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIpIHtcbiAgICAgIGFkZEV4cHJlc3Npb25FZmZlY3RzKHJlc3VsdCwgUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBraW5kID09IFwiRm9yRWFjaFN0YXRlbWVudFwiID8gXCJsaXN0XCIgOiBcIm1hcFwiKSwgY2FsbEVmZmVjdHMsXG4gICAgICAgIG1ldGhvZEVmZmVjdHMpXG4gICAgICBhZGRBbGwocmVzdWx0LCBzeW50YWN0aWNCbG9ja0VmZmVjdHMoUmVmbGVjdC5nZXQoc3RhdGVtZW50LCBcImJvZHlcIiksIGNhbGxFZmZlY3RzLCBtZXRob2RFZmZlY3RzKSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChraW5kID09IFwiV2hpbGVTdGF0ZW1lbnRcIikge1xuICAgICAgYWRkRXhwcmVzc2lvbkVmZmVjdHMocmVzdWx0LCBSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiY29uZGl0aW9uXCIpLCBjYWxsRWZmZWN0cywgbWV0aG9kRWZmZWN0cylcbiAgICAgIGFkZEFsbChyZXN1bHQsIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhSZWZsZWN0LmdldChzdGF0ZW1lbnQsIFwiYm9keVwiKSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1wiZXhwcmVzc2lvblwiLCBcImluaXRpYWxpemVyXCJdKSB7XG4gICAgICBhZGRFeHByZXNzaW9uRWZmZWN0cyhyZXN1bHQsIFJlZmxlY3QuZ2V0KHN0YXRlbWVudCwga2V5KSwgY2FsbEVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIERlcml2ZXMgdGhlIGVzY2FwaW5nIHVzZXItZGVmaW5lZCBlcnJvciBzZXRzIGZvciBsb2NhbCBmdW5jdGlvbnMgYW5kIHJlc29sdmVkIGNsYXNzIG1ldGhvZHMuXG4gKiBUaGUgZml4ZWQgcG9pbnQgaXMgY29tcHV0ZWQgb3ZlciBldmVyeSB1bmNoZWNrZWQgZXJyb3I7IGNhcGFiaWxpdHkgZmFpbHVyZXMgYXJlIHByb2plY3RlZCBvdXRcbiAqIGJlY2F1c2UgY2FsbCBzaXRlcyBhbHJlYWR5IGNhcnJ5IHRoZWlyIGNhcGFiaWxpdHktZmFpbHVyZSBib3VuZGFyeSB0aHJvdWdoIHJlc29sdXRpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNNb2R1bGV9IG1vZHVsZSAtIFJlc29sdmVkIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBbc2VlZEVmZmVjdHNdIC0gRGVwZW5kZW5jeSBlZmZlY3RzIGtleWVkIGJ5IGxvY2FsIGltcG9ydCBuYW1lLlxuICogQHJldHVybnMge3tmdW5jdGlvbnM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiwgbWV0aG9kczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+fX0gRXNjYXBpbmcgdXNlci1kZWZpbmVkIGVycm9yIGlkZW50aXRpZXMgYnkgZnVuY3Rpb24gbmFtZSBhbmQgbWV0aG9kIGlkZW50aXR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJFc2NhcGluZ0Vycm9yRWZmZWN0cyhtb2R1bGUsIHNlZWRFZmZlY3RzID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBNYXAobW9kdWxlLmZ1bmN0aW9ucy5tYXAoKGRlY2xhcmF0aW9uKSA9PiBbZGVjbGFyYXRpb24ubmFtZSwgZGVjbGFyYXRpb25dKSlcbiAgY29uc3QgZnVuY3Rpb25FZmZlY3RzID0gbmV3IE1hcChbLi4uZnVuY3Rpb25zLmtleXMoKV0ubWFwKChuYW1lKSA9PiBbbmFtZSwgbmV3IFNldChzZWVkRWZmZWN0cy5nZXQobmFtZSkgPz8gW10pXSkpXG4gIGNvbnN0IGNsYXNzZXMgPSBtb2R1bGUuY2xhc3NlcyA/PyBbXVxuICBjb25zdCBtZXRob2RFZmZlY3RzID0gbmV3IE1hcCgpXG4gIGNvbnN0IGNhcGFiaWxpdHlGYWlsdXJlSWRzID0gbmV3IFNldCgobW9kdWxlLmNhcGFiaWxpdGllcyA/PyBbXSkuZmxhdE1hcCgoe2ZhaWx1cmVzfSkgPT4gZmFpbHVyZXMpLm1hcCgoe2lkfSkgPT4gaWQpKVxuXG4gIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgY2xhc3NlcykgZm9yIChjb25zdCBtZXRob2Qgb2YgZGVjbGFyYXRpb24ubWV0aG9kcykgbWV0aG9kRWZmZWN0cy5zZXQobWV0aG9kLmlkLCBuZXcgU2V0KCkpXG4gIGxldCBjaGFuZ2VkID0gdHJ1ZVxuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiBtb2R1bGUuZnVuY3Rpb25zKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKGZ1bmN0aW9uRWZmZWN0cy5nZXQoZGVjbGFyYXRpb24ubmFtZSkpXG4gICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhkZWNsYXJhdGlvbi5ib2R5LCBmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHMpKSB7XG4gICAgICAgIGlmICghY3VycmVudC5oYXMoZXJyb3IpKSB7IGN1cnJlbnQuYWRkKGVycm9yKTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIGNsYXNzZXMpIHtcbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIGRlY2xhcmF0aW9uLm1ldGhvZHMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovIChtZXRob2RFZmZlY3RzLmdldChtZXRob2QuaWQpKVxuICAgICAgICBmb3IgKGNvbnN0IGVycm9yIG9mIHN5bnRhY3RpY0Jsb2NrRWZmZWN0cyhtZXRob2QuYm9keSwgZnVuY3Rpb25FZmZlY3RzLCBtZXRob2RFZmZlY3RzKSkge1xuICAgICAgICAgIGlmICghY3VycmVudC5oYXMoZXJyb3IpKSB7IGN1cnJlbnQuYWRkKGVycm9yKTsgY2hhbmdlZCA9IHRydWUgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlZmZlY3RzIG9mIFtmdW5jdGlvbkVmZmVjdHMsIG1ldGhvZEVmZmVjdHNdKSB7XG4gICAgZm9yIChjb25zdCBlcnJvcnMgb2YgZWZmZWN0cy52YWx1ZXMoKSkge1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBbLi4uZXJyb3JzXSkgaWYgKGNhcGFiaWxpdHlGYWlsdXJlSWRzLmhhcyhlcnJvcikpIGVycm9ycy5kZWxldGUoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtmdW5jdGlvbnM6IGZ1bmN0aW9uRWZmZWN0cywgbWV0aG9kczogbWV0aG9kRWZmZWN0c31cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGV4aWNhbCBzY29wZSB3aXRoIGRlY2xhcmF0aW9ucyBtYXJrZWQgcGVuZGluZyB1bnRpbCB2aXNpdGVkLlxuICogQHBhcmFtIHtTY29wZSB8IHVuZGVmaW5lZH0gcGFyZW50IC0gRW5jbG9zaW5nIHNjb3BlLlxuICogQHBhcmFtIHt7a2luZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nfVtdfSBzdGF0ZW1lbnRzIC0gU2NvcGUgc3RhdGVtZW50cy5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFtyZXNlcnZlZE5hbWVzXSAtIE5hbWVzIHVuYXZhaWxhYmxlIHRvIHJvb3QgYmluZGluZ3MuXG4gKiBAcGFyYW0ge1NldDxzdHJpbmc+fSBbdHlwZVBhcmFtZXRlcnNdIC0gRGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVycy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5DbGFzc0RlY2xhcmF0aW9ufSBbY3VycmVudENsYXNzXSAtIERlY2xhcmluZyBjbGFzcyBmb3IgcmVjZWl2ZXItcHJpdmF0ZSBhY2Nlc3MuXG4gKiBAcmV0dXJucyB7U2NvcGV9IFNjb3BlLlxuICovXG5mdW5jdGlvbiBjcmVhdGVTY29wZShwYXJlbnQsIHN0YXRlbWVudHMsIHJlc2VydmVkTmFtZXMgPSBuZXcgU2V0KCksIHR5cGVQYXJhbWV0ZXJzID0gcGFyZW50Py50eXBlUGFyYW1ldGVycyA/PyBuZXcgU2V0KCksXG4gIGN1cnJlbnRDbGFzcyA9IHBhcmVudD8uY3VycmVudENsYXNzKSB7XG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgU2V0KHN0YXRlbWVudHMuZmlsdGVyKChzdGF0ZW1lbnQpID0+IHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiKVxuICAgIC5tYXAoKHN0YXRlbWVudCkgPT4gLyoqIEB0eXBlIHt7bmFtZTogc3RyaW5nfX0gKi8gKHN0YXRlbWVudCkubmFtZSkpXG5cbiAgcmV0dXJuIHtcbiAgICBiaW5kaW5nczogbmV3IE1hcCgpLFxuICAgIGN1cnJlbnRDbGFzcyxcbiAgICBwYXJlbnQsXG4gICAgcGVuZGluZyxcbiAgICBwcmVzZW5jZVByb29mczogbmV3IFNldChwYXJlbnQ/LnByZXNlbmNlUHJvb2ZzID8/IFtdKSxcbiAgICB0eXBlUGFyYW1ldGVycyxcbiAgICB1c2VkTmFtZXM6IHBhcmVudD8udXNlZE5hbWVzID8/IG5ldyBTZXQocmVzZXJ2ZWROYW1lcylcbiAgfVxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBzaW1wbGUtaWRlbnRpZmllciBwcmVzZW5jZSBwcm9vZiB0byBleGFjdGx5IHRoZSBicmFuY2ggd2hlcmUgdGhlIHRlc3QgaXMgdHJ1ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb25kaXRpb24gLSBWYWxpZGF0ZWQgYnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNvdXJjZVNjb3BlIC0gU2NvcGUgY29udGFpbmluZyB0aGUgdGVzdGVkIGJpbmRpbmcuXG4gKiBAcGFyYW0ge1Njb3BlfSBicmFuY2hTY29wZSAtIEJyYW5jaC1sb2NhbCBwcm9vZiBzY29wZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYnJhbmNoV2hlblRydWUgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIGNvbmRpdGlvbidzIHRydWUgYnJhbmNoLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFwcGx5UHJlc2VuY2VOYXJyb3dpbmcoY29uZGl0aW9uLCBzb3VyY2VTY29wZSwgYnJhbmNoU2NvcGUsIGJyYW5jaFdoZW5UcnVlKSB7XG4gIGxldCB0ZXN0ID0gY29uZGl0aW9uXG4gIGxldCBwcmVzZW50V2hlblRydWUgPSB0cnVlXG5cbiAgaWYgKGNvbmRpdGlvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIgJiYgY29uZGl0aW9uLm9wZXJhdGlvbiA9PSBcIkJvb2xlYW5Ob3RcIiAmJlxuICAgIGNvbmRpdGlvbi5vcGVyYW5kLmtpbmQgPT0gXCJPcHRpb25hbElzUHJlc2VudFwiKSB7XG4gICAgdGVzdCA9IGNvbmRpdGlvbi5vcGVyYW5kXG4gICAgcHJlc2VudFdoZW5UcnVlID0gZmFsc2VcbiAgfVxuICBpZiAodGVzdC5raW5kICE9IFwiT3B0aW9uYWxJc1ByZXNlbnRcIikgcmV0dXJuXG4gIGNvbnN0IGJpbmRpbmcgPSBmaW5kQmluZGluZyh0ZXN0Lm9wZXJhbmQubmFtZSwgc291cmNlU2NvcGUpXG5cbiAgaWYgKCFiaW5kaW5nKSByZXR1cm5cbiAgaWYgKGJyYW5jaFdoZW5UcnVlID09IHByZXNlbnRXaGVuVHJ1ZSkgYnJhbmNoU2NvcGUucHJlc2VuY2VQcm9vZnMuYWRkKGJpbmRpbmcpXG4gIGVsc2UgYnJhbmNoU2NvcGUucHJlc2VuY2VQcm9vZnMuZGVsZXRlKGJpbmRpbmcpXG59XG5cbi8qKlxuICogQWRkcyBvbmUgYmluZGluZyB3aGlsZSByZWplY3RpbmcgZHVwbGljYXRlcyBhbmQgc2hhZG93aW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBCaW5kaW5nIG5hbWUuXG4gKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgLSBCaW5kaW5nIG1ldGFkYXRhLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBDdXJyZW50IHNjb3BlLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVCaW5kaW5nKG5hbWUsIGJpbmRpbmcsIGxvY2F0aW9uLCBzY29wZSwgZmFpbCkge1xuICBpZiAoc2NvcGUudXNlZE5hbWVzLmhhcyhuYW1lKSkgZmFpbChcIkRVUExJQ0FURV9CSU5ESU5HXCIsIGBEdXBsaWNhdGUgb3Igc2hhZG93ZWQgYmluZGluZyAnJHtuYW1lfScuYCwgbG9jYXRpb24pXG5cbiAgc2NvcGUuYmluZGluZ3Muc2V0KG5hbWUsIGJpbmRpbmcpXG4gIHNjb3BlLnVzZWROYW1lcy5hZGQobmFtZSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBvbmUgaWRlbnRpZmllciBhbmQgZGlzdGluZ3Vpc2hlcyB1c2UtYmVmb3JlLWRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBCaW5kaW5nIG5hbWUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gUmVmZXJlbmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBDdXJyZW50IHNjb3BlLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge0JpbmRpbmd9IEJpbmRpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVCaW5kaW5nKG5hbWUsIGxvY2F0aW9uLCBzY29wZSwgZmFpbCkge1xuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGN1cnJlbnQuYmluZGluZ3MuZ2V0KG5hbWUpXG5cbiAgICBpZiAoYmluZGluZykgcmV0dXJuIGJpbmRpbmdcbiAgICBpZiAoY3VycmVudC5wZW5kaW5nLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVU0VfQkVGT1JFX0RFQ0xBUkFUSU9OXCIsIGBCaW5kaW5nICcke25hbWV9JyBpcyB1c2VkIGJlZm9yZSBpdHMgZGVjbGFyYXRpb24uYCwgbG9jYXRpb24pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJVTlJFU09MVkVEX0JJTkRJTkdcIiwgYFVua25vd24gYmluZGluZyAnJHtuYW1lfScuYCwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBzZW1hbnRpYyB2YWx1ZSB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2l2ZSB0eXBlIHBhdGguXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSBbcmVjb3Jkc10gLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZXQ8c3RyaW5nPn0gW3R5cGVQYXJhbWV0ZXJzXSAtIFR5cGUtdmFyaWFibGUgaWRlbnRpdGllcyBpbiBkZWNsYXJhdGlvbiBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBWYWxpZGF0ZWQgdmFsdWUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIHNlZW4sIHJlY29yZHMgPSBuZXcgTWFwKCksIHR5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCgpKSB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgaWYgKGlzVm9pZFR5cGUoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJWT0lEX0FTX1ZBTFVFXCIsIFwiVm9pZCBpcyB2YWxpZCBvbmx5IGFzIGEgZnVuY3Rpb24gcmV0dXJuIHR5cGUuXCIsIHR5cGVMb2NhdGlvbih0eXBlLCBsb2NhdGlvbikpXG5cbiAgcmV0dXJuIGNhbmRpZGF0ZVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBvbmUgZnVuY3Rpb24gcmV0dXJuIHR5cGUgcmVmZXJlbmNlLlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIHNlbWFudGljIHJldHVybiB0eXBlIHJlZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPd25pbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gW3JlY29yZHNdIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBUeXBlLXZhcmlhYmxlIGlkZW50aXRpZXMgaW4gZGVjbGFyYXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gVmFsaWRhdGVkIHJldHVybiB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIHJlY29yZHMgPSBuZXcgTWFwKCksIHR5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCgpKSB7XG4gIHJldHVybiB2YWxpZGF0ZVR5cGVSZWZlcmVuY2UodHlwZSwgbG9jYXRpb24sIGZhaWwsIG5ldyBTZXQoKSwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSByZWN1cnNpdmUgc2VtYW50aWMgdHlwZS1yZWZlcmVuY2Ugc2hhcGUuXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgc2VtYW50aWMgdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gT3duaW5nIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7U2V0PG9iamVjdD59IFtzZWVuXSAtIEFjdGl2ZSByZWN1cnNpdmUgdHlwZSBwYXRoLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gW3JlY29yZHNdIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2V0PHN0cmluZz59IFt0eXBlUGFyYW1ldGVyc10gLSBUeXBlLXZhcmlhYmxlIGlkZW50aXRpZXMgaW4gZGVjbGFyYXRpb24gc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gVmFsaWRhdGVkIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlVHlwZVJlZmVyZW5jZSh0eXBlLCBsb2NhdGlvbiwgZmFpbCwgc2VlbiA9IG5ldyBTZXQoKSwgcmVjb3JkcyA9IG5ldyBNYXAoKSwgdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KCkpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNlbWFudGljIHR5cGUuXCIsIGxvY2F0aW9uKVxuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAodHlwZSlcblxuICBpZiAoW1wiTGlzdFR5cGVcIiwgXCJNYXBUeXBlXCIsIFwiT3B0aW9uYWxUeXBlXCIsIFwiT3JkZXJlZE1hcFR5cGVcIiwgXCJSZWNvcmRUeXBlXCJdLmluY2x1ZGVzKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgIGNvbnRhaW5zT3duZWRUeXBlKGNhbmRpZGF0ZSkpIHtcbiAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgYW5kIHJlZmVyZW5jZXMgY2Fubm90IGJlIG5lc3RlZCBpbiB2YWx1ZSBvciBnZW5lcmljIHR5cGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gIH1cblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJUeXBlUmVmZXJlbmNlXCIpIHtcbiAgICBpZiAoIWlzU2NhbGFyVHlwZU5hbWUoY2FuZGlkYXRlLm5hbWUpICYmIGNhbmRpZGF0ZS5uYW1lICE9IFwidm9pZFwiKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNjYWxhciBvciB2b2lkIHJldHVybiB0eXBlLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwia2luZCxsb2NhdGlvbixwYXJhbWV0ZXJJZFwiIHx8XG4gICAgICB0eXBlb2YgY2FuZGlkYXRlLnBhcmFtZXRlcklkICE9IFwic3RyaW5nXCIgfHwgIXR5cGVQYXJhbWV0ZXJzLmhhcyhjYW5kaWRhdGUucGFyYW1ldGVySWQpKSB7XG4gICAgICBmYWlsKFwiRlJFRV9UWVBFX1ZBUklBQkxFXCIsIGBGcmVlIG9yIHVua25vd24gdHlwZSB2YXJpYWJsZSAnJHtTdHJpbmcoY2FuZGlkYXRlLnBhcmFtZXRlcklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpXG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghKFtcImFyZ3VtZW50cyxkZWNsYXJhdGlvbklkLGtpbmRcIiwgXCJkZWNsYXJhdGlvbklkLGtpbmRcIl0uaW5jbHVkZXMoa2V5cykpIHx8XG4gICAgICB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fCAhZGVjbGFyYXRpb24pIHtcbiAgICAgIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7U3RyaW5nKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgY29uc3QgZXhwZWN0ZWRBcml0eSA9IGRlY2xhcmF0aW9uLnR5cGVQYXJhbWV0ZXJzPy5sZW5ndGggPz8gMFxuXG4gICAgaWYgKGV4cGVjdGVkQXJpdHkgPiAwICYmIGNhbmRpZGF0ZS5hcmd1bWVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFpbChcIlJBV19HRU5FUklDX0FQUExJQ0FUSU9OXCIsIGBHZW5lcmljIHJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgcmVxdWlyZXMgJHtleHBlY3RlZEFyaXR5fSB0eXBlIGFyZ3VtZW50cy5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChleHBlY3RlZEFyaXR5ID09IDAgJiYgY2FuZGlkYXRlLmFyZ3VtZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmYWlsKFwiR0VORVJJQ19BUklUWV9NSVNNQVRDSFwiLCBgTm9uLWdlbmVyaWMgcmVjb3JkICcke2RlY2xhcmF0aW9uLm5hbWV9JyBkb2VzIG5vdCBhY2NlcHQgdHlwZSBhcmd1bWVudHMuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBjYW5kaWRhdGVBcmd1bWVudHMgPSBjYW5kaWRhdGUuYXJndW1lbnRzXG5cbiAgICBpZiAoY2FuZGlkYXRlQXJndW1lbnRzICE9PSB1bmRlZmluZWQgJiYgKCFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZUFyZ3VtZW50cykgfHxcbiAgICAgIGNhbmRpZGF0ZUFyZ3VtZW50cy5zb21lKChfYXJndW1lbnQsIGluZGV4KSA9PiAhT2JqZWN0Lmhhc093bihjYW5kaWRhdGVBcmd1bWVudHMsIGluZGV4KSkpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkdlbmVyaWMgcmVjb3JkIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBhcmd1bWVudHNfID0gY2FuZGlkYXRlLmFyZ3VtZW50cyA/PyBbXVxuXG4gICAgaWYgKGFyZ3VtZW50c18ubGVuZ3RoICE9IGV4cGVjdGVkQXJpdHkpIHtcbiAgICAgIGZhaWwoXCJHRU5FUklDX0FSSVRZX01JU01BVENIXCIsIGBSZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyAke2FyZ3VtZW50c18ubGVuZ3RofSB0eXBlIGFyZ3VtZW50czsgZXhwZWN0ZWQgJHtleHBlY3RlZEFyaXR5fS5gLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgZ2VuZXJpYyBhcHBsaWNhdGlvbnMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGFyZ3VtZW50c18pIHtcbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGFyZ3VtZW50LCB0eXBlTG9jYXRpb24oYXJndW1lbnQsIGxvY2F0aW9uKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG4gICAgfVxuICAgIHNlZW4uZGVsZXRlKGNhbmRpZGF0ZSlcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8ICFjbGFzc2VzLmhhcyhjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCkpIHtcbiAgICAgIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyBkZWNsYXJhdGlvbiAnJHtTdHJpbmcoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwia2luZCxyZXNvdXJjZUlkXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUucmVzb3VyY2VJZCAhPSBcInN0cmluZ1wiIHx8ICFyZXNvdXJjZUlkc0J5UmVjb3JkUmVnaXN0cnkuZ2V0KHJlY29yZHMpPy5oYXMoY2FuZGlkYXRlLnJlc291cmNlSWQpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biBvd25lZCByZXNvdXJjZSAnJHtTdHJpbmcoY2FuZGlkYXRlLnJlc291cmNlSWQpfScuYCwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICBjb25zdCBjbGFzc2VzID0gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuZmlsdGVyKChrZXkpID0+IGtleSAhPSBcInNvdXJjZVByb3ZlbmFuY2VcIikuc29ydCgpLmpvaW4oXCIsXCIpICE9IFwiZGVjbGFyYXRpb25JZCxraW5kXCIgfHxcbiAgICAgIHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCAhPSBcInN0cmluZ1wiIHx8IGNsYXNzZXMuZ2V0KGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKT8ub3duZXJzaGlwPy5raW5kICE9IFwib3duZWRSZXNvdXJjZVwiKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biBvd25lZCByZWZlcmVuY2UgJyR7U3RyaW5nKGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkKX0nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICB9XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICB9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICBpZiAoc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjdXJzaXZlIGNvbGxlY3Rpb24gdHlwZXMgY2Fubm90IGNvbnRhaW4gY3ljbGVzLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgc2Vlbi5hZGQoY2FuZGlkYXRlKVxuICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoY2FuZGlkYXRlLmVsZW1lbnRUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJlbGVtZW50VHlwZVwiKSwgZmFpbCwgc2VlbiwgcmVjb3JkcywgdHlwZVBhcmFtZXRlcnMpXG5cbiAgICBzZWVuLmRlbGV0ZShjYW5kaWRhdGUpXG5cbiAgICBpZiAoY2FuZGlkYXRlLmVsZW1lbnRUeXBlICE9PSBlbGVtZW50VHlwZSkgY2FuZGlkYXRlLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJNYXBUeXBlXCIgfHwgY2FuZGlkYXRlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgY29uc3QgZXhwZWN0ZWRGaWVsZHMgPSBjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBcImtleVR5cGUsa2luZCxvcmRlcix2YWx1ZVR5cGVcIiA6IFwia2V5VHlwZSxraW5kLHZhbHVlVHlwZVwiXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gZXhwZWN0ZWRGaWVsZHMpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFsZm9ybWVkICR7Y2FuZGlkYXRlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiID8gXCJvcmRlcmVkIG1hcFwiIDogXCJtYXBcIn0gdHlwZS5gLFxuICAgICAgICB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgJiYgY2FuZGlkYXRlLm9yZGVyICE9IFwiaW5zZXJ0aW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk9yZGVyZWQgbWFwIHR5cGUgcmVxdWlyZXMgaW5zZXJ0aW9uIG9yZGVyLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbikpXG4gICAgfVxuICAgIGlmIChzZWVuLmhhcyhjYW5kaWRhdGUpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWN1cnNpdmUgY29sbGVjdGlvbiB0eXBlcyBjYW5ub3QgY29udGFpbiBjeWNsZXMuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbiAgICBzZWVuLmFkZChjYW5kaWRhdGUpXG4gICAgY29uc3Qga2V5VHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGNhbmRpZGF0ZS5rZXlUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJrZXlUeXBlXCIpLCBmYWlsLCBzZWVuLCByZWNvcmRzLCB0eXBlUGFyYW1ldGVycylcblxuICAgIGlmICghaXNTY2FsYXJUeXBlKGtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTWFwIGtleSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGtleVR5cGUpfTsgZXhwZWN0ZWQgc3RyaW5nLmAsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUua2V5VHlwZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUudmFsdWVUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuXG4gICAgaWYgKGNhbmRpZGF0ZS5rZXlUeXBlICE9PSBrZXlUeXBlKSBjYW5kaWRhdGUua2V5VHlwZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSAqLyAoa2V5VHlwZSlcbiAgICBpZiAoY2FuZGlkYXRlLnZhbHVlVHlwZSAhPT0gdmFsdWVUeXBlKSBjYW5kaWRhdGUudmFsdWVUeXBlID0gdmFsdWVUeXBlXG5cbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9IFwic291cmNlUHJvdmVuYW5jZVwiKS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYWxmb3JtZWQgb3B0aW9uYWwgdHlwZS5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXMoY2FuZGlkYXRlKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjdXJzaXZlIG9wdGlvbmFsIHR5cGVzIGNhbm5vdCBjb250YWluIGN5Y2xlcy5cIiwgdHlwZUxvY2F0aW9uKGNhbmRpZGF0ZSwgbG9jYXRpb24pKVxuICAgIHNlZW4uYWRkKGNhbmRpZGF0ZSlcbiAgICBjb25zdCB2YWx1ZVR5cGUgPSB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShjYW5kaWRhdGUudmFsdWVUeXBlLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIiksIGZhaWwsIHNlZW4sIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgc2Vlbi5kZWxldGUoY2FuZGlkYXRlKVxuICAgIGlmICh2YWx1ZVR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBmYWlsKFwiSU5WQUxJRF9PUFRJT05BTF9DT05TVElUVUVOVFwiLCBcIk9wdGlvbmFsIHZhbHVlcyBjYW5ub3QgZGlyZWN0bHkgY29udGFpbiBhbm90aGVyIG9wdGlvbmFsLlwiLCB0eXBlTG9jYXRpb24oY2FuZGlkYXRlLCBsb2NhdGlvbiwgXCJ2YWx1ZVR5cGVcIikpXG4gICAgfVxuICAgIGlmIChjYW5kaWRhdGUudmFsdWVUeXBlICE9PSB2YWx1ZVR5cGUpIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPSB2YWx1ZVR5cGVcblxuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgfVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlVuc3VwcG9ydGVkIHNlbWFudGljIHR5cGUuXCIsIHR5cGVMb2NhdGlvbihjYW5kaWRhdGUsIGxvY2F0aW9uKSlcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZS1jbGFzcyByZWdpc3RyeSBhdHRhY2hlZCB0byB0aGUgcmVjb3JkIHZhbGlkYXRpb24gY29udGV4dC5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgdmFsaWRhdGlvbiByZWdpc3RyeS5cbiAqIEByZXR1cm5zIHtDbGFzc1JlZ2lzdHJ5fSBSZWZlcmVuY2UgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKSB7XG4gIHJldHVybiByZWZlcmVuY2VDbGFzc2VzQnlSZWNvcmRSZWdpc3RyeS5nZXQocmVjb3JkcykgPz8gbmV3IE1hcCgpXG59XG5cbi8qKlxuICogSW5mZXJzIGEgdmFsdWUgZXhwcmVzc2lvbiBhbmQgcmVqZWN0cyB0aGUgbm9uLXZhbHVlIHJlc3VsdCBvZiBhIHZvaWQgY2FsbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byBub3JtYWxpemUgZnJvbnRlbmQgaW50ZW50IGFuZCBjYWxsIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dCAtIFZhbHVlIGNvbnRleHQgZm9yIGRpYWdub3N0aWNzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBbZXhwZWN0ZWRUeXBlXSAtIENvbnRleHR1YWwgY29sbGVjdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNdIC0gV2hldGhlciBhIGdlbmVyaWMtY2FsbCBldmlkZW5jZSBwYXNzIG1heSBpbmZlciBub25lbXB0eSBjb2xsZWN0aW9uIGxpdGVyYWxzLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IEV4cHJlc3Npb24gdmFsdWUgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGNvbnRleHQsIGV4cGVjdGVkVHlwZSxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgPSBmYWxzZSkge1xuICBjb25zdCBhbGxvd093bmVkQm9ycm93ID0gY29udGV4dCA9PSBcImFuIGVmZmVjdCBhcmd1bWVudFwiIHx8IGNvbnRleHQgPT0gXCJhIG1ldGhvZCByZWNlaXZlclwiXG4gIGNvbnN0IHR5cGUgPSBpbmZlckV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGV4cGVjdGVkVHlwZSxcbiAgICBpbmZlckNvbGxlY3Rpb25FbGVtZW50cywgYWxsb3dPd25lZEJvcnJvdylcblxuICBpZiAodHlwZSA9PSBcInZvaWRcIikgcmV0dXJuIGZhaWwoXCJWT0lEX0FTX1ZBTFVFXCIsIGBWb2lkIGNhbGwgY2Fubm90IGJlIHVzZWQgYXMgJHtjb250ZXh0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICBpZiAodHlwZS5raW5kID09IFwiRXJyb3JUeXBlXCIpIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgRXJyb3IgdmFsdWUgY2Fubm90IGJlIHVzZWQgYXMgJHtjb250ZXh0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gIHJldHVybiB0eXBlXG59XG5cbi8qKlxuICogSW5mZXJzIGFuZCB2YWxpZGF0ZXMgb25lIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFNlbWFudGljIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgbGV4aWNhbCBzY29wZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gcmVwbGFjZSB0cmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uIGludGVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gW2V4cGVjdGVkVHlwZV0gLSBDb250ZXh0dWFsIGNvbGxlY3Rpb24gdHlwZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZmVyQ29sbGVjdGlvbkVsZW1lbnRzXSAtIFdoZXRoZXIgYSBnZW5lcmljLWNhbGwgZXZpZGVuY2UgcGFzcyBtYXkgaW5mZXIgbm9uZW1wdHkgY29sbGVjdGlvbiBsaXRlcmFscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93T3duZWRCb3Jyb3ddIC0gV2hldGhlciB0aGlzIGV4YWN0IGNhbGwgcG9zaXRpb24gYWRtaXRzIGFuIGltbWVkaWF0ZSBib3Jyb3cuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmRpbmdUeXBlIHwgXCJ2b2lkXCJ9IEV4cHJlc3Npb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gaW5mZXJFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBleHBlY3RlZFR5cGUsXG4gIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzID0gZmFsc2UsIGFsbG93T3duZWRCb3Jyb3cgPSBmYWxzZSkge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIHJlc29sdmVCaW5kaW5nKGV4cHJlc3Npb24ubmFtZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpLnR5cGVcblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVjZWl2ZXJFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAoIXNjb3BlLmN1cnJlbnRDbGFzcyB8fCBleHByZXNzaW9uLmNsYXNzSWQgIT0gc2NvcGUuY3VycmVudENsYXNzLmlkKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklMTEVHQUxfUFJJVkFURV9BQ0NFU1NcIiwgXCJSZWNlaXZlciBleHByZXNzaW9uIGlzIHZhbGlkIG9ubHkgaW5zaWRlIGl0cyBkZWNsYXJpbmcgY2xhc3MuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHNjb3BlLmN1cnJlbnRDbGFzcy5pZCksIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlByaXZhdGVGaWVsZFJlYWRcIikge1xuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gc2NvcGUuY3VycmVudENsYXNzXG5cbiAgICBpZiAoIWRlY2xhcmF0aW9uIHx8ICFleHByZXNzaW9uLnJlY2VpdmVyIHx8IGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCAhPSBcIlJlY2VpdmVyRXhwcmVzc2lvblwiIHx8XG4gICAgICBleHByZXNzaW9uLnJlY2VpdmVyLmNsYXNzSWQgIT0gZGVjbGFyYXRpb24uaWQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSUxMRUdBTF9QUklWQVRFX0FDQ0VTU1wiLCBcIlByaXZhdGUgZmllbGQgcmVjZWl2ZXIgbXVzdCBiZSB0aGUgZGVjbGFyaW5nIGNsYXNzIHJlY2VpdmVyLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLmZpZWxkKVxuXG4gICAgaWYgKCFmaWVsZCkgcmV0dXJuIGZhaWwoXCJJTExFR0FMX1BSSVZBVEVfQUNDRVNTXCIsIFwiUHJpdmF0ZSBmaWVsZCBpZGVudGl0eSBpcyBub3Qgb3duZWQgYnkgdGhlIGRlY2xhcmluZyBjbGFzcy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcblxuICAgIHJldHVybiBmaWVsZC50eXBlXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAoIWFsbG93T3duZWRCb3Jyb3cpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiQk9SUk9XX0VTQ0FQRVwiLCBcIkJPUlJPV19FU0NBUEU6IE93bmVkIGJvcnJvd3MgYXJlIHZhbGlkIG9ubHkgYXMgaW1tZWRpYXRlIGNhcGFiaWxpdHkgYXJndW1lbnRzIG9yIG1ldGhvZCByZWNlaXZlcnMuXCIsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLm1vZGUgIT0gXCJzaGFyZWRcIiAmJiBleHByZXNzaW9uLm1vZGUgIT0gXCJleGNsdXNpdmVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX1JFU09VUkNFX0JPUlJPV1wiLCBcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XOiBPd25lZCBib3Jyb3cgbW9kZSBtdXN0IGJlIHNoYXJlZCBvciBleGNsdXNpdmUuXCIsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGJvcnJvd2VkID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvd25lZCBib3Jyb3dcIilcblxuICAgIGlmIChib3Jyb3dlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBib3Jyb3dlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJCb3Jyb3dlZCBleHByZXNzaW9uIG11c3QgYmUgYW4gb3duZWQgcmVzb3VyY2Ugb3Igb3duZWQgcmVmZXJlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIXNhbWVUeXBlKGJvcnJvd2VkLCBleHByZXNzaW9uLnR5cGUpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBcIkJvcnJvdyBtZXRhZGF0YSBkb2VzIG5vdCBtYXRjaCBpdHMgcmVzb3VyY2UgcGxhY2UuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIHJldHVybiBib3Jyb3dlZFxuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk93bmVkTW92ZUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IG1vdmVkID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvd25lZCBtb3ZlXCIpXG5cbiAgICBpZiAobW92ZWQua2luZCAhPSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgbW92ZWQua2luZCAhPSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfVFJBTlNGRVJcIiwgXCJNb3ZlZCBleHByZXNzaW9uIG11c3QgYmUgYW4gb3duZWQgcmVzb3VyY2Ugb3Igb3duZWQgcmVmZXJlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIXNhbWVUeXBlKG1vdmVkLCBleHByZXNzaW9uLnR5cGUpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfVFlQRV9NSVNNQVRDSFwiLCBcIk1vdmUgbWV0YWRhdGEgZG9lcyBub3QgbWF0Y2ggaXRzIHJlc291cmNlIHBsYWNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gbW92ZWRcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJFcnJvck1lc3NhZ2VSZWFkXCIpIHtcbiAgICBpZiAoIWV4cHJlc3Npb24ucmVjZWl2ZXIgfHwgZXhwcmVzc2lvbi5yZWNlaXZlci5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJJTlZBTElEX01FTUJFUl9SRUNFSVZFUlwiLCBcIkVycm9yIG1lc3NhZ2UgcmVjZWl2ZXIgbXVzdCBiZSBvbmUgY2F0Y2ggYmluZGluZy5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcmVjZWl2ZXIgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLnJlY2VpdmVyLm5hbWUsIGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24sIHNjb3BlLCBmYWlsKVxuXG4gICAgaWYgKHJlY2VpdmVyLnR5cGUua2luZCAhPSBcIkVycm9yVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfTUVNQkVSX1JFQ0VJVkVSXCIsIFwiTWVzc2FnZSBtZW1iZXIgcmVxdWlyZXMgYSB0eXBlZCBlcnJvciBjYXRjaCBiaW5kaW5nLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpXG4gIH1cblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSW50ZWdlckxpdGVyYWxcIikge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoZXhwcmVzc2lvbi52YWx1ZSkpIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTm9uLXNhZmUgaW50ZWdlciBsaXRlcmFsLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIHJldHVybiBzY2FsYXJUeXBlKFwiaW50ZWdlclwiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJCb29sZWFuTGl0ZXJhbFwiKSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0LmdldChleHByZXNzaW9uLCBcInZhbHVlXCIpICE9IFwiYm9vbGVhblwiKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkludmFsaWQgYm9vbGVhbiBsaXRlcmFsIHZhbHVlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcImJvb2xlYW5cIilcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiKSB7XG4gICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldChleHByZXNzaW9uLCBcInZhbHVlXCIpXG5cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9IFwic3RyaW5nXCIgfHwgIWhhc09ubHlVbmljb2RlU2NhbGFycyh2YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiSW52YWxpZCBVbmljb2RlIHN0cmluZyBsaXRlcmFsLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShcInN0cmluZ1wiKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbE5vbmVcIikge1xuICAgIGlmICghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiT3B0aW9uYWwgYWJzZW5jZSByZXF1aXJlcyBhbiBleHBsaWNpdCBvcHRpb25hbCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxTb21lXCIpIHtcbiAgICBpZiAoIWV4cGVjdGVkVHlwZSB8fCBleHBlY3RlZFR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIGV4cHJlc3Npb24udmFsdWUsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gb3B0aW9uYWwgcHJlc2VudCB2YWx1ZVwiXG4gICAgICApXG5cbiAgICAgIGlmICh2YWx1ZVR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUFRJT05BTF9DT05TVElUVUVOVFwiLCBcIk9wdGlvbmFsIHZhbHVlcyBjYW5ub3QgZGlyZWN0bHkgY29udGFpbiBhbm90aGVyIG9wdGlvbmFsLlwiLCBleHByZXNzaW9uLnZhbHVlLmxvY2F0aW9uKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZX1cbiAgICB9XG4gICAgY29uc3QgdmFsdWVUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKFxuICAgICAgZXhwcmVzc2lvbi52YWx1ZSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhbiBvcHRpb25hbCBwcmVzZW50IHZhbHVlXCIsIGV4cGVjdGVkVHlwZS52YWx1ZVR5cGVcbiAgICApXG5cbiAgICBpZiAoIXNhbWVUeXBlKHZhbHVlVHlwZSwgZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSkpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBPcHRpb25hbCBwcmVzZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24odmFsdWVUeXBlKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUpfS5gLCBleHByZXNzaW9uLnZhbHVlLmxvY2F0aW9uKVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxJc1ByZXNlbnRcIikge1xuICAgIGlmICghZXhwcmVzc2lvbi5vcGVyYW5kIHx8IGV4cHJlc3Npb24ub3BlcmFuZC5raW5kICE9IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiT3B0aW9uYWwgcHJlc2VuY2UgdGVzdCByZXF1aXJlcyBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IG9wZXJhbmRUeXBlID0gcmVzb2x2ZUJpbmRpbmcoZXhwcmVzc2lvbi5vcGVyYW5kLm5hbWUsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbiwgc2NvcGUsIGZhaWwpLnR5cGVcblxuICAgIGlmIChvcGVyYW5kVHlwZS5raW5kICE9IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUHJlc2VuY2UgdGVzdCByZWNlaXZlZCAke3R5cGVEZXNjcmlwdGlvbihvcGVyYW5kVHlwZSl9OyBleHBlY3RlZCBvcHRpb25hbC5gLCBleHByZXNzaW9uLm9wZXJhbmQubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJib29sZWFuXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk9wdGlvbmFsVW53cmFwXCIpIHtcbiAgICBpZiAoIWV4cHJlc3Npb24ub3BlcmFuZCB8fCBleHByZXNzaW9uLm9wZXJhbmQua2luZCAhPSBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk9wdGlvbmFsIHVud3JhcCByZXF1aXJlcyBvbmUgc2ltcGxlIGlkZW50aWZpZXIuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGJpbmRpbmcgPSByZXNvbHZlQmluZGluZyhleHByZXNzaW9uLm9wZXJhbmQubmFtZSwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBzY29wZSwgZmFpbClcblxuICAgIGlmIChiaW5kaW5nLnR5cGUua2luZCAhPSBcIk9wdGlvbmFsVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9wdGlvbmFsIHVud3JhcCByZWNlaXZlZCAke3R5cGVEZXNjcmlwdGlvbihiaW5kaW5nLnR5cGUpfTsgZXhwZWN0ZWQgb3B0aW9uYWwuYCwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoIXNjb3BlLnByZXNlbmNlUHJvb2ZzLmhhcyhiaW5kaW5nKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTkNIRUNLRURfT1BUSU9OQUxfVU5XUkFQXCIsIGBPcHRpb25hbCBiaW5kaW5nICcke2V4cHJlc3Npb24ub3BlcmFuZC5uYW1lfScgaXMgbm90IHByb3ZlbiBwcmVzZW50LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbmRpbmcudHlwZS52YWx1ZVR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdExpdGVyYWxcIikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHByZXNzaW9uLmVsZW1lbnRzKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTGlzdCBsaXRlcmFsIGVsZW1lbnRzIG11c3QgYmUgYSBkZW5zZSBzb3VyY2Utb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCghZXhwZWN0ZWRUeXBlIHx8IGV4cGVjdGVkVHlwZS5raW5kICE9IFwiTGlzdFR5cGVcIikgJiZcbiAgICAgICghaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMgfHwgZXhwcmVzc2lvbi5lbGVtZW50cy5sZW5ndGggPT0gMCkpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiTUlTU0lOR19UWVBFXCIsIFwiTGlzdCBsaXRlcmFsIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlY3Vyc2l2ZSBsaXN0IHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZSB8IHVuZGVmaW5lZH0gKi9cbiAgICBsZXQgaW5mZXJyZWRFbGVtZW50VHlwZVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmVsZW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGV4cHJlc3Npb24uZWxlbWVudHMsIGluZGV4KSkge1xuICAgICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlNwYXJzZSBsaXN0IGxpdGVyYWxzIGFyZSBvdXRzaWRlIHRoZSBpbXBsZW1lbnRlZCBzdWJzZXQuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZXhwcmVzc2lvbi5lbGVtZW50c1tpbmRleF1cbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZWxlbWVudCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGxpc3QgZWxlbWVudFwiLFxuICAgICAgICBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJMaXN0VHlwZVwiID8gZXhwZWN0ZWRUeXBlLmVsZW1lbnRUeXBlIDogaW5mZXJyZWRFbGVtZW50VHlwZSwgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNcbiAgICAgIClcblxuICAgICAgaW5mZXJyZWRFbGVtZW50VHlwZSA/Pz0gYWN0dWFsXG4gICAgICBjb25zdCByZXF1aXJlZEVsZW1lbnRUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTGlzdFR5cGVcIiA/IGV4cGVjdGVkVHlwZS5lbGVtZW50VHlwZSA6IGluZmVycmVkRWxlbWVudFR5cGVcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIHJlcXVpcmVkRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBMaXN0IGVsZW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24ocmVxdWlyZWRFbGVtZW50VHlwZSl9LmAsIGVsZW1lbnQubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIkxpc3RUeXBlXCJcbiAgICAgID8gZXhwZWN0ZWRUeXBlXG4gICAgICA6IHtlbGVtZW50VHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoaW5mZXJyZWRFbGVtZW50VHlwZSksIGtpbmQ6IFwiTGlzdFR5cGVcIn1cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTGl0ZXJhbFwiKSB7XG4gICAgaWYgKGV4cGVjdGVkVHlwZSAmJiBleHBlY3RlZFR5cGUua2luZCAhPSBcIk1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAgbGl0ZXJhbCBjb250ZXh0ICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkVHlwZSl9OyBleHBlY3RlZCBtYXAuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFleHBlY3RlZFR5cGUgJiYgIWluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU1NJTkdfVFlQRVwiLCBcIk1hcCBsaXRlcmFsIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlY3Vyc2l2ZSBtYXAgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiAmJiAhaXNTY2FsYXJUeXBlKGV4cGVjdGVkVHlwZS5rZXlUeXBlLCBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWFwIGtleSB0eXBlIG11c3QgYmUgc3RyaW5nLlwiLCB0eXBlTG9jYXRpb24oZXhwZWN0ZWRUeXBlLmtleVR5cGUsIGV4cHJlc3Npb24ubG9jYXRpb24pKVxuICAgIH1cbiAgICBjb25zdCBlbnRyaWVzID0gdmFsaWRhdGVNYXBMaXRlcmFsRW50cmllcyhleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLFxuICAgICAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpXG5cbiAgICBpZiAoIWV4cGVjdGVkVHlwZSAmJiBlbnRyaWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU1NJTkdfVFlQRVwiLCBcIkVtcHR5IG1hcCBsaXRlcmFsIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlY3Vyc2l2ZSBtYXAgdHlwZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBpbmZlcnJlZFZhbHVlVHlwZVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoXG4gICAgICAgIGVudHJ5LnZhbHVlLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIHZhbHVlXCIsXG4gICAgICAgIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUgOiBpbmZlcnJlZFZhbHVlVHlwZSwgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNcbiAgICAgIClcbiAgICAgIGluZmVycmVkVmFsdWVUeXBlID8/PSBhY3R1YWxcbiAgICAgIGNvbnN0IHJlcXVpcmVkVmFsdWVUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiTWFwVHlwZVwiID8gZXhwZWN0ZWRUeXBlLnZhbHVlVHlwZSA6IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCByZXF1aXJlZFZhbHVlVHlwZSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1hcCB2YWx1ZSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXF1aXJlZFZhbHVlVHlwZSl9LmAsIGVudHJ5LnZhbHVlLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUgOiB7XG4gICAgICBrZXlUeXBlOiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpLFxuICAgICAga2luZDogXCJNYXBUeXBlXCIsXG4gICAgICB2YWx1ZVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGluZmVycmVkVmFsdWVUeXBlKVxuICAgIH1cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikge1xuICAgIGlmIChleHBlY3RlZFR5cGUgJiYgZXhwZWN0ZWRUeXBlLmtpbmQgIT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE9yZGVyZWQtbWFwIGxpdGVyYWwgY29udGV4dCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZFR5cGUpfTsgZXhwZWN0ZWQgb3JkZXJlZCBtYXAuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFleHBlY3RlZFR5cGUgJiYgIWluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU1NJTkdfVFlQRVwiLCBcIk9yZGVyZWQtbWFwIGxpdGVyYWwgcmVxdWlyZXMgYW4gZXhwbGljaXQgcmVjdXJzaXZlIG9yZGVyZWQtbWFwIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHBlY3RlZFR5cGU/LmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiICYmICFpc1NjYWxhclR5cGUoZXhwZWN0ZWRUeXBlLmtleVR5cGUsIFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJPcmRlcmVkLW1hcCBrZXkgdHlwZSBtdXN0IGJlIHN0cmluZy5cIiwgdHlwZUxvY2F0aW9uKGV4cGVjdGVkVHlwZS5rZXlUeXBlLCBleHByZXNzaW9uLmxvY2F0aW9uKSlcbiAgICB9XG4gICAgY29uc3QgZW50cmllcyA9IHZhbGlkYXRlTWFwTGl0ZXJhbEVudHJpZXMoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgICAgIGluZmVyQ29sbGVjdGlvbkVsZW1lbnRzKVxuXG4gICAgaWYgKCFleHBlY3RlZFR5cGUgJiYgZW50cmllcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNSVNTSU5HX1RZUEVcIiwgXCJFbXB0eSBvcmRlcmVkLW1hcCBsaXRlcmFsIHJlcXVpcmVzIGFuIGV4cGxpY2l0IHJlY3Vyc2l2ZSBvcmRlcmVkLW1hcCB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGUgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IGluZmVycmVkVmFsdWVUeXBlXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgZW50cnkudmFsdWUsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYW4gb3JkZXJlZC1tYXAgdmFsdWVcIixcbiAgICAgICAgZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUgOiBpbmZlcnJlZFZhbHVlVHlwZSwgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHNcbiAgICAgIClcbiAgICAgIGluZmVycmVkVmFsdWVUeXBlID8/PSBhY3R1YWxcbiAgICAgIGNvbnN0IHJlcXVpcmVkVmFsdWVUeXBlID0gZXhwZWN0ZWRUeXBlPy5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiA/IGV4cGVjdGVkVHlwZS52YWx1ZVR5cGUgOiBpbmZlcnJlZFZhbHVlVHlwZVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgcmVxdWlyZWRWYWx1ZVR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBPcmRlcmVkLW1hcCB2YWx1ZSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihyZXF1aXJlZFZhbHVlVHlwZSl9LmAsXG4gICAgICAgICAgZW50cnkudmFsdWUubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGVjdGVkVHlwZT8ua2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIgPyBleHBlY3RlZFR5cGUgOiB7XG4gICAgICBrZXlUeXBlOiBzY2FsYXJUeXBlKFwic3RyaW5nXCIpLFxuICAgICAga2luZDogXCJPcmRlcmVkTWFwVHlwZVwiLFxuICAgICAgb3JkZXI6IFwiaW5zZXJ0aW9uXCIsXG4gICAgICB2YWx1ZVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGluZmVycmVkVmFsdWVUeXBlKVxuICAgIH1cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTGlzdEluZGV4RXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbGlzdCByZWNlaXZlclwiKVxuICAgIGNvbnN0IGluZGV4VHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmluZGV4LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbGlzdCBpbmRleFwiLCBzY2FsYXJUeXBlKFwiaW50ZWdlclwiKSlcblxuICAgIGlmIChjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiTGlzdFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBMaXN0IGluZGV4IHJlY2VpdmVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29sbGVjdGlvblR5cGUpfTsgZXhwZWN0ZWQgbGlzdC5gLCBleHByZXNzaW9uLmNvbGxlY3Rpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghaXNTY2FsYXJUeXBlKGluZGV4VHlwZSwgXCJpbnRlZ2VyXCIpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgTGlzdCBpbmRleCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGluZGV4VHlwZSl9OyBleHBlY3RlZCBpbnRlZ2VyLmAsIGV4cHJlc3Npb24uaW5kZXgubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUpXG4gICAgY29uc3Qga25vd25JbmRleCA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlKVxuXG4gICAgaWYgKGtub3duQ29sbGVjdGlvbj8ua2luZCA9PSBcIkxpc3RMaXRlcmFsXCIgJiYga25vd25JbmRleD8ua2luZCA9PSBcIkludGVnZXJMaXRlcmFsXCIgJiZcbiAgICAgIChrbm93bkluZGV4LnZhbHVlIDwgMCB8fCBrbm93bkluZGV4LnZhbHVlID49IGtub3duQ29sbGVjdGlvbi5lbGVtZW50cy5sZW5ndGgpKSB7XG4gICAgICBmYWlsKFwiSU5ERVhfT1VUX09GX0JPVU5EU1wiLCBgTGlzdCBpbmRleCAke2tub3duSW5kZXgudmFsdWV9IGlzIG91dHNpZGUgYSBsaXRlcmFsIGxpc3Qgb2Ygc2l6ZSAke2tub3duQ29sbGVjdGlvbi5lbGVtZW50cy5sZW5ndGh9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHByb3ZlbiA9IHByb3Zlbkxpc3RFbGVtZW50KGV4cHJlc3Npb24uY29sbGVjdGlvbiwgZXhwcmVzc2lvbi5pbmRleCwgc2NvcGUpXG5cbiAgICB2YWxpZGF0ZUFjY2Vzc1RvdGFsaXR5KGV4cHJlc3Npb24sIHByb3ZlbiAhPT0gdW5kZWZpbmVkLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb25UeXBlLmVsZW1lbnRUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1hcExvb2t1cEV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25UeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uY29sbGVjdGlvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1hcCByZWNlaXZlclwiKVxuICAgIGNvbnN0IGtleVR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5rZXksIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBtYXAga2V5XCIsIHNjYWxhclR5cGUoXCJzdHJpbmdcIikpXG5cbiAgICBpZiAoY29sbGVjdGlvblR5cGUua2luZCAhPSBcIk1hcFR5cGVcIiAmJiBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAgbG9va3VwIHJlY2VpdmVyIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29sbGVjdGlvblR5cGUpfTsgZXhwZWN0ZWQgbWFwLmAsIGV4cHJlc3Npb24uY29sbGVjdGlvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKCFpc1NjYWxhclR5cGUoa2V5VHlwZSwgXCJzdHJpbmdcIikpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBNYXAgbG9va3VwIGtleSB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGtleVR5cGUpfTsgZXhwZWN0ZWQgc3RyaW5nLmAsIGV4cHJlc3Npb24ua2V5LmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBrbm93bkNvbGxlY3Rpb24gPSBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLmNvbGxlY3Rpb24sIHNjb3BlKVxuICAgIGNvbnN0IGtub3duS2V5ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oZXhwcmVzc2lvbi5rZXksIHNjb3BlKVxuXG4gICAgaWYgKChrbm93bkNvbGxlY3Rpb24/LmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIgfHwga25vd25Db2xsZWN0aW9uPy5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIikgJiZcbiAgICAgIGtub3duS2V5Py5raW5kID09IFwiU3RyaW5nTGl0ZXJhbFwiICYmXG4gICAgICAha25vd25Db2xsZWN0aW9uLmVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmtleS52YWx1ZSA9PSBrbm93bktleS52YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJNSVNTSU5HX01BUF9LRVlcIiwgYE1hcCBrZXkgJyR7a25vd25LZXkudmFsdWV9JyBpcyBhYnNlbnQgZnJvbSB0aGUgbGl0ZXJhbCBpbml0aWFsaXplci5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwcm92ZW4gPSBwcm92ZW5NYXBWYWx1ZShleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24ua2V5LCBzY29wZSlcblxuICAgIHZhbGlkYXRlQWNjZXNzVG90YWxpdHkoZXhwcmVzc2lvbiwgcHJvdmVuICE9PSB1bmRlZmluZWQsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG5cbiAgICByZXR1cm4gY29sbGVjdGlvblR5cGUudmFsdWVUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgY29sbGVjdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29sbGVjdGlvbi1zaXplIHJlY2VpdmVyXCIpXG5cbiAgICBpZiAoY29sbGVjdGlvblR5cGUua2luZCAhPSBcIkxpc3RUeXBlXCIgJiYgY29sbGVjdGlvblR5cGUua2luZCAhPSBcIk1hcFR5cGVcIiAmJiBjb2xsZWN0aW9uVHlwZS5raW5kICE9IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDb2xsZWN0aW9uIHNpemUgcmVjZWl2ZXIgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihjb2xsZWN0aW9uVHlwZSl9OyBleHBlY3RlZCBsaXN0IG9yIG1hcC5gLCBleHByZXNzaW9uLmNvbGxlY3Rpb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGNvbGxlY3Rpb25LaW5kID0gY29sbGVjdGlvblR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIgPyBcImxpc3RcIiA6IFwibWFwXCJcblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSB7XG4gICAgICBpZiAoZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCAhPT0gdW5kZWZpbmVkICYmIGV4cHJlc3Npb24uY29sbGVjdGlvbktpbmQgIT0gY29sbGVjdGlvbktpbmQpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDb2xsZWN0aW9uIHNpemUgb3BlcmF0aW9uIGRvZXMgbm90IG1hdGNoIGl0cyByZWNlaXZlciB0eXBlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwcmVzc2lvbi5jb2xsZWN0aW9uS2luZCA9IGNvbGxlY3Rpb25LaW5kXG4gICAgfVxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24uY29sbGVjdGlvbktpbmQgIT0gY29sbGVjdGlvbktpbmQpIHtcbiAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ29sbGVjdGlvbiBzaXplIGtpbmQgZG9lcyBub3QgbWF0Y2ggaXRzIHJlY2VpdmVyIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoXCJpbnRlZ2VyXCIpXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpIHx8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCAhPSBleHByZXNzaW9uLnJlc29sdXRpb24ucGFyYW1ldGVyVHlwZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJFZmZlY3QgY2FsbCBhcmd1bWVudCBjb3VudCBkb2VzIG5vdCBtYXRjaCBpdHMgYXV0aG9yaXplZCBvcGVyYXRpb24uXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IHJlc291cmNlRmxvdyA9IGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXNvdXJjZUZsb3dcblxuICAgIGlmIChyZXNvdXJjZUZsb3cua2luZCA9PSBcImJvcnJvd1wiIHx8IHJlc291cmNlRmxvdy5raW5kID09IFwiY2xvc2VcIikge1xuICAgICAgY29uc3QgYm9ycm93ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbcmVzb3VyY2VGbG93LnBhcmFtZXRlckluZGV4XVxuICAgICAgY29uc3QgZXhwZWN0ZWRNb2RlID0gcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJjbG9zZVwiID8gXCJleGNsdXNpdmVcIiA6IFwic2hhcmVkXCJcblxuICAgICAgaWYgKGJvcnJvdz8ua2luZCAhPSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiIHx8IGJvcnJvdy5tb2RlICE9IGV4cGVjdGVkTW9kZSkge1xuICAgICAgICBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgYElOVkFMSURfUkVTT1VSQ0VfQk9SUk9XOiAke3Jlc291cmNlRmxvdy5raW5kfSByZXF1aXJlcyBhbiBpbW1lZGlhdGUgJHtleHBlY3RlZE1vZGV9IGJvcnJvdy5gLFxuICAgICAgICAgIGJvcnJvdz8ubG9jYXRpb24gPz8gZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBpZGVudGl0eUFzVmFsdWVUeXBlKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5wYXJhbWV0ZXJUeXBlc1tpbmRleF0sIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbiwgZmFpbClcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsXG4gICAgICAgIFwiYW4gZWZmZWN0IGFyZ3VtZW50XCIsIGV4cGVjdGVkKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgICAgIGZhaWwoXCJSRVNPVVJDRV9UWVBFX01JU01BVENIXCIsIGBFZmZlY3QgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZXhwZWN0ZWQpfS5gLFxuICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24ucmVzb2x1dGlvbi5yZXR1cm5UeXBlID09IFwidm9pZFwiKSByZXR1cm4gXCJ2b2lkXCJcbiAgICByZXR1cm4gaWRlbnRpdHlBc1ZhbHVlVHlwZShleHByZXNzaW9uLnJlc29sdXRpb24ucmV0dXJuVHlwZSwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCIpIHtcbiAgICBjb25zdCByZWZlcmVuY2VUeXBlID0gdmFsaWRhdGVWYWx1ZVR5cGVSZWZlcmVuY2UoZXhwcmVzc2lvbi5yZWZlcmVuY2UsIGV4cHJlc3Npb24ubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcyxcbiAgICAgIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgaWYgKHJlZmVyZW5jZVR5cGUua2luZCAhPSBcIlJlZmVyZW5jZVR5cGVcIiAmJiByZWZlcmVuY2VUeXBlLmtpbmQgIT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVmZXJlbmNlIGNvbnN0cnVjdGlvbiByZXF1aXJlcyBhIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVmZXJlbmNlQ2xhc3Nlc0ZvcihyZWNvcmRzKS5nZXQocmVmZXJlbmNlVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX0NMQVNTXCIsIGBVbmtub3duIHJlZmVyZW5jZSBjbGFzcyAnJHtyZWZlcmVuY2VUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uYXJndW1lbnRzKSkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiQ29uc3RydWN0b3IgYXJndW1lbnRzIG11c3QgYmUgYSBkZW5zZSBvcmRlcmVkIGFycmF5LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcIkNPTlNUUlVDVE9SX0FSSVRZX01JU01BVENIXCIsXG4gICAgICAgIGBDb25zdHJ1Y3RvciBmb3IgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyAke2V4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aH0gYXJndW1lbnRzOyBleHBlY3RlZCAke2RlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnMubGVuZ3RofS5gLFxuICAgICAgICBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IGRlY2xhcmF0aW9uLmNvbnN0cnVjdG9yLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgICB2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMpKVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdID0gbm9ybWFsaXplT3duZWRNb3ZlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgcGFyYW1ldGVyVHlwZXNbaW5kZXhdLCBub3JtYWxpemVPcGVyYXRpb25zLCBmYWlsKVxuICAgICAgY29uc3QgYWN0dWFsID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XSwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbnN0cnVjdG9yIGFyZ3VtZW50XCIsIHBhcmFtZXRlclR5cGVzW2luZGV4XSlcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIHBhcmFtZXRlclR5cGVzW2luZGV4XSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENvbnN0cnVjdG9yIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKHBhcmFtZXRlclR5cGVzW2luZGV4XSl9LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNvbHV0aW9uID0ge1xuICAgICAgZGVjbGFyYXRpb25JZDogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZWNsYXJhdGlvbi5jb25zdHJ1Y3Rvci5pZCksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlXCIpLFxuICAgICAgcGFyYW1ldGVyVHlwZXM6IHBhcmFtZXRlclR5cGVzLm1hcCgodHlwZSkgPT4gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUpKSlcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuICAgIGVsc2UgdmFsaWRhdGVSZWZlcmVuY2VSZXNvbHV0aW9uKGV4cHJlc3Npb24ucmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbCwgXCJjb25zdHJ1Y3RvclwiKVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLnJlY2VpdmVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIG1ldGhvZCByZWNlaXZlclwiKVxuXG4gICAgaWYgKHJlY2VpdmVyVHlwZS5raW5kICE9IFwiUmVmZXJlbmNlVHlwZVwiICYmIHJlY2VpdmVyVHlwZS5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9NRVRIT0RfUkVDRUlWRVJcIiwgXCJNZXRob2QgY2FsbCByZWNlaXZlciBtdXN0IGhhdmUgYSByZWZlcmVuY2UgY2xhc3MgdHlwZS5cIiwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWZlcmVuY2VDbGFzc2VzRm9yKHJlY29yZHMpLmdldChyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBmYWlsKFwiVU5LTk9XTl9DTEFTU1wiLCBgVW5rbm93biByZWZlcmVuY2UgY2xhc3MgJyR7cmVjZWl2ZXJUeXBlLmRlY2xhcmF0aW9uSWR9Jy5gLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgIGNvbnN0IG1ldGhvZCA9IGRlY2xhcmF0aW9uLm1ldGhvZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT0gZXhwcmVzc2lvbi5tZXRob2QpID8/XG4gICAgICAobm9ybWFsaXplT3BlcmF0aW9ucyA/IGRlY2xhcmF0aW9uLm1ldGhvZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBleHByZXNzaW9uLm1ldGhvZCkgOiB1bmRlZmluZWQpXG5cbiAgICBpZiAoIW1ldGhvZCkgcmV0dXJuIGZhaWwoXCJVTktOT1dOX01FVEhPRFwiLCBgQ2xhc3MgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBubyBtZXRob2QgJyR7ZXhwcmVzc2lvbi5tZXRob2R9Jy5gLFxuICAgICAgcm9sZUxvY2F0aW9uKGV4cHJlc3Npb24sIFwibWVtYmVyXCIpKVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLm1ldGhvZCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAobWV0aG9kLmlkKVxuICAgIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uYXJndW1lbnRzKSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiTWV0aG9kIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJNRVRIT0RfQVJJVFlfTUlTTUFUQ0hcIixcbiAgICAgICAgYE1ldGhvZCAnJHttZXRob2QubmFtZX0nIGhhcyAke2V4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aH0gYXJndW1lbnRzOyBleHBlY3RlZCAke21ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBtZXRob2QucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT5cbiAgICAgIHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKHBhcmFtZXRlci50eXBlLCBwYXJhbWV0ZXIubG9jYXRpb24sIGZhaWwsIHVuZGVmaW5lZCwgcmVjb3JkcykpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0gPSBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgICBjb25zdCBhY3R1YWwgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWV0aG9kIGFyZ3VtZW50XCIsIHBhcmFtZXRlclR5cGVzW2luZGV4XSlcblxuICAgICAgaWYgKCFzYW1lVHlwZShhY3R1YWwsIHBhcmFtZXRlclR5cGVzW2luZGV4XSkpIHtcbiAgICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYE1ldGhvZCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihwYXJhbWV0ZXJUeXBlc1tpbmRleF0pfS5gLFxuICAgICAgICAgIGV4cHJlc3Npb24uYXJndW1lbnRzW2luZGV4XS5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IHZhbGlkYXRlUmV0dXJuVHlwZVJlZmVyZW5jZShtZXRob2QucmV0dXJuVHlwZSwgbWV0aG9kLmxvY2F0aW9uLCBmYWlsLCByZWNvcmRzKVxuICAgIGNvbnN0IHJlc291cmNlRmxvdyA9IGRlY2xhcmF0aW9uLm93bmVyc2hpcD8ua2luZCA9PSBcIm93bmVkUmVzb3VyY2VcIlxuICAgICAgPyBvd25lZE1ldGhvZFJlc291cmNlRmxvdyhkZWNsYXJhdGlvbiwgbWV0aG9kLCBmYWlsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB7XG4gICAgICBkZWNsYXJhdGlvbklkOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKG1ldGhvZC5pZCksXG4gICAgICBraW5kOiAvKiogQHR5cGUge2NvbnN0fSAqLyAoXCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwiKSxcbiAgICAgIHBhcmFtZXRlclR5cGVzOiBwYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlKSkpLFxuICAgICAgcmV0dXJuVHlwZTogdHlwZUlkZW50aXR5KHJldHVyblR5cGUpLFxuICAgICAgLi4uKHJlc291cmNlRmxvdyA/IHtyZXNvdXJjZUZsb3d9IDoge30pXG4gICAgfVxuXG4gICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIua2luZCA9PSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiICYmIHJlc291cmNlRmxvdykge1xuICAgICAgY29uc3QgZXhwZWN0ZWRNb2RlID0gcmVzb3VyY2VGbG93LmtpbmQgPT0gXCJ0ZXJtaW5hbFwiID8gXCJleGNsdXNpdmVcIiA6IFwic2hhcmVkXCJcblxuICAgICAgaWYgKGV4cHJlc3Npb24ucmVjZWl2ZXIubW9kZSAhPSBleHBlY3RlZE1vZGUpIHtcbiAgICAgICAgZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBJTlZBTElEX1JFU09VUkNFX0JPUlJPVzogT3duZWQgbWV0aG9kIHJlcXVpcmVzIGFuIGltbWVkaWF0ZSAke2V4cGVjdGVkTW9kZX0gcmVjZWl2ZXIgYm9ycm93LmAsXG4gICAgICAgICAgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiAmJiBleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIikge1xuICAgICAgaWYgKCFub3JtYWxpemVPcGVyYXRpb25zKSBmYWlsKFwiSU5WQUxJRF9SRVNPVVJDRV9CT1JST1dcIiwgXCJPd25lZCBtZXRob2QgcmVjZWl2ZXIgcmVxdWlyZXMgYW4gaW1tZWRpYXRlIGJvcnJvdy5cIiwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICAgIGlmIChleHByZXNzaW9uLnJlY2VpdmVyLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGZhaWwoXCJCT1JST1dfRVNDQVBFXCIsIFwiT3duZWQgbWV0aG9kIHJlY2VpdmVyIGJvcnJvdyBtdXN0IG5hbWUgb25lIGltbWVkaWF0ZSBiaW5kaW5nLlwiLCBleHByZXNzaW9uLnJlY2VpdmVyLmxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgZXhwcmVzc2lvbi5yZWNlaXZlciA9IHtcbiAgICAgICAgZXhwcmVzc2lvbjogZXhwcmVzc2lvbi5yZWNlaXZlcixcbiAgICAgICAga2luZDogXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIixcbiAgICAgICAgbG9jYXRpb246IGV4cHJlc3Npb24ucmVjZWl2ZXIubG9jYXRpb24sXG4gICAgICAgIG1vZGU6IHJlc291cmNlRmxvdz8ua2luZCA9PSBcInRlcm1pbmFsXCIgPyBcImV4Y2x1c2l2ZVwiIDogXCJzaGFyZWRcIixcbiAgICAgICAgc291cmNlUHJvdmVuYW5jZTogZXhwcmVzc2lvbi5yZWNlaXZlci5zb3VyY2VQcm92ZW5hbmNlLFxuICAgICAgICB0eXBlOiByZWNlaXZlclR5cGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuICAgIGVsc2UgdmFsaWRhdGVSZWZlcmVuY2VSZXNvbHV0aW9uKGV4cHJlc3Npb24ucmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbCwgXCJtZXRob2RcIilcblxuICAgIHJldHVybiBpc1ZvaWRUeXBlKHJldHVyblR5cGUpID8gXCJ2b2lkXCIgOiByZXR1cm5UeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIlJlY29yZENvbnN0cnVjdGlvblwiKSB7XG4gICAgY29uc3QgcmVjb3JkVHlwZSA9IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKGV4cHJlc3Npb24ucmVjb3JkLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHNjb3BlLnR5cGVQYXJhbWV0ZXJzKVxuXG4gICAgaWYgKHJlY29yZFR5cGUua2luZCAhPSBcIlJlY29yZFR5cGVcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiUmVjb3JkIGNvbnN0cnVjdGlvbiByZXF1aXJlcyBhIG5vbWluYWwgcmVjb3JkIHR5cGUuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGNvbnN0IGRlY2xhcmF0aW9uID0gcmVjb3Jkcy5nZXQocmVjb3JkVHlwZS5kZWNsYXJhdGlvbklkKVxuXG4gICAgaWYgKCFkZWNsYXJhdGlvbikgcmV0dXJuIGZhaWwoXCJVTktOT1dOX1JFQ09SRFwiLCBgVW5rbm93biByZWNvcmQgZGVjbGFyYXRpb24gJyR7cmVjb3JkVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwcmVzc2lvbi5hcmd1bWVudHMpIHx8IGV4cHJlc3Npb24uYXJndW1lbnRzLnNvbWUoKF9hcmd1bWVudCwgaW5kZXgpID0+ICFPYmplY3QuaGFzT3duKGV4cHJlc3Npb24uYXJndW1lbnRzLCBpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJSZWNvcmQgY29uc3RydWN0aW9uIGFyZ3VtZW50cyBtdXN0IGJlIGEgZGVuc2Ugb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aCAhPSBkZWNsYXJhdGlvbi5maWVsZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFpbChcbiAgICAgICAgXCJSRUNPUkRfQVJJVFlfTUlTTUFUQ0hcIixcbiAgICAgICAgYFJlY29yZCAnJHtkZWNsYXJhdGlvbi5uYW1lfScgY29uc3RydWN0aW9uIGhhcyAke2V4cHJlc3Npb24uYXJndW1lbnRzLmxlbmd0aH0gYXJndW1lbnRzOyBleHBlY3RlZCAke2RlY2xhcmF0aW9uLmZpZWxkcy5sZW5ndGh9LmAsXG4gICAgICAgIGV4cHJlc3Npb24ubG9jYXRpb25cbiAgICAgIClcbiAgICB9XG4gICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IHJlY29yZFR5cGVTdWJzdGl0dXRpb25zKHJlY29yZFR5cGUsIGRlY2xhcmF0aW9uKVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdXG4gICAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkc1tpbmRleF1cbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHN1YnN0aXR1dGVWYWx1ZVR5cGUoZmllbGQudHlwZSwgc3Vic3RpdHV0aW9ucylcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgYXJndW1lbnQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGByZWNvcmQgZmllbGQgJyR7ZmllbGQubmFtZX0nYCwgZmllbGRUeXBlXG4gICAgICApXG5cbiAgICAgIGlmICghc2FtZVR5cGUoYWN0dWFsLCBmaWVsZFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBSZWNvcmQgZmllbGQgJyR7ZmllbGQubmFtZX0nIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZpZWxkVHlwZSl9LmAsIGFyZ3VtZW50LmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZWNvcmRUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIk1lbWJlclJlYWRcIikge1xuICAgIGNvbnN0IHJlY2VpdmVyVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLnJlY2VpdmVyLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWVtYmVyIHJlY2VpdmVyXCIpXG5cbiAgICBpZiAocmVjZWl2ZXJUeXBlLmtpbmQgIT0gXCJSZWNvcmRUeXBlXCIpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9NRU1CRVJfUkVDRUlWRVJcIiwgYE1lbWJlciByZWNlaXZlciB0eXBlICR7dHlwZURlc2NyaXB0aW9uKHJlY2VpdmVyVHlwZSl9OyBleHBlY3RlZCByZWNvcmQuYCwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICB9XG4gICAgY29uc3QgZGVjbGFyYXRpb24gPSByZWNvcmRzLmdldChyZWNlaXZlclR5cGUuZGVjbGFyYXRpb25JZClcblxuICAgIGlmICghZGVjbGFyYXRpb24pIHJldHVybiBmYWlsKFwiVU5LTk9XTl9SRUNPUkRcIiwgYFVua25vd24gcmVjb3JkIGRlY2xhcmF0aW9uICcke3JlY2VpdmVyVHlwZS5kZWNsYXJhdGlvbklkfScuYCwgZXhwcmVzc2lvbi5yZWNlaXZlci5sb2NhdGlvbilcbiAgICBjb25zdCBmaWVsZCA9IGRlY2xhcmF0aW9uLmZpZWxkcy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PSBleHByZXNzaW9uLmZpZWxkKSA/P1xuICAgICAgKG5vcm1hbGl6ZU9wZXJhdGlvbnMgPyBkZWNsYXJhdGlvbi5maWVsZHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PSBleHByZXNzaW9uLmZpZWxkKSA6IHVuZGVmaW5lZClcblxuICAgIGlmICghZmllbGQpIGZhaWwoXCJVTktOT1dOX0ZJRUxEXCIsIGBSZWNvcmQgJyR7ZGVjbGFyYXRpb24ubmFtZX0nIGhhcyBubyBmaWVsZCAnJHtleHByZXNzaW9uLmZpZWxkfScuYCwgcm9sZUxvY2F0aW9uKGV4cHJlc3Npb24sIFwibWVtYmVyXCIpKVxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLmZpZWxkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChmaWVsZC5pZClcblxuICAgIHJldHVybiBzdWJzdGl0dXRlVmFsdWVUeXBlKGZpZWxkLnR5cGUsIHJlY29yZFR5cGVTdWJzdGl0dXRpb25zKHJlY2VpdmVyVHlwZSwgZGVjbGFyYXRpb24pKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDYWxsRXhwcmVzc2lvblwiKSB7XG4gICAgY29uc3QgZnVuY3Rpb25EZWNsYXJhdGlvbiA9IGZ1bmN0aW9ucy5nZXQoZXhwcmVzc2lvbi5jYWxsZWUpXG5cbiAgICBpZiAoIWZ1bmN0aW9uRGVjbGFyYXRpb24pIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVU5SRVNPTFZFRF9CSU5ESU5HXCIsIGBVbmtub3duIGZ1bmN0aW9uICcke2V4cHJlc3Npb24uY2FsbGVlfScuYCwgcm9sZUxvY2F0aW9uKGV4cHJlc3Npb24sIFwiY2FsbGVlXCIpKVxuICAgIH1cbiAgICBpZiAoZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoICE9IGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCBjb3VudCBmb3IgJyR7ZXhwcmVzc2lvbi5jYWxsZWV9Jy5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGZ1bmN0aW9uRGVjbGFyYXRpb24pXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gKi9cbiAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gbmV3IE1hcCgpXG4gICAgY29uc3QgcGFyYW1ldGVyVHlwZXMgPSBmdW5jdGlvbkRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHZhbGlkYXRlVmFsdWVUeXBlUmVmZXJlbmNlKFxuICAgICAgcGFyYW1ldGVyLnR5cGUsIHBhcmFtZXRlci5sb2NhdGlvbiwgZmFpbCwgdW5kZWZpbmVkLCByZWNvcmRzLCBkZWNsYXJhdGlvblR5cGVQYXJhbWV0ZXJzXG4gICAgKSlcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0gPSBub3JtYWxpemVPd25lZE1vdmUoZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLCBwYXJhbWV0ZXJUeXBlc1tpbmRleF0sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBleHByZXNzaW9uLmFyZ3VtZW50cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGFyZ3VtZW50ID0gZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdXG4gICAgICBjb25zdCBleHBlY3RlZFR5cGUgPSBwYXJhbWV0ZXJUeXBlc1tpbmRleF1cbiAgICAgIGNvbnN0IGdhdGhlcnNHZW5lcmljRXZpZGVuY2UgPSB0eXBlQ29udGFpbnNBbnlWYXJpYWJsZShleHBlY3RlZFR5cGUpXG5cbiAgICAgIGlmIChnYXRoZXJzR2VuZXJpY0V2aWRlbmNlKSB7XG4gICAgICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZXhwZWN0ZWRUeXBlLCBhcmd1bWVudCwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgICBub3JtYWxpemVPcGVyYXRpb25zKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0dWFsVHlwZSA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICAgICAgYXJndW1lbnQsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjYWxsIGFyZ3VtZW50XCIsIGV4cGVjdGVkVHlwZVxuICAgICAgKVxuXG4gICAgICBpZiAoKGZ1bmN0aW9uRGVjbGFyYXRpb24udHlwZVBhcmFtZXRlcnM/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgaW5mZXJUeXBlQXJndW1lbnRzKGV4cGVjdGVkVHlwZSwgYWN0dWFsVHlwZSwgc3Vic3RpdHV0aW9ucywgYXJndW1lbnQubG9jYXRpb24sIGZhaWwpXG4gICAgICB9IGVsc2UgaWYgKCFzYW1lVHlwZShhY3R1YWxUeXBlLCBleHBlY3RlZFR5cGUpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsVHlwZSl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihleHBlY3RlZFR5cGUpfS5gLCBhcmd1bWVudC5sb2NhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgZnVuY3Rpb25EZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXSkge1xuICAgICAgaWYgKCFzdWJzdGl0dXRpb25zLmhhcygvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmFtZXRlci5pZCkpKSB7XG4gICAgICAgIGNvbnN0IGV2aWRlbmNlRnJlZUluZGV4ID0gcGFyYW1ldGVyVHlwZXMuZmluZEluZGV4KCh0eXBlKSA9PlxuICAgICAgICAgIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAocGFyYW1ldGVyLmlkKSkpXG5cbiAgICAgICAgaWYgKGV2aWRlbmNlRnJlZUluZGV4ID49IDApIHtcbiAgICAgICAgICBmYWlsKFwiR0VORVJJQ19JTkZFUkVOQ0VfRkFJTFVSRVwiLCBcIkNhbm5vdCBpbmZlciBhIHR5cGUgcGFyYW1ldGVyIGZyb20gYW4gZXZpZGVuY2UtZnJlZSBjYWxsIGFyZ3VtZW50LlwiLFxuICAgICAgICAgICAgZXhwcmVzc2lvbi5hcmd1bWVudHNbZXZpZGVuY2VGcmVlSW5kZXhdLmxvY2F0aW9uKVxuICAgICAgICB9XG4gICAgICAgIGZhaWwoXCJHRU5FUklDX0lORkVSRU5DRV9GQUlMVVJFXCIsIGBDYW5ub3QgaW5mZXIgdHlwZSBwYXJhbWV0ZXIgJyR7cGFyYW1ldGVyLm5hbWV9JyBmcm9tIGNhbGwgYXJndW1lbnRzLmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChbLi4uc3Vic3RpdHV0aW9ucy52YWx1ZXMoKV0uc29tZSgodHlwZSkgPT4gY29udGFpbnNPd25lZFR5cGUodHlwZSkpKSB7XG4gICAgICBmYWlsKFwiUkVTT1VSQ0VfQUxJQVNcIiwgXCJPd25lZCByZXNvdXJjZXMgYW5kIHJlZmVyZW5jZXMgY2Fubm90IGJlIGluZmVycmVkIGFzIGdlbmVyaWMgYXJndW1lbnRzLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZnVuY3Rpb25EZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBzdWJzdGl0dXRlVmFsdWVUeXBlKGZ1bmN0aW9uRGVjbGFyYXRpb24ucGFyYW1ldGVyc1tpbmRleF0udHlwZSwgc3Vic3RpdHV0aW9ucylcbiAgICAgIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLmFyZ3VtZW50c1tpbmRleF0sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjYWxsIGFyZ3VtZW50XCIsIGV4cGVjdGVkKVxuXG4gICAgICBpZiAoIXNhbWVUeXBlKGFjdHVhbCwgZXhwZWN0ZWQpKSB7XG4gICAgICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGV4cGVjdGVkKX0uYCwgZXhwcmVzc2lvbi5hcmd1bWVudHNbaW5kZXhdLmxvY2F0aW9uKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXNvbHV0aW9uID0gc2lnbmF0dXJlRm9yKGZ1bmN0aW9uRGVjbGFyYXRpb24sIHJlY29yZHMsIGZhaWwsIHN1YnN0aXR1dGlvbnMpXG5cbiAgICBpZiAobm9ybWFsaXplT3BlcmF0aW9ucykgZXhwcmVzc2lvbi5yZXNvbHV0aW9uID0gcmVzb2x1dGlvblxuICAgIGVsc2UgdmFsaWRhdGVSZXNvbHV0aW9uKGV4cHJlc3Npb24ucmVzb2x1dGlvbiwgcmVzb2x1dGlvbiwgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcbiAgICBjb25zdCByZXR1cm5UeXBlID0gc3Vic3RpdHV0ZVJldHVyblR5cGUodmFsaWRhdGVSZXR1cm5UeXBlUmVmZXJlbmNlKGZ1bmN0aW9uRGVjbGFyYXRpb24ucmV0dXJuVHlwZSxcbiAgICAgIGZ1bmN0aW9uRGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIGRlY2xhcmF0aW9uVHlwZVBhcmFtZXRlcnMpLCBzdWJzdGl0dXRpb25zKVxuXG4gICAgcmV0dXJuIGlzVm9pZFR5cGUocmV0dXJuVHlwZSkgPyBcInZvaWRcIiA6IHJldHVyblR5cGVcbiAgfVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiVW5hcnlFeHByZXNzaW9uXCIpIHtcbiAgICBjb25zdCBvcGVyYW5kID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24ub3BlcmFuZCwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIHVuYXJ5IG9wZXJhbmRcIilcbiAgICBjb25zdCBvcGVyYW5kVHlwZSA9IHNjYWxhck5hbWVGb3JPcGVyYXRpb24ob3BlcmFuZCwgZXhwcmVzc2lvbi5vcGVyYW5kLmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IG5vcm1hbGl6ZU9wZXJhdGlvbnNcbiAgICAgID8gbm9ybWFsaXplVW5hcnlPcGVyYXRpb24oYWRhcHRlZE9wZXJhdGlvbkZvcihleHByZXNzaW9uKSwgb3BlcmFuZFR5cGUsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbiwgZmFpbClcbiAgICAgIDogZXhwcmVzc2lvbi5vcGVyYXRpb25cblxuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBzZXROb3JtYWxpemVkT3BlcmF0aW9uKGV4cHJlc3Npb24sIG9wZXJhdGlvbiwgdW5hcnlPcGVyYXRpb25TaWduYXR1cmVzW29wZXJhdGlvbl0ucmVzdWx0KVxuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gdW5hcnlPcGVyYXRpb25TaWduYXR1cmVzW29wZXJhdGlvbl1cblxuICAgIGlmICghc2lnbmF0dXJlKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFVua25vd24gdW5hcnkgb3BlcmF0aW9uICR7U3RyaW5nKG9wZXJhdGlvbil9LmAsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgaWYgKG9wZXJhbmRUeXBlICE9IHNpZ25hdHVyZS5vcGVyYW5kKSB7XG4gICAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke29wZXJhdGlvbn0gcmVxdWlyZXMgJHtzaWduYXR1cmUub3BlcmFuZH07IHJlY2VpdmVkICR7b3BlcmFuZFR5cGV9LmAsIGV4cHJlc3Npb24ub3BlcmFuZC5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGV4cHJlc3Npb24udHlwZSAhPSBzaWduYXR1cmUucmVzdWx0KSB7XG4gICAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYCR7b3BlcmF0aW9ufSByZXN1bHQgdHlwZSAke1N0cmluZyhleHByZXNzaW9uLnR5cGUpfTsgZXhwZWN0ZWQgJHtzaWduYXR1cmUucmVzdWx0fS5gLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICByZXR1cm4gc2NhbGFyVHlwZShzaWduYXR1cmUucmVzdWx0KVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJDb25kaXRpb25hbEV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGNvbmRpdGlvblR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb25kaXRpb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY29uZGl0aW9uXCIpXG5cbiAgICBpZiAoIWlzU2NhbGFyVHlwZShjb25kaXRpb25UeXBlLCBcImJvb2xlYW5cIikpIHtcbiAgICAgIGZhaWwoXCJOT05fQk9PTEVBTl9DT05ESVRJT05cIiwgYENvbmRpdGlvbmFsIGV4cHJlc3Npb24gY29uZGl0aW9uIHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oY29uZGl0aW9uVHlwZSl9OyBleHBlY3RlZCBib29sZWFuLmAsXG4gICAgICAgIGV4cHJlc3Npb24uY29uZGl0aW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBjb25zdCBjb25zZXF1ZW50U2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgW10pXG4gICAgY29uc3QgYWx0ZXJuYXRlU2NvcGUgPSBjcmVhdGVTY29wZShzY29wZSwgW10pXG5cbiAgICBhcHBseVByZXNlbmNlTmFycm93aW5nKGV4cHJlc3Npb24uY29uZGl0aW9uLCBzY29wZSwgY29uc2VxdWVudFNjb3BlLCB0cnVlKVxuICAgIGFwcGx5UHJlc2VuY2VOYXJyb3dpbmcoZXhwcmVzc2lvbi5jb25kaXRpb24sIHNjb3BlLCBhbHRlcm5hdGVTY29wZSwgZmFsc2UpXG4gICAgY29uc3QgY29uc2VxdWVudFR5cGUgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5jb25zZXF1ZW50LCBjb25zZXF1ZW50U2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIFwiYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGNvbnNlcXVlbnRcIilcbiAgICBjb25zdCBhbHRlcm5hdGVUeXBlID0gaW5mZXJWYWx1ZUV4cHJlc3Npb25UeXBlKGV4cHJlc3Npb24uYWx0ZXJuYXRlLCBhbHRlcm5hdGVTY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLFxuICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucywgXCJhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gYWx0ZXJuYXRlXCIpXG5cbiAgICBpZiAoIXNhbWVUeXBlKGNvbnNlcXVlbnRUeXBlLCBhbHRlcm5hdGVUeXBlKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENvbmRpdGlvbmFsIGV4cHJlc3Npb24gYXJtcyAke3R5cGVEZXNjcmlwdGlvbihjb25zZXF1ZW50VHlwZSl9IGFuZCAke3R5cGVEZXNjcmlwdGlvbihhbHRlcm5hdGVUeXBlKX07IGV4cGVjdGVkIG9uZSBqb2luZWQgdHlwZS5gLFxuICAgICAgICBleHByZXNzaW9uLmFsdGVybmF0ZS5sb2NhdGlvbilcbiAgICB9XG4gICAgUmVmbGVjdC5zZXQoZXhwcmVzc2lvbiwgXCJ0eXBlXCIsIGNvbnNlcXVlbnRUeXBlKVxuXG4gICAgcmV0dXJuIGNvbnNlcXVlbnRUeXBlXG4gIH1cbiAgaWYgKGV4cHJlc3Npb24ua2luZCA9PSBcIkJpbmFyeUV4cHJlc3Npb25cIikge1xuICAgIGNvbnN0IGxlZnQgPSBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZXhwcmVzc2lvbi5sZWZ0LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgYmluYXJ5IG9wZXJhbmRcIilcbiAgICBjb25zdCByaWdodCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShleHByZXNzaW9uLnJpZ2h0LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgYmluYXJ5IG9wZXJhbmRcIilcbiAgICBjb25zdCBsZWZ0VHlwZSA9IHNjYWxhck5hbWVGb3JPcGVyYXRpb24obGVmdCwgZXhwcmVzc2lvbi5sZWZ0LmxvY2F0aW9uLCBmYWlsKVxuICAgIGNvbnN0IHJpZ2h0VHlwZSA9IHNjYWxhck5hbWVGb3JPcGVyYXRpb24ocmlnaHQsIGV4cHJlc3Npb24ucmlnaHQubG9jYXRpb24sIGZhaWwpXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gbm9ybWFsaXplT3BlcmF0aW9uc1xuICAgICAgPyBub3JtYWxpemVCaW5hcnlPcGVyYXRpb24oYWRhcHRlZE9wZXJhdGlvbkZvcihleHByZXNzaW9uKSwgbGVmdFR5cGUsIHJpZ2h0VHlwZSwgZXhwcmVzc2lvbi5sZWZ0LmxvY2F0aW9uLCBleHByZXNzaW9uLnJpZ2h0LmxvY2F0aW9uLCBleHByZXNzaW9uLmxvY2F0aW9uLCBmYWlsKVxuICAgICAgOiBleHByZXNzaW9uLm9wZXJhdGlvblxuXG4gICAgaWYgKG5vcm1hbGl6ZU9wZXJhdGlvbnMpIHNldE5vcm1hbGl6ZWRPcGVyYXRpb24oZXhwcmVzc2lvbiwgb3BlcmF0aW9uLCBiaW5hcnlPcGVyYXRpb25TaWduYXR1cmVzW29wZXJhdGlvbl0ucmVzdWx0KVxuXG4gICAgY29uc3Qgc2lnbmF0dXJlID0gYmluYXJ5T3BlcmF0aW9uU2lnbmF0dXJlc1tvcGVyYXRpb25dXG5cbiAgICBpZiAoIXNpZ25hdHVyZSkgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIGJpbmFyeSBvcGVyYXRpb24gJHtTdHJpbmcob3BlcmF0aW9uKX0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICBpZiAobGVmdFR5cGUgIT0gc2lnbmF0dXJlLmxlZnQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5sZWZ0fSBsZWZ0IG9wZXJhbmQ7IHJlY2VpdmVkICR7bGVmdFR5cGV9LmAsIGV4cHJlc3Npb24ubGVmdC5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKHJpZ2h0VHlwZSAhPSBzaWduYXR1cmUucmlnaHQpIHtcbiAgICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYCR7b3BlcmF0aW9ufSByZXF1aXJlcyAke3NpZ25hdHVyZS5yaWdodH0gcmlnaHQgb3BlcmFuZDsgcmVjZWl2ZWQgJHtyaWdodFR5cGV9LmAsIGV4cHJlc3Npb24ucmlnaHQubG9jYXRpb24pXG4gICAgfVxuICAgIGlmIChleHByZXNzaW9uLnR5cGUgIT0gc2lnbmF0dXJlLnJlc3VsdCkge1xuICAgICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGAke29wZXJhdGlvbn0gcmVzdWx0IHR5cGUgJHtTdHJpbmcoZXhwcmVzc2lvbi50eXBlKX07IGV4cGVjdGVkICR7c2lnbmF0dXJlLnJlc3VsdH0uYCwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuIHNjYWxhclR5cGUoc2lnbmF0dXJlLnJlc3VsdClcbiAgfVxuXG4gIGNvbnN0IHVuZXhwZWN0ZWQgPSAvKiogQHR5cGUge3traW5kOiBzdHJpbmcsIGxvY2F0aW9uOiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufX0gKi8gKGV4cHJlc3Npb24pXG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIHVuZXhwZWN0ZWQua2luZCwgdW5leHBlY3RlZC5sb2NhdGlvbilcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgbWFwIGxheW91dCBhbmQgZml4ZWQgc3RyaW5nIGtleXMgaW5kZXBlbmRlbnRseSBvZiBjb250ZXh0dWFsIHZhbHVlIGluZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBMaXRlcmFsIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5PcmRlcmVkTWFwTGl0ZXJhbH0gZXhwcmVzc2lvbiAtIENhbmRpZGF0ZSBtYXAgbGl0ZXJhbC5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBsZXhpY2FsIHNjb3BlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb24+fSBmdW5jdGlvbnMgLSBNb2R1bGUgZnVuY3Rpb24gc2lnbmF0dXJlcy5cbiAqIEBwYXJhbSB7UmVjb3JkUmVnaXN0cnl9IHJlY29yZHMgLSBSZWNvcmQgZGVjbGFyYXRpb25zIGJ5IGlkZW50aXR5LlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemVPcGVyYXRpb25zIC0gV2hldGhlciB0byBub3JtYWxpemUgZnJvbnRlbmQgaW50ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBpbmZlckNvbGxlY3Rpb25FbGVtZW50cyAtIFdoZXRoZXIgbmVzdGVkIGNvbGxlY3Rpb24gZXZpZGVuY2UgbWF5IGJlIGluZmVycmVkLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuTWFwRW50cnlbXX0gVmFsaWRhdGVkIGRlbnNlIGVudHJpZXMuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlTWFwTGl0ZXJhbEVudHJpZXMoZXhwcmVzc2lvbiwgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCwgbm9ybWFsaXplT3BlcmF0aW9ucyxcbiAgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZW50cmllcykpIHtcbiAgICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgbGl0ZXJhbCBlbnRyaWVzIG11c3QgYmUgYSBkZW5zZSBzb3VyY2Utb3JkZXJlZCBhcnJheS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgfVxuICBpZiAoIWlzRGVuc2VBcnJheShleHByZXNzaW9uLmVudHJpZXMpKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIFwiU3BhcnNlIG1hcCBsaXRlcmFscyBhcmUgb3V0c2lkZSB0aGUgaW1wbGVtZW50ZWQgc3Vic2V0LlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KClcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGV4cHJlc3Npb24uZW50cmllcykge1xuICAgIGlmICghZW50cnkgfHwgZW50cnkua2luZCAhPSBcIk1hcEVudHJ5XCIgfHwgIWVudHJ5LmtleSB8fCBlbnRyeS5rZXkua2luZCAhPSBcIlN0cmluZ0xpdGVyYWxcIikge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJNYXAgZW50cmllcyByZXF1aXJlIGxpdGVyYWwgc3RyaW5nIGtleXMuXCIsIGVudHJ5Py5sb2NhdGlvbiA/PyBleHByZXNzaW9uLmxvY2F0aW9uKVxuICAgIH1cbiAgICBpbmZlclZhbHVlRXhwcmVzc2lvblR5cGUoZW50cnkua2V5LCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgbWFwIGtleVwiLFxuICAgICAgc2NhbGFyVHlwZShcInN0cmluZ1wiKSwgaW5mZXJDb2xsZWN0aW9uRWxlbWVudHMpXG4gICAgaWYgKGlzTnVtZXJpY1N0cmluZyhlbnRyeS5rZXkudmFsdWUpKSB7XG4gICAgICBmYWlsKFwiSU5WQUxJRF9NQVBfS0VZXCIsIFwiTWFwIGluaXRpYWxpemVyIGtleXMgbXVzdCBiZSBub25udW1lcmljIHN0cmluZ3MuXCIsIGVudHJ5LmtleS5sb2NhdGlvbilcbiAgICB9XG4gICAgaWYgKGtleXMuaGFzKGVudHJ5LmtleS52YWx1ZSkpIHtcbiAgICAgIGZhaWwoXCJEVVBMSUNBVEVfTUFQX0tFWVwiLCBgRHVwbGljYXRlICR7ZXhwcmVzc2lvbi5raW5kID09IFwiT3JkZXJlZE1hcExpdGVyYWxcIiA/IFwib3JkZXJlZC1tYXBcIiA6IFwibWFwXCJ9IGtleSAnJHtlbnRyeS5rZXkudmFsdWV9Jy5gLFxuICAgICAgICBlbnRyeS5rZXkubG9jYXRpb24pXG4gICAgfVxuICAgIGtleXMuYWRkKGVudHJ5LmtleS52YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBleHByZXNzaW9uLmVudHJpZXNcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBhcmd1bWVudC1vbmx5IGdlbmVyaWMgZXZpZGVuY2Ugd2hpbGUgZGVmZXJyaW5nIHJlY3Vyc2l2ZWx5IGNvbnRleHR1YWwgbGl0ZXJhbHMuXG4gKiBUaGUgY29tcGxldGUgYXJndW1lbnQgaXMgdmFsaWRhdGVkIGFnYWluc3QgaXRzIGNsb3NlZCBzdWJzdGl0dXRlZCB0eXBlIGFmdGVyIGluZmVyZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gZm9ybWFsIC0gT3BlbiBkZWNsYXJhdGlvbiBwYXJhbWV0ZXIgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQ2FsbCBhcmd1bWVudCBvciBuZXN0ZWQgY29sbGVjdGlvbiB2YWx1ZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZT59IHN1YnN0aXR1dGlvbnMgLSBJbmZlcmVuY2Ugc3RhdGUuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgbGV4aWNhbCBzY29wZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9uPn0gZnVuY3Rpb25zIC0gTW9kdWxlIGZ1bmN0aW9uIHNpZ25hdHVyZXMuXG4gKiBAcGFyYW0ge1JlY29yZFJlZ2lzdHJ5fSByZWNvcmRzIC0gUmVjb3JkIGRlY2xhcmF0aW9ucyBieSBpZGVudGl0eS5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdG8gbm9ybWFsaXplIGZyb250ZW5kIGludGVudC5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbCwgZXhwcmVzc2lvbiwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgbm9ybWFsaXplT3BlcmF0aW9ucykge1xuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiT3B0aW9uYWxOb25lXCIpIHJldHVyblxuICBpZiAoZm9ybWFsLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJPcHRpb25hbFNvbWVcIikge1xuICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLnZhbHVlVHlwZSwgZXhwcmVzc2lvbi52YWx1ZSwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiTGlzdFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0TGl0ZXJhbFwiKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkxpc3QgbGl0ZXJhbCBlbGVtZW50cyBtdXN0IGJlIGEgZGVuc2Ugc291cmNlLW9yZGVyZWQgYXJyYXkuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGlmICghaXNEZW5zZUFycmF5KGV4cHJlc3Npb24uZWxlbWVudHMpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIlNwYXJzZSBsaXN0IGxpdGVyYWxzIGFyZSBvdXRzaWRlIHRoZSBpbXBsZW1lbnRlZCBzdWJzZXQuXCIsIGV4cHJlc3Npb24ubG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBleHByZXNzaW9uLmVsZW1lbnRzKSB7XG4gICAgICBpbmZlckdlbmVyaWNBcmd1bWVudEV2aWRlbmNlKGZvcm1hbC5lbGVtZW50VHlwZSwgZWxlbWVudCwgc3Vic3RpdHV0aW9ucywgc2NvcGUsIGZ1bmN0aW9ucywgcmVjb3JkcywgZmFpbCxcbiAgICAgICAgbm9ybWFsaXplT3BlcmF0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKChmb3JtYWwua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJNYXBMaXRlcmFsXCIpIHx8XG4gICAgKGZvcm1hbC5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJiBleHByZXNzaW9uLmtpbmQgPT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiKSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSB2YWxpZGF0ZU1hcExpdGVyYWxFbnRyaWVzKGV4cHJlc3Npb24sIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIHRydWUpXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGluZmVyR2VuZXJpY0FyZ3VtZW50RXZpZGVuY2UoZm9ybWFsLnZhbHVlVHlwZSwgZW50cnkudmFsdWUsIHN1YnN0aXR1dGlvbnMsIHNjb3BlLCBmdW5jdGlvbnMsIHJlY29yZHMsIGZhaWwsXG4gICAgICAgIG5vcm1hbGl6ZU9wZXJhdGlvbnMpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGFjdHVhbCA9IGluZmVyVmFsdWVFeHByZXNzaW9uVHlwZShcbiAgICBleHByZXNzaW9uLCBzY29wZSwgZnVuY3Rpb25zLCByZWNvcmRzLCBmYWlsLCBub3JtYWxpemVPcGVyYXRpb25zLCBcImEgY2FsbCBhcmd1bWVudFwiLCB1bmRlZmluZWQsIHRydWVcbiAgKVxuXG4gIGluZmVyVHlwZUFyZ3VtZW50cyhmb3JtYWwsIGFjdHVhbCwgc3Vic3RpdHV0aW9ucywgZXhwcmVzc2lvbi5sb2NhdGlvbiwgZmFpbClcbn1cblxuLyoqXG4gKiBVbmlmaWVzIG9uZSBkZWNsYXJhdGlvbi1vd25lZCBmb3JtYWwgdHlwZSB3aXRoIG9uZSBhcmd1bWVudCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBmb3JtYWwgLSBHZW5lcmljIHNpZ25hdHVyZSB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBhY3R1YWwgLSBJbmZlcnJlZCBhcmd1bWVudCB0eXBlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlPn0gc3Vic3RpdHV0aW9ucyAtIEluZmVyZW5jZSBzdGF0ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBcmd1bWVudCBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gRGlhZ25vc3RpYyBjYWxsYmFjay5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLCBhY3R1YWwsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSB7XG4gICAgY29uc3QgcHJpb3IgPSBzdWJzdGl0dXRpb25zLmdldChmb3JtYWwucGFyYW1ldGVySWQpXG5cbiAgICBpZiAocHJpb3IpIHtcbiAgICAgIGlmICghc2FtZVR5cGUocHJpb3IsIGFjdHVhbCkpIHtcbiAgICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX0NPTkZMSUNUXCIsIGBDb25mbGljdGluZyBpbmZlcmVuY2UgZm9yIHR5cGUgcGFyYW1ldGVyICcke2Zvcm1hbC5wYXJhbWV0ZXJJZH0nLmAsIGxvY2F0aW9uKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghKGFjdHVhbC5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIgJiYgYWN0dWFsLnBhcmFtZXRlcklkID09IGZvcm1hbC5wYXJhbWV0ZXJJZCkgJiZcbiAgICAgIHR5cGVDb250YWluc1ZhcmlhYmxlKGFjdHVhbCwgZm9ybWFsLnBhcmFtZXRlcklkKSkge1xuICAgICAgZmFpbChcIkdFTkVSSUNfSU5GRVJFTkNFX1JFQ1VSU0lPTlwiLCBgUmVjdXJzaXZlIGluZmVyZW5jZSBmb3IgdHlwZSBwYXJhbWV0ZXIgJyR7Zm9ybWFsLnBhcmFtZXRlcklkfScuYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIHN1YnN0aXR1dGlvbnMuc2V0KGZvcm1hbC5wYXJhbWV0ZXJJZCwgYWN0dWFsKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCAhPSBhY3R1YWwua2luZCkge1xuICAgIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBDYWxsIGFyZ3VtZW50IHR5cGUgJHt0eXBlRGVzY3JpcHRpb24oYWN0dWFsKX07IGV4cGVjdGVkICR7dHlwZURlc2NyaXB0aW9uKGZvcm1hbCl9LmAsIGxvY2F0aW9uKVxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikge1xuICAgIGlmICghc2FtZVR5cGUoZm9ybWFsLCBhY3R1YWwpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiUmVmZXJlbmNlVHlwZVwiKSB7XG4gICAgaWYgKGZvcm1hbC5kZWNsYXJhdGlvbklkICE9IGFjdHVhbC5kZWNsYXJhdGlvbklkKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgQ2FsbCBhcmd1bWVudCB0eXBlICR7dHlwZURlc2NyaXB0aW9uKGFjdHVhbCl9OyBleHBlY3RlZCAke3R5cGVEZXNjcmlwdGlvbihmb3JtYWwpfS5gLCBsb2NhdGlvbilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgaWYgKGZvcm1hbC5kZWNsYXJhdGlvbklkICE9IGFjdHVhbC5kZWNsYXJhdGlvbklkIHx8IChmb3JtYWwuYXJndW1lbnRzPy5sZW5ndGggPz8gMCkgIT0gKGFjdHVhbC5hcmd1bWVudHM/Lmxlbmd0aCA/PyAwKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYENhbGwgYXJndW1lbnQgdHlwZSAke3R5cGVEZXNjcmlwdGlvbihhY3R1YWwpfTsgZXhwZWN0ZWQgJHt0eXBlRGVzY3JpcHRpb24oZm9ybWFsKX0uYCwgbG9jYXRpb24pXG4gICAgfVxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAoZm9ybWFsLmFyZ3VtZW50cz8ubGVuZ3RoID8/IDApOyBpbmRleCArPSAxKSB7XG4gICAgICBpbmZlclR5cGVBcmd1bWVudHMoLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSAqLyAoZm9ybWFsLmFyZ3VtZW50cz8uW2luZGV4XSksXG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gKi8gKGFjdHVhbC5hcmd1bWVudHM/LltpbmRleF0pLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZvcm1hbC5raW5kID09IFwiTGlzdFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIkxpc3RUeXBlXCIpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLmVsZW1lbnRUeXBlLCBhY3R1YWwuZWxlbWVudFR5cGUsIHN1YnN0aXR1dGlvbnMsIGxvY2F0aW9uLCBmYWlsKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChmb3JtYWwua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLnZhbHVlVHlwZSwgYWN0dWFsLnZhbHVlVHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKChmb3JtYWwua2luZCA9PSBcIk1hcFR5cGVcIiAmJiBhY3R1YWwua2luZCA9PSBcIk1hcFR5cGVcIikgfHxcbiAgICAoZm9ybWFsLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiICYmIGFjdHVhbC5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikpIHtcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLmtleVR5cGUsIGFjdHVhbC5rZXlUeXBlLCBzdWJzdGl0dXRpb25zLCBsb2NhdGlvbiwgZmFpbClcbiAgICBpbmZlclR5cGVBcmd1bWVudHMoZm9ybWFsLnZhbHVlVHlwZSwgYWN0dWFsLnZhbHVlVHlwZSwgc3Vic3RpdHV0aW9ucywgbG9jYXRpb24sIGZhaWwpXG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIG9jY3VycyBjb25zdHJhaW50IGZvciBmaXJzdC1vcmRlciBpbmZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9IHR5cGUgLSBDYW5kaWRhdGUgaW5mZXJyZWQgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbWV0ZXJJZCAtIFBhcmFtZXRlciBiZWluZyBpbmZlcnJlZC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSB0eXBlIHJlY3Vyc2l2ZWx5IGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXIuXG4gKi9cbmZ1bmN0aW9uIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUsIHBhcmFtZXRlcklkKSB7XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUucGFyYW1ldGVySWQgPT0gcGFyYW1ldGVySWRcbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlY29yZFR5cGVcIikgcmV0dXJuIHR5cGUuYXJndW1lbnRzPy5zb21lKChhcmd1bWVudCkgPT4gdHlwZUNvbnRhaW5zVmFyaWFibGUoYXJndW1lbnQsIHBhcmFtZXRlcklkKSkgPz8gZmFsc2VcbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLmVsZW1lbnRUeXBlLCBwYXJhbWV0ZXJJZClcbiAgaWYgKHR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCB0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSB7XG4gICAgcmV0dXJuIHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUua2V5VHlwZSwgcGFyYW1ldGVySWQpIHx8IHR5cGVDb250YWluc1ZhcmlhYmxlKHR5cGUudmFsdWVUeXBlLCBwYXJhbWV0ZXJJZClcbiAgfVxuICBpZiAodHlwZS5raW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiB0eXBlQ29udGFpbnNWYXJpYWJsZSh0eXBlLnZhbHVlVHlwZSwgcGFyYW1ldGVySWQpXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogQXBwbGllcyBzdWJzdGl0dXRpb25zIHRvIGEgdmFsdWUgb3Igdm9pZCByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gdHlwZSAtIE9wZW4gcmV0dXJuIHR5cGUuXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBzdWJzdGl0dXRpb25zIC0gQ2xvc2VkIHN1YnN0aXR1dGlvbnMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gU3Vic3RpdHV0ZWQgcmV0dXJuIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHN1YnN0aXR1dGVSZXR1cm5UeXBlKHR5cGUsIHN1YnN0aXR1dGlvbnMpIHtcbiAgcmV0dXJuIGlzVm9pZFR5cGUodHlwZSkgPyB0eXBlIDogc3Vic3RpdHV0ZVZhbHVlVHlwZSh0eXBlLCBzdWJzdGl0dXRpb25zKVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhhY3Qgc2VtYW50aWMgc2lnbmF0dXJlIGJvdW5kIHRvIG9uZSBkZWNsYXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5GdW5jdGlvbkRlY2xhcmF0aW9ufSBkZWNsYXJhdGlvbiAtIFJlc29sdmVkIGRlY2xhcmF0aW9uLlxuICogQHBhcmFtIHtSZWNvcmRSZWdpc3RyeX0gcmVjb3JkcyAtIFJlY29yZCBkZWNsYXJhdGlvbnMgYnkgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcGFyYW0ge01hcDxzdHJpbmcsIGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGU+fSBbc3Vic3RpdHV0aW9uc10gLSBJbmZlcnJlZCBnZW5lcmljIHN1YnN0aXR1dGlvbnMuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBEZXRhY2hlZCBzaWduYXR1cmUgYmluZGluZy5cbiAqL1xuZnVuY3Rpb24gc2lnbmF0dXJlRm9yKGRlY2xhcmF0aW9uLCByZWNvcmRzLCBmYWlsLCBzdWJzdGl0dXRpb25zID0gbmV3IE1hcCgpKSB7XG4gIGNvbnN0IHR5cGVQYXJhbWV0ZXJzID0gZGVjbGFyYXRpb25UeXBlUGFyYW1ldGVySWRzKGRlY2xhcmF0aW9uKVxuICBjb25zdCBkZWNsYXJlZFBhcmFtZXRlcnMgPSBkZWNsYXJhdGlvbi50eXBlUGFyYW1ldGVycyA/PyBbXVxuICBjb25zdCBwYXJhbWV0ZXJUeXBlcyA9IGRlY2xhcmF0aW9uLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgc3Vic3RpdHV0ZVZhbHVlVHlwZSh2YWxpZGF0ZVZhbHVlVHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSwgcGFyYW1ldGVyLmxvY2F0aW9uLCBmYWlsLCB1bmRlZmluZWQsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKSwgc3Vic3RpdHV0aW9ucykpXG4gIGNvbnN0IHJldHVyblR5cGUgPSBzdWJzdGl0dXRlUmV0dXJuVHlwZShcbiAgICB2YWxpZGF0ZVJldHVyblR5cGVSZWZlcmVuY2UoZGVjbGFyYXRpb24ucmV0dXJuVHlwZSwgZGVjbGFyYXRpb24ubG9jYXRpb24sIGZhaWwsIHJlY29yZHMsIHR5cGVQYXJhbWV0ZXJzKSwgc3Vic3RpdHV0aW9ucylcblxuICByZXR1cm4ge1xuICAgIGRlY2xhcmF0aW9uSWQ6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVjbGFyYXRpb24uaWQpLFxuICAgIGtpbmQ6IFwiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwiLFxuICAgIHBhcmFtZXRlclR5cGVzOiBwYXJhbWV0ZXJUeXBlcy5tYXAoKHR5cGUpID0+IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlKSkpLFxuICAgIHJldHVyblR5cGU6IHR5cGVJZGVudGl0eShyZXR1cm5UeXBlKSxcbiAgICAuLi4oZGVjbGFyZWRQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyB7XG4gICAgICB0eXBlQXJndW1lbnRzOiBkZWNsYXJlZFBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+XG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSgvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNWYWx1ZVR5cGV9ICovIChcbiAgICAgICAgICBzdWJzdGl0dXRpb25zLmdldCgvKiogQHR5cGUge3N0cmluZ30gKi8gKHBhcmFtZXRlci5pZCkpXG4gICAgICAgICkpKSlcbiAgICB9IDoge30pXG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW4gZXh0ZXJuYWxseSBzdXBwbGllZCBjYWxsIGJpbmRpbmcgYWdhaW5zdCB0aGUgZGVjbGFyYXRpb24gY29sbGVjdGVkIGZvciB0aGlzIG1vZHVsZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIC0gQ2FuZGlkYXRlIGNhbGwgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSBleHBlY3RlZCAtIEV4YWN0IGRlY2xhcmF0aW9uIHNpZ25hdHVyZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDYWxsIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVzb2x1dGlvbihhY3R1YWwsIGV4cGVjdGVkLCBsb2NhdGlvbiwgZmFpbCkge1xuICBjb25zdCBleHBlY3RlZEtleXMgPSBleHBlY3RlZC50eXBlQXJndW1lbnRzID8gXCJkZWNsYXJhdGlvbklkLGtpbmQscGFyYW1ldGVyVHlwZXMscmV0dXJuVHlwZSx0eXBlQXJndW1lbnRzXCIgOlxuICAgIFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJldHVyblR5cGVcIlxuXG4gIGlmICghYWN0dWFsIHx8IHR5cGVvZiBhY3R1YWwgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGFjdHVhbCkgfHxcbiAgICBPYmplY3Qua2V5cyhhY3R1YWwpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBleHBlY3RlZEtleXMpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgaXMgbWlzc2luZyBhbiBleGFjdCByZXNvbHZlZCBmdW5jdGlvbiBzaWduYXR1cmUuXCIsIGxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlfSAqLyAoYWN0dWFsKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBcIlJlc29sdmVkRnVuY3Rpb25TaWduYXR1cmVcIiB8fCB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgIT0gXCJzdHJpbmdcIiB8fFxuICAgICFBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcykgfHwgIXZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS5yZXR1cm5UeXBlLCB0cnVlKSB8fFxuICAgIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IGV4cGVjdGVkLmRlY2xhcmF0aW9uSWQgfHxcbiAgICAhc2FtZVR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgZXhwZWN0ZWQucmV0dXJuVHlwZSkgfHwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgcmVzb2x1dGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgZGVjbGFyYXRpb24gc2lnbmF0dXJlLlwiLCBsb2NhdGlvbilcbiAgfVxuICBpZiAoZXhwZWN0ZWQudHlwZUFyZ3VtZW50cykge1xuICAgIGNvbnN0IGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMgPSBjYW5kaWRhdGUudHlwZUFyZ3VtZW50c1xuXG4gICAgaWYgKCFpc0RlbnNlQXJyYXkoY2FuZGlkYXRlVHlwZUFyZ3VtZW50cykgfHwgY2FuZGlkYXRlVHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZXhwZWN0ZWQudHlwZUFyZ3VtZW50cy5sZW5ndGggfHxcbiAgICAgIGNhbmRpZGF0ZVR5cGVBcmd1bWVudHMuc29tZSgodHlwZSwgaW5kZXgpID0+XG4gICAgICAgICF2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBmYWxzZSkgfHwgIXNhbWVUeXBlSWRlbnRpdHkodHlwZSwgZXhwZWN0ZWQudHlwZUFyZ3VtZW50cz8uW2luZGV4XSkpKSB7XG4gICAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIkNhbGwgcmVzb2x1dGlvbiBkb2VzIG5vdCBtYXRjaCBpdHMgaW5mZXJyZWQgdHlwZSBhcmd1bWVudHMuXCIsIGxvY2F0aW9uKVxuICAgIH1cbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHR5cGUgPSBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXNbaW5kZXhdXG5cbiAgICBpZiAoIU9iamVjdC5oYXNPd24oY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLCBpbmRleCkgfHwgIXZhbGlkVHlwZUlkZW50aXR5KHR5cGUsIGZhbHNlKSB8fFxuICAgICAgIXNhbWVUeXBlSWRlbnRpdHkodHlwZSwgZXhwZWN0ZWQucGFyYW1ldGVyVHlwZXNbaW5kZXhdKSkge1xuICAgICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJDYWxsIHJlc29sdXRpb24gZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmF0aW9uIHNpZ25hdHVyZS5cIiwgbG9jYXRpb24pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGV4YWN0IGNhbGxlci1vd25lZCBjb25zdHJ1Y3RvciBvciBtZXRob2QgcmVzb2x1dGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gYWN0dWFsIC0gQ2FuZGlkYXRlIHJlc29sdXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZSB8IGltcG9ydChcIi4vdHlwZXMuanNcIikuUmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IGV4cGVjdGVkIC0gRXhhY3QgcmVzb2x1dGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeHByZXNzaW9uIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHBhcmFtIHtcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwifSByb2xlIC0gUmVzb2x1dGlvbiByb2xlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUmVmZXJlbmNlUmVzb2x1dGlvbihhY3R1YWwsIGV4cGVjdGVkLCBsb2NhdGlvbiwgZmFpbCwgcm9sZSkge1xuICBjb25zdCBleHBlY3RlZE1ldGhvZCA9IHJvbGUgPT0gXCJtZXRob2RcIiA/IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5SZXNvbHZlZE1ldGhvZFNpZ25hdHVyZX0gKi8gKGV4cGVjdGVkKSA6IHVuZGVmaW5lZFxuICBjb25zdCBleHBlY3RlZEtleXMgPSByb2xlID09IFwiY29uc3RydWN0b3JcIiA/IFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzXCIgOlxuICAgIGV4cGVjdGVkTWV0aG9kPy5yZXNvdXJjZUZsb3cgPyBcImRlY2xhcmF0aW9uSWQsa2luZCxwYXJhbWV0ZXJUeXBlcyxyZXNvdXJjZUZsb3cscmV0dXJuVHlwZVwiIDpcbiAgICAgIFwiZGVjbGFyYXRpb25JZCxraW5kLHBhcmFtZXRlclR5cGVzLHJldHVyblR5cGVcIlxuXG4gIGlmICghYWN0dWFsIHx8IHR5cGVvZiBhY3R1YWwgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGFjdHVhbCkgfHwgT2JqZWN0LmtleXMoYWN0dWFsKS5zb3J0KCkuam9pbihcIixcIikgIT0gZXhwZWN0ZWRLZXlzKSB7XG4gICAgZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgYFJlZmVyZW5jZSAke3JvbGV9IGNhbGwgaXMgbWlzc2luZyBhbiBleGFjdCByZXNvbHZlZCAke3JvbGV9IHNpZ25hdHVyZS5gLCBsb2NhdGlvbilcbiAgfVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoYWN0dWFsKVxuXG4gIGlmIChjYW5kaWRhdGUua2luZCAhPSBleHBlY3RlZC5raW5kIHx8IGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkICE9IGV4cGVjdGVkLmRlY2xhcmF0aW9uSWQgfHxcbiAgICAhaXNEZW5zZUFycmF5KGNhbmRpZGF0ZS5wYXJhbWV0ZXJUeXBlcykgfHwgY2FuZGlkYXRlLnBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBleHBlY3RlZC5wYXJhbWV0ZXJUeXBlcy5sZW5ndGggfHxcbiAgICBjYW5kaWRhdGUucGFyYW1ldGVyVHlwZXMuc29tZSgodHlwZSwgaW5kZXgpID0+ICF2YWxpZFR5cGVJZGVudGl0eSh0eXBlLCBmYWxzZSkgfHxcbiAgICAgICFzYW1lVHlwZUlkZW50aXR5KHR5cGUsIGV4cGVjdGVkLnBhcmFtZXRlclR5cGVzW2luZGV4XSkpIHx8XG4gICAgcm9sZSA9PSBcIm1ldGhvZFwiICYmICghdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnJldHVyblR5cGUsIHRydWUpIHx8XG4gICAgICAhc2FtZVR5cGVJZGVudGl0eShjYW5kaWRhdGUucmV0dXJuVHlwZSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlJlc29sdmVkTWV0aG9kU2lnbmF0dXJlfSAqLyAoZXhwZWN0ZWQpLnJldHVyblR5cGUpIHx8XG4gICAgICBKU09OLnN0cmluZ2lmeShjYW5kaWRhdGUucmVzb3VyY2VGbG93KSAhPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZE1ldGhvZD8ucmVzb3VyY2VGbG93KSkpIHtcbiAgICBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgUmVzb2x2ZWQgJHtyb2xlfSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggaXRzIGRlY2xhcmF0aW9uLmAsIGxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogTWFrZXMgYSBzb3VyY2UgaWRlbnRpZmllcidzIG93bmVyc2hpcCB0cmFuc2ZlciBleHBsaWNpdCBpbiBub3JtYWxpemVkIElSLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGV4cHJlc3Npb24gLSBDYW5kaWRhdGUgdHJhbnNmZXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gZXhwZWN0ZWQgLSBEZXN0aW5hdGlvbiB0eXBlLlxuICogQHBhcmFtIHtib29sZWFufSBub3JtYWxpemUgLSBXaGV0aGVyIHBhcnNlciBpbnRlbnQgbWF5IGJlIG5vcm1hbGl6ZWQuXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IEV4cGxpY2l0IGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU93bmVkTW92ZShleHByZXNzaW9uLCBleHBlY3RlZCwgbm9ybWFsaXplLCBmYWlsKSB7XG4gIGlmIChleHBlY3RlZC5raW5kICE9IFwiT3duZWRSZXNvdXJjZVR5cGVcIiAmJiBleHBlY3RlZC5raW5kICE9IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBleHByZXNzaW9uXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJPd25lZE1vdmVFeHByZXNzaW9uXCIpIHJldHVybiBleHByZXNzaW9uXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJQcml2YXRlRmllbGRSZWFkXCIpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfVFJBTlNGRVJcIiwgXCJQcml2YXRlIHJlc291cmNlIGZpZWxkcyBjYW5ub3QgYmUgbW92ZWQgb3IgZXhwb3NlZDsgdHJhbnNmZXIgdGhlIG93bmluZyByZWZlcmVuY2UuXCIsXG4gICAgICBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG4gIGlmIChleHByZXNzaW9uLmtpbmQgIT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoIW5vcm1hbGl6ZSkgcmV0dXJuIGZhaWwoXCJSRVNPVVJDRV9NT1ZFX1JFUVVJUkVEXCIsIFwiT3duZWQgdHJhbnNmZXIgcmVxdWlyZXMgYW4gZXhwbGljaXQgbW92ZSBleHByZXNzaW9uLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuXG4gIHJldHVybiB7XG4gICAgZXhwcmVzc2lvbixcbiAgICBraW5kOiBcIk93bmVkTW92ZUV4cHJlc3Npb25cIixcbiAgICBsb2NhdGlvbjogZXhwcmVzc2lvbi5sb2NhdGlvbixcbiAgICBzb3VyY2VQcm92ZW5hbmNlOiBleHByZXNzaW9uLnNvdXJjZVByb3ZlbmFuY2UsXG4gICAgdHlwZTogZXhwZWN0ZWRcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzaWZpZXMgdGhlIGRlbGliZXJhdGVseSBib3VuZGVkIFRhc2sgMDM0IHJlY2VpdmVyIHRyYW5zaXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQ2xhc3NEZWNsYXJhdGlvbn0gZGVjbGFyYXRpb24gLSBPd25lZCBjbGFzcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NZXRob2REZWNsYXJhdGlvbn0gbWV0aG9kIC0gQ2FuZGlkYXRlIG1ldGhvZC5cbiAqIEBwYXJhbSB7U2VtYW50aWNGYWlsfSBmYWlsIC0gTG9jYXRlZCBmYWlsdXJlLlxuICogQHJldHVybnMge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gUmVjZWl2ZXIgdHJhbnNpdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3duZWRNZXRob2RSZXNvdXJjZUZsb3coZGVjbGFyYXRpb24sIG1ldGhvZCwgZmFpbCkge1xuICBjb25zdCBlZmZlY3RTdGF0ZW1lbnRzID0gbWV0aG9kLmJvZHkuc3RhdGVtZW50cy5mbGF0TWFwKChzdGF0ZW1lbnQpID0+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gc3RhdGVtZW50LmtpbmQgPT0gXCJFeHByZXNzaW9uU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJSZXR1cm5TdGF0ZW1lbnRcIiA/IHN0YXRlbWVudC5leHByZXNzaW9uIDpcbiAgICAgIHN0YXRlbWVudC5raW5kID09IFwiTG9jYWxEZWNsYXJhdGlvblwiID8gc3RhdGVtZW50LmluaXRpYWxpemVyIDogdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gZXhwcmVzc2lvbj8ua2luZCA9PSBcIkVmZmVjdENhbGxFeHByZXNzaW9uXCIgPyBbZXhwcmVzc2lvbl0gOiBbXVxuICB9KVxuICBjb25zdCBhbGxFZmZlY3RzID0gbWV0aG9kRWZmZWN0RXhwcmVzc2lvbnMobWV0aG9kLmJvZHkpXG5cbiAgaWYgKGFsbEVmZmVjdHMubGVuZ3RoID09IDApIHJldHVybiB7a2luZDogXCJwcmVzZXJ2ZVwifVxuICBpZiAobWV0aG9kLmJvZHkuc3RhdGVtZW50cy5sZW5ndGggIT0gMSB8fCBlZmZlY3RTdGF0ZW1lbnRzLmxlbmd0aCAhPSAxIHx8IGFsbEVmZmVjdHMubGVuZ3RoICE9IDEgfHxcbiAgICBhbGxFZmZlY3RzWzBdICE9PSBlZmZlY3RTdGF0ZW1lbnRzWzBdKSB7XG4gICAgcmV0dXJuIGZhaWwoXCJVTlNVUFBPUlRFRF9TVEFURU1FTlRcIixcbiAgICAgIGBPd25lZCBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBtdXN0IGNvbnRhaW4gb25lIGRpcmVjdCByZXNvdXJjZSBvcGVyYXRpb24gb3Igb25seSBwdXJlIHN0YXRlbWVudHMuYCwgbWV0aG9kLmxvY2F0aW9uKVxuICB9XG4gIGNvbnN0IG9wZXJhdGlvbiA9IGVmZmVjdFN0YXRlbWVudHNbMF1cbiAgY29uc3QgZmxvdyA9IG9wZXJhdGlvbi5yZXNvbHV0aW9uLnJlc291cmNlRmxvd1xuXG4gIGlmIChmbG93LmtpbmQgPT0gXCJub25lXCIgfHwgZmxvdy5raW5kID09IFwiYWNxdWlyZVwiKSByZXR1cm4ge2tpbmQ6IFwicHJlc2VydmVcIn1cbiAgY29uc3QgYXJndW1lbnQgPSBvcGVyYXRpb24uYXJndW1lbnRzW2Zsb3cucGFyYW1ldGVySW5kZXhdXG5cbiAgY29uc3Qgb3duZWQgPSBkZWNsYXJhdGlvbi5vd25lcnNoaXA/LmtpbmQgPT0gXCJvd25lZFJlc291cmNlXCIgPyBkZWNsYXJhdGlvbi5vd25lcnNoaXAgOiB1bmRlZmluZWRcbiAgY29uc3QgYm9ycm93ZWRQYXJhbWV0ZXJOYW1lID0gYXJndW1lbnQ/LmtpbmQgPT0gXCJPd25lZEJvcnJvd0V4cHJlc3Npb25cIiAmJiBhcmd1bWVudC5leHByZXNzaW9uLmtpbmQgPT0gXCJJZGVudGlmaWVyRXhwcmVzc2lvblwiXG4gICAgPyBhcmd1bWVudC5leHByZXNzaW9uLm5hbWUgOiB1bmRlZmluZWRcbiAgY29uc3QgYm9ycm93ZWRQYXJhbWV0ZXIgPSBib3Jyb3dlZFBhcmFtZXRlck5hbWUgIT09IHVuZGVmaW5lZCAmJlxuICAgIG1ldGhvZC5wYXJhbWV0ZXJzLnNvbWUoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLm5hbWUgPT0gYm9ycm93ZWRQYXJhbWV0ZXJOYW1lICYmIGNvbnRhaW5zT3duZWRUeXBlKHBhcmFtZXRlci50eXBlKSlcblxuICBpZiAoYm9ycm93ZWRQYXJhbWV0ZXIpIHJldHVybiB7a2luZDogXCJwcmVzZXJ2ZVwifVxuXG4gIGlmICghYXJndW1lbnQgfHwgYXJndW1lbnQua2luZCAhPSBcIk93bmVkQm9ycm93RXhwcmVzc2lvblwiIHx8IGFyZ3VtZW50LmV4cHJlc3Npb24ua2luZCAhPSBcIlByaXZhdGVGaWVsZFJlYWRcIiB8fFxuICAgIGFyZ3VtZW50LmV4cHJlc3Npb24uZmllbGQgIT0gb3duZWQ/LmZpZWxkSWQpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfUkVTT1VSQ0VfQk9SUk9XXCIsIGBPd25lZCBtZXRob2QgJyR7bWV0aG9kLm5hbWV9JyBtdXN0IG9wZXJhdGUgb24gaXRzIHByaXZhdGUgcmVzb3VyY2UgZmllbGQuYCwgb3BlcmF0aW9uLmxvY2F0aW9uKVxuICB9XG4gIHJldHVybiB7a2luZDogZmxvdy5raW5kID09IFwiY2xvc2VcIiA/IFwidGVybWluYWxcIiA6IFwicHJlc2VydmVcIiwgdGVybWluYWxGYWlsdXJlSWQ6IGZsb3cudGVybWluYWxGYWlsdXJlSWR9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgZXZlcnkgaG9zdC1lZmZlY3Qgc2l0ZSBuZXN0ZWQgaW4gb25lIG93bmVkIG1ldGhvZCBib2R5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkJsb2NrfSBibG9jayAtIE1ldGhvZCBib2R5LlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbltdfSBFZmZlY3RmdWwgZXhwcmVzc2lvbnMuXG4gKi9cbmZ1bmN0aW9uIG1ldGhvZEVmZmVjdEV4cHJlc3Npb25zKGJsb2NrKSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uW119ICovXG4gIGNvbnN0IGVmZmVjdHMgPSBbXVxuICBjb25zdCBwZW5kaW5nID0gWy8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGJsb2NrKV1cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQoKVxuXG4gIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZSA9IHBlbmRpbmcucG9wKClcblxuICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgc2Vlbi5oYXModmFsdWUpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKHZhbHVlKVxuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgKFJlZmxlY3QuZ2V0KHZhbHVlLCBcImtpbmRcIikgPT0gXCJFZmZlY3RDYWxsRXhwcmVzc2lvblwiIHx8XG4gICAgICB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsIFwiZWZmZWN0U2l0ZUlkXCIpID09IFwic3RyaW5nXCIpKSB7XG4gICAgICBlZmZlY3RzLnB1c2goLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259ICovICh2YWx1ZSkpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgaWYgKFtcImxvY2F0aW9uXCIsIFwicmVzb2x1dGlvblwiLCBcInNvdXJjZVByb3ZlbmFuY2VcIl0uaW5jbHVkZXMoa2V5KSkgY29udGludWVcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkKSkgcGVuZGluZy5wdXNoKC4uLmNoaWxkKVxuICAgICAgZWxzZSBpZiAoY2hpbGQgJiYgdHlwZW9mIGNoaWxkID09IFwib2JqZWN0XCIpIHBlbmRpbmcucHVzaChjaGlsZClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVmZmVjdHNcbn1cblxuLyoqXG4gKiBSZWh5ZHJhdGVzIGEgY2xvc2VkIGNhcGFiaWxpdHkgdHlwZSBpZGVudGl0eSBmb3Igb3JkaW5hcnkgZXhwcmVzc2lvbiBjaGVja3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IGlkZW50aXR5IC0gQ2xvc2VkIGlkZW50aXR5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERpYWdub3N0aWMgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIExvY2F0ZWQgZmFpbHVyZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVmFsdWVUeXBlfSBWYWx1ZSB0eXBlLlxuICovXG5mdW5jdGlvbiBpZGVudGl0eUFzVmFsdWVUeXBlKGlkZW50aXR5LCBsb2NhdGlvbiwgZmFpbCkge1xuICBpZiAodHlwZW9mIGlkZW50aXR5ID09IFwic3RyaW5nXCIpIHtcbiAgICBpZiAoIWlzU2NhbGFyVHlwZU5hbWUoaWRlbnRpdHkpKSByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJWb2lkIG9yIGludmFsaWQgaWRlbnRpdHkgdXNlZCBhcyBhbiBlZmZlY3QgdmFsdWUgdHlwZS5cIiwgbG9jYXRpb24pXG4gICAgcmV0dXJuIHNjYWxhclR5cGUoaWRlbnRpdHkpXG4gIH1cbiAgaWYgKCFpZGVudGl0eSB8fCB0eXBlb2YgaWRlbnRpdHkgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGlkZW50aXR5KSkge1xuICAgIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBcIk1hbGZvcm1lZCBlZmZlY3QgdHlwZSBpZGVudGl0eS5cIiwgbG9jYXRpb24pXG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtFeGNsdWRlPGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHksIHN0cmluZz59ICovIChpZGVudGl0eSlcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2VJZDogY2FuZGlkYXRlLnJlc291cmNlSWR9XG4gIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkLCBraW5kOiBcIk93bmVkUmVmZXJlbmNlVHlwZVwifVxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IGlkZW50aXR5QXNWYWx1ZVR5cGUoY2FuZGlkYXRlLnZhbHVlVHlwZSwgbG9jYXRpb24sIGZhaWwpfVxuICByZXR1cm4gZmFpbChcIlRZUEVfTUlTTUFUQ0hcIiwgXCJVbnN1cHBvcnRlZCBlZmZlY3QgdHlwZSBpZGVudGl0eS5cIiwgbG9jYXRpb24pXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzZW1hbnRpYyB0eXBlIHRvIGl0cyBkZXRhY2hlZCBjYWxsLXJlc29sdXRpb24gaWRlbnRpdHkuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBWYWxpZGF0ZWQgc2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkZ1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSBEZXRhY2hlZCBpZGVudGl0eS5cbiAqL1xuZnVuY3Rpb24gdHlwZUlkZW50aXR5KHR5cGUpIHtcbiAgaWYgKHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIikgcmV0dXJuIHR5cGUubmFtZVxuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIpIHJldHVybiB7a2luZDogXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIiwgcGFyYW1ldGVySWQ6IHR5cGUucGFyYW1ldGVySWR9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWNvcmRUeXBlXCIpIHJldHVybiB7XG4gICAgZGVjbGFyYXRpb25JZDogdHlwZS5kZWNsYXJhdGlvbklkLFxuICAgIGtpbmQ6IFwiUmVjb3JkVHlwZVwiLFxuICAgIC4uLih0eXBlLmFyZ3VtZW50cyA/IHthcmd1bWVudHM6IHR5cGUuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+XG4gICAgICAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkoYXJndW1lbnQpKSl9IDoge30pXG4gIH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIHtkZWNsYXJhdGlvbklkOiB0eXBlLmRlY2xhcmF0aW9uSWQsIGtpbmQ6IFwiUmVmZXJlbmNlVHlwZVwifVxuICBpZiAodHlwZS5raW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIikgcmV0dXJuIHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHR5cGUucmVzb3VyY2VJZH1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4ge2RlY2xhcmF0aW9uSWQ6IHR5cGUuZGVjbGFyYXRpb25JZCwga2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIkxpc3RUeXBlXCIpIHJldHVybiB7ZWxlbWVudFR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmVsZW1lbnRUeXBlKSksIGtpbmQ6IFwiTGlzdFR5cGVcIn1cbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4ge2tpbmQ6IFwiT3B0aW9uYWxUeXBlXCIsIHZhbHVlVHlwZTogLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZUlkZW50aXR5fSAqLyAodHlwZUlkZW50aXR5KHR5cGUudmFsdWVUeXBlKSl9XG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPcmRlcmVkTWFwVHlwZVwiKSByZXR1cm4ge1xuICAgIGtleVR5cGU6IC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVJZGVudGl0eX0gKi8gKHR5cGVJZGVudGl0eSh0eXBlLmtleVR5cGUpKSxcbiAgICBraW5kOiBcIk9yZGVyZWRNYXBUeXBlXCIsXG4gICAgb3JkZXI6IFwiaW5zZXJ0aW9uXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBrZXlUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS5rZXlUeXBlKSksXG4gICAga2luZDogXCJNYXBUeXBlXCIsXG4gICAgdmFsdWVUeXBlOiAvKiogQHR5cGUge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlSWRlbnRpdHl9ICovICh0eXBlSWRlbnRpdHkodHlwZS52YWx1ZVR5cGUpKVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIG9uZSBleHRlcm5hbGx5IHN1cHBsaWVkIHJlY3Vyc2l2ZSB0eXBlIGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSB0eXBlIC0gQ2FuZGlkYXRlIGlkZW50aXR5LlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd1ZvaWQgLSBXaGV0aGVyIHZvaWQgaXMgcGVybWl0dGVkLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gQWN0aXZlIHJlY3Vyc2lvbiBwYXRoLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGlkZW50aXR5IGlzIGNsb3NlZCBhbmQgYWN5Y2xpYy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRUeXBlSWRlbnRpdHkodHlwZSwgYWxsb3dWb2lkLCBzZWVuID0gbmV3IFNldCgpKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PSBcInN0cmluZ1wiKSByZXR1cm4gaXNTY2FsYXJUeXBlTmFtZSh0eXBlKSB8fCBhbGxvd1ZvaWQgJiYgdHlwZSA9PSBcInZvaWRcIlxuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcblxuICBzZWVuLmFkZCh0eXBlKVxuICBjb25zdCBjYW5kaWRhdGUgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodHlwZSlcbiAgbGV0IHZhbGlkID0gZmFsc2VcblxuICBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJMaXN0VHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwiZWxlbWVudFR5cGUsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUuZWxlbWVudFR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiTWFwVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIHZhbGlkVHlwZUlkZW50aXR5KGNhbmRpZGF0ZS52YWx1ZVR5cGUsIGZhbHNlLCBzZWVuKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIiAmJlxuICAgIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2V5VHlwZSxraW5kLG9yZGVyLHZhbHVlVHlwZVwiKSB7XG4gICAgdmFsaWQgPSBjYW5kaWRhdGUua2V5VHlwZSA9PSBcInN0cmluZ1wiICYmIGNhbmRpZGF0ZS5vcmRlciA9PSBcImluc2VydGlvblwiICYmXG4gICAgICB2YWxpZFR5cGVJZGVudGl0eShjYW5kaWRhdGUudmFsdWVUeXBlLCBmYWxzZSwgc2VlbilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCx2YWx1ZVR5cGVcIikge1xuICAgIHZhbGlkID0gdmFsaWRUeXBlSWRlbnRpdHkoY2FuZGlkYXRlLnZhbHVlVHlwZSwgZmFsc2UsIHNlZW4pICYmXG4gICAgICAhKGNhbmRpZGF0ZS52YWx1ZVR5cGUgJiYgdHlwZW9mIGNhbmRpZGF0ZS52YWx1ZVR5cGUgPT0gXCJvYmplY3RcIiAmJiBSZWZsZWN0LmdldChjYW5kaWRhdGUudmFsdWVUeXBlLCBcImtpbmRcIikgPT0gXCJPcHRpb25hbFR5cGVcIilcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiICYmIE9iamVjdC5rZXlzKGNhbmRpZGF0ZSkuc29ydCgpLmpvaW4oXCIsXCIpID09IFwia2luZCxwYXJhbWV0ZXJJZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLnBhcmFtZXRlcklkID09IFwic3RyaW5nXCIgJiYgL14oPzpbYS16XVthLXowLTkuXy1dKiMpPyg/OnJlY29yZHxmdW5jdGlvbik6WzAtOV0rOnR5cGU6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLnBhcmFtZXRlcklkKVxuICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5raW5kID09IFwiUmVjb3JkVHlwZVwiICYmXG4gICAgW1wiYXJndW1lbnRzLGRlY2xhcmF0aW9uSWQsa2luZFwiLCBcImRlY2xhcmF0aW9uSWQsa2luZFwiXS5pbmNsdWRlcyhPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSkpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVBcmd1bWVudHMgPSBjYW5kaWRhdGUuYXJndW1lbnRzXG5cbiAgICB2YWxpZCA9IHR5cGVvZiBjYW5kaWRhdGUuZGVjbGFyYXRpb25JZCA9PSBcInN0cmluZ1wiICYmIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9yZWNvcmQ6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpICYmXG4gICAgICAoY2FuZGlkYXRlQXJndW1lbnRzID09PSB1bmRlZmluZWQgfHwgaXNEZW5zZUFycmF5KGNhbmRpZGF0ZUFyZ3VtZW50cykgJiZcbiAgICAgICAgY2FuZGlkYXRlQXJndW1lbnRzLmV2ZXJ5KChhcmd1bWVudCkgPT4gdmFsaWRUeXBlSWRlbnRpdHkoYXJndW1lbnQsIGZhbHNlLCBzZWVuKSkpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJkZWNsYXJhdGlvbklkLGtpbmRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5kZWNsYXJhdGlvbklkID09IFwic3RyaW5nXCIgJiZcbiAgICAgIC9eKD86W2Etel1bYS16MC05Ll8tXSojKT9jbGFzczpbMC05XSskL3UudGVzdChjYW5kaWRhdGUuZGVjbGFyYXRpb25JZClcbiAgfSBlbHNlIGlmIChjYW5kaWRhdGUua2luZCA9PSBcIk93bmVkUmVzb3VyY2VUeXBlXCIgJiYgT2JqZWN0LmtleXMoY2FuZGlkYXRlKS5zb3J0KCkuam9pbihcIixcIikgPT0gXCJraW5kLHJlc291cmNlSWRcIikge1xuICAgIHZhbGlkID0gdHlwZW9mIGNhbmRpZGF0ZS5yZXNvdXJjZUlkID09IFwic3RyaW5nXCIgJiYgL14oPzptb2R1bGU6WzAtOV0rXFwvKT9jYXBhYmlsaXR5OlswLTldK1xcL3Jlc291cmNlOlswLTldKyQvdVxuICAgICAgLnRlc3QoY2FuZGlkYXRlLnJlc291cmNlSWQpXG4gIH0gZWxzZSBpZiAoY2FuZGlkYXRlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIiAmJiBPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSA9PSBcImRlY2xhcmF0aW9uSWQsa2luZFwiKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQgPT0gXCJzdHJpbmdcIiAmJiAvXig/OlthLXpdW2EtejAtOS5fLV0qIyk/Y2xhc3M6WzAtOV0rJC91LnRlc3QoY2FuZGlkYXRlLmRlY2xhcmF0aW9uSWQpXG4gIH1cbiAgc2Vlbi5kZWxldGUodHlwZSlcblxuICByZXR1cm4gdmFsaWRcbn1cblxuLyoqXG4gKiBDaGVja3MgYXJyYXkgaWRlbnRpdHkgd2l0aG91dCByZWx5aW5nIG9uIGl0ZXJhdGlvbiBtZXRob2RzIHRoYXQgc2tpcCBzcGFyc2Ugc2xvdHMuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIGFycmF5LlxuICogQHJldHVybnMge3ZhbHVlIGlzIHVua25vd25bXX0gV2hldGhlciBldmVyeSBpbmRleGVkIHNsb3QgaXMgcHJlc2VudC5cbiAqL1xuZnVuY3Rpb24gaXNEZW5zZUFycmF5KHZhbHVlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiBmYWxzZVxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24odmFsdWUsIGluZGV4KSkgcmV0dXJuIGZhbHNlXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBjbG9zZWQgdHlwZSBpZGVudGl0aWVzIHN0cnVjdHVyYWxseS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gbGVmdCAtIEZpcnN0IGlkZW50aXR5LlxuICogQHBhcmFtIHt1bmtub3dufSByaWdodCAtIFNlY29uZCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBpZGVudGl0aWVzIGFyZSBlcXVhbC5cbiAqL1xuZnVuY3Rpb24gc2FtZVR5cGVJZGVudGl0eShsZWZ0LCByaWdodCkge1xuICBpZiAodHlwZW9mIGxlZnQgPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcmlnaHQgPT0gXCJzdHJpbmdcIikgcmV0dXJuIGxlZnQgPT09IHJpZ2h0XG4gIGlmICghbGVmdCB8fCAhcmlnaHQgfHwgdHlwZW9mIGxlZnQgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgcmlnaHQgIT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IGxlZnRUeXBlID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGxlZnQpXG4gIGNvbnN0IHJpZ2h0VHlwZSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChyaWdodClcblxuICBpZiAobGVmdFR5cGUua2luZCAhPSByaWdodFR5cGUua2luZCkgcmV0dXJuIGZhbHNlXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUuZWxlbWVudFR5cGUsIHJpZ2h0VHlwZS5lbGVtZW50VHlwZSlcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPcHRpb25hbFR5cGVcIikgcmV0dXJuIHNhbWVUeXBlSWRlbnRpdHkobGVmdFR5cGUudmFsdWVUeXBlLCByaWdodFR5cGUudmFsdWVUeXBlKVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlR5cGVWYXJpYWJsZVJlZmVyZW5jZVwiKSByZXR1cm4gbGVmdFR5cGUucGFyYW1ldGVySWQgPT0gcmlnaHRUeXBlLnBhcmFtZXRlcklkXG4gIGlmIChsZWZ0VHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSB7XG4gICAgY29uc3QgbGVmdEFyZ3VtZW50cyA9IEFycmF5LmlzQXJyYXkobGVmdFR5cGUuYXJndW1lbnRzKSA/IGxlZnRUeXBlLmFyZ3VtZW50cyA6IFtdXG4gICAgY29uc3QgcmlnaHRBcmd1bWVudHMgPSBBcnJheS5pc0FycmF5KHJpZ2h0VHlwZS5hcmd1bWVudHMpID8gcmlnaHRUeXBlLmFyZ3VtZW50cyA6IFtdXG5cbiAgICByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZCAmJiBsZWZ0QXJndW1lbnRzLmxlbmd0aCA9PSByaWdodEFyZ3VtZW50cy5sZW5ndGggJiZcbiAgICAgIGxlZnRBcmd1bWVudHMuZXZlcnkoKGFyZ3VtZW50LCBpbmRleCkgPT4gc2FtZVR5cGVJZGVudGl0eShhcmd1bWVudCwgcmlnaHRBcmd1bWVudHNbaW5kZXhdKSlcbiAgfVxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIlJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGxlZnRUeXBlLmRlY2xhcmF0aW9uSWQgPT0gcmlnaHRUeXBlLmRlY2xhcmF0aW9uSWRcbiAgaWYgKGxlZnRUeXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4gbGVmdFR5cGUucmVzb3VyY2VJZCA9PSByaWdodFR5cGUucmVzb3VyY2VJZFxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk93bmVkUmVmZXJlbmNlVHlwZVwiKSByZXR1cm4gbGVmdFR5cGUuZGVjbGFyYXRpb25JZCA9PSByaWdodFR5cGUuZGVjbGFyYXRpb25JZFxuICBpZiAobGVmdFR5cGUua2luZCA9PSBcIk1hcFR5cGVcIiB8fCBsZWZ0VHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikge1xuICAgIHJldHVybiBzYW1lVHlwZUlkZW50aXR5KGxlZnRUeXBlLmtleVR5cGUsIHJpZ2h0VHlwZS5rZXlUeXBlKSAmJiBzYW1lVHlwZUlkZW50aXR5KGxlZnRUeXBlLnZhbHVlVHlwZSwgcmlnaHRUeXBlLnZhbHVlVHlwZSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byB2YWxpZGF0ZWQgc2VtYW50aWMgdHlwZXMgc3RydWN0dXJhbGx5LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSBsZWZ0IC0gRmlyc3QgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmlnaHQgLSBTZWNvbmQgdHlwZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSB0eXBlcyBhcmUgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNhbWVUeXBlKGxlZnQsIHJpZ2h0KSB7XG4gIHJldHVybiBzYW1lVHlwZUlkZW50aXR5KHR5cGVJZGVudGl0eShsZWZ0KSwgdHlwZUlkZW50aXR5KHJpZ2h0KSlcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG9uZSB2YWxpZGF0ZWQgc2VtYW50aWMgdHlwZSBmb3IgZGlhZ25vc3RpY3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgfCBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVycm9yVHlwZX0gdHlwZSAtIFNlbWFudGljIHR5cGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUgcmVjdXJzaXZlIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiB0eXBlRGVzY3JpcHRpb24odHlwZSkge1xuICBpZiAodHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiKSByZXR1cm4gdHlwZS5uYW1lXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIikgcmV0dXJuIGB0eXBlLXZhcmlhYmxlPCR7dHlwZS5wYXJhbWV0ZXJJZH0+YFxuICBpZiAodHlwZS5raW5kID09IFwiUmVjb3JkVHlwZVwiKSByZXR1cm4gYHJlY29yZDwke3R5cGUuZGVjbGFyYXRpb25JZH0ke3R5cGUuYXJndW1lbnRzPy5sZW5ndGhcbiAgICA/IGAsICR7dHlwZS5hcmd1bWVudHMubWFwKHR5cGVEZXNjcmlwdGlvbikuam9pbihcIiwgXCIpfWAgOiBcIlwifT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJSZWZlcmVuY2VUeXBlXCIpIHJldHVybiBgcmVmZXJlbmNlPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlc291cmNlVHlwZVwiKSByZXR1cm4gYG93bmVkLXJlc291cmNlPCR7dHlwZS5yZXNvdXJjZUlkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJPd25lZFJlZmVyZW5jZVR5cGVcIikgcmV0dXJuIGBvd25lZC1yZWZlcmVuY2U8JHt0eXBlLmRlY2xhcmF0aW9uSWR9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIkVycm9yVHlwZVwiKSByZXR1cm4gYGVycm9yPCR7dHlwZS5kZWNsYXJhdGlvbklkfT5gXG4gIGlmICh0eXBlLmtpbmQgPT0gXCJMaXN0VHlwZVwiKSByZXR1cm4gYGxpc3Q8JHt0eXBlRGVzY3JpcHRpb24odHlwZS5lbGVtZW50VHlwZSl9PmBcbiAgaWYgKHR5cGUua2luZCA9PSBcIk9wdGlvbmFsVHlwZVwiKSByZXR1cm4gYG9wdGlvbmFsPCR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0+YFxuICBpZiAodHlwZS5raW5kID09IFwiT3JkZXJlZE1hcFR5cGVcIikgcmV0dXJuIGBvcmRlcmVkLW1hcDxzdHJpbmcsICR7dHlwZURlc2NyaXB0aW9uKHR5cGUudmFsdWVUeXBlKX0sIGluc2VydGlvbj5gXG5cbiAgcmV0dXJuIGBtYXA8c3RyaW5nLCAke3R5cGVEZXNjcmlwdGlvbih0eXBlLnZhbHVlVHlwZSl9PmBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHR5cGUgZ3JhcGggY29udGFpbnMgbGluZWFyIG93bmVyc2hpcC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdHlwZSAtIENhbmRpZGF0ZSBzZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtTZXQ8b2JqZWN0Pn0gW3NlZW5dIC0gVmlzaXRlZCB0eXBlIGNvbnRhaW5lcnMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBvd25lcnNoaXAgb2NjdXJzIGF0IGFueSBkZXB0aC5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNPd25lZFR5cGUodHlwZSwgc2VlbiA9IG5ldyBTZXQoKSkge1xuICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHR5cGUpIHx8IHNlZW4uaGFzKHR5cGUpKSByZXR1cm4gZmFsc2VcbiAgc2Vlbi5hZGQodHlwZSlcbiAgY29uc3Qga2luZCA9IFJlZmxlY3QuZ2V0KHR5cGUsIFwia2luZFwiKVxuXG4gIGlmIChraW5kID09IFwiT3duZWRSZXNvdXJjZVR5cGVcIiB8fCBraW5kID09IFwiT3duZWRSZWZlcmVuY2VUeXBlXCIpIHJldHVybiB0cnVlXG4gIGlmIChraW5kID09IFwiTGlzdFR5cGVcIikgcmV0dXJuIGNvbnRhaW5zT3duZWRUeXBlKFJlZmxlY3QuZ2V0KHR5cGUsIFwiZWxlbWVudFR5cGVcIiksIHNlZW4pXG4gIGlmIChraW5kID09IFwiT3B0aW9uYWxUeXBlXCIpIHJldHVybiBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgaWYgKGtpbmQgPT0gXCJNYXBUeXBlXCIgfHwga2luZCA9PSBcIk9yZGVyZWRNYXBUeXBlXCIpIHtcbiAgICByZXR1cm4gY29udGFpbnNPd25lZFR5cGUoUmVmbGVjdC5nZXQodHlwZSwgXCJrZXlUeXBlXCIpLCBzZWVuKSB8fCBjb250YWluc093bmVkVHlwZShSZWZsZWN0LmdldCh0eXBlLCBcInZhbHVlVHlwZVwiKSwgc2VlbilcbiAgfVxuICBpZiAoa2luZCA9PSBcIlJlY29yZFR5cGVcIikge1xuICAgIGNvbnN0IGFyZ3VtZW50c18gPSBSZWZsZWN0LmdldCh0eXBlLCBcImFyZ3VtZW50c1wiKVxuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzXykgJiYgYXJndW1lbnRzXy5zb21lKChhcmd1bWVudCkgPT4gY29udGFpbnNPd25lZFR5cGUoYXJndW1lbnQsIHNlZW4pKVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrcyBvbmUgc2NhbGFyIHNlbWFudGljIHR5cGUuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHR5cGUgLSBTZW1hbnRpYyB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IFtuYW1lXSAtIE9wdGlvbmFsIHJlcXVpcmVkIHNjYWxhci5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuVHlwZVJlZmVyZW5jZX0gV2hldGhlciBpdCBpcyB0aGUgcmVxdWVzdGVkIHNjYWxhci5cbiAqL1xuZnVuY3Rpb24gaXNTY2FsYXJUeXBlKHR5cGUsIG5hbWUpIHtcbiAgcmV0dXJuIHR5cGUua2luZCA9PSBcIlR5cGVSZWZlcmVuY2VcIiAmJiBpc1NjYWxhclR5cGVOYW1lKHR5cGUubmFtZSkgJiYgKG5hbWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlLm5hbWUgPT0gbmFtZSlcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHNvbGUgbm9uLXZhbHVlIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSB0eXBlIC0gU2VtYW50aWMgdHlwZS5cbiAqIEByZXR1cm5zIHt0eXBlIGlzIGltcG9ydChcIi4vdHlwZXMuanNcIikuRnVuY3Rpb25SZXR1cm5UeXBlUmVmZXJlbmNlfSBXaGV0aGVyIGl0IGlzIHZvaWQuXG4gKi9cbmZ1bmN0aW9uIGlzVm9pZFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZS5raW5kID09IFwiVHlwZVJlZmVyZW5jZVwiICYmIHR5cGUubmFtZSA9PSBcInZvaWRcIlxufVxuXG4vKipcbiAqIFJlcXVpcmVzIGEgc2NhbGFyIHR5cGUgZm9yIHRoZSBwcmUtY29sbGVjdGlvbiBvcGVyYXRvciBjb250cmFjdC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIE9wZXJhbmQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBPcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtTZW1hbnRpY0ZhaWx9IGZhaWwgLSBEaWFnbm9zdGljIGNhbGxiYWNrLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0gU2NhbGFyIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHNjYWxhck5hbWVGb3JPcGVyYXRpb24odHlwZSwgbG9jYXRpb24sIGZhaWwpIHtcbiAgaWYgKCFpc1NjYWxhclR5cGUodHlwZSkpIHtcbiAgICByZXR1cm4gZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTY2FsYXIgb3BlcmF0aW9uIHJlY2VpdmVkICR7dHlwZURlc2NyaXB0aW9uKHR5cGUpfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIHJldHVybiB0eXBlLm5hbWVcbn1cblxuLyoqXG4gKiBFbmZvcmNlcyB0aGF0IGEgdG90YWwgY29sbGVjdGlvbiBhY2Nlc3MgaXMgcHJvdmVuIG9yIHVzZXMgYSBzb3VyY2Ugb3BlcmF0aW9uIHRoYXQgZmFpbHMgb24gYWJzZW5jZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5MaXN0SW5kZXhFeHByZXNzaW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5NYXBMb29rdXBFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQWNjZXNzLlxuICogQHBhcmFtIHtib29sZWFufSBwcm92ZW4gLSBXaGV0aGVyIHN0YXRpYyBsaXRlcmFsIHByb3BhZ2F0aW9uIHByb3ZlcyBwcmVzZW5jZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbm9ybWFsaXplT3BlcmF0aW9ucyAtIFdoZXRoZXIgdGhpcyBpcyBmcm9udGVuZCBhZG1pc3Npb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVBY2Nlc3NUb3RhbGl0eShleHByZXNzaW9uLCBwcm92ZW4sIG5vcm1hbGl6ZU9wZXJhdGlvbnMsIGZhaWwpIHtcbiAgaWYgKHByb3Zlbikge1xuICAgIGlmIChub3JtYWxpemVPcGVyYXRpb25zKSBleHByZXNzaW9uLnRvdGFsaXR5ID0gXCJwcm92ZW5cIlxuICAgIGVsc2UgaWYgKGV4cHJlc3Npb24udG90YWxpdHkgIT0gXCJwcm92ZW5cIiAmJiBleHByZXNzaW9uLnRvdGFsaXR5ICE9IFwiZmFpbC1vbi1hYnNlbmNlXCIpIHtcbiAgICAgIGZhaWwoXCJVTkNIRUNLRURfQ09MTEVDVElPTl9BQ0NFU1NcIiwgXCJDb2xsZWN0aW9uIGFjY2VzcyBsYWNrcyBhIHRvdGFsaXR5IGd1YXJhbnRlZS5cIiwgZXhwcmVzc2lvbi5sb2NhdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuICBpZiAoZXhwcmVzc2lvbi50b3RhbGl0eSAhPSBcImZhaWwtb24tYWJzZW5jZVwiKSB7XG4gICAgZmFpbChcIlVOQ0hFQ0tFRF9DT0xMRUNUSU9OX0FDQ0VTU1wiLCBcIkNvbGxlY3Rpb24gYWNjZXNzIGlzIG5vdCBzdGF0aWNhbGx5IHByb3ZlbiBhbmQgZG9lcyBub3QgZmFpbCBvbiBhYnNlbmNlLlwiLCBleHByZXNzaW9uLmxvY2F0aW9uKVxuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBiaW5kaW5nIHdpdGhvdXQgcHJvZHVjaW5nIGEgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQmluZGluZyBuYW1lLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge0JpbmRpbmcgfCB1bmRlZmluZWR9IEJpbmRpbmcgd2hlbiB2aXNpYmxlLlxuICovXG5mdW5jdGlvbiBmaW5kQmluZGluZyhuYW1lLCBzY29wZSkge1xuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgY29uc3QgYmluZGluZyA9IGN1cnJlbnQuYmluZGluZ3MuZ2V0KG5hbWUpXG5cbiAgICBpZiAoYmluZGluZykgcmV0dXJuIGJpbmRpbmdcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBleGlzdGluZyBiaW5kaW5ncyB3aG9zZSBrbm93biB2YWx1ZXMgbXVzdCBiZSBtZXJnZWQgYWNyb3NzIGEgY29uZGl0aW9uYWwuXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7QmluZGluZ1tdfSBOZWFyZXN0LXRvLWZhcnRoZXN0IGJpbmRpbmdzLlxuICovXG5mdW5jdGlvbiBiaW5kaW5nc1Zpc2libGVGcm9tKHNjb3BlKSB7XG4gIGNvbnN0IGJpbmRpbmdzID0gW11cblxuICBmb3IgKGxldCBjdXJyZW50ID0gLyoqIEB0eXBlIHtTY29wZSB8IHVuZGVmaW5lZH0gKi8gKHNjb3BlKTsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50KSB7XG4gICAgYmluZGluZ3MucHVzaCguLi5jdXJyZW50LmJpbmRpbmdzLnZhbHVlcygpKVxuICB9XG5cbiAgcmV0dXJuIGJpbmRpbmdzXG59XG5cbi8qKlxuICogRmluZHMgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRoYXQgYSBsb29wIGJvZHkgbWF5IGFzc2lnbiBvbiBhbnkgbmVzdGVkIHBhdGguXG4gKiBUaGUgc2V0IGlzIGNvbXB1dGVkIGFmdGVyIHZhbGlkYXRpbmcgdGhlIGxpc3QgZXhwcmVzc2lvbiBiZWNhdXNlIGNvbGxlY3Rpb24gZXZhbHVhdGlvbiBwcmVjZWRlcyBib2R5IGVmZmVjdHMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gQ2FuZGlkYXRlIGxvb3AgYm9keS5cbiAqIEBwYXJhbSB7U2NvcGV9IG91dGVyU2NvcGUgLSBTY29wZSB2aXNpYmxlIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcC5cbiAqIEBwYXJhbSB7U2V0PEJpbmRpbmc+fSBbYXNzaWduZWRdIC0gQWNjdW11bGF0ZWQgYmluZGluZyBpZGVudGl0aWVzLlxuICogQHJldHVybnMge1NldDxCaW5kaW5nPn0gRXhhY3RseSB0aGUgdmlzaWJsZSBtdXRhYmxlIGJpbmRpbmdzIHRhcmdldGVkIGJ5IG5lc3RlZCBhc3NpZ25tZW50cy5cbiAqL1xuZnVuY3Rpb24gb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KGJsb2NrLCBvdXRlclNjb3BlLCBhc3NpZ25lZCA9IG5ldyBTZXQoKSkge1xuICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgaWYgKHN0YXRlbWVudC5raW5kID09IFwiQXNzaWdubWVudFN0YXRlbWVudFwiKSB7XG4gICAgICBjb25zdCBiaW5kaW5nID0gZmluZEJpbmRpbmcoc3RhdGVtZW50LnRhcmdldC5uYW1lLCBvdXRlclNjb3BlKVxuXG4gICAgICBpZiAoYmluZGluZz8ubXV0YWJsZSkgYXNzaWduZWQuYWRkKGJpbmRpbmcpXG4gICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIklmU3RhdGVtZW50XCIpIHtcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuY29uc2VxdWVudCwgb3V0ZXJTY29wZSwgYXNzaWduZWQpXG4gICAgICBpZiAoc3RhdGVtZW50LmFsdGVybmF0ZSkgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5hbHRlcm5hdGUsIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJGb3JFYWNoTWFwU3RhdGVtZW50XCIgfHwgc3RhdGVtZW50LmtpbmQgPT0gXCJXaGlsZVN0YXRlbWVudFwiKSB7XG4gICAgICBvdXRlck11dGFibGVCaW5kaW5nc0Fzc2lnbmVkQnkoc3RhdGVtZW50LmJvZHksIG91dGVyU2NvcGUsIGFzc2lnbmVkKVxuICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJUcnlTdGF0ZW1lbnRcIikge1xuICAgICAgb3V0ZXJNdXRhYmxlQmluZGluZ3NBc3NpZ25lZEJ5KHN0YXRlbWVudC5ib2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICAgIG91dGVyTXV0YWJsZUJpbmRpbmdzQXNzaWduZWRCeShzdGF0ZW1lbnQuY2F0Y2hCb2R5LCBvdXRlclNjb3BlLCBhc3NpZ25lZClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXNzaWduZWRcbn1cblxuLyoqXG4gKiBQcm9wYWdhdGVzIG9ubHkgaW1tdXRhYmxlIHZhbHVlcyB3aG9zZSBleGFjdCBjb2xsZWN0aW9uIGNvbnRlbnRzIHJlbWFpbiBrbm93bi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBleHByZXNzaW9uIC0gRXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlIC0gVmlzaWJsZSBzY29wZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb24gfCB1bmRlZmluZWR9IEtub3duIHZhbHVlLlxuICovXG5mdW5jdGlvbiBrbm93blZhbHVlRm9yRXhwcmVzc2lvbihleHByZXNzaW9uLCBzY29wZSkge1xuICBpZiAoW1wiSW50ZWdlckxpdGVyYWxcIiwgXCJCb29sZWFuTGl0ZXJhbFwiLCBcIlN0cmluZ0xpdGVyYWxcIiwgXCJMaXN0TGl0ZXJhbFwiLCBcIk1hcExpdGVyYWxcIiwgXCJPcmRlcmVkTWFwTGl0ZXJhbFwiXS5pbmNsdWRlcyhleHByZXNzaW9uLmtpbmQpKSByZXR1cm4gZXhwcmVzc2lvblxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiSWRlbnRpZmllckV4cHJlc3Npb25cIikgcmV0dXJuIGZpbmRCaW5kaW5nKGV4cHJlc3Npb24ubmFtZSwgc2NvcGUpPy5rbm93blZhbHVlXG4gIGlmIChleHByZXNzaW9uLmtpbmQgPT0gXCJMaXN0SW5kZXhFeHByZXNzaW9uXCIpIHJldHVybiBwcm92ZW5MaXN0RWxlbWVudChleHByZXNzaW9uLmNvbGxlY3Rpb24sIGV4cHJlc3Npb24uaW5kZXgsIHNjb3BlKVxuICBpZiAoZXhwcmVzc2lvbi5raW5kID09IFwiTWFwTG9va3VwRXhwcmVzc2lvblwiKSByZXR1cm4gcHJvdmVuTWFwVmFsdWUoZXhwcmVzc2lvbi5jb2xsZWN0aW9uLCBleHByZXNzaW9uLmtleSwgc2NvcGUpXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIGxpc3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTGlzdCByZWNlaXZlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBpbmRleCAtIEluZGV4IGV4cHJlc3Npb24uXG4gKiBAcGFyYW0ge1Njb3BlfSBzY29wZSAtIFZpc2libGUgc2NvcGUuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9uIHwgdW5kZWZpbmVkfSBQcm92ZW4gZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gcHJvdmVuTGlzdEVsZW1lbnQoY29sbGVjdGlvbiwgaW5kZXgsIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bkluZGV4ID0ga25vd25WYWx1ZUZvckV4cHJlc3Npb24oaW5kZXgsIHNjb3BlKVxuXG4gIGlmIChrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJMaXN0TGl0ZXJhbFwiIHx8IGtub3duSW5kZXg/LmtpbmQgIT0gXCJJbnRlZ2VyTGl0ZXJhbFwiIHx8XG4gICAga25vd25JbmRleC52YWx1ZSA8IDAgfHwga25vd25JbmRleC52YWx1ZSA+PSBrbm93bkNvbGxlY3Rpb24uZWxlbWVudHMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGtub3duQ29sbGVjdGlvbi5lbGVtZW50c1trbm93bkluZGV4LnZhbHVlXVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBzdGF0aWNhbGx5IHNlbGVjdGVkIG1hcCB2YWx1ZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FeHByZXNzaW9ufSBjb2xsZWN0aW9uIC0gTWFwIHJlY2VpdmVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IGtleSAtIEtleSBleHByZXNzaW9uLlxuICogQHBhcmFtIHtTY29wZX0gc2NvcGUgLSBWaXNpYmxlIHNjb3BlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuRXhwcmVzc2lvbiB8IHVuZGVmaW5lZH0gUHJvdmVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBwcm92ZW5NYXBWYWx1ZShjb2xsZWN0aW9uLCBrZXksIHNjb3BlKSB7XG4gIGNvbnN0IGtub3duQ29sbGVjdGlvbiA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGNvbGxlY3Rpb24sIHNjb3BlKVxuICBjb25zdCBrbm93bktleSA9IGtub3duVmFsdWVGb3JFeHByZXNzaW9uKGtleSwgc2NvcGUpXG5cbiAgaWYgKGtub3duQ29sbGVjdGlvbj8ua2luZCAhPSBcIk1hcExpdGVyYWxcIiAmJiBrbm93bkNvbGxlY3Rpb24/LmtpbmQgIT0gXCJPcmRlcmVkTWFwTGl0ZXJhbFwiIHx8XG4gICAga25vd25LZXk/LmtpbmQgIT0gXCJTdHJpbmdMaXRlcmFsXCIpIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ga25vd25Db2xsZWN0aW9uLmVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LmtleS52YWx1ZSA9PSBrbm93bktleS52YWx1ZSk/LnZhbHVlXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBudW1lcmljIHN0cmluZ3MgaW5kZXBlbmRlbnRseSBmcm9tIGFueSB0YXJnZXQncyBrZXkgY29lcmNpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gTGl0ZXJhbCBrZXkuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBpdCBpcyBudW1lcmljLlxuICovXG5mdW5jdGlvbiBpc051bWVyaWNTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIC9eWystXT8oPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/JC9pdS50ZXN0KHZhbHVlLnRyaW0oKSlcbn1cblxuLyoqXG4gKiBTZWxlY3RzIGFuIGV4YWN0IHNlbWFudGljIHRva2VuIGxvY2F0aW9uIHdoZW4gcGFyc2VyIHByb3ZlbmFuY2UgaXMgYXZhaWxhYmxlLlxuICogQHBhcmFtIHt7bG9jYXRpb246IGltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb24sIHNvdXJjZVByb3ZlbmFuY2U/OiBpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9fSBub2RlIC0gTG9jYXRlZCBzZW1hbnRpYyBub2RlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJvbGUgLSBUb2tlbiByb2xlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IEV4YWN0IG9yIG93bmluZyBsb2NhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcm9sZUxvY2F0aW9uKG5vZGUsIHJvbGUpIHtcbiAgcmV0dXJuIG5vZGUuc291cmNlUHJvdmVuYW5jZT8ucmFuZ2VzW3JvbGVdID8/IHBhcnNlclJhbmdlRm9yKG5vZGUsIHJvbGUpID8/IG5vZGUubG9jYXRpb25cbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBleGFjdCB0eXBlIHRva2VuIG9yIHRoZSBvd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IHR5cGUgLSBDYW5kaWRhdGUgdHlwZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IG93bmVyTG9jYXRpb24gLSBPd25pbmcgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3JvbGVdIC0gUmVjdXJzaXZlIHR5cGUgcm9sZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBFeGFjdCB0eXBlIGxvY2F0aW9uIHdoZW4ga25vd24uXG4gKi9cbmZ1bmN0aW9uIHR5cGVMb2NhdGlvbih0eXBlLCBvd25lckxvY2F0aW9uLCByb2xlID0gXCJ0eXBlXCIpIHtcbiAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh0eXBlKSkgcmV0dXJuIG93bmVyTG9jYXRpb25cbiAgY29uc3QgY2FuZGlkYXRlID0gLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljRnVuY3Rpb25SZXR1cm5UeXBlfSAqLyAodHlwZSlcblxuICByZXR1cm4gY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlc1tyb2xlXSA/PyBwYXJzZXJSYW5nZUZvcihjYW5kaWRhdGUsIHJvbGUpID8/XG4gICAgY2FuZGlkYXRlLnNvdXJjZVByb3ZlbmFuY2U/LnJhbmdlcy50eXBlID8/IHBhcnNlclJhbmdlRm9yKGNhbmRpZGF0ZSwgXCJ0eXBlXCIpID8/IG93bmVyTG9jYXRpb25cbn1cblxuLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uLCB7b3BlcmFuZDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IHVuYXJ5T3BlcmF0aW9uU2lnbmF0dXJlcyA9IE9iamVjdC5mcmVlemUoe1xuICBCb29sZWFuTm90OiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyTmVnYXRlOiBPYmplY3QuZnJlZXplKHtvcGVyYW5kOiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIn0pXG59KVxuXG4vKiogQHR5cGUge1JlYWRvbmx5PFJlY29yZDxpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljQmluYXJ5T3BlcmF0aW9uLCB7bGVmdDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByaWdodDogaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lLCByZXN1bHQ6IGltcG9ydChcIi4vdHlwZXMuanNcIikuU2VtYW50aWNUeXBlTmFtZX0+Pn0gKi9cbmNvbnN0IGJpbmFyeU9wZXJhdGlvblNpZ25hdHVyZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgQm9vbGVhbkFuZDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBCb29sZWFuRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiYm9vbGVhblwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJib29sZWFuXCJ9KSxcbiAgQm9vbGVhbk5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImJvb2xlYW5cIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiYm9vbGVhblwifSksXG4gIEJvb2xlYW5PcjogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJib29sZWFuXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImJvb2xlYW5cIn0pLFxuICBJbnRlZ2VyQWRkOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImludGVnZXJcIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyR3JlYXRlclRoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckdyZWF0ZXJUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTGVzc1RoYW46IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlckxlc3NUaGFuT3JFcXVhbDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBJbnRlZ2VyTXVsdGlwbHk6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwiaW50ZWdlclwiLCByZXN1bHQ6IFwiaW50ZWdlclwiLCByaWdodDogXCJpbnRlZ2VyXCJ9KSxcbiAgSW50ZWdlck5vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcImludGVnZXJcIiwgcmVzdWx0OiBcImJvb2xlYW5cIiwgcmlnaHQ6IFwiaW50ZWdlclwifSksXG4gIEludGVnZXJTdWJ0cmFjdDogT2JqZWN0LmZyZWV6ZSh7bGVmdDogXCJpbnRlZ2VyXCIsIHJlc3VsdDogXCJpbnRlZ2VyXCIsIHJpZ2h0OiBcImludGVnZXJcIn0pLFxuICBTdHJpbmdDb25jYXQ6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJzdHJpbmdcIiwgcmlnaHQ6IFwic3RyaW5nXCJ9KSxcbiAgU3RyaW5nRXF1YWw6IE9iamVjdC5mcmVlemUoe2xlZnQ6IFwic3RyaW5nXCIsIHJlc3VsdDogXCJib29sZWFuXCIsIHJpZ2h0OiBcInN0cmluZ1wifSksXG4gIFN0cmluZ05vdEVxdWFsOiBPYmplY3QuZnJlZXplKHtsZWZ0OiBcInN0cmluZ1wiLCByZXN1bHQ6IFwiYm9vbGVhblwiLCByaWdodDogXCJzdHJpbmdcIn0pXG59KVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIHVuYXJ5IG1lYW5pbmcgZnJvbSBwYXJzZXItbm9ybWFsaXplZCBzb3VyY2UgaW50ZW50LlxuICogQHBhcmFtIHt1bmtub3dufSBzb3VyY2VPcGVyYXRpb24gLSBUcmFuc2llbnQgZnJvbnRlbmQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IG9wZXJhbmRUeXBlIC0gUmVzb2x2ZWQgb3BlcmFuZCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIE9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9ufSBTZW1hbnRpYyBvcGVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuYXJ5T3BlcmF0aW9uKHNvdXJjZU9wZXJhdGlvbiwgb3BlcmFuZFR5cGUsIGxvY2F0aW9uLCBmYWlsKSB7XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOZWdhdGVcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImludGVnZXJcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBJbnRlZ2VyIG5lZ2F0aW9uIHJlcXVpcmVzIGludGVnZXI7IHJlY2VpdmVkICR7b3BlcmFuZFR5cGV9LmAsIGxvY2F0aW9uKVxuICAgIHJldHVybiBcIkludGVnZXJOZWdhdGVcIlxuICB9XG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJOb3RcIikge1xuICAgIGlmIChvcGVyYW5kVHlwZSAhPSBcImJvb2xlYW5cIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBCb29sZWFuIG5vdCByZXF1aXJlcyBib29sZWFuOyByZWNlaXZlZCAke29wZXJhbmRUeXBlfS5gLCBsb2NhdGlvbilcbiAgICByZXR1cm4gXCJCb29sZWFuTm90XCJcbiAgfVxuXG4gIHJldHVybiBmYWlsKFwiVFlQRV9NSVNNQVRDSFwiLCBgVW5rbm93biB1bmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxvY2F0aW9uKVxufVxuXG4vKipcbiAqIFNlbGVjdHMgb25lIHR5cGVkIGJpbmFyeSBtZWFuaW5nIGZyb20gcGFyc2VyLW5vcm1hbGl6ZWQgc291cmNlIGludGVudC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gc291cmNlT3BlcmF0aW9uIC0gVHJhbnNpZW50IGZyb250ZW5kIG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSBsZWZ0VHlwZSAtIFJlc29sdmVkIGxlZnQgdHlwZS5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lfSByaWdodFR5cGUgLSBSZXNvbHZlZCByaWdodCB0eXBlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBsZWZ0TG9jYXRpb24gLSBMZWZ0IG9wZXJhbmQgbG9jYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vdHlwZXMuanNcIikuU291cmNlTG9jYXRpb259IHJpZ2h0TG9jYXRpb24gLSBSaWdodCBvcGVyYW5kIGxvY2F0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNvdXJjZUxvY2F0aW9ufSBleHByZXNzaW9uTG9jYXRpb24gLSBXaG9sZSBvcGVyYXRpb24gbG9jYXRpb24uXG4gKiBAcGFyYW0ge1NlbWFudGljRmFpbH0gZmFpbCAtIERpYWdub3N0aWMgY2FsbGJhY2suXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gU2VtYW50aWMgb3BlcmF0aW9uLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVCaW5hcnlPcGVyYXRpb24oc291cmNlT3BlcmF0aW9uLCBsZWZ0VHlwZSwgcmlnaHRUeXBlLCBsZWZ0TG9jYXRpb24sIHJpZ2h0TG9jYXRpb24sIGV4cHJlc3Npb25Mb2NhdGlvbiwgZmFpbCkge1xuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiUGhwQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIGZhaWwoXCJVTlNVUFBPUlRFRF9TWU5UQVhcIiwgXCJQSFAgYmluYXJ5ICsgZG9lcyBub3QgY29uY2F0ZW5hdGUgc3RyaW5nczsgdXNlIC4gaW5zdGVhZC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IFwiQWRkXCJcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdDb25jYXRcIikge1xuICAgIGlmIChsZWZ0VHlwZSAhPSBcInN0cmluZ1wiKSBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYFN0cmluZyBjb25jYXRlbmF0aW9uIHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgY29uY2F0ZW5hdGlvbiByZXF1aXJlcyBzdHJpbmc7IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIHJldHVybiBcIlN0cmluZ0NvbmNhdFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiQWRkXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgJiYgcmlnaHRUeXBlID09IFwiaW50ZWdlclwiKSByZXR1cm4gXCJJbnRlZ2VyQWRkXCJcbiAgICBpZiAobGVmdFR5cGUgPT0gXCJzdHJpbmdcIiAmJiByaWdodFR5cGUgPT0gXCJzdHJpbmdcIikgcmV0dXJuIFwiU3RyaW5nQ29uY2F0XCJcblxuICAgIGNvbnN0IGxvY2F0aW9uID0gbGVmdFR5cGUgPT0gXCJpbnRlZ2VyXCIgfHwgbGVmdFR5cGUgPT0gXCJzdHJpbmdcIiA/IHJpZ2h0TG9jYXRpb24gOiBsZWZ0TG9jYXRpb25cblxuICAgIHJldHVybiBmYWlsKFwiSU5WQUxJRF9PUEVSQU5EX1RZUEVcIiwgYEFkZGl0aW9uIHJlcXVpcmVzIHR3byBpbnRlZ2VycyBvciB0d28gc3RyaW5nczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCBsb2NhdGlvbilcbiAgfVxuXG4gIGNvbnN0IGZpeGVkT3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gICAgQW5kOiBbXCJib29sZWFuXCIsIFwiQm9vbGVhbkFuZFwiXSxcbiAgICBHcmVhdGVyVGhhbjogW1wiaW50ZWdlclwiLCBcIkludGVnZXJHcmVhdGVyVGhhblwiXSxcbiAgICBHcmVhdGVyVGhhbk9yRXF1YWw6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICAgIExlc3NUaGFuOiBbXCJpbnRlZ2VyXCIsIFwiSW50ZWdlckxlc3NUaGFuXCJdLFxuICAgIExlc3NUaGFuT3JFcXVhbDogW1wiaW50ZWdlclwiLCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIl0sXG4gICAgTXVsdGlwbHk6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyTXVsdGlwbHlcIl0sXG4gICAgT3I6IFtcImJvb2xlYW5cIiwgXCJCb29sZWFuT3JcIl0sXG4gICAgU3VidHJhY3Q6IFtcImludGVnZXJcIiwgXCJJbnRlZ2VyU3VidHJhY3RcIl1cbiAgfSlcbiAgY29uc3QgZml4ZWQgPSBSZWZsZWN0LmdldChmaXhlZE9wZXJhdGlvbnMsIFN0cmluZyhzb3VyY2VPcGVyYXRpb24pKVxuXG4gIGlmIChmaXhlZCkge1xuICAgIGNvbnN0IFtyZXF1aXJlZFR5cGUsIG9wZXJhdGlvbl0gPSBmaXhlZFxuXG4gICAgaWYgKGxlZnRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7bGVmdFR5cGV9LmAsIGxlZnRMb2NhdGlvbilcbiAgICBpZiAocmlnaHRUeXBlICE9IHJlcXVpcmVkVHlwZSkgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGAke1N0cmluZyhzb3VyY2VPcGVyYXRpb24pfSByZXF1aXJlcyAke3JlcXVpcmVkVHlwZX07IHJlY2VpdmVkICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKG9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJKYXZhTm90RXF1YWxcIikge1xuICAgIGlmIChsZWZ0VHlwZSA9PSBcInN0cmluZ1wiIHx8IHJpZ2h0VHlwZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gZmFpbChcIlVOU1VQUE9SVEVEX1NZTlRBWFwiLCBcIkphdmEgcmVmZXJlbmNlIGVxdWFsaXR5IGlzIG91dHNpZGUgdGhlIGltcGxlbWVudGVkIHNlbWFudGljIHN1YnNldC5cIiwgZXhwcmVzc2lvbkxvY2F0aW9uKVxuICAgIH1cblxuICAgIHNvdXJjZU9wZXJhdGlvbiA9IHNvdXJjZU9wZXJhdGlvbiA9PSBcIkphdmFFcXVhbFwiID8gXCJFcXVhbFwiIDogXCJOb3RFcXVhbFwiXG4gIH1cblxuICBpZiAoc291cmNlT3BlcmF0aW9uID09IFwiU3RyaW5nRXF1YWxcIiB8fCBzb3VyY2VPcGVyYXRpb24gPT0gXCJTdHJpbmdOb3RFcXVhbFwiKSB7XG4gICAgaWYgKGxlZnRUeXBlICE9IFwic3RyaW5nXCIpIGZhaWwoXCJJTlZBTElEX09QRVJBTkRfVFlQRVwiLCBgU3RyaW5nIGVxdWFsaXR5IHJlcXVpcmVzIHN0cmluZzsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0uYCwgbGVmdExvY2F0aW9uKVxuICAgIGlmIChyaWdodFR5cGUgIT0gXCJzdHJpbmdcIikgZmFpbChcIklOVkFMSURfT1BFUkFORF9UWVBFXCIsIGBTdHJpbmcgZXF1YWxpdHkgcmVxdWlyZXMgc3RyaW5nOyByZWNlaXZlZCAke3JpZ2h0VHlwZX0uYCwgcmlnaHRMb2NhdGlvbilcblxuICAgIHJldHVybiAvKiogQHR5cGUge1wiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIn0gKi8gKHNvdXJjZU9wZXJhdGlvbilcbiAgfVxuXG4gIGlmIChzb3VyY2VPcGVyYXRpb24gPT0gXCJFcXVhbFwiIHx8IHNvdXJjZU9wZXJhdGlvbiA9PSBcIk5vdEVxdWFsXCIpIHtcbiAgICBpZiAobGVmdFR5cGUgIT0gcmlnaHRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFpbChcIk1JU01BVENIRURfRVFVQUxJVFlfVFlQRVNcIiwgYEVxdWFsaXR5IHJlcXVpcmVzIG1hdGNoaW5nIHNjYWxhciB0eXBlczsgcmVjZWl2ZWQgJHtsZWZ0VHlwZX0gYW5kICR7cmlnaHRUeXBlfS5gLCByaWdodExvY2F0aW9uKVxuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeCA9IGxlZnRUeXBlID09IFwiaW50ZWdlclwiID8gXCJJbnRlZ2VyXCIgOiBsZWZ0VHlwZSA9PSBcImJvb2xlYW5cIiA/IFwiQm9vbGVhblwiIDogXCJTdHJpbmdcIlxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gKi8gKGAke3ByZWZpeH0ke3NvdXJjZU9wZXJhdGlvbn1gKVxuICB9XG5cbiAgcmV0dXJuIGZhaWwoXCJUWVBFX01JU01BVENIXCIsIGBVbmtub3duIGJpbmFyeSBzb3VyY2Ugb3BlcmF0aW9uICR7U3RyaW5nKHNvdXJjZU9wZXJhdGlvbil9LmAsIGxlZnRMb2NhdGlvbilcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyB0cmFuc2llbnQgZnJvbnRlbmQgaW50ZW50IHdpdGggdGhlIHB1YmxpYyB0eXBlZCBvcGVyYXRpb24gZmllbGRzLlxuICogQHBhcmFtIHtvYmplY3R9IGV4cHJlc3Npb24gLSBNdXRhYmxlIGFkYXB0ZWQgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY1VuYXJ5T3BlcmF0aW9uIHwgaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5TZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gVHlwZWQgb3BlcmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLlNlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCByZXN1bHQgdHlwZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBzZXROb3JtYWxpemVkT3BlcmF0aW9uKGV4cHJlc3Npb24sIG9wZXJhdGlvbiwgdHlwZSkge1xuICBSZWZsZWN0LnNldChleHByZXNzaW9uLCBcIm9wZXJhdGlvblwiLCBvcGVyYXRpb24pXG4gIFJlZmxlY3Quc2V0KGV4cHJlc3Npb24sIFwidHlwZVwiLCB0eXBlKVxufVxuIl19