ts2famix 2.1.0-beta.2 → 3.1.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 (192) hide show
  1. package/.eslintrc.json +24 -24
  2. package/LICENSE +24 -24
  3. package/README.md +78 -78
  4. package/dist/analyze.js +3 -3
  5. package/dist/analyze_functions/process_functions.js +92 -62
  6. package/dist/famix_functions/EntityDictionary.js +674 -599
  7. package/dist/famix_functions/helpers_creation.js +18 -12
  8. package/dist/fqn.js +351 -18
  9. package/dist/lib/famix/famix_JSON_exporter.js +1 -1
  10. package/dist/lib/famix/famix_base_element.js +1 -1
  11. package/dist/lib/famix/famix_repository.js +14 -5
  12. package/dist/lib/famix/index.js +1 -1
  13. package/dist/lib/famix/model/famix/access.js +1 -1
  14. package/dist/lib/famix/model/famix/accessor.js +1 -1
  15. package/dist/lib/famix/model/famix/alias.js +1 -1
  16. package/dist/lib/famix/model/famix/arrow_function.js +1 -1
  17. package/dist/lib/famix/model/famix/behavioral_entity.js +1 -1
  18. package/dist/lib/famix/model/famix/class.js +1 -1
  19. package/dist/lib/famix/model/famix/comment.js +1 -1
  20. package/dist/lib/famix/model/famix/concretisation.js +1 -1
  21. package/dist/lib/famix/model/famix/container_entity.js +1 -1
  22. package/dist/lib/famix/model/famix/decorator.js +1 -1
  23. package/dist/lib/famix/model/famix/entity.js +1 -1
  24. package/dist/lib/famix/model/famix/enum.js +1 -1
  25. package/dist/lib/famix/model/famix/enum_value.js +1 -1
  26. package/dist/lib/famix/model/famix/function.js +1 -1
  27. package/dist/lib/famix/model/famix/import_clause.js +1 -1
  28. package/dist/lib/famix/model/famix/index.js +1 -1
  29. package/dist/lib/famix/model/famix/indexed_file_anchor.js +1 -1
  30. package/dist/lib/famix/model/famix/inheritance.js +1 -1
  31. package/dist/lib/famix/model/famix/interface.js +1 -1
  32. package/dist/lib/famix/model/famix/invocation.js +1 -1
  33. package/dist/lib/famix/model/famix/method.js +1 -1
  34. package/dist/lib/famix/model/famix/module.js +2 -2
  35. package/dist/lib/famix/model/famix/named_entity.js +1 -1
  36. package/dist/lib/famix/model/famix/parameter.js +1 -1
  37. package/dist/lib/famix/model/famix/parameter_concretisation.js +1 -1
  38. package/dist/lib/famix/model/famix/parameter_type.js +1 -1
  39. package/dist/lib/famix/model/famix/parametric_arrow_function.js +1 -1
  40. package/dist/lib/famix/model/famix/parametric_class.js +1 -1
  41. package/dist/lib/famix/model/famix/parametric_function.js +1 -1
  42. package/dist/lib/famix/model/famix/parametric_interface.js +1 -1
  43. package/dist/lib/famix/model/famix/parametric_method.js +1 -1
  44. package/dist/lib/famix/model/famix/primitive_type.js +1 -1
  45. package/dist/lib/famix/model/famix/property.js +1 -1
  46. package/dist/lib/famix/model/famix/reference.js +1 -1
  47. package/dist/lib/famix/model/famix/scoping_entity.js +1 -1
  48. package/dist/lib/famix/model/famix/script_entity.js +1 -1
  49. package/dist/lib/famix/model/famix/source_anchor.js +1 -1
  50. package/dist/lib/famix/model/famix/source_language.js +1 -1
  51. package/dist/lib/famix/model/famix/sourced_entity.js +1 -1
  52. package/dist/lib/famix/model/famix/structural_entity.js +1 -1
  53. package/dist/lib/famix/model/famix/type.js +1 -1
  54. package/dist/lib/famix/model/famix/variable.js +1 -1
  55. package/dist/lib/ts-complex/cyclomatic-service.js +1 -1
  56. package/dist/refactorer/refactor-getter-setter.js +1 -1
  57. package/dist/ts2famix-cli-wrapper.js +1 -1
  58. package/dist/ts2famix-cli.js +3 -1
  59. package/doc-uml/famix-typescript-model.puml +619 -607
  60. package/doc-uml/famix-typescript-model.svg +1 -1
  61. package/eslint.config.mjs +28 -28
  62. package/jest.config.json +1 -1
  63. package/package.json +70 -70
  64. package/src/analyze.ts +120 -120
  65. package/src/analyze_functions/process_functions.ts +1069 -1040
  66. package/src/famix_functions/EntityDictionary.ts +2061 -2016
  67. package/src/famix_functions/helpers_creation.ts +143 -135
  68. package/src/fqn.ts +416 -50
  69. package/src/generate_uml.sh +20 -20
  70. package/src/lib/famix/License.md +22 -22
  71. package/src/lib/famix/famix_JSON_exporter.ts +56 -56
  72. package/src/lib/famix/famix_base_element.ts +22 -22
  73. package/src/lib/famix/famix_repository.ts +288 -278
  74. package/src/lib/famix/index.ts +8 -8
  75. package/src/lib/famix/model/famix/access.ts +50 -50
  76. package/src/lib/famix/model/famix/accessor.ts +15 -15
  77. package/src/lib/famix/model/famix/alias.ts +39 -39
  78. package/src/lib/famix/model/famix/arrow_function.ts +15 -15
  79. package/src/lib/famix/model/famix/behavioral_entity.ts +97 -97
  80. package/src/lib/famix/model/famix/class.ts +85 -85
  81. package/src/lib/famix/model/famix/comment.ts +47 -47
  82. package/src/lib/famix/model/famix/concretisation.ts +40 -40
  83. package/src/lib/famix/model/famix/container_entity.ts +160 -160
  84. package/src/lib/famix/model/famix/decorator.ts +37 -37
  85. package/src/lib/famix/model/famix/entity.ts +15 -15
  86. package/src/lib/famix/model/famix/enum.ts +30 -30
  87. package/src/lib/famix/model/famix/enum_value.ts +28 -28
  88. package/src/lib/famix/model/famix/function.ts +15 -15
  89. package/src/lib/famix/model/famix/import_clause.ts +51 -51
  90. package/src/lib/famix/model/famix/index.ts +41 -41
  91. package/src/lib/famix/model/famix/indexed_file_anchor.ts +46 -46
  92. package/src/lib/famix/model/famix/inheritance.ts +40 -40
  93. package/src/lib/famix/model/famix/interface.ts +75 -75
  94. package/src/lib/famix/model/famix/invocation.ts +65 -65
  95. package/src/lib/famix/model/famix/method.ts +89 -89
  96. package/src/lib/famix/model/famix/module.ts +71 -71
  97. package/src/lib/famix/model/famix/named_entity.ts +95 -95
  98. package/src/lib/famix/model/famix/parameter.ts +28 -28
  99. package/src/lib/famix/model/famix/parameter_concretisation.ts +51 -51
  100. package/src/lib/famix/model/famix/parameter_type.ts +58 -58
  101. package/src/lib/famix/model/famix/parametric_arrow_function.ts +32 -32
  102. package/src/lib/famix/model/famix/parametric_class.ts +49 -49
  103. package/src/lib/famix/model/famix/parametric_function.ts +32 -32
  104. package/src/lib/famix/model/famix/parametric_interface.ts +49 -49
  105. package/src/lib/famix/model/famix/parametric_method.ts +32 -32
  106. package/src/lib/famix/model/famix/primitive_type.ts +15 -15
  107. package/src/lib/famix/model/famix/property.ts +94 -94
  108. package/src/lib/famix/model/famix/reference.ts +40 -40
  109. package/src/lib/famix/model/famix/scoping_entity.ts +35 -35
  110. package/src/lib/famix/model/famix/script_entity.ts +34 -34
  111. package/src/lib/famix/model/famix/source_anchor.ts +30 -30
  112. package/src/lib/famix/model/famix/source_language.ts +35 -35
  113. package/src/lib/famix/model/famix/sourced_entity.ts +70 -70
  114. package/src/lib/famix/model/famix/structural_entity.ts +43 -43
  115. package/src/lib/famix/model/famix/type.ts +87 -87
  116. package/src/lib/famix/model/famix/variable.ts +27 -27
  117. package/src/lib/famix/package.json +28 -28
  118. package/src/lib/ts-complex/cyclomatic-service.ts +83 -83
  119. package/src/refactorer/refactor-getter-setter.ts +140 -140
  120. package/src/ts2famix-cli-wrapper.ts +21 -21
  121. package/src/ts2famix-cli.ts +62 -60
  122. package/tsconfig.check-tests.json +14 -14
  123. package/tsconfig.json +73 -72
  124. package/.vscode/settings.json +0 -4
  125. package/TODO +0 -1
  126. package/arwea-fix.json +0 -1
  127. package/bogus.ts +0 -3
  128. package/class-diagram.puml +0 -792
  129. package/debug.txt +0 -13332
  130. package/debuglog.txt +0 -12073
  131. package/dist/famix2puml.js +0 -126
  132. package/dist/getClasses-arrow-body.js +0 -43
  133. package/dist/lib/famix/src/famix_JSON_exporter.js +0 -55
  134. package/dist/lib/famix/src/famix_base_element.js +0 -18
  135. package/dist/lib/famix/src/famix_repository.js +0 -224
  136. package/dist/lib/famix/src/index.js +0 -31
  137. package/dist/lib/famix/src/model/famix/access.js +0 -40
  138. package/dist/lib/famix/src/model/famix/accessor.js +0 -17
  139. package/dist/lib/famix/src/model/famix/alias.js +0 -33
  140. package/dist/lib/famix/src/model/famix/arrowFunction.js +0 -17
  141. package/dist/lib/famix/src/model/famix/arrow_function.js +0 -17
  142. package/dist/lib/famix/src/model/famix/behavioral_entity.js +0 -79
  143. package/dist/lib/famix/src/model/famix/class.js +0 -71
  144. package/dist/lib/famix/src/model/famix/comment.js +0 -39
  145. package/dist/lib/famix/src/model/famix/concretisation.js +0 -31
  146. package/dist/lib/famix/src/model/famix/container_entity.js +0 -126
  147. package/dist/lib/famix/src/model/famix/decorator.js +0 -32
  148. package/dist/lib/famix/src/model/famix/entity.js +0 -17
  149. package/dist/lib/famix/src/model/famix/enum.js +0 -31
  150. package/dist/lib/famix/src/model/famix/enum_value.js +0 -25
  151. package/dist/lib/famix/src/model/famix/function.js +0 -17
  152. package/dist/lib/famix/src/model/famix/implicit_variable.js +0 -17
  153. package/dist/lib/famix/src/model/famix/import_clause.js +0 -41
  154. package/dist/lib/famix/src/model/famix/index.js +0 -86
  155. package/dist/lib/famix/src/model/famix/indexed_file_anchor.js +0 -38
  156. package/dist/lib/famix/src/model/famix/inheritance.js +0 -33
  157. package/dist/lib/famix/src/model/famix/interface.js +0 -64
  158. package/dist/lib/famix/src/model/famix/invocation.js +0 -54
  159. package/dist/lib/famix/src/model/famix/method.js +0 -67
  160. package/dist/lib/famix/src/model/famix/module.js +0 -60
  161. package/dist/lib/famix/src/model/famix/named_entity.js +0 -78
  162. package/dist/lib/famix/src/model/famix/parameter.js +0 -25
  163. package/dist/lib/famix/src/model/famix/parameterConcretisation.js +0 -44
  164. package/dist/lib/famix/src/model/famix/parameter_concretisation.js +0 -44
  165. package/dist/lib/famix/src/model/famix/parameter_type.js +0 -45
  166. package/dist/lib/famix/src/model/famix/parametricArrowFunction.js +0 -29
  167. package/dist/lib/famix/src/model/famix/parametric_arrow_function.js +0 -31
  168. package/dist/lib/famix/src/model/famix/parametric_class.js +0 -44
  169. package/dist/lib/famix/src/model/famix/parametric_function.js +0 -31
  170. package/dist/lib/famix/src/model/famix/parametric_interface.js +0 -44
  171. package/dist/lib/famix/src/model/famix/parametric_method.js +0 -31
  172. package/dist/lib/famix/src/model/famix/primitive_type.js +0 -17
  173. package/dist/lib/famix/src/model/famix/property.js +0 -73
  174. package/dist/lib/famix/src/model/famix/reference.js +0 -33
  175. package/dist/lib/famix/src/model/famix/scoping_entity.js +0 -36
  176. package/dist/lib/famix/src/model/famix/script_entity.js +0 -29
  177. package/dist/lib/famix/src/model/famix/source_anchor.js +0 -27
  178. package/dist/lib/famix/src/model/famix/source_language.js +0 -35
  179. package/dist/lib/famix/src/model/famix/sourced_entity.js +0 -60
  180. package/dist/lib/famix/src/model/famix/structural_entity.js +0 -39
  181. package/dist/lib/famix/src/model/famix/text_anchor.js +0 -38
  182. package/dist/lib/famix/src/model/famix/type.js +0 -73
  183. package/dist/lib/famix/src/model/famix/variable.js +0 -24
  184. package/fqn-model.json +0 -1
  185. package/iterateGenericTypes.ts +0 -69
  186. package/out/class-diagram/class-diagram.svg +0 -1
  187. package/sample.json +0 -1
  188. package/sample.ts +0 -1
  189. package/stats.txt +0 -3091
  190. package/tabby-debug-output.txt +0 -19433
  191. package/ts2famix.log +0 -22656
  192. package/validate-references.js +0 -103
@@ -44,6 +44,7 @@ exports.processImportClausesForImportEqualsDeclarations = processImportClausesFo
44
44
  exports.processImportClausesForModules = processImportClausesForModules;
45
45
  exports.processInheritances = processInheritances;
46
46
  exports.processInvocations = processInvocations;
47
+ exports.processConcretisations = processConcretisations;
47
48
  const ts_morph_1 = require("ts-morph");
48
49
  const Famix = __importStar(require("../lib/famix/model/famix"));
49
50
  const cyclomatic_service_1 = require("../lib/ts-complex/cyclomatic-service");
@@ -56,6 +57,7 @@ exports.classes = new Array(); // Array of all the classes of the source files
56
57
  exports.interfaces = new Array(); // Array of all the interfaces of the source files
57
58
  exports.modules = new Array(); // Array of all the source files which are modules
58
59
  exports.listOfExportMaps = new Array(); // Array of all the export maps
60
+ const processedNodesWithTypeParams = new Set(); // Set of nodes that have been processed and have type parameters
59
61
  /**
60
62
  * Checks if the file has any imports or exports to be considered a module
61
63
  * @param sourceFile A source file
@@ -110,18 +112,15 @@ function getImplementedOrExtendedInterfaces(interfaces, subClass) {
110
112
  });
111
113
  return implementedOrExtendedInterfaces;
112
114
  }
113
- /**
114
- * Builds a Famix model for an array of source files
115
- * @param sourceFiles An array of source files
116
- */
117
115
  function processFiles(sourceFiles) {
118
116
  sourceFiles.forEach(file => {
119
117
  analyze_1.logger.info(`File: >>>>>>>>>> ${file.getFilePath()}`);
120
- // Computes the cyclomatic complexity metrics for the current source file if it exists (i.e. if it is not from a jest test)
121
- if (fs.existsSync(file.getFilePath()))
118
+ if (fs.existsSync(file.getFilePath())) {
122
119
  exports.currentCC = (0, cyclomatic_service_1.calculate)(file.getFilePath());
123
- else
120
+ }
121
+ else {
124
122
  exports.currentCC = {};
123
+ }
125
124
  processFile(file);
126
125
  });
127
126
  }
@@ -143,10 +142,10 @@ function processFile(f) {
143
142
  processAliases(f, fmxFile);
144
143
  processClasses(f, fmxFile);
145
144
  processInterfaces(f, fmxFile);
146
- processVariables(f, fmxFile);
145
+ processModules(f, fmxFile);
146
+ processVariables(f, fmxFile); // This will handle our object literal methods
147
147
  processEnums(f, fmxFile);
148
148
  processFunctions(f, fmxFile);
149
- processModules(f, fmxFile);
150
149
  }
151
150
  function isAmbient(node) {
152
151
  // An ambient module has the DeclareKeyword modifier.
@@ -246,6 +245,25 @@ function processVariables(m, fmxScope) {
246
245
  fmxVariables.forEach(fmxVariable => {
247
246
  fmxScope.addVariable(fmxVariable);
248
247
  });
248
+ // Check each VariableDeclaration for object literal methods
249
+ v.getDeclarations().forEach(varDecl => {
250
+ const varName = varDecl.getName();
251
+ console.log(`Checking variable: ${varName} at pos=${varDecl.getStart()}`);
252
+ const initializer = varDecl.getInitializer();
253
+ if (initializer && ts_morph_1.Node.isObjectLiteralExpression(initializer)) {
254
+ initializer.getProperties().forEach(prop => {
255
+ if (ts_morph_1.Node.isPropertyAssignment(prop)) {
256
+ const nested = prop.getInitializer();
257
+ if (nested && ts_morph_1.Node.isObjectLiteralExpression(nested)) {
258
+ nested.getDescendantsOfKind(ts_morph_1.SyntaxKind.MethodDeclaration).forEach(method => {
259
+ console.log(`Found object literal method: ${method.getName()} at pos=${method.getStart()}`);
260
+ analyze_1.entityDictionary.createOrGetFamixMethod(method, exports.currentCC);
261
+ });
262
+ }
263
+ }
264
+ });
265
+ }
266
+ });
249
267
  });
250
268
  }
251
269
  /**
@@ -541,17 +559,26 @@ function processParameter(paramDecl) {
541
559
  }
542
560
  return fmxParam;
543
561
  }
544
- /**
545
- * Builds a Famix model for the type parameters of a class, an interface, a method or a function
546
- * @param e A class, an interface, a method or a function
547
- * @param fmxScope The Famix model of the class, the interface, the method or the function
548
- */
549
562
  function processTypeParameters(e, fmxScope) {
550
563
  analyze_1.logger.debug(`Finding Type Parameters:`);
551
- e.getTypeParameters().forEach(tp => {
564
+ const nodeStart = e.getStart();
565
+ // Check if this node has already been processed
566
+ if (processedNodesWithTypeParams.has(nodeStart)) {
567
+ return;
568
+ }
569
+ // Get type parameters
570
+ const typeParams = e.getTypeParameters();
571
+ // Process each type parameter
572
+ typeParams.forEach((tp) => {
552
573
  const fmxParam = processTypeParameter(tp);
553
574
  fmxScope.addGenericParameter(fmxParam);
554
575
  });
576
+ // Log if no type parameters were found
577
+ if (typeParams.length === 0) {
578
+ analyze_1.logger.debug(`[processTypeParameters] No type parameters found for this node`);
579
+ }
580
+ // Mark this node as processed
581
+ processedNodesWithTypeParams.add(nodeStart);
555
582
  }
556
583
  /**
557
584
  * Builds a Famix model for a type parameter
@@ -746,7 +773,7 @@ function processImportClausesForImportEqualsDeclarations(sourceFiles, exports) {
746
773
  function processImportClausesForModules(modules, exports) {
747
774
  analyze_1.logger.info(`Creating import clauses from ${modules.length} modules:`);
748
775
  modules.forEach(module => {
749
- const modulePath = module.getFilePath(); // + module.getBaseName();
776
+ const modulePath = module.getFilePath();
750
777
  module.getImportDeclarations().forEach(impDecl => {
751
778
  analyze_1.logger.info(`Importing ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
752
779
  const path = getModulePath(impDecl);
@@ -754,6 +781,7 @@ function processImportClausesForModules(modules, exports) {
754
781
  analyze_1.logger.info(`Importing (named) ${namedImport.getName()} from ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
755
782
  const importedEntityName = namedImport.getName();
756
783
  const importFoundInExports = isInExports(exports, importedEntityName);
784
+ analyze_1.logger.debug(`Processing ImportSpecifier: ${namedImport.getText()}, pos=${namedImport.getStart()}`);
757
785
  analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
758
786
  importDeclaration: impDecl,
759
787
  importerSourceFile: module,
@@ -766,7 +794,7 @@ function processImportClausesForModules(modules, exports) {
766
794
  const defaultImport = impDecl.getDefaultImport();
767
795
  if (defaultImport !== undefined) {
768
796
  analyze_1.logger.info(`Importing (default) ${defaultImport.getText()} from ${impDecl.getModuleSpecifierValue()} in ${modulePath}`);
769
- // call with module, impDecl.getModuleSpecifierValue(), path, defaultImport, false, true
797
+ analyze_1.logger.debug(`Processing Default Import: ${defaultImport.getText()}, pos=${defaultImport.getStart()}`);
770
798
  analyze_1.entityDictionary.oldCreateOrGetFamixImportClause({
771
799
  importDeclaration: impDecl,
772
800
  importerSourceFile: module,
@@ -787,7 +815,6 @@ function processImportClausesForModules(modules, exports) {
787
815
  isInExports: false,
788
816
  isDefaultExport: false
789
817
  });
790
- // entityDictionary.createFamixImportClause(module, impDecl.getModuleSpecifierValue(), path, namespaceImport, false, false);
791
818
  }
792
819
  });
793
820
  });
@@ -807,33 +834,36 @@ function isInExports(exports, importedEntityName) {
807
834
  * @param interfaces An array of interfaces
808
835
  */
809
836
  function processInheritances(classes, interfaces) {
810
- analyze_1.logger.info(`processInheritances: Creating inheritances:`);
837
+ analyze_1.logger.info(`Creating inheritances:`);
811
838
  classes.forEach(cls => {
812
- analyze_1.logger.debug(`processInheritances: Checking class inheritance for ${cls.getName()}`);
813
- try {
814
- const extClass = cls.getBaseClass();
815
- if (extClass !== undefined) {
816
- analyze_1.entityDictionary.createOrGetFamixInheritance(cls, extClass);
817
- analyze_1.logger.debug(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), extClass: ${extClass.getName()}, (${extClass.getType().getText()})`);
839
+ analyze_1.logger.debug(`Checking class inheritance for ${cls.getName()}`);
840
+ const baseClass = cls.getBaseClass();
841
+ if (baseClass !== undefined) {
842
+ analyze_1.entityDictionary.createOrGetFamixInheritance(cls, baseClass);
843
+ analyze_1.logger.debug(`class: ${cls.getName()}, (${cls.getType().getText()}), extClass: ${baseClass.getName()}, (${baseClass.getType().getText()})`);
844
+ } // this is false when the class extends an undefined class
845
+ else {
846
+ // check for "extends" of unresolved class
847
+ const undefinedExtendedClass = cls.getExtends();
848
+ if (undefinedExtendedClass) {
849
+ analyze_1.entityDictionary.createOrGetFamixInheritance(cls, undefinedExtendedClass);
850
+ analyze_1.logger.debug(`class: ${cls.getName()}, (${cls.getType().getText()}), undefinedExtendedClass: ${undefinedExtendedClass.getText()}`);
818
851
  }
819
- analyze_1.logger.debug(`processInheritances: Checking interface inheritance for ${cls.getName()}`);
820
- const implementedInterfaces = getImplementedOrExtendedInterfaces(interfaces, cls);
821
- implementedInterfaces.forEach(impInter => {
822
- analyze_1.entityDictionary.createOrGetFamixInheritance(cls, impInter);
823
- analyze_1.logger.debug(`processInheritances: class: ${cls.getName()}, (${cls.getType().getText()}), impInter: ${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getName() : impInter.getExpression().getText()}, (${(impInter instanceof ts_morph_1.InterfaceDeclaration) ? impInter.getType().getText() : impInter.getExpression().getText()})`);
824
- });
825
- }
826
- catch (error) {
827
- analyze_1.logger.error(`> WARNING: got exception ${error}. Continuing...`);
828
852
  }
853
+ analyze_1.logger.debug(`Checking interface inheritance for ${cls.getName()}`);
854
+ const implementedInterfaces = getImplementedOrExtendedInterfaces(interfaces, cls);
855
+ implementedInterfaces.forEach(implementedIF => {
856
+ analyze_1.entityDictionary.createOrGetFamixInheritance(cls, implementedIF);
857
+ analyze_1.logger.debug(`class: ${cls.getName()}, (${cls.getType().getText()}), impInter: ${(implementedIF instanceof ts_morph_1.InterfaceDeclaration) ? implementedIF.getName() : implementedIF.getExpression().getText()}, (${(implementedIF instanceof ts_morph_1.InterfaceDeclaration) ? implementedIF.getType().getText() : implementedIF.getExpression().getText()})`);
858
+ });
829
859
  });
830
- interfaces.forEach(inter => {
860
+ interfaces.forEach(interFace => {
831
861
  try {
832
- analyze_1.logger.debug(`processInheritances: Checking interface inheritance for ${inter.getName()}`);
833
- const extendedInterfaces = getImplementedOrExtendedInterfaces(interfaces, inter);
834
- extendedInterfaces.forEach(extInter => {
835
- analyze_1.entityDictionary.createOrGetFamixInheritance(inter, extInter);
836
- analyze_1.logger.debug(`processInheritances: inter: ${inter.getName()}, (${inter.getType().getText()}), extInter: ${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getName() : extInter.getExpression().getText()}, (${(extInter instanceof ts_morph_1.InterfaceDeclaration) ? extInter.getType().getText() : extInter.getExpression().getText()})`);
862
+ analyze_1.logger.debug(`Checking interface inheritance for ${interFace.getName()}`);
863
+ const extendedInterfaces = getImplementedOrExtendedInterfaces(interfaces, interFace);
864
+ extendedInterfaces.forEach(extendedInterface => {
865
+ analyze_1.entityDictionary.createOrGetFamixInheritance(interFace, extendedInterface);
866
+ analyze_1.logger.debug(`interFace: ${interFace.getName()}, (${interFace.getType().getText()}), extendedInterface: ${(extendedInterface instanceof ts_morph_1.InterfaceDeclaration) ? extendedInterface.getName() : extendedInterface.getExpression().getText()}, (${(extendedInterface instanceof ts_morph_1.InterfaceDeclaration) ? extendedInterface.getType().getText() : extendedInterface.getExpression().getText()})`);
837
867
  });
838
868
  }
839
869
  catch (error) {
@@ -883,25 +913,25 @@ function processNodeForInvocations(nodeReferencingInvocable, invocable, id) {
883
913
  * @param classes An array of classes
884
914
  * @param interfaces An array of interfaces
885
915
  */
886
- // export function processConcretisations(classes: ClassDeclaration[], interfaces: InterfaceDeclaration[], functions: Map<number, MethodDeclaration | ConstructorDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | FunctionDeclaration | FunctionExpression | ArrowFunction>): void {
887
- // logger.info(`processConcretisations: Creating concretisations:`);
888
- // classes.forEach(cls => {
889
- // logger.debug(`processConcretisations: Checking class concretisation for ${cls.getName()}`);
890
- // entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(cls);
891
- // entityDictionary.createFamixConcretisationGenericInstantiation(cls);
892
- // entityDictionary.createFamixConcretisationInterfaceClass(cls);
893
- // entityDictionary.createFamixConcretisationTypeInstanciation(cls);
894
- // });
895
- // interfaces.forEach(inter => {
896
- // logger.debug(`processConcretisations: Checking interface concretisation for ${inter.getName()}`);
897
- // entityDictionary.createFamixConcretisationTypeInstanciation(inter);
898
- // entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(inter);
899
- // });
900
- // functions.forEach(func => {
901
- // if(func instanceof FunctionDeclaration || func instanceof MethodDeclaration ){
902
- // logger.debug(`processConcretisations: Checking Method concretisation`);
903
- // entityDictionary.createFamixConcretisationFunctionInstantiation(func);
904
- // }
905
- // });
906
- // }
907
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc19mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZV9mdW5jdGlvbnMvcHJvY2Vzc19mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0NBLHNDQWNDO0FBUUQsZ0ZBc0JDO0FBTUQsb0NBWUM7QUFxQ0QsOEJBR0M7QUFFRCxrQ0FJQztBQThvQkQsMENBV0M7QUE0QkQsMEdBeUJDO0FBT0Qsd0VBbURDO0FBaUJELGtEQXVDQztBQU1ELGdEQWdCQztBQXArQkQsdUNBQW9sQjtBQUNwbEIsZ0VBQWtEO0FBQ2xELDZFQUFpRTtBQUNqRSx1Q0FBeUI7QUFDekIsd0NBQXNEO0FBQ3RELGdDQUFnQztBQU1uQixRQUFBLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDLENBQUMsK0lBQStJO0FBRTdNLFFBQUEsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFxQyxDQUFDLENBQUMsd0lBQXdJO0FBQ2xNLFFBQUEsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFvQixDQUFDLENBQUMsK0NBQStDO0FBQ3hGLFFBQUEsVUFBVSxHQUFHLElBQUksS0FBSyxFQUF3QixDQUFDLENBQUMsa0RBQWtEO0FBQ2xHLFFBQUEsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFjLENBQUMsQ0FBQyxrREFBa0Q7QUFDckYsUUFBQSxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBK0MsQ0FBQyxDQUFDLCtCQUErQjtBQUd6SDs7OztHQUlHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxVQUFzQjtJQUMvQyxPQUFPLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxVQUE2QjtJQUN2RCxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLFVBQVUsQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFELElBQUksVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUM1RyxJQUFJLEdBQUcsVUFBVSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEQsQ0FBQzthQUNJLENBQUM7WUFDRixJQUFJLEdBQUcsVUFBVSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3hELENBQUM7SUFDTCxDQUFDO1NBQ0ksQ0FBQztRQUNGLElBQUksR0FBRyxVQUFVLENBQUMsNEJBQTRCLEVBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0Isa0NBQWtDLENBQUMsVUFBdUMsRUFBRSxRQUFpRDtJQUN6SSxJQUFJLGtCQUFzRCxDQUFDO0lBQzNELElBQUksUUFBUSxZQUFZLDJCQUFnQixFQUFFLENBQUM7UUFDdkMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2xELENBQUM7U0FDSSxDQUFDO1FBQ0Ysa0JBQWtCLEdBQUcsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDekQsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEtBQUssRUFBc0QsQ0FBQztJQUV4RyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDM0IsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEQsK0JBQStCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDO2FBQ0ksQ0FBQztZQUNGLCtCQUErQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLCtCQUErQixDQUFDO0FBQzNDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsV0FBOEI7SUFDdkQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN2QixnQkFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0RCwySEFBMkg7UUFDM0gsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxpQkFBUyxHQUFHLElBQUEsOEJBQVMsRUFBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzs7WUFFMUMsaUJBQVMsR0FBRyxFQUFFLENBQUM7UUFFbkIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLENBQWE7SUFDOUIsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNYLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzlDLElBQUksU0FBUztRQUFFLHdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVoRCxNQUFNLE9BQU8sR0FBRywwQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbkUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRTNGLGVBQWUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUIsY0FBYyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUUzQixjQUFjLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTNCLGlCQUFpQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU5QixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFN0IsWUFBWSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV6QixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFN0IsY0FBYyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXVCO0lBQzdDLHFEQUFxRDtJQUNyRCxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0FBQzlHLENBQUM7QUFFRCxTQUFnQixXQUFXLENBQUMsSUFBdUI7SUFDL0MsMkRBQTJEO0lBQzNELDhFQUE4RTtJQUM5RSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLENBQW9CO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLDBCQUFnQixDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdELGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRXBHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUIsY0FBYyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU3QixjQUFjLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTdCLGlCQUFpQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVoQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0IsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUUzQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0IsY0FBYyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU3QixPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBTUQ7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLENBQWlCLEVBQUUsUUFBcUI7SUFDNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUM1RCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFpQyxFQUFFLFFBQTJDO0lBQ2xHLGdCQUFNLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDNUQsTUFBTSx1QkFBdUIsR0FBRyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDL0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNoQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUFDLENBQWdCO0lBQzdDLE1BQU0sT0FBTyxHQUF1QixFQUFFLENBQUM7SUFFdkMsU0FBUyxXQUFXLENBQUMsSUFBVTtRQUMzQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxxQkFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakQsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUF3QixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQ0FBa0MsQ0FBQyxDQUFpQztJQUN6RSxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMscUJBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RSxNQUFNLHVCQUF1QixHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNGLE9BQU8sdUJBQXVCLENBQUM7QUFDbkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLENBQWlDLEVBQUUsUUFBMkM7SUFDckcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsQ0FBaUIsRUFBRSxRQUE0RjtJQUNySSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNsQyxNQUFNLFlBQVksR0FBRyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQy9CLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsQ0FBaUIsRUFBRSxRQUFxQjtJQUMxRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsQ0FBaUIsRUFBRSxRQUFxQjtJQUM5RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDekIsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxzQkFBc0I7SUFDdEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNuQyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMscUJBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4RSxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxDQUFpQyxFQUFFLFFBQTJDO0lBQ2xHLGdCQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxZQUFZLENBQUMsQ0FBdUI7SUFDekMsTUFBTSxRQUFRLEdBQUcsMEJBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFFeEcsZUFBZSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU3QixPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLENBQW1CO0lBQ3JDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEIsTUFBTSxRQUFRLEdBQUcsMEJBQWdCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFFeEcsZUFBZSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU3QixpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFL0IscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRW5DLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM5QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxDQUF1QjtJQUM3QyxrQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuQixNQUFNLFlBQVksR0FBRywwQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksWUFBWSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUVoSCxlQUFlLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRWpDLHFCQUFxQixDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV2QyxPQUFPLFlBQVksQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMscUJBQXFCLENBQUMsQ0FBMEMsRUFBRSxRQUEyRjtJQUNsSyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBUSxZQUFZLEtBQUssQ0FBQyxlQUFlLElBQUksUUFBUSxZQUFZLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdGLHFCQUFxQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3QixNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLENBQTBDO0lBQy9ELE1BQU0sV0FBVyxHQUFHLDBCQUFnQixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVELGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxXQUFXLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzlHLGdCQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsWUFBWSw0QkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDeEcsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFeEUsYUFBYTtJQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSw0QkFBaUIsQ0FBQyxFQUFFLENBQUM7UUFDcEMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xDLHlFQUF5RTtRQUN6RSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1lBQ25ELGdCQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLFdBQVcsQ0FBQyxJQUFJLFFBQVEsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakksaUJBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFaEMsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7O09BSU87QUFDUCxTQUFTLGFBQWEsQ0FBQyxDQUFpSDtJQUNwSSxNQUFNLFNBQVMsR0FBRywwQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsaUJBQVMsQ0FBQyxDQUFDO0lBRXhFLGdCQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxpQ0FBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLGNBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBOEMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRXBQLGVBQWUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUIscUJBQXFCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXBDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksMEJBQWUsQ0FBQyxFQUFFLENBQUM7UUFDbEMsY0FBYyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUU3QixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0IsWUFBWSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUzQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0IsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLGlDQUF5QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLENBQUMsWUFBWSw0QkFBaUIsSUFBSSxDQUFDLFlBQVksaUNBQXNCLElBQUksQ0FBQyxZQUFZLGlDQUFzQixFQUFFLENBQUM7UUFDL0csaUJBQWlCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLENBQTJEO0lBRWhGLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksd0JBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLElBQUEsWUFBTSxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVsSyxJQUFJLFdBQVcsQ0FBQztJQUNoQixJQUFJLENBQUMsWUFBWSx3QkFBYSxFQUFFLENBQUM7UUFDN0IsV0FBVyxHQUFHLDBCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsRUFBRSxpQkFBUyxDQUFDLENBQUM7SUFDL0UsQ0FBQztTQUFNLENBQUM7UUFDSixXQUFXLEdBQUcsMEJBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLGlCQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsZUFBZSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoQyxjQUFjLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRS9CLHFCQUFxQixDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV0QyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFbEMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWpDLFlBQVksQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFN0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWpDLElBQUksQ0FBQyxZQUFZLDhCQUFtQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFlBQVksZ0JBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEUsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxpQ0FBeUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVqRCxPQUFPLFdBQVcsQ0FBQztBQUN2QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsMEJBQTBCLENBQUMsQ0FBcUgsRUFBRSxRQUF3RDtJQUMvTSxnQkFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLHFCQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRixtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxDQUE0SyxFQUFFLFFBQXdEO0lBQzdQLGdCQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxRQUFRLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hDLCtEQUErRDtRQUMvRCxJQUFJLENBQUMsWUFBWSxpQ0FBc0IsRUFBRSxDQUFDO1lBQ3RDLHFEQUFxRDtZQUNyRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMscUJBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLHFCQUFVLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxxQkFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxxQkFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pNLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN6QyxnQkFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxDQUFDLE9BQU8sRUFBRSxzQkFBc0Isa0JBQWtCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN4Ryw0REFBNEQ7Z0JBQzVELE1BQU0sV0FBVyxHQUFHLDBCQUEwQixDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUMxRSxXQUFXLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMscUJBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6RSxDQUFDO1FBQ0wsQ0FBQztJQUVMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixzRUFBc0U7QUFDdEUsU0FBUywwQkFBMEIsQ0FBQyxLQUEyQixFQUFFLFNBQTZDO0lBQzFHLHdDQUF3QztJQUN4QyxNQUFNLHNCQUFzQixHQUFHLHdDQUF3QyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9FLDRFQUE0RTtJQUM1RSxTQUFTLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFFOUMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksc0JBQXNCLENBQUMsSUFBSSx1QkFBdUIsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBQ0QsTUFBTSxXQUFXLEdBQUcsMEJBQWdCLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsSUFBSSxTQUFTLFlBQVksMkJBQWdCLEVBQUUsQ0FBQztRQUN4QyxNQUFNLFFBQVEsR0FBRywwQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRSxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXZDLHFDQUFxQztJQUNyQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFbEIsT0FBTyxXQUFXLENBQUM7QUFFdkIsQ0FBQztBQUVELFNBQVMsd0NBQXdDLENBQUMsS0FBMkI7SUFDekUsZUFBZTtJQUNmLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUVsQyxlQUFlO0lBQ2YsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVqRCx1QkFBdUI7SUFDdkIsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLHFCQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxLQUFLLEdBQUcsZ0JBQUssQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxxQkFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztRQUN4RCxLQUFLLEdBQUcsZ0JBQUssQ0FBQyxTQUFTLENBQUM7SUFDNUIsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxxQkFBVSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDckQsS0FBSyxHQUFHLGdCQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsU0FBUyxzREFBc0QsQ0FBQyxDQUFDO0lBQzNHLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxxQkFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRWpFLDBDQUEwQztJQUMxQyxNQUFNLHNCQUFzQixHQUFHO1FBQzNCLElBQUksRUFBRSxTQUFTO1FBQ2YsSUFBSSxFQUFFLFNBQVM7UUFDZixLQUFLLEVBQUUsS0FBSztRQUNaLFVBQVUsRUFBRSxVQUFVO0tBQ3pCLENBQUM7SUFFRixPQUFPLHNCQUFzQixDQUFDO0FBQ2xDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxTQUErQjtJQUNyRCxNQUFNLFFBQVEsR0FBRywwQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFFLGdCQUFnQjtJQUV6RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLFNBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUU1SCxlQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXJDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV2QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFFckMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLDBCQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pILGlCQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxDQUFzTixFQUFFLFFBQWtJO0lBQ3JYLGdCQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDekMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQy9CLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxFQUE0QjtJQUN0RCxNQUFNLGdCQUFnQixHQUFHLDBCQUFnQixDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXZFLGdCQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUUzSCxlQUFlLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFdEMsT0FBTyxnQkFBZ0IsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsd0JBQXdCLENBQUMsQ0FBb0I7SUFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxLQUFLLEVBQWtCLENBQUM7SUFFakQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVoSyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ25DLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxlQUFlLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFlBQVksQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLENBQXNCO0lBQzNDLE1BQU0sTUFBTSxHQUFHLDBCQUFnQixDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVELGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsY0FBYyxFQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsV0FBVyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRXBNLGVBQWUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0IsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFdBQVcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsaUJBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLENBQWtCO0lBQ25DLE1BQU0sT0FBTyxHQUFHLDBCQUFnQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpELGdCQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBRXRHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN2QixNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLENBQWE7SUFDbkMsTUFBTSxZQUFZLEdBQUcsMEJBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFFakgsZUFBZSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVqQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNyRyxpQkFBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxDLE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxDQUFzSSxFQUFFLFFBQWdIO0lBQy9RLGdCQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM1QixNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsQ0FBWSxFQUFFLENBQXNJO0lBQzFLLE1BQU0sTUFBTSxHQUFHLDBCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUUxRyxlQUFlLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNCLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBK2IsRUFBRSxRQUEyQjtJQUNqZixnQkFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNwQyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLGdCQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyw4QkFBOEI7SUFDbkUsQ0FBQyxDQUFDLENBQUM7SUFDSCxDQUFDLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNoRSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsQ0FBZSxFQUFFLFFBQTJCO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxPQUFPLEVBQUUsZUFBZSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sVUFBVSxHQUFHLDBCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFN0UsT0FBTyxVQUFVLENBQUM7QUFDdEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxTQUFpRDtJQUM3RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25DLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUU7UUFDeEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLFFBQVE7UUFDUixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMscUJBQXFCLEVBQXVCLENBQUM7UUFDbEUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdELG9CQUFvQjtRQUNwQiwyRUFBMkU7UUFDM0UsSUFBSTtJQUNSLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLENBQWEsRUFBRSxFQUFVO0lBQ3JELFFBQVE7SUFDUixtRkFBbUY7SUFDbkYsc0VBQXNFO0lBQ3RFLDRFQUE0RTtJQUM1RSxpQ0FBaUM7SUFDakMsSUFBSSxDQUFDLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RFLGdCQUFNLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsMERBQTBELENBQUMsQ0FBQztRQUN6SyxPQUFPO0lBQ1gsQ0FBQztJQUNELDBCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xILG9CQUFvQjtJQUNwQix1SUFBdUk7SUFDdkksSUFBSTtBQUNSLENBQUM7QUFHRCwwRkFBMEY7QUFFMUYscURBQXFEO0FBQ3JELFNBQWdCLCtDQUErQyxDQUFDLFdBQThCLEVBQUUsT0FBMkQ7SUFDdkosZ0JBQU0sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLENBQUMsQ0FBQztJQUN0RixXQUFXLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzdCLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxJQUFJLGVBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QywwQ0FBMEM7Z0JBQzFDLGdCQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCxnQkFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRSwwQ0FBMEM7Z0JBQzFDLHlDQUF5QztnQkFDekMsK0JBQStCO2dCQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3ZDLDBCQUFnQixDQUFDLCtCQUErQixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxJQUFJO29CQUN2QixrQkFBa0IsRUFBRSxVQUFVO29CQUM5Qix1QkFBdUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLEVBQUU7b0JBQzVELGFBQWEsRUFBRSxXQUFXO29CQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTO29CQUMxRSxlQUFlLEVBQUUsS0FBSztpQkFDekIsQ0FBQyxDQUFDO2dCQUNILDZFQUE2RTtZQUNqRixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDLENBQ0EsQ0FBQztBQUNOLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsOEJBQThCLENBQUMsT0FBMEIsRUFBRSxPQUEyRDtJQUNsSSxnQkFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsT0FBTyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUM7SUFDdkUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNyQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQywwQkFBMEI7UUFDbkUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdDLGdCQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsT0FBTyxDQUFDLHVCQUF1QixFQUFFLE9BQU8sVUFBVSxFQUFFLENBQUMsQ0FBQztZQUMvRSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFcEMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDNUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsT0FBTyxVQUFVLEVBQUUsQ0FBQyxDQUFDO2dCQUNySCxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3RFLDBCQUFnQixDQUFDLCtCQUErQixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxPQUFPO29CQUMxQixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQix1QkFBdUIsRUFBRSxJQUFJO29CQUM3QixhQUFhLEVBQUUsV0FBVztvQkFDMUIsV0FBVyxFQUFFLG9CQUFvQjtvQkFDakMsZUFBZSxFQUFFLEtBQUs7aUJBQ3pCLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDakQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzlCLGdCQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLE9BQU8sVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDekgsd0ZBQXdGO2dCQUN4RiwwQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQztvQkFDN0MsaUJBQWlCLEVBQUUsT0FBTztvQkFDMUIsa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsdUJBQXVCLEVBQUUsSUFBSTtvQkFDN0IsYUFBYSxFQUFFLGFBQWE7b0JBQzVCLFdBQVcsRUFBRSxLQUFLO29CQUNsQixlQUFlLEVBQUUsSUFBSTtpQkFDeEIsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxnQkFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLFVBQVUsRUFBRSxDQUFDLENBQUM7Z0JBQzdILDBCQUFnQixDQUFDLCtCQUErQixDQUFDO29CQUM3QyxpQkFBaUIsRUFBRSxPQUFPO29CQUMxQixrQkFBa0IsRUFBRSxNQUFNO29CQUMxQix1QkFBdUIsRUFBRSxJQUFJO29CQUM3QixhQUFhLEVBQUUsZUFBZTtvQkFDOUIsV0FBVyxFQUFFLEtBQUs7b0JBQ2xCLGVBQWUsRUFBRSxLQUFLO2lCQUN6QixDQUFDLENBQUM7Z0JBQ0gsNEhBQTRIO1lBQ2hJLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE9BQXNELEVBQUUsa0JBQTBCO0lBQ25HLElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDaEIsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUM1QixvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxvQkFBb0IsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLE9BQTJCLEVBQUUsVUFBa0M7SUFDL0YsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLGdCQUFNLENBQUMsS0FBSyxDQUFDLHVEQUF1RCxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekIsMEJBQWdCLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUU1RCxnQkFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ25LLENBQUM7WUFFRCxnQkFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RixNQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNsRixxQkFBcUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3JDLDBCQUFnQixDQUFDLDJCQUEyQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFNUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsWUFBWSwrQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsWUFBWSwrQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDdlUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNYLGdCQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLGlCQUFpQixDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2QixJQUFJLENBQUM7WUFDRCxnQkFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMzRixNQUFNLGtCQUFrQixHQUFHLGtDQUFrQyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqRixrQkFBa0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2xDLDBCQUFnQixDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFOUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsWUFBWSwrQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFFBQVEsWUFBWSwrQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDM1UsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNYLGdCQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLGlCQUFpQixDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLHlCQUFxRDtJQUNwRixnQkFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JDLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUNoRCxJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksd0JBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBRSwwQ0FBMEM7WUFDcEYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxZQUFZLDRCQUFpQixJQUFJLFNBQVMsWUFBWSxpQ0FBc0IsSUFBSSxTQUFTLFlBQVksaUNBQXNCLElBQUksU0FBUyxZQUFZLDhCQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFBWSxpQ0FBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1WSxJQUFJLENBQUM7Z0JBQ0QsTUFBTSx5QkFBeUIsR0FBRyxTQUFTLENBQUMscUJBQXFCLEVBQXVCLENBQUM7Z0JBQ3pGLHlCQUF5QixDQUFDLE9BQU8sQ0FDN0Isd0JBQXdCLENBQUMsRUFBRSxDQUFDLHlCQUF5QixDQUFDLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hHLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLGdCQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLGlCQUFpQixDQUFDLENBQUM7WUFDckUsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osZ0JBQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCLENBQUMsd0JBQW9DLEVBQUUsU0FBd0IsRUFBRSxFQUFVO0lBQ3pHLElBQUksQ0FBQztRQUNELDBCQUFnQixDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLHdCQUF3QixDQUFDLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2SCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLGdCQUFNLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLGtDQUFrQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUcsQ0FBQyxxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BLLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILG1TQUFtUztBQUNuUyx3RUFBd0U7QUFDeEUsK0JBQStCO0FBQy9CLHNHQUFzRztBQUN0Ryx5RkFBeUY7QUFDekYsK0VBQStFO0FBQy9FLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFFNUUsVUFBVTtBQUNWLG9DQUFvQztBQUNwQyw0R0FBNEc7QUFDNUcsOEVBQThFO0FBQzlFLDJGQUEyRjtBQUMzRixVQUFVO0FBQ1Ysa0NBQWtDO0FBQ2xDLHlGQUF5RjtBQUN6RixzRkFBc0Y7QUFDdEYscUZBQXFGO0FBQ3JGLFlBQVk7QUFDWixVQUFVO0FBQ1YsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBWYXJpYWJsZVN0YXRlbWVudCwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFNvdXJjZUZpbGUsIE1vZHVsZURlY2xhcmF0aW9uLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgRGVjb3JhdG9yLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBFeHBvcnRlZERlY2xhcmF0aW9ucywgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiwgQmxvY2ssIElkZW50aWZpZXIsIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSW1wb3J0RGVjbGFyYXRpb24sIE5vZGUsIEFycm93RnVuY3Rpb24sIFNjb3BlLCBDbGFzc0V4cHJlc3Npb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcclxuaW1wb3J0ICogYXMgRmFtaXggZnJvbSBcIi4uL2xpYi9mYW1peC9tb2RlbC9mYW1peFwiO1xyXG5pbXBvcnQgeyBjYWxjdWxhdGUgfSBmcm9tIFwiLi4vbGliL3RzLWNvbXBsZXgvY3ljbG9tYXRpYy1zZXJ2aWNlXCI7XHJcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgbG9nZ2VyLCBlbnRpdHlEaWN0aW9uYXJ5IH0gZnJvbSBcIi4uL2FuYWx5emVcIjtcclxuaW1wb3J0IHsgZ2V0RlFOIH0gZnJvbSBcIi4uL2ZxblwiO1xyXG5pbXBvcnQgeyBJbnZvY2FibGVUeXBlIH0gZnJvbSBcInNyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeVwiO1xyXG5cclxuZXhwb3J0IHR5cGUgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50ID0gUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IEVudW1NZW1iZXI7XHJcbmV4cG9ydCB0eXBlIEZhbWl4SUQgPSBudW1iZXI7XHJcblxyXG5leHBvcnQgY29uc3QgbWV0aG9kc0FuZEZ1bmN0aW9uc1dpdGhJZCA9IG5ldyBNYXA8bnVtYmVyLCBJbnZvY2FibGVUeXBlPigpOyAvLyBNYXBzIHRoZSBGYW1peCBtZXRob2QsIGNvbnN0cnVjdG9yLCBnZXR0ZXIsIHNldHRlciBhbmQgZnVuY3Rpb24gaWRzIHRvIHRoZWlyIHRzLW1vcnBoIG1ldGhvZCwgY29uc3RydWN0b3IsIGdldHRlciwgc2V0dGVyIG9yIGZ1bmN0aW9uIG9iamVjdFxyXG5cclxuZXhwb3J0IGNvbnN0IGFjY2Vzc01hcCA9IG5ldyBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50PigpOyAvLyBNYXBzIHRoZSBGYW1peCBwYXJhbWV0ZXIsIHZhcmlhYmxlLCBwcm9wZXJ0eSBhbmQgZW51bSB2YWx1ZSBpZHMgdG8gdGhlaXIgdHMtbW9ycGggcGFyYW1ldGVyLCB2YXJpYWJsZSwgcHJvcGVydHkgb3IgZW51bSBtZW1iZXIgb2JqZWN0XHJcbmV4cG9ydCBjb25zdCBjbGFzc2VzID0gbmV3IEFycmF5PENsYXNzRGVjbGFyYXRpb24+KCk7IC8vIEFycmF5IG9mIGFsbCB0aGUgY2xhc3NlcyBvZiB0aGUgc291cmNlIGZpbGVzXHJcbmV4cG9ydCBjb25zdCBpbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG5leHBvcnQgY29uc3QgbW9kdWxlcyA9IG5ldyBBcnJheTxTb3VyY2VGaWxlPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbW9kdWxlc1xyXG5leHBvcnQgY29uc3QgbGlzdE9mRXhwb3J0TWFwcyA9IG5ldyBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+PigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGV4cG9ydCBtYXBzXHJcbmV4cG9ydCBsZXQgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvLyBTdG9yZXMgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIGZvciB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxyXG5cclxuLyoqXHJcbiAqIENoZWNrcyBpZiB0aGUgZmlsZSBoYXMgYW55IGltcG9ydHMgb3IgZXhwb3J0cyB0byBiZSBjb25zaWRlcmVkIGEgbW9kdWxlXHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlIEEgc291cmNlIGZpbGVcclxuICogQHJldHVybnMgQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGZpbGUgaXMgYSBtb2R1bGVcclxuICovXHJcbmZ1bmN0aW9uIGlzU291cmNlRmlsZUFNb2R1bGUoc291cmNlRmlsZTogU291cmNlRmlsZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHNvdXJjZUZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCkubGVuZ3RoID4gMCB8fCBzb3VyY2VGaWxlLmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCkuc2l6ZSA+IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXRzIHRoZSBwYXRoIG9mIGEgbW9kdWxlIHRvIGJlIGltcG9ydGVkXHJcbiAqIEBwYXJhbSBpbXBvcnREZWNsIEFuIGltcG9ydCBkZWNsYXJhdGlvblxyXG4gKiBAcmV0dXJucyBUaGUgcGF0aCBvZiB0aGUgbW9kdWxlIHRvIGJlIGltcG9ydGVkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlUGF0aChpbXBvcnREZWNsOiBJbXBvcnREZWNsYXJhdGlvbik6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0aDogc3RyaW5nO1xyXG4gICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLnN1YnN0cmluZyhpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkubGVuZ3RoIC0gMykgPT09IFwiLnRzXCIpIHtcclxuICAgICAgICAgICAgcGF0aCA9IGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgKyBcIi50c1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKSEuZ2V0RmlsZVBhdGgoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0cyB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSBhIGNsYXNzIG9yIGFuIGludGVyZmFjZVxyXG4gKiBAcGFyYW0gaW50ZXJmYWNlcyBBbiBhcnJheSBvZiBpbnRlcmZhY2VzXHJcbiAqIEBwYXJhbSBzdWJDbGFzcyBBIGNsYXNzIG9yIGFuIGludGVyZmFjZVxyXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbiBhbmQgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzIGNvbnRhaW5pbmcgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgdGhlIHN1YkNsYXNzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcyhpbnRlcmZhY2VzOiBBcnJheTxJbnRlcmZhY2VEZWNsYXJhdGlvbj4sIHN1YkNsYXNzOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBBcnJheTxJbnRlcmZhY2VEZWNsYXJhdGlvbiB8IEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cz4ge1xyXG4gICAgbGV0IGltcE9yRXh0SW50ZXJmYWNlczogQXJyYXk8RXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPjtcclxuICAgIGlmIChzdWJDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcclxuICAgICAgICBpbXBPckV4dEludGVyZmFjZXMgPSBzdWJDbGFzcy5nZXRJbXBsZW1lbnRzKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpbXBPckV4dEludGVyZmFjZXMgPSBzdWJDbGFzcy5nZXRFeHRlbmRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW50ZXJmYWNlc05hbWVzID0gaW50ZXJmYWNlcy5tYXAoaSA9PiBpLmdldE5hbWUoKSk7XHJcbiAgICBjb25zdCBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uIHwgRXhwcmVzc2lvbldpdGhUeXBlQXJndW1lbnRzPigpO1xyXG5cclxuICAgIGltcE9yRXh0SW50ZXJmYWNlcy5mb3JFYWNoKGkgPT4ge1xyXG4gICAgICAgIGlmIChpbnRlcmZhY2VzTmFtZXMuaW5jbHVkZXMoaS5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpKSkge1xyXG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlc1tpbnRlcmZhY2VzTmFtZXMuaW5kZXhPZihpLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCkpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYXJyYXkgb2Ygc291cmNlIGZpbGVzXHJcbiAqIEBwYXJhbSBzb3VyY2VGaWxlcyBBbiBhcnJheSBvZiBzb3VyY2UgZmlsZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZXMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+KTogdm9pZCB7XHJcbiAgICBzb3VyY2VGaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5pbmZvKGBGaWxlOiA+Pj4+Pj4+Pj4+ICR7ZmlsZS5nZXRGaWxlUGF0aCgpfWApO1xyXG5cclxuICAgICAgICAvLyBDb21wdXRlcyB0aGUgY3ljbG9tYXRpYyBjb21wbGV4aXR5IG1ldHJpY3MgZm9yIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIGlmIGl0IGV4aXN0cyAoaS5lLiBpZiBpdCBpcyBub3QgZnJvbSBhIGplc3QgdGVzdClcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlLmdldEZpbGVQYXRoKCkpKVxyXG4gICAgICAgICAgICBjdXJyZW50Q0MgPSBjYWxjdWxhdGUoZmlsZS5nZXRGaWxlUGF0aCgpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGN1cnJlbnRDQyA9IHt9O1xyXG5cclxuICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgc291cmNlIGZpbGVcclxuICogQHBhcmFtIGYgQSBzb3VyY2UgZmlsZVxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoZjogU291cmNlRmlsZSk6IHZvaWQge1xyXG4gICAgY29uc3QgaXNNb2R1bGUgPSBpc1NvdXJjZUZpbGVBTW9kdWxlKGYpO1xyXG5cclxuICAgIGlmIChpc01vZHVsZSkge1xyXG4gICAgICAgIG1vZHVsZXMucHVzaChmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBleHBvcnRNYXAgPSBmLmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCk7XHJcbiAgICBpZiAoZXhwb3J0TWFwKSBsaXN0T2ZFeHBvcnRNYXBzLnB1c2goZXhwb3J0TWFwKTtcclxuXHJcbiAgICBjb25zdCBmbXhGaWxlID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4RmlsZShmLCBpc01vZHVsZSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzRmlsZTogZmlsZTogJHtmLmdldEJhc2VOYW1lKCl9LCBmcW4gPSAke2ZteEZpbGUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQWxpYXNlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQ2xhc3NlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzSW50ZXJmYWNlcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzVmFyaWFibGVzKGYsIGZteEZpbGUpO1xyXG5cclxuICAgIHByb2Nlc3NFbnVtcyhmLCBmbXhGaWxlKTtcclxuXHJcbiAgICBwcm9jZXNzRnVuY3Rpb25zKGYsIGZteEZpbGUpO1xyXG5cclxuICAgIHByb2Nlc3NNb2R1bGVzKGYsIGZteEZpbGUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNBbWJpZW50KG5vZGU6IE1vZHVsZURlY2xhcmF0aW9uKTogYm9vbGVhbiB7XHJcbiAgICAvLyBBbiBhbWJpZW50IG1vZHVsZSBoYXMgdGhlIERlY2xhcmVLZXl3b3JkIG1vZGlmaWVyLlxyXG4gICAgcmV0dXJuIChub2RlLmdldE1vZGlmaWVycygpPy5zb21lKG1vZGlmaWVyID0+IG1vZGlmaWVyLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5EZWNsYXJlS2V5d29yZCkpID8/IGZhbHNlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lc3BhY2Uobm9kZTogTW9kdWxlRGVjbGFyYXRpb24pOiBib29sZWFuIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24gaGFzIGEgbmFtZXNwYWNlIGtleXdvcmQuXHJcbiAgICAvLyBUaGlzIGFwcHJvYWNoIHVzZXMgdGhlIGdldENoaWxkcmVuKCkgbWV0aG9kIHRvIGluc3BlY3QgdGhlIHN5bnRheCBkaXJlY3RseS5cclxuICAgIHJldHVybiBub2RlLmdldENoaWxkcmVuT2ZLaW5kKFN5bnRheEtpbmQuTmFtZXNwYWNlS2V5d29yZCkubGVuZ3RoID4gMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIG1vZHVsZSAoYWxzbyBuYW1lc3BhY2UpXHJcbiAqIEBwYXJhbSBtIEEgbmFtZXNwYWNlXHJcbiAqIEByZXR1cm5zIEEgRmFtaXguTW9kdWxlIHJlcHJlc2VudGluZyB0aGUgbW9kdWxlXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzTW9kdWxlKG06IE1vZHVsZURlY2xhcmF0aW9uKTogRmFtaXguTW9kdWxlIHtcclxuICAgIGNvbnN0IGZteE1vZHVsZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1vZHVsZShtKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYG1vZHVsZTogJHttLmdldE5hbWUoKX0sICgke20uZ2V0VHlwZSgpLmdldFRleHQoKX0pLCAke2ZteE1vZHVsZS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKG0sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgcHJvY2Vzc0FsaWFzZXMobSwgZm14TW9kdWxlKTtcclxuXHJcbiAgICBwcm9jZXNzQ2xhc3NlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NJbnRlcmZhY2VzKG0sIGZteE1vZHVsZSk7XHJcblxyXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NFbnVtcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHByb2Nlc3NGdW5jdGlvbnMobSwgZm14TW9kdWxlKTtcclxuXHJcbiAgICBwcm9jZXNzTW9kdWxlcyhtLCBmbXhNb2R1bGUpO1xyXG5cclxuICAgIHJldHVybiBmbXhNb2R1bGU7XHJcbn1cclxuXHJcbnR5cGUgQ29udGFpbmVyVHlwZXMgPSBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uO1xyXG5cclxudHlwZSBTY29wZWRUeXBlcyA9IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSB8IEZhbWl4LkZ1bmN0aW9uIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3I7XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhbGlhc2VzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlLCBhIG5hbWVzcGFjZSwgYSBmdW5jdGlvbiBvciBhIG1ldGhvZClcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQWxpYXNlcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NBbGlhc2VzOiAtLS0tLS0tLS0tIEZpbmRpbmcgQWxpYXNlczpgKTtcclxuICAgIG0uZ2V0VHlwZUFsaWFzZXMoKS5mb3JFYWNoKGEgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteEFsaWFzID0gcHJvY2Vzc0FsaWFzKGEpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEFsaWFzKGZteEFsaWFzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBjbGFzc2VzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NDbGFzc2VzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ2xhc3NlczogLS0tLS0tLS0tLSBGaW5kaW5nIENsYXNzZXM6YCk7XHJcbiAgICBjb25zdCBjbGFzc2VzSW5BcnJvd0Z1bmN0aW9ucyA9IGdldENsYXNzZXNEZWNsYXJlZEluQXJyb3dGdW5jdGlvbnMobSk7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gbS5nZXRDbGFzc2VzKCkuY29uY2F0KGNsYXNzZXNJbkFycm93RnVuY3Rpb25zKTtcclxuICAgIGNsYXNzZXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhDbGFzcyA9IHByb2Nlc3NDbGFzcyhjKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteENsYXNzKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcnJvd0Z1bmN0aW9uQ2xhc3NlcyhmOiBBcnJvd0Z1bmN0aW9uKTogQ2xhc3NEZWNsYXJhdGlvbltdIHtcclxuICAgIGNvbnN0IGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSA9IFtdO1xyXG5cclxuICAgIGZ1bmN0aW9uIGZpbmRDbGFzc2VzKG5vZGU6IE5vZGUpIHtcclxuICAgICAgICBpZiAobm9kZS5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gobm9kZSBhcyBDbGFzc0RlY2xhcmF0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9kZS5nZXRDaGlsZHJlbigpLmZvckVhY2goZmluZENsYXNzZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbmRDbGFzc2VzKGYpO1xyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0cy1tb3JwaCBkb2Vzbid0IGZpbmQgY2xhc3NlcyBpbiBhcnJvdyBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG8gZmluZCB0aGVtIG1hbnVhbGx5XHJcbiAqIEBwYXJhbSBzIEEgc291cmNlIGZpbGUgXHJcbiAqIEByZXR1cm5zIHRoZSBDbGFzc0RlY2xhcmF0aW9uIG9iamVjdHMgZm91bmQgaW4gYXJyb3cgZnVuY3Rpb25zIG9mIHRoZSBzb3VyY2UgZmlsZVxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q2xhc3Nlc0RlY2xhcmVkSW5BcnJvd0Z1bmN0aW9ucyhzOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24pOiBDbGFzc0RlY2xhcmF0aW9uW10ge1xyXG4gICAgY29uc3QgYXJyb3dGdW5jdGlvbnMgPSBzLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XHJcbiAgICBjb25zdCBjbGFzc2VzSW5BcnJvd0Z1bmN0aW9ucyA9IGFycm93RnVuY3Rpb25zLm1hcChmID0+IGdldEFycm93RnVuY3Rpb25DbGFzc2VzKGYpKS5mbGF0KCk7XHJcbiAgICByZXR1cm4gY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGludGVyZmFjZXMgb2YgYSBjb250YWluZXJcclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUgb3IgYSBuYW1lc3BhY2UpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0ludGVyZmFjZXMobTogU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbnRlcmZhY2VzOiAtLS0tLS0tLS0tIEZpbmRpbmcgSW50ZXJmYWNlczpgKTtcclxuICAgIG0uZ2V0SW50ZXJmYWNlcygpLmZvckVhY2goaSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14SW50ZXJmYWNlID0gcHJvY2Vzc0ludGVyZmFjZShpKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteEludGVyZmFjZSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdmFyaWFibGVzIG9mIGEgY29udGFpbmVyXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlLCBhIG5hbWVzcGFjZSwgYSBmdW5jdGlvbiBvciBhIG1ldGhvZClcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzVmFyaWFibGVzKG06IENvbnRhaW5lclR5cGVzLCBmbXhTY29wZTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlIHwgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3Nvcik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzVmFyaWFibGVzOiAtLS0tLS0tLS0tIEZpbmRpbmcgVmFyaWFibGVzOmApO1xyXG4gICAgbS5nZXRWYXJpYWJsZVN0YXRlbWVudHMoKS5mb3JFYWNoKHYgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFZhcmlhYmxlcyA9IHByb2Nlc3NWYXJpYWJsZVN0YXRlbWVudCh2KTtcclxuICAgICAgICBmbXhWYXJpYWJsZXMuZm9yRWFjaChmbXhWYXJpYWJsZSA9PiB7XHJcbiAgICAgICAgICAgIGZteFNjb3BlLmFkZFZhcmlhYmxlKGZteFZhcmlhYmxlKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBlbnVtcyBvZiBhIGNvbnRhaW5lclxyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSwgYSBuYW1lc3BhY2UsIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbnRhaW5lclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0VudW1zKG06IENvbnRhaW5lclR5cGVzLCBmbXhTY29wZTogU2NvcGVkVHlwZXMpOiB2b2lkIHtcclxuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0VudW1zOiAtLS0tLS0tLS0tIEZpbmRpbmcgRW51bXM6YCk7XHJcbiAgICBtLmdldEVudW1zKCkuZm9yRWFjaChlID0+IHtcclxuICAgICAgICBjb25zdCBmbXhFbnVtID0gcHJvY2Vzc0VudW0oZSk7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkVHlwZShmbXhFbnVtKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBmdW5jdGlvbnMgb2YgYSBjb250YWluZXJcclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NGdW5jdGlvbnMobTogQ29udGFpbmVyVHlwZXMsIGZteFNjb3BlOiBTY29wZWRUeXBlcyk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcclxuICAgIG0uZ2V0RnVuY3Rpb25zKCkuZm9yRWFjaChmID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jdGlvbiA9IHByb2Nlc3NGdW5jdGlvbihmKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL2ZpbmQgYXJyb3cgZnVuY3Rpb25zXHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgRnVuY3Rpb25zOmApO1xyXG4gICAgY29uc3QgYXJyb3dGdW5jdGlvbnMgPSBtLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XHJcbiAgICBhcnJvd0Z1bmN0aW9ucy5mb3JFYWNoKGFmID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jdGlvbiA9IHByb2Nlc3NGdW5jdGlvbihhZik7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkRnVuY3Rpb24oZm14RnVuY3Rpb24pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIG1vZHVsZXMgb2YgYSBjb250YWluZXIuXHJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NNb2R1bGVzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIE1vZHVsZXM6YCk7XHJcbiAgICBtLmdldE1vZHVsZXMoKS5mb3JFYWNoKG1kID0+IHtcclxuICAgICAgICBjb25zdCBmbXhNb2R1bGUgPSBwcm9jZXNzTW9kdWxlKG1kKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRNb2R1bGUoZm14TW9kdWxlKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGFsaWFzXHJcbiAqIEBwYXJhbSBhIEFuIGFsaWFzXHJcbiAqIEByZXR1cm5zIEEgRmFtaXguQWxpYXMgcmVwcmVzZW50aW5nIHRoZSBhbGlhc1xyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0FsaWFzKGE6IFR5cGVBbGlhc0RlY2xhcmF0aW9uKTogRmFtaXguQWxpYXMge1xyXG4gICAgY29uc3QgZm14QWxpYXMgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4QWxpYXMoYSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBBbGlhczogJHthLmdldE5hbWUoKX0sICgke2EuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEFsaWFzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHMoYSwgZm14QWxpYXMpO1xyXG5cclxuICAgIHJldHVybiBmbXhBbGlhcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGNsYXNzXHJcbiAqIEBwYXJhbSBjIEEgY2xhc3NcclxuICogQHJldHVybnMgQSBGYW1peC5DbGFzcyBvciBhIEZhbWl4LlBhcmFtZXRyaWNDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNsYXNzXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3MoYzogQ2xhc3NEZWNsYXJhdGlvbik6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHtcclxuICAgIGNsYXNzZXMucHVzaChjKTtcclxuXHJcbiAgICBjb25zdCBmbXhDbGFzcyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peENsYXNzKGMpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xhc3M6ICR7Yy5nZXROYW1lKCl9LCAoJHtjLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhDbGFzcy5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGMsIGZteENsYXNzKTtcclxuXHJcbiAgICBwcm9jZXNzRGVjb3JhdG9ycyhjLCBmbXhDbGFzcyk7XHJcblxyXG4gICAgcHJvY2Vzc1N0cnVjdHVyZWRUeXBlKGMsIGZteENsYXNzKTtcclxuXHJcbiAgICBjLmdldENvbnN0cnVjdG9ycygpLmZvckVhY2goY29uID0+IHtcclxuICAgICAgICBjb25zdCBmbXhDb24gPSBwcm9jZXNzTWV0aG9kKGNvbik7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteENvbik7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjLmdldEdldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhBY2MgPSBwcm9jZXNzTWV0aG9kKGFjYyk7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteEFjYyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjLmdldFNldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcclxuICAgICAgICBjb25zdCBmbXhBY2MgPSBwcm9jZXNzTWV0aG9kKGFjYyk7XHJcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteEFjYyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZm14Q2xhc3M7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gaW50ZXJmYWNlXHJcbiAqIEBwYXJhbSBpIEFuIGludGVyZmFjZVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LkludGVyZmFjZSBvciBhIEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UgcmVwcmVzZW50aW5nIHRoZSBpbnRlcmZhY2VcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NJbnRlcmZhY2UoaTogSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHtcclxuICAgIGludGVyZmFjZXMucHVzaChpKTtcclxuXHJcbiAgICBjb25zdCBmbXhJbnRlcmZhY2UgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBJbnRlcmZhY2U6ICR7aS5nZXROYW1lKCl9LCAoJHtpLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhJbnRlcmZhY2UuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhpLCBmbXhJbnRlcmZhY2UpO1xyXG5cclxuICAgIHByb2Nlc3NTdHJ1Y3R1cmVkVHlwZShpLCBmbXhJbnRlcmZhY2UpO1xyXG5cclxuICAgIHJldHVybiBmbXhJbnRlcmZhY2U7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycywgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhIHN0cnVjdHVyZWQgdHlwZVxyXG4gKiBAcGFyYW0gYyBBIHN0cnVjdHVyZWQgdHlwZSAoYSBjbGFzcyBvciBhbiBpbnRlcmZhY2UpXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZVxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc1N0cnVjdHVyZWRUeXBlKGM6IENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguSW50ZXJmYWNlIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIFByb3BlcnRpZXMgYW5kIE1ldGhvZHM6YCk7XHJcbiAgICBpZiAoZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfHwgZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKSB7XHJcbiAgICAgICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGMsIGZteFNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICBjLmdldFByb3BlcnRpZXMoKS5mb3JFYWNoKHByb3AgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFByb3BlcnR5ID0gcHJvY2Vzc1Byb3BlcnR5KHByb3ApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZFByb3BlcnR5KGZteFByb3BlcnR5KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGMuZ2V0TWV0aG9kcygpLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14TWV0aG9kID0gcHJvY2Vzc01ldGhvZChtKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRNZXRob2QoZm14TWV0aG9kKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIHAgQSBwcm9wZXJ0eVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlByb3BlcnR5IHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHlcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQcm9wZXJ0eShwOiBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUpOiBGYW1peC5Qcm9wZXJ0eSB7XHJcbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYHByb3BlcnR5OiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14UHJvcGVydHkuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG4gICAgbG9nZ2VyLmRlYnVnKGAgLS0tPiBJdCdzIGEgUHJvcGVydHkkeyhwIGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmUpID8gXCJTaWduYXR1cmVcIiA6IFwiRGVjbGFyYXRpb25cIn0hYCk7XHJcbiAgICBjb25zdCBhbmNlc3RvciA9IHAuZ2V0Rmlyc3RBbmNlc3Rvck9yVGhyb3coKTtcclxuICAgIGxvZ2dlci5kZWJ1ZyhgIC0tLT4gSXRzIGZpcnN0IGFuY2VzdG9yIGlzIGEgJHthbmNlc3Rvci5nZXRLaW5kTmFtZSgpfWApO1xyXG5cclxuICAgIC8vIGRlY29yYXRvcnNcclxuICAgIGlmICghKHAgaW5zdGFuY2VvZiBQcm9wZXJ0eVNpZ25hdHVyZSkpIHtcclxuICAgICAgICBwcm9jZXNzRGVjb3JhdG9ycyhwLCBmbXhQcm9wZXJ0eSk7XHJcbiAgICAgICAgLy8gb25seSBhZGQgYWNjZXNzIGlmIHRoZSBwJ3MgZmlyc3QgYW5jZXN0b3IgaXMgbm90IGEgUHJvcGVydHlEZWNsYXJhdGlvblxyXG4gICAgICAgIGlmIChhbmNlc3Rvci5nZXRLaW5kTmFtZSgpICE9PSBcIlByb3BlcnR5RGVjbGFyYXRpb25cIikge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3MgdG8gbWFwOiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhQcm9wZXJ0eS5uYW1lfSBpZDogJHtmbXhQcm9wZXJ0eS5pZH1gKTtcclxuICAgICAgICAgICAgYWNjZXNzTWFwLnNldChmbXhQcm9wZXJ0eS5pZCwgcCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhwLCBmbXhQcm9wZXJ0eSk7XHJcblxyXG4gICAgcmV0dXJuIGZteFByb3BlcnR5O1xyXG59XHJcblxyXG4vKipcclxuICAgICAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIG1ldGhvZCBvciBhbiBhY2Nlc3NvclxyXG4gICAgICogQHBhcmFtIG0gQSBtZXRob2Qgb3IgYW4gYWNjZXNzb3JcclxuICAgICAqIEByZXR1cm5zIEEgRmFtaXguTWV0aG9kIG9yIGEgRmFtaXguQWNjZXNzb3IgcmVwcmVzZW50aW5nIHRoZSBtZXRob2Qgb3IgdGhlIGFjY2Vzc29yXHJcbiAgICAgKi9cclxuZnVuY3Rpb24gcHJvY2Vzc01ldGhvZChtOiBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbik6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHtcclxuICAgIGNvbnN0IGZteE1ldGhvZCA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1ldGhvZChtLCBjdXJyZW50Q0MpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgTWV0aG9kOiAkeyEobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pID8gbS5nZXROYW1lKCkgOiBcImNvbnN0cnVjdG9yXCJ9LCAoJHttLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgcGFyZW50OiAkeyhtLmdldFBhcmVudCgpIGFzIENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbikuZ2V0TmFtZSgpfSwgZnFuID0gJHtmbXhNZXRob2QuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgIHByb2Nlc3NQYXJhbWV0ZXJzKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgaWYgKCEobSBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcclxuICAgICAgICBwcm9jZXNzQWxpYXNlcyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgICAgICBwcm9jZXNzVmFyaWFibGVzKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIHByb2Nlc3NFbnVtcyhtLCBmbXhNZXRob2QpO1xyXG5cclxuICAgICAgICBwcm9jZXNzRnVuY3Rpb25zKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIHByb2Nlc3NGdW5jdGlvbkV4cHJlc3Npb25zKG0sIGZteE1ldGhvZCk7XHJcblxyXG4gICAgICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuc2V0KGZteE1ldGhvZC5pZCwgbSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG0gaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBtIGluc3RhbmNlb2YgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIHByb2Nlc3NEZWNvcmF0b3JzKG0sIGZteE1ldGhvZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZteE1ldGhvZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBmIEEgZnVuY3Rpb25cclxuICogQHJldHVybnMgQSBGYW1peC5GdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRnVuY3Rpb24oZjogRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24pOiBGYW1peC5GdW5jdGlvbiB7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBGdW5jdGlvbjogJHsoZiBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24gPyBcImFub255bW91c1wiIDogZi5nZXROYW1lKCkgPyBmLmdldE5hbWUoKSA6IFwiYW5vbnltb3VzXCIpfSwgKCR7Zi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Z2V0RlFOKGYpfWApO1xyXG5cclxuICAgIGxldCBmbXhGdW5jdGlvbjtcclxuICAgIGlmIChmIGluc3RhbmNlb2YgQXJyb3dGdW5jdGlvbikge1xyXG4gICAgICAgIGZteEZ1bmN0aW9uID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4QXJyb3dGdW5jdGlvbihmLCBjdXJyZW50Q0MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmbXhGdW5jdGlvbiA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGYsIGN1cnJlbnRDQyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzQWxpYXNlcyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzUGFyYW1ldGVycyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhmLCBmbXhGdW5jdGlvbik7XHJcblxyXG4gICAgcHJvY2Vzc0VudW1zKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBwcm9jZXNzRnVuY3Rpb25zKGYsIGZteEZ1bmN0aW9uKTtcclxuXHJcbiAgICBpZiAoZiBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24gJiYgIShmLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQmxvY2spKSB7XHJcbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRXhwcmVzc2lvbnMoZiwgZm14RnVuY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuc2V0KGZteEZ1bmN0aW9uLmlkLCBmKTtcclxuXHJcbiAgICByZXR1cm4gZm14RnVuY3Rpb247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb25zIG9mIGEgZnVuY3Rpb24gb3IgYSBtZXRob2RcclxuICogQHBhcmFtIGYgQSBmdW5jdGlvbiBvciBhIG1ldGhvZFxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBmdW5jdGlvbiBvciB0aGUgbWV0aG9kXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRnVuY3Rpb25FeHByZXNzaW9ucyhmOiBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5GdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgRnVuY3Rpb24gRXhwcmVzc2lvbnM6YCk7XHJcbiAgICBjb25zdCBmdW5jdGlvbkV4cHJlc3Npb25zID0gZi5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbik7XHJcbiAgICBmdW5jdGlvbkV4cHJlc3Npb25zLmZvckVhY2goKGZ1bmMpID0+IHtcclxuICAgICAgICBjb25zdCBmbXhGdW5jID0gcHJvY2Vzc0Z1bmN0aW9uKGZ1bmMpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEZ1bmN0aW9uKGZteEZ1bmMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHBhcmFtZXRlcnMgb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gbSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJzKG06IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24sIGZteFNjb3BlOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LkZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgUGFyYW1ldGVyczpgKTtcclxuICAgIG0uZ2V0UGFyYW1ldGVycygpLmZvckVhY2gocGFyYW0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gcHJvY2Vzc1BhcmFtZXRlcihwYXJhbSk7XHJcbiAgICAgICAgZm14U2NvcGUuYWRkUGFyYW1ldGVyKGZteFBhcmFtKTtcclxuICAgICAgICAvLyBBZGRpdGlvbmFsIGhhbmRsaW5nIGZvciBQYXJhbWV0ZXIgUHJvcGVydGllcyBpbiBjb25zdHJ1Y3RvcnNcclxuICAgICAgICBpZiAobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHtcclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBoYXMgYW55IHZpc2liaWxpdHkgbW9kaWZpZXJcclxuICAgICAgICAgICAgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHx8IHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgfHwgcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSB8fCBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzT2ZDb25zdHJ1Y3RvciA9IG0uZ2V0UGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgUGFyYW1ldGVyIFByb3BlcnR5ICR7cGFyYW0uZ2V0TmFtZSgpfSBpbiBjb25zdHJ1Y3RvciBvZiAke2NsYXNzT2ZDb25zdHJ1Y3Rvci5nZXROYW1lKCl9LmApO1xyXG4gICAgICAgICAgICAgICAgLy8gVHJlYXQgdGhlIHBhcmFtZXRlciBhcyBhIHByb3BlcnR5IGFuZCBhZGQgaXQgdG8gdGhlIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtLCBjbGFzc09mQ29uc3RydWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgZm14UHJvcGVydHkucmVhZE9ubHkgPSBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNyZWF0ZSBhIEZhbWl4LlByb3BlcnR5IG1vZGVsIGZyb20gYSBQYXJhbWV0ZXJEZWNsYXJhdGlvblxyXG4vLyBZb3UnbGwgbmVlZCB0byBpbXBsZW1lbnQgaXQgYWNjb3JkaW5nIHRvIHlvdXIgRmFtaXggbW9kZWwgc3RydWN0dXJlXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgY2xhc3NEZWNsOiBDbGFzc0RlY2xhcmF0aW9uIHwgQ2xhc3NFeHByZXNzaW9uKTogRmFtaXguUHJvcGVydHkge1xyXG4gICAgLy8gQ29udmVydCB0aGUgcGFyYW1ldGVyIGludG8gYSBQcm9wZXJ0eVxyXG4gICAgY29uc3QgcHJvcGVydHlSZXByZXNlbnRhdGlvbiA9IGNvbnZlcnRQYXJhbWV0ZXJUb1Byb3BlcnR5UmVwcmVzZW50YXRpb24ocGFyYW0pO1xyXG5cclxuICAgIC8vIEFkZCB0aGUgcHJvcGVydHkgdG8gdGhlIGNsYXNzIHNvIHdlIGNhbiBoYXZlIGEgUHJvcGVydHlEZWNsYXJhdGlvbiBvYmplY3RcclxuICAgIGNsYXNzRGVjbC5hZGRQcm9wZXJ0eShwcm9wZXJ0eVJlcHJlc2VudGF0aW9uKTtcclxuXHJcbiAgICBjb25zdCBwcm9wZXJ0eSA9IGNsYXNzRGVjbC5nZXRQcm9wZXJ0eShwcm9wZXJ0eVJlcHJlc2VudGF0aW9uLm5hbWUpO1xyXG4gICAgaWYgKCFwcm9wZXJ0eSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtwcm9wZXJ0eVJlcHJlc2VudGF0aW9uLm5hbWV9IG5vdCBmb3VuZCBpbiBjbGFzcyAke2NsYXNzRGVjbC5nZXROYW1lKCl9YCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwcm9wZXJ0eSk7XHJcbiAgICBpZiAoY2xhc3NEZWNsIGluc3RhbmNlb2YgQ2xhc3NEZWNsYXJhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGZteENsYXNzID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4Q2xhc3MoY2xhc3NEZWNsKTtcclxuICAgICAgICBmbXhDbGFzcy5hZGRQcm9wZXJ0eShmbXhQcm9wZXJ0eSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgdHlwZSBDbGFzc0V4cHJlc3Npb24uXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhwcm9wZXJ0eSwgZm14UHJvcGVydHkpO1xyXG5cclxuICAgIC8vIHJlbW92ZSB0aGUgcHJvcGVydHkgZnJvbSB0aGUgY2xhc3NcclxuICAgIHByb3BlcnR5LnJlbW92ZSgpO1xyXG5cclxuICAgIHJldHVybiBmbXhQcm9wZXJ0eTtcclxuXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbnZlcnRQYXJhbWV0ZXJUb1Byb3BlcnR5UmVwcmVzZW50YXRpb24ocGFyYW06IFBhcmFtZXRlckRlY2xhcmF0aW9uKSB7XHJcbiAgICAvLyBFeHRyYWN0IG5hbWVcclxuICAgIGNvbnN0IHBhcmFtTmFtZSA9IHBhcmFtLmdldE5hbWUoKTtcclxuXHJcbiAgICAvLyBFeHRyYWN0IHR5cGVcclxuICAgIGNvbnN0IHBhcmFtVHlwZSA9IHBhcmFtLmdldFR5cGUoKS5nZXRUZXh0KHBhcmFtKTtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgdmlzaWJpbGl0eVxyXG4gICAgbGV0IHNjb3BlOiBTY29wZTtcclxuICAgIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xyXG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJpdmF0ZTtcclxuICAgIH0gZWxzZSBpZiAocGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xyXG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJvdGVjdGVkO1xyXG4gICAgfSBlbHNlIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpKSB7XHJcbiAgICAgICAgc2NvcGUgPSBTY29wZS5QdWJsaWM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIHByb3BlcnR5ICR7cGFyYW1OYW1lfSBpbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGEgdmlzaWJpbGl0eSBtb2RpZmllci5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgaWYgcmVhZG9ubHlcclxuICAgIGNvbnN0IGlzUmVhZG9ubHkgPSBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlJlYWRvbmx5S2V5d29yZCk7XHJcblxyXG4gICAgLy8gQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5XHJcbiAgICBjb25zdCBwcm9wZXJ0eVJlcHJlc2VudGF0aW9uID0ge1xyXG4gICAgICAgIG5hbWU6IHBhcmFtTmFtZSxcclxuICAgICAgICB0eXBlOiBwYXJhbVR5cGUsXHJcbiAgICAgICAgc2NvcGU6IHNjb3BlLFxyXG4gICAgICAgIGlzUmVhZG9ubHk6IGlzUmVhZG9ubHksXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBwcm9wZXJ0eVJlcHJlc2VudGF0aW9uO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcGFyYW1ldGVyXHJcbiAqIEBwYXJhbSBwYXJhbURlY2wgQSBwYXJhbWV0ZXJcclxuICogQHJldHVybnMgQSBGYW1peC5QYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSBwYXJhbWV0ZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXIocGFyYW1EZWNsOiBQYXJhbWV0ZXJEZWNsYXJhdGlvbik6IEZhbWl4LlBhcmFtZXRlciB7XHJcbiAgICBjb25zdCBmbXhQYXJhbSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peFBhcmFtZXRlcihwYXJhbURlY2wpOyAgLy8gY3JlYXRlIG9yIEdFVFxyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgcGFyYW1ldGVyOiAke3BhcmFtRGVjbC5nZXROYW1lKCl9LCAoJHtwYXJhbURlY2wuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteFBhcmFtLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgcHJvY2Vzc0RlY29yYXRvcnMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XHJcblxyXG4gICAgY29uc3QgcGFyZW50ID0gcGFyYW1EZWNsLmdldFBhcmVudCgpO1xyXG5cclxuICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7cGFyYW1EZWNsLmdldE5hbWUoKX0sICgke3BhcmFtRGVjbC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhQYXJhbS5uYW1lfWApO1xyXG4gICAgICAgIGFjY2Vzc01hcC5zZXQoZm14UGFyYW0uaWQsIHBhcmFtRGVjbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZteFBhcmFtO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSB0eXBlIHBhcmFtZXRlcnMgb2YgYSBjbGFzcywgYW4gaW50ZXJmYWNlLCBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uXHJcbiAqIEBwYXJhbSBlIEEgY2xhc3MsIGFuIGludGVyZmFjZSwgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjbGFzcywgdGhlIGludGVyZmFjZSwgdGhlIG1ldGhvZCBvciB0aGUgZnVuY3Rpb25cclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhlOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uLCBmbXhTY29wZTogRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0ludGVyZmFjZSB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHwgRmFtaXguRnVuY3Rpb24gfCBGYW1peC5BcnJvd0Z1bmN0aW9uKTogdm9pZCB7XHJcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgVHlwZSBQYXJhbWV0ZXJzOmApO1xyXG4gICAgZS5nZXRUeXBlUGFyYW1ldGVycygpLmZvckVhY2godHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gcHJvY2Vzc1R5cGVQYXJhbWV0ZXIodHApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZEdlbmVyaWNQYXJhbWV0ZXIoZm14UGFyYW0pO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSB0eXBlIHBhcmFtZXRlclxyXG4gKiBAcGFyYW0gdHAgQSB0eXBlIHBhcmFtZXRlclxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlR5cGVQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHBhcmFtZXRlclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc1R5cGVQYXJhbWV0ZXIodHA6IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbik6IEZhbWl4LlBhcmFtZXRlclR5cGUge1xyXG4gICAgY29uc3QgZm14VHlwZVBhcmFtZXRlciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYHR5cGUgcGFyYW1ldGVyOiAke3RwLmdldE5hbWUoKX0sICgke3RwLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhUeXBlUGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHModHAsIGZteFR5cGVQYXJhbWV0ZXIpO1xyXG5cclxuICAgIHJldHVybiBmbXhUeXBlUGFyYW1ldGVyO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSB2YXJpYWJsZXMgb2YgYSB2YXJpYWJsZSBzdGF0ZW1lbnRcclxuICogQHBhcmFtIHYgQSB2YXJpYWJsZSBzdGF0ZW1lbnRcclxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgRmFtaXguVmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZXNcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NWYXJpYWJsZVN0YXRlbWVudCh2OiBWYXJpYWJsZVN0YXRlbWVudCk6IEFycmF5PEZhbWl4LlZhcmlhYmxlPiB7XHJcbiAgICBjb25zdCBmbXhWYXJpYWJsZXMgPSBuZXcgQXJyYXk8RmFtaXguVmFyaWFibGU+KCk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBWYXJpYWJsZSBzdGF0ZW1lbnQ6ICR7di5nZXRUZXh0KCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgJHt2LmdldERlY2xhcmF0aW9uS2luZEtleXdvcmRzKClbMF19LCBmcW4gPSAke3YuZ2V0RGVjbGFyYXRpb25zKClbMF0uZ2V0TmFtZSgpfWApO1xyXG5cclxuICAgIHYuZ2V0RGVjbGFyYXRpb25zKCkuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14VmFyID0gcHJvY2Vzc1ZhcmlhYmxlKHZhcmlhYmxlKTtcclxuICAgICAgICBwcm9jZXNzQ29tbWVudHModiwgZm14VmFyKTtcclxuICAgICAgICBmbXhWYXJpYWJsZXMucHVzaChmbXhWYXIpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZteFZhcmlhYmxlcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIHZhcmlhYmxlXHJcbiAqIEBwYXJhbSB2IEEgdmFyaWFibGVcclxuICogQHJldHVybnMgQSBGYW1peC5WYXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIHZhcmlhYmxlXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzVmFyaWFibGUodjogVmFyaWFibGVEZWNsYXJhdGlvbik6IEZhbWl4LlZhcmlhYmxlIHtcclxuICAgIGNvbnN0IGZteFZhciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peFZhcmlhYmxlKHYpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgdmFyaWFibGU6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgJHt2LmdldEluaXRpYWxpemVyKCkgPyBcImluaXRpYWxpemVyOiBcIiArIHYuZ2V0SW5pdGlhbGl6ZXIoKSEuZ2V0VGV4dCgpIDogXCJpbml0aWFsaXplcjogXCJ9LCBmcW4gPSAke2ZteFZhci5mdWxseVF1YWxpZmllZE5hbWV9YCk7XHJcblxyXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHYsIGZteFZhcik7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBhZGRpbmcgYWNjZXNzOiAke3YuZ2V0TmFtZSgpfSwgKCR7di5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhWYXIubmFtZX1gKTtcclxuICAgIGFjY2Vzc01hcC5zZXQoZm14VmFyLmlkLCB2KTtcclxuXHJcbiAgICByZXR1cm4gZm14VmFyO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGVudW1cclxuICogQHBhcmFtIGUgQW4gZW51bVxyXG4gKiBAcmV0dXJucyBBIEZhbWl4LkVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnVtXHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRW51bShlOiBFbnVtRGVjbGFyYXRpb24pOiBGYW1peC5FbnVtIHtcclxuICAgIGNvbnN0IGZteEVudW0gPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhFbnVtKGUpO1xyXG5cclxuICAgIGxvZ2dlci5kZWJ1ZyhgZW51bTogJHtlLmdldE5hbWUoKX0sICgke2UuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEVudW0uZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhlLCBmbXhFbnVtKTtcclxuXHJcbiAgICBlLmdldE1lbWJlcnMoKS5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IHByb2Nlc3NFbnVtVmFsdWUobSk7XHJcbiAgICAgICAgZm14RW51bS5hZGRWYWx1ZShmbXhFbnVtVmFsdWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZteEVudW07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gZW51bSBtZW1iZXJcclxuICogQHBhcmFtIHYgQW4gZW51bSBtZW1iZXJcclxuICogQHJldHVybnMgQSBGYW1peC5FbnVtVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbnVtIG1lbWJlclxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0VudW1WYWx1ZSh2OiBFbnVtTWVtYmVyKTogRmFtaXguRW51bVZhbHVlIHtcclxuICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhFbnVtVmFsdWUodik7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBlbnVtIHZhbHVlOiAke3YuZ2V0TmFtZSgpfSwgKCR7di5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14RW51bVZhbHVlLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcclxuXHJcbiAgICBwcm9jZXNzQ29tbWVudHModiwgZm14RW51bVZhbHVlKTtcclxuXHJcbiAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSBGYW1peCAke2ZteEVudW1WYWx1ZS5uYW1lfWApO1xyXG4gICAgYWNjZXNzTWFwLnNldChmbXhFbnVtVmFsdWUuaWQsIHYpO1xyXG5cclxuICAgIHJldHVybiBmbXhFbnVtVmFsdWU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGRlY29yYXRvcnMgb2YgYSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIGUgQSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY2xhc3MsIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIgb3IgdGhlIHByb3BlcnR5XHJcbiAqL1xyXG5mdW5jdGlvbiBwcm9jZXNzRGVjb3JhdG9ycyhlOiBDbGFzc0RlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IgfCBGYW1peC5QYXJhbWV0ZXIgfCBGYW1peC5Qcm9wZXJ0eSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIERlY29yYXRvcnM6YCk7XHJcbiAgICBlLmdldERlY29yYXRvcnMoKS5mb3JFYWNoKGRlYyA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14RGVjID0gcHJvY2Vzc0RlY29yYXRvcihkZWMsIGUpO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZERlY29yYXRvcihmbXhEZWMpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBkZWNvcmF0b3JcclxuICogQHBhcmFtIGQgQSBkZWNvcmF0b3JcclxuICogQHBhcmFtIGUgQSBjbGFzcywgYSBtZXRob2QsIGEgcGFyYW1ldGVyIG9yIGEgcHJvcGVydHlcclxuICogQHJldHVybnMgQSBGYW1peC5EZWNvcmF0b3IgcmVwcmVzZW50aW5nIHRoZSBkZWNvcmF0b3JcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NEZWNvcmF0b3IoZDogRGVjb3JhdG9yLCBlOiBDbGFzc0RlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFBhcmFtZXRlckRlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbik6IEZhbWl4LkRlY29yYXRvciB7XHJcbiAgICBjb25zdCBmbXhEZWMgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhEZWNvcmF0b3IoZCwgZSk7XHJcblxyXG4gICAgbG9nZ2VyLmRlYnVnKGBkZWNvcmF0b3I6ICR7ZC5nZXROYW1lKCl9LCAoJHtkLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhEZWMuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xyXG5cclxuICAgIHByb2Nlc3NDb21tZW50cyhkLCBmbXhEZWMpO1xyXG5cclxuICAgIHJldHVybiBmbXhEZWM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGNvbW1lbnRzXHJcbiAqIEBwYXJhbSBlIEEgdHMtbW9ycGggZWxlbWVudFxyXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBuYW1lZCBlbnRpdHlcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NDb21tZW50cyhlOiBTb3VyY2VGaWxlIHwgTW9kdWxlRGVjbGFyYXRpb24gfCBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgUHJvcGVydHlTaWduYXR1cmUgfCBEZWNvcmF0b3IgfCBFbnVtRGVjbGFyYXRpb24gfCBFbnVtTWVtYmVyIHwgVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIHwgVmFyaWFibGVTdGF0ZW1lbnQgfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IEFycm93RnVuY3Rpb24sIGZteFNjb3BlOiBGYW1peC5OYW1lZEVudGl0eSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBQcm9jZXNzIGNvbW1lbnRzOmApO1xyXG4gICAgZS5nZXRMZWFkaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgY29uc3QgZm14Q29tbWVudCA9IHByb2Nlc3NDb21tZW50KGMsIGZteFNjb3BlKTtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYGxlYWRpbmcgY29tbWVudHMsIGFkZENvbW1lbnQ6ICcke2MuZ2V0VGV4dCgpfSdgKTtcclxuICAgICAgICBmbXhTY29wZS5hZGRDb21tZW50KGZteENvbW1lbnQpOyAvLyByZWR1bmRhbnQsIGJ1dCBqdXN0IGluIGNhc2VcclxuICAgIH0pO1xyXG4gICAgZS5nZXRUcmFpbGluZ0NvbW1lbnRSYW5nZXMoKS5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGB0cmFpbGluZyBjb21tZW50cywgYWRkQ29tbWVudDogJyR7Yy5nZXRUZXh0KCl9J2ApO1xyXG4gICAgICAgIGZteFNjb3BlLmFkZENvbW1lbnQoZm14Q29tbWVudCk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGNvbW1lbnRcclxuICogQHBhcmFtIGMgQSBjb21tZW50XHJcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcclxuICogQHJldHVybnMgQSBGYW1peC5Db21tZW50IHJlcHJlc2VudGluZyB0aGUgY29tbWVudFxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc0NvbW1lbnQoYzogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiBGYW1peC5Db21tZW50IHtcclxuICAgIGNvbnN0IGlzSlNEb2MgPSBjLmdldFRleHQoKS5zdGFydHNXaXRoKFwiLyoqXCIpO1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29tbWVudDogY29tbWVudDogJHtjLmdldFRleHQoKX0sIGlzSlNEb2MgPSAke2lzSlNEb2N9YCk7XHJcbiAgICBjb25zdCBmbXhDb21tZW50ID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbW1lbnQoYywgZm14U2NvcGUsIGlzSlNEb2MpO1xyXG5cclxuICAgIHJldHVybiBmbXhDb21tZW50O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhY2Nlc3NlcyBvbiB0aGUgcGFyYW1ldGVycywgdmFyaWFibGVzLCBwcm9wZXJ0aWVzIGFuZCBlbnVtIG1lbWJlcnMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gYWNjZXNzTWFwIEEgbWFwIG9mIHBhcmFtZXRlcnMsIHZhcmlhYmxlcywgcHJvcGVydGllcyBhbmQgZW51bSBtZW1iZXJzIHdpdGggdGhlaXIgaWRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQWNjZXNzZXMoYWNjZXNzTWFwOiBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50Pik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBhY2Nlc3NlczpgKTtcclxuICAgIGFjY2Vzc01hcC5mb3JFYWNoKCh2LCBpZCkgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWNjZXNzZXMgdG8gJHt2LmdldE5hbWUoKX1gKTtcclxuICAgICAgICAvLyB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRlbXBfbm9kZXMgPSB2LmZpbmRSZWZlcmVuY2VzQXNOb2RlcygpIGFzIEFycmF5PElkZW50aWZpZXI+O1xyXG4gICAgICAgIHRlbXBfbm9kZXMuZm9yRWFjaChub2RlID0+IHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobm9kZSwgaWQpKTtcclxuICAgICAgICAvLyB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vICAgICBsb2dnZXIuZXJyb3IoYD4gV0FSTklORzogZ290IGV4Y2VwdGlvbiBcIiR7ZXJyb3J9XCIuXFxuQ29udGludWluZy4uLmApO1xyXG4gICAgICAgIC8vIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGFjY2VzcyBvbiBhIHBhcmFtZXRlciwgdmFyaWFibGUsIHByb3BlcnR5IG9yIGVudW0gbWVtYmVyXHJcbiAqIEBwYXJhbSBuIEEgbm9kZVxyXG4gKiBAcGFyYW0gaWQgQW4gaWQgb2YgYSBwYXJhbWV0ZXIsIGEgdmFyaWFibGUsIGEgcHJvcGVydHkgb3IgYW4gZW51bSBtZW1iZXJcclxuICovXHJcbmZ1bmN0aW9uIHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobjogSWRlbnRpZmllciwgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gdHJ5IHtcclxuICAgIC8vIHNvbWV0aW1lcyBub2RlJ3MgZmlyc3QgYW5jZXN0b3IgaXMgYSBQcm9wZXJ0eURlY2xhcmF0aW9uLCB3aGljaCBpcyBub3QgYW4gYWNjZXNzXHJcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Z1aHJtYW5hdG9yL0ZhbWl4VHlwZVNjcmlwdEltcG9ydGVyL2lzc3Vlcy85XHJcbiAgICAvLyBjaGVjayBmb3IgYSBub2RlIHdob3NlIGZpcnN0IGFuY2VzdG9yIGlzIGEgcHJvcGVydHkgZGVjbGFyYXRpb24gYW5kIGJhaWw/XHJcbiAgICAvLyBUaGlzIG1heSBiZSBhIGJ1ZyBpbiB0cy1tb3JwaD9cclxuICAgIGlmIChuLmdldEZpcnN0QW5jZXN0b3JPclRocm93KCkuZ2V0S2luZE5hbWUoKSA9PT0gXCJQcm9wZXJ0eURlY2xhcmF0aW9uXCIpIHtcclxuICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NOb2RlRm9yQWNjZXNzZXM6IG5vZGUga2luZDogJHtuLmdldEtpbmROYW1lKCl9LCAke24uZ2V0VGV4dCgpfSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkncyBmaXJzdCBhbmNlc3RvciBpcyBhIFByb3BlcnR5RGVjbGFyYXRpb24uIFNraXBwaW5nLi4uYCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEFjY2VzcyhuLCBpZCk7XHJcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NOb2RlRm9yQWNjZXNzZXM6IG5vZGUga2luZDogJHtuLmdldEtpbmROYW1lKCl9LCAke24uZ2V0VGV4dCgpfSwgKCR7bi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcclxuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAvLyAgICAgbG9nZ2VyLmVycm9yKGA+IEdvdCBleGNlcHRpb24gXCIke2Vycm9yfVwiLlxcblNjb3BlRGVjbGFyYXRpb24gaW52YWxpZCBmb3IgXCIke24uZ2V0U3ltYm9sKCkuZnVsbHlRdWFsaWZpZWROYW1lfVwiLlxcbkNvbnRpbnVpbmcuLi5gKTtcclxuICAgIC8vIH1cclxufVxyXG5cclxuXHJcbi8vIGV4cG9ydHMgaGFzIG5hbWUgLT4gRGVjbGFyYXRpb24gLS0gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIEZhbWl4RWxlbWVudFxyXG5cclxuLy8gaGFuZGxlIGBpbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpYCBmb3IgZXhhbXBsZVxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ltcG9ydENsYXVzZXNGb3JJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbnMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+LCBleHBvcnRzOiBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+Pik6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmluZm8oYENyZWF0aW5nIGltcG9ydCBjbGF1c2VzIGZyb20gSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25zIGluIHNvdXJjZSBmaWxlczpgKTtcclxuICAgIHNvdXJjZUZpbGVzLmZvckVhY2goc291cmNlRmlsZSA9PiB7XHJcbiAgICAgICAgc291cmNlRmlsZS5mb3JFYWNoRGVzY2VuZGFudChub2RlID0+IHtcclxuICAgICAgICAgICAgaWYgKE5vZGUuaXNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbihub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gWW91J3ZlIGZvdW5kIGFuIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkRlY2xhcmF0aW9uIE5hbWU6XCIsIG5vZGUuZ2V0TmFtZSgpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiTW9kdWxlIFJlZmVyZW5jZSBUZXh0OlwiLCBub2RlLmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSk7XHJcbiAgICAgICAgICAgICAgICAvLyB3aGF0J3MgdGhlIG5hbWUgb2YgdGhlIGltcG9ydGVkIGVudGl0eT9cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGltcG9ydGVkRW50aXR5ID0gbm9kZS5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBmYW1peCBpbXBvcnQgY2xhdXNlXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lZEltcG9ydCA9IG5vZGUuZ2V0TmFtZU5vZGUoKTtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IG5vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBzb3VyY2VGaWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBub2RlLmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lZEltcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICBpc0luRXhwb3J0czogZXhwb3J0cy5maW5kKGUgPT4gZS5oYXMobmFtZWRJbXBvcnQuZ2V0VGV4dCgpKSkgIT09IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhJbXBvcnRDbGF1c2UoaW1wb3J0ZWRFbnRpdHksIGltcG9ydGluZ0VudGl0eSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgICk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGltcG9ydCBjbGF1c2VzIG9mIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG1vZHVsZXNcclxuICogQHBhcmFtIG1vZHVsZXMgQW4gYXJyYXkgb2YgbW9kdWxlc1xyXG4gKiBAcGFyYW0gZXhwb3J0cyBBbiBhcnJheSBvZiBtYXBzIG9mIGV4cG9ydGVkIGRlY2xhcmF0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbXBvcnRDbGF1c2VzRm9yTW9kdWxlcyhtb2R1bGVzOiBBcnJheTxTb3VyY2VGaWxlPiwgZXhwb3J0czogQXJyYXk8UmVhZG9ubHlNYXA8c3RyaW5nLCBFeHBvcnRlZERlY2xhcmF0aW9uc1tdPj4pOiB2b2lkIHtcclxuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbXBvcnQgY2xhdXNlcyBmcm9tICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZXM6YCk7XHJcbiAgICBtb2R1bGVzLmZvckVhY2gobW9kdWxlID0+IHtcclxuICAgICAgICBjb25zdCBtb2R1bGVQYXRoID0gbW9kdWxlLmdldEZpbGVQYXRoKCk7IC8vICsgbW9kdWxlLmdldEJhc2VOYW1lKCk7XHJcbiAgICAgICAgbW9kdWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpLmZvckVhY2goaW1wRGVjbCA9PiB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IGdldE1vZHVsZVBhdGgoaW1wRGVjbCk7XHJcblxyXG4gICAgICAgICAgICBpbXBEZWNsLmdldE5hbWVkSW1wb3J0cygpLmZvckVhY2gobmFtZWRJbXBvcnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEltcG9ydGluZyAobmFtZWQpICR7bmFtZWRJbXBvcnQuZ2V0TmFtZSgpfSBmcm9tICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRlZEVudGl0eU5hbWUgPSBuYW1lZEltcG9ydC5nZXROYW1lKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRGb3VuZEluRXhwb3J0cyA9IGlzSW5FeHBvcnRzKGV4cG9ydHMsIGltcG9ydGVkRW50aXR5TmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5Lm9sZENyZWF0ZU9yR2V0RmFtaXhJbXBvcnRDbGF1c2Uoe1xyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uOiBpbXBEZWNsLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydGVyU291cmNlRmlsZTogbW9kdWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBwYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydEVsZW1lbnQ6IG5hbWVkSW1wb3J0LFxyXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FeHBvcnRzOiBpbXBvcnRGb3VuZEluRXhwb3J0cyxcclxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0SW1wb3J0ID0gaW1wRGVjbC5nZXREZWZhdWx0SW1wb3J0KCk7XHJcbiAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wb3J0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgKGRlZmF1bHQpICR7ZGVmYXVsdEltcG9ydC5nZXRUZXh0KCl9IGZyb20gJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcclxuICAgICAgICAgICAgICAgIC8vIGNhbGwgd2l0aCBtb2R1bGUsIGltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSwgcGF0aCwgZGVmYXVsdEltcG9ydCwgZmFsc2UsIHRydWVcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IGltcERlY2wsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBtb2R1bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyRmlsZVBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogZGVmYXVsdEltcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICBpc0luRXhwb3J0czogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0RXhwb3J0OiB0cnVlXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0ID0gaW1wRGVjbC5nZXROYW1lc3BhY2VJbXBvcnQoKTtcclxuICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUltcG9ydCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChuYW1lc3BhY2UpICR7bmFtZXNwYWNlSW1wb3J0LmdldFRleHQoKX0gZnJvbSAke2ltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKX0gaW4gJHttb2R1bGVQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5vbGRDcmVhdGVPckdldEZhbWl4SW1wb3J0Q2xhdXNlKHtcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnREZWNsYXJhdGlvbjogaW1wRGVjbCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IG1vZHVsZSxcclxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogcGF0aCxcclxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lc3BhY2VJbXBvcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdEV4cG9ydDogZmFsc2VcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgLy8gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEltcG9ydENsYXVzZShtb2R1bGUsIGltcERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSwgcGF0aCwgbmFtZXNwYWNlSW1wb3J0LCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNJbkV4cG9ydHMoZXhwb3J0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBFeHBvcnRlZERlY2xhcmF0aW9uc1tdPltdLCBpbXBvcnRlZEVudGl0eU5hbWU6IHN0cmluZykge1xyXG4gICAgbGV0IGltcG9ydEZvdW5kSW5FeHBvcnRzID0gZmFsc2U7XHJcbiAgICBleHBvcnRzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgaWYgKGUuaGFzKGltcG9ydGVkRW50aXR5TmFtZSkpIHtcclxuICAgICAgICAgICAgaW1wb3J0Rm91bmRJbkV4cG9ydHMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGltcG9ydEZvdW5kSW5FeHBvcnRzO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbmhlcml0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXHJcbiAqIEBwYXJhbSBpbnRlcmZhY2VzIEFuIGFycmF5IG9mIGludGVyZmFjZXNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzSW5oZXJpdGFuY2VzKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmluZm8oYHByb2Nlc3NJbmhlcml0YW5jZXM6IENyZWF0aW5nIGluaGVyaXRhbmNlczpgKTtcclxuICAgIGNsYXNzZXMuZm9yRWFjaChjbHMgPT4ge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogQ2hlY2tpbmcgY2xhc3MgaW5oZXJpdGFuY2UgZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBleHRDbGFzcyA9IGNscy5nZXRCYXNlQ2xhc3MoKTtcclxuICAgICAgICAgICAgaWYgKGV4dENsYXNzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNscywgZXh0Q2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogY2xhc3M6ICR7Y2xzLmdldE5hbWUoKX0sICgke2Nscy5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dENsYXNzOiAke2V4dENsYXNzLmdldE5hbWUoKX0sICgke2V4dENsYXNzLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NJbmhlcml0YW5jZXM6IENoZWNraW5nIGludGVyZmFjZSBpbmhlcml0YW5jZSBmb3IgJHtjbHMuZ2V0TmFtZSgpfWApO1xyXG4gICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRlZEludGVyZmFjZXMgPSBnZXRJbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzKGludGVyZmFjZXMsIGNscyk7XHJcbiAgICAgICAgICAgIGltcGxlbWVudGVkSW50ZXJmYWNlcy5mb3JFYWNoKGltcEludGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNscywgaW1wSW50ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogY2xhc3M6ICR7Y2xzLmdldE5hbWUoKX0sICgke2Nscy5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGltcEludGVyOiAkeyhpbXBJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGltcEludGVyLmdldE5hbWUoKSA6IGltcEludGVyLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoaW1wSW50ZXIgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBpbXBJbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogaW1wSW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpbnRlcmZhY2VzLmZvckVhY2goaW50ZXIgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0luaGVyaXRhbmNlczogQ2hlY2tpbmcgaW50ZXJmYWNlIGluaGVyaXRhbmNlIGZvciAke2ludGVyLmdldE5hbWUoKX1gKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRJbnRlcmZhY2VzID0gZ2V0SW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcyhpbnRlcmZhY2VzLCBpbnRlcik7XHJcbiAgICAgICAgICAgIGV4dGVuZGVkSW50ZXJmYWNlcy5mb3JFYWNoKGV4dEludGVyID0+IHtcclxuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGludGVyLCBleHRJbnRlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzSW5oZXJpdGFuY2VzOiBpbnRlcjogJHtpbnRlci5nZXROYW1lKCl9LCAoJHtpbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dEludGVyOiAkeyhleHRJbnRlciBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGV4dEludGVyLmdldE5hbWUoKSA6IGV4dEludGVyLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoZXh0SW50ZXIgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBleHRJbnRlci5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogZXh0SW50ZXIuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIENvbnRpbnVpbmcuLi5gKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgaW52b2NhdGlvbnMgb2YgdGhlIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBvZiB0aGUgc291cmNlIGZpbGVzXHJcbiAqIEBwYXJhbSBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkIEEgbWFwIG9mIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyB3aXRoIHRoZWlyIGlkXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ludm9jYXRpb25zKG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQ6IE1hcDxudW1iZXIsIEludm9jYWJsZVR5cGU+KTogdm9pZCB7XHJcbiAgICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgaW52b2NhdGlvbnM6YCk7XHJcbiAgICBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkLmZvckVhY2goKGludm9jYWJsZSwgaWQpID0+IHtcclxuICAgICAgICBpZiAoIShpbnZvY2FibGUgaW5zdGFuY2VvZiBBcnJvd0Z1bmN0aW9uKSkgeyAgLy8gQXJyb3dGdW5jdGlvbnMgYXJlIG5vdCBkaXJlY3RseSBpbnZva2VkXHJcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgSW52b2NhdGlvbnMgdG8gJHsoaW52b2NhYmxlIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgaW52b2NhYmxlIGluc3RhbmNlb2YgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8fCBpbnZvY2FibGUgaW5zdGFuY2VvZiBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IGludm9jYWJsZSBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24pID8gaW52b2NhYmxlLmdldE5hbWUoKSA6ICgoaW52b2NhYmxlIGluc3RhbmNlb2YgQ29uc3RydWN0b3JEZWNsYXJhdGlvbikgPyAnY29uc3RydWN0b3InIDogKGludm9jYWJsZS5nZXROYW1lKCkgPyBpbnZvY2FibGUuZ2V0TmFtZSgpIDogJ2Fub255bW91cycpKX0gKCR7aW52b2NhYmxlLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXNSZWZlcmVuY2luZ0ludm9jYWJsZSA9IGludm9jYWJsZS5maW5kUmVmZXJlbmNlc0FzTm9kZXMoKSBhcyBBcnJheTxJZGVudGlmaWVyPjtcclxuICAgICAgICAgICAgICAgIG5vZGVzUmVmZXJlbmNpbmdJbnZvY2FibGUuZm9yRWFjaChcclxuICAgICAgICAgICAgICAgICAgICBub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUgPT4gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBDb250aW51aW5nLi4uYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFNraXBwaW5nIGludm9jYXRpb24gdG8gQXJyb3dGdW5jdGlvbjogJHsoaW52b2NhYmxlLmdldEJvZHlUZXh0KCkpfWApO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGludm9jYXRpb24gb2YgYSBtZXRob2Qgb3IgYSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gbm9kZVJlZmVyZW5jaW5nSW52b2NhYmxlIEEgbm9kZVxyXG4gKiBAcGFyYW0gaW52b2NhYmxlIEEgbWV0aG9kIG9yIGEgZnVuY3Rpb25cclxuICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbWV0aG9kIG9yIHRoZSBmdW5jdGlvblxyXG4gKi9cclxuZnVuY3Rpb24gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlUmVmZXJlbmNpbmdJbnZvY2FibGU6IElkZW50aWZpZXIsIGludm9jYWJsZTogSW52b2NhYmxlVHlwZSwgaWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4SW52b2NhdGlvbihub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpO1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1Zyhgbm9kZTogJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0S2luZE5hbWUoKX0sICgke25vZGVSZWZlcmVuY2luZ0ludm9jYWJsZS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIFNjb3BlRGVjbGFyYXRpb24gaW52YWxpZCBmb3IgJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0U3ltYm9sKCkhLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpfS4gQ29udGludWluZy4uLmApO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbmhlcml0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xyXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXHJcbiAqIEBwYXJhbSBpbnRlcmZhY2VzIEFuIGFycmF5IG9mIGludGVyZmFjZXNcclxuICovXHJcbi8vIGV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uY3JldGlzYXRpb25zKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSwgZnVuY3Rpb25zOiBNYXA8bnVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uPik6IHZvaWQge1xyXG4vLyAgICAgbG9nZ2VyLmluZm8oYHByb2Nlc3NDb25jcmV0aXNhdGlvbnM6IENyZWF0aW5nIGNvbmNyZXRpc2F0aW9uczpgKTtcclxuLy8gICAgIGNsYXNzZXMuZm9yRWFjaChjbHMgPT4ge1xyXG4vLyAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0NvbmNyZXRpc2F0aW9uczogQ2hlY2tpbmcgY2xhc3MgY29uY3JldGlzYXRpb24gZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oY2xzKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25HZW5lcmljSW5zdGFudGlhdGlvbihjbHMpO1xyXG4vLyAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNscyk7XHJcbi8vICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uVHlwZUluc3RhbmNpYXRpb24oY2xzKTtcclxuXHJcbi8vICAgICB9KTtcclxuLy8gICAgIGludGVyZmFjZXMuZm9yRWFjaChpbnRlciA9PiB7XHJcbi8vICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBpbnRlcmZhY2UgY29uY3JldGlzYXRpb24gZm9yICR7aW50ZXIuZ2V0TmFtZSgpfWApO1xyXG4vLyAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGludGVyKTtcclxuLy8gICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4Q29uY3JldGlzYXRpb25DbGFzc09ySW50ZXJmYWNlU3BlY2lhbGlzYXRpb24oaW50ZXIpO1xyXG4vLyAgICAgfSk7XHJcbi8vICAgICBmdW5jdGlvbnMuZm9yRWFjaChmdW5jID0+IHtcclxuLy8gICAgICAgICBpZihmdW5jIGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbiB8fCBmdW5jIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gKXtcclxuLy8gICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDaGVja2luZyBNZXRob2QgY29uY3JldGlzYXRpb25gKTtcclxuLy8gICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uRnVuY3Rpb25JbnN0YW50aWF0aW9uKGZ1bmMpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgIH0pO1xyXG4vLyB9XHJcbiJdfQ==
916
+ function processConcretisations(classes, interfaces, functions) {
917
+ analyze_1.logger.info(`processConcretisations: Creating concretisations:`);
918
+ classes.forEach(cls => {
919
+ analyze_1.logger.debug(`processConcretisations: Checking class concretisation for ${cls.getName()}`);
920
+ analyze_1.entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(cls);
921
+ analyze_1.entityDictionary.createFamixConcretisationGenericInstantiation(cls);
922
+ analyze_1.entityDictionary.createFamixConcretisationInterfaceClass(cls);
923
+ analyze_1.entityDictionary.createFamixConcretisationTypeInstanciation(cls);
924
+ });
925
+ interfaces.forEach(inter => {
926
+ analyze_1.logger.debug(`processConcretisations: Checking interface concretisation for ${inter.getName()}`);
927
+ analyze_1.entityDictionary.createFamixConcretisationTypeInstanciation(inter);
928
+ analyze_1.entityDictionary.createFamixConcretisationClassOrInterfaceSpecialisation(inter);
929
+ });
930
+ functions.forEach(func => {
931
+ if (func instanceof ts_morph_1.FunctionDeclaration || func instanceof ts_morph_1.MethodDeclaration) {
932
+ analyze_1.logger.debug(`processConcretisations: Checking Method concretisation`);
933
+ analyze_1.entityDictionary.createFamixConcretisationFunctionInstantiation(func);
934
+ }
935
+ });
936
+ }
937
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzc19mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYW5hbHl6ZV9mdW5jdGlvbnMvcHJvY2Vzc19mdW5jdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbUNBLHNDQWNDO0FBU0QsZ0ZBc0JDO0FBRUQsb0NBWUM7QUFpQ0QsOEJBR0M7QUFFRCxrQ0FJQztBQWdyQkQsMENBV0M7QUE0QkQsMEdBeUJDO0FBT0Qsd0VBbURDO0FBaUJELGtEQXdDQztBQU1ELGdEQWdCQztBQXNCRCx3REFxQkM7QUE1aUNELHVDQUFvbEI7QUFDcGxCLGdFQUFrRDtBQUNsRCw2RUFBaUU7QUFDakUsdUNBQXlCO0FBQ3pCLHdDQUFzRDtBQUN0RCxnQ0FBZ0M7QUFNbkIsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQyxDQUFDLCtJQUErSTtBQUU3TSxRQUFBLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBcUMsQ0FBQyxDQUFDLHdJQUF3STtBQUNsTSxRQUFBLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBb0IsQ0FBQyxDQUFDLCtDQUErQztBQUN4RixRQUFBLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBd0IsQ0FBQyxDQUFDLGtEQUFrRDtBQUNsRyxRQUFBLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBYyxDQUFDLENBQUMsa0RBQWtEO0FBQ3JGLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLEVBQStDLENBQUMsQ0FBQywrQkFBK0I7QUFFekgsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUMsaUVBQWlFO0FBRXpIOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQXNCO0lBQy9DLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsdUJBQXVCLEVBQUUs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QUFDLENBQUM7UUFDMUUsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsYXNzRGVjbGFyYXRpb24sIE1ldGhvZERlY2xhcmF0aW9uLCBWYXJpYWJsZVN0YXRlbWVudCwgRnVuY3Rpb25EZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbiwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIFBhcmFtZXRlckRlY2xhcmF0aW9uLCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uLCBNZXRob2RTaWduYXR1cmUsIFNvdXJjZUZpbGUsIE1vZHVsZURlY2xhcmF0aW9uLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBQcm9wZXJ0eVNpZ25hdHVyZSwgRGVjb3JhdG9yLCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBFeHBvcnRlZERlY2xhcmF0aW9ucywgQ29tbWVudFJhbmdlLCBFbnVtRGVjbGFyYXRpb24sIEVudW1NZW1iZXIsIFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiwgVHlwZUFsaWFzRGVjbGFyYXRpb24sIFN5bnRheEtpbmQsIEZ1bmN0aW9uRXhwcmVzc2lvbiwgQmxvY2ssIElkZW50aWZpZXIsIEV4cHJlc3Npb25XaXRoVHlwZUFyZ3VtZW50cywgSW1wb3J0RGVjbGFyYXRpb24sIE5vZGUsIEFycm93RnVuY3Rpb24sIFNjb3BlLCBDbGFzc0V4cHJlc3Npb24gfSBmcm9tIFwidHMtbW9ycGhcIjtcbmltcG9ydCAqIGFzIEZhbWl4IGZyb20gXCIuLi9saWIvZmFtaXgvbW9kZWwvZmFtaXhcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZSB9IGZyb20gXCIuLi9saWIvdHMtY29tcGxleC9jeWNsb21hdGljLXNlcnZpY2VcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGxvZ2dlciwgZW50aXR5RGljdGlvbmFyeSB9IGZyb20gXCIuLi9hbmFseXplXCI7XG5pbXBvcnQgeyBnZXRGUU4gfSBmcm9tIFwiLi4vZnFuXCI7XG5pbXBvcnQgeyBJbnZvY2FibGVUeXBlIH0gZnJvbSBcInNyYy9mYW1peF9mdW5jdGlvbnMvRW50aXR5RGljdGlvbmFyeVwiO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlVFNNb3JwaEVsZW1lbnQgPSBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgRW51bU1lbWJlcjtcbmV4cG9ydCB0eXBlIEZhbWl4SUQgPSBudW1iZXI7XG5cbmV4cG9ydCBjb25zdCBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkID0gbmV3IE1hcDxudW1iZXIsIEludm9jYWJsZVR5cGU+KCk7IC8vIE1hcHMgdGhlIEZhbWl4IG1ldGhvZCwgY29uc3RydWN0b3IsIGdldHRlciwgc2V0dGVyIGFuZCBmdW5jdGlvbiBpZHMgdG8gdGhlaXIgdHMtbW9ycGggbWV0aG9kLCBjb25zdHJ1Y3RvciwgZ2V0dGVyLCBzZXR0ZXIgb3IgZnVuY3Rpb24gb2JqZWN0XG5cbmV4cG9ydCBjb25zdCBhY2Nlc3NNYXAgPSBuZXcgTWFwPEZhbWl4SUQsIEFjY2Vzc2libGVUU01vcnBoRWxlbWVudD4oKTsgLy8gTWFwcyB0aGUgRmFtaXggcGFyYW1ldGVyLCB2YXJpYWJsZSwgcHJvcGVydHkgYW5kIGVudW0gdmFsdWUgaWRzIHRvIHRoZWlyIHRzLW1vcnBoIHBhcmFtZXRlciwgdmFyaWFibGUsIHByb3BlcnR5IG9yIGVudW0gbWVtYmVyIG9iamVjdFxuZXhwb3J0IGNvbnN0IGNsYXNzZXMgPSBuZXcgQXJyYXk8Q2xhc3NEZWNsYXJhdGlvbj4oKTsgLy8gQXJyYXkgb2YgYWxsIHRoZSBjbGFzc2VzIG9mIHRoZSBzb3VyY2UgZmlsZXNcbmV4cG9ydCBjb25zdCBpbnRlcmZhY2VzID0gbmV3IEFycmF5PEludGVyZmFjZURlY2xhcmF0aW9uPigpOyAvLyBBcnJheSBvZiBhbGwgdGhlIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuZXhwb3J0IGNvbnN0IG1vZHVsZXMgPSBuZXcgQXJyYXk8U291cmNlRmlsZT4oKTsgLy8gQXJyYXkgb2YgYWxsIHRoZSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlIG1vZHVsZXNcbmV4cG9ydCBjb25zdCBsaXN0T2ZFeHBvcnRNYXBzID0gbmV3IEFycmF5PFJlYWRvbmx5TWFwPHN0cmluZywgRXhwb3J0ZWREZWNsYXJhdGlvbnNbXT4+KCk7IC8vIEFycmF5IG9mIGFsbCB0aGUgZXhwb3J0IG1hcHNcbmV4cG9ydCBsZXQgY3VycmVudENDOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9OyAvLyBTdG9yZXMgdGhlIGN5Y2xvbWF0aWMgY29tcGxleGl0eSBtZXRyaWNzIGZvciB0aGUgY3VycmVudCBzb3VyY2UgZmlsZVxuY29uc3QgcHJvY2Vzc2VkTm9kZXNXaXRoVHlwZVBhcmFtcyA9IG5ldyBTZXQ8bnVtYmVyPigpOyAvLyBTZXQgb2Ygbm9kZXMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFuZCBoYXZlIHR5cGUgcGFyYW1ldGVyc1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZmlsZSBoYXMgYW55IGltcG9ydHMgb3IgZXhwb3J0cyB0byBiZSBjb25zaWRlcmVkIGEgbW9kdWxlXG4gKiBAcGFyYW0gc291cmNlRmlsZSBBIHNvdXJjZSBmaWxlXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgZmlsZSBpcyBhIG1vZHVsZVxuICovXG5mdW5jdGlvbiBpc1NvdXJjZUZpbGVBTW9kdWxlKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc291cmNlRmlsZS5nZXRJbXBvcnREZWNsYXJhdGlvbnMoKS5sZW5ndGggPiAwIHx8IHNvdXJjZUZpbGUuZ2V0RXhwb3J0ZWREZWNsYXJhdGlvbnMoKS5zaXplID4gMDtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXRoIG9mIGEgbW9kdWxlIHRvIGJlIGltcG9ydGVkXG4gKiBAcGFyYW0gaW1wb3J0RGVjbCBBbiBpbXBvcnQgZGVjbGFyYXRpb25cbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBtb2R1bGUgdG8gYmUgaW1wb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZVBhdGgoaW1wb3J0RGVjbDogSW1wb3J0RGVjbGFyYXRpb24pOiBzdHJpbmcge1xuICAgIGxldCBwYXRoOiBzdHJpbmc7XG4gICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKS5zdWJzdHJpbmcoaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpLmxlbmd0aCAtIDMpID09PSBcIi50c1wiKSB7XG4gICAgICAgICAgICBwYXRoID0gaW1wb3J0RGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGltcG9ydERlY2wuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArIFwiLnRzXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHBhdGggPSBpbXBvcnREZWNsLmdldE1vZHVsZVNwZWNpZmllclNvdXJjZUZpbGUoKSEuZ2V0RmlsZVBhdGgoKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlXG4gKiBAcGFyYW0gaW50ZXJmYWNlcyBBbiBhcnJheSBvZiBpbnRlcmZhY2VzXG4gKiBAcGFyYW0gc3ViQ2xhc3MgQSBjbGFzcyBvciBhbiBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIEludGVyZmFjZURlY2xhcmF0aW9uIGFuZCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHMgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSB0aGUgc3ViQ2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXMoaW50ZXJmYWNlczogQXJyYXk8SW50ZXJmYWNlRGVjbGFyYXRpb24+LCBzdWJDbGFzczogQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uKTogQXJyYXk8SW50ZXJmYWNlRGVjbGFyYXRpb24gfCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+IHtcbiAgICBsZXQgaW1wT3JFeHRJbnRlcmZhY2VzOiBBcnJheTxFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+O1xuICAgIGlmIChzdWJDbGFzcyBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgaW1wT3JFeHRJbnRlcmZhY2VzID0gc3ViQ2xhc3MuZ2V0SW1wbGVtZW50cygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaW1wT3JFeHRJbnRlcmZhY2VzID0gc3ViQ2xhc3MuZ2V0RXh0ZW5kcygpO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVyZmFjZXNOYW1lcyA9IGludGVyZmFjZXMubWFwKGkgPT4gaS5nZXROYW1lKCkpO1xuICAgIGNvbnN0IGltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXMgPSBuZXcgQXJyYXk8SW50ZXJmYWNlRGVjbGFyYXRpb24gfCBFeHByZXNzaW9uV2l0aFR5cGVBcmd1bWVudHM+KCk7XG5cbiAgICBpbXBPckV4dEludGVyZmFjZXMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgaWYgKGludGVyZmFjZXNOYW1lcy5pbmNsdWRlcyhpLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCkpKSB7XG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlc1tpbnRlcmZhY2VzTmFtZXMuaW5kZXhPZihpLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCkpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpbXBsZW1lbnRlZE9yRXh0ZW5kZWRJbnRlcmZhY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGVzKHNvdXJjZUZpbGVzOiBBcnJheTxTb3VyY2VGaWxlPik6IHZvaWQge1xuICAgIHNvdXJjZUZpbGVzLmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBGaWxlOiA+Pj4+Pj4+Pj4+ICR7ZmlsZS5nZXRGaWxlUGF0aCgpfWApO1xuXG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGUuZ2V0RmlsZVBhdGgoKSkpIHtcbiAgICAgICAgICAgIGN1cnJlbnRDQyA9IGNhbGN1bGF0ZShmaWxlLmdldEZpbGVQYXRoKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudENDID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGYgQSBzb3VyY2UgZmlsZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzRmlsZShmOiBTb3VyY2VGaWxlKTogdm9pZCB7XG4gICAgY29uc3QgaXNNb2R1bGUgPSBpc1NvdXJjZUZpbGVBTW9kdWxlKGYpO1xuXG4gICAgaWYgKGlzTW9kdWxlKSB7XG4gICAgICAgIG1vZHVsZXMucHVzaChmKTtcbiAgICB9XG5cbiAgICBjb25zdCBleHBvcnRNYXAgPSBmLmdldEV4cG9ydGVkRGVjbGFyYXRpb25zKCk7XG4gICAgaWYgKGV4cG9ydE1hcCkgbGlzdE9mRXhwb3J0TWFwcy5wdXNoKGV4cG9ydE1hcCk7XG5cbiAgICBjb25zdCBmbXhGaWxlID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4RmlsZShmLCBpc01vZHVsZSk7XG5cbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NGaWxlOiBmaWxlOiAke2YuZ2V0QmFzZU5hbWUoKX0sIGZxbiA9ICR7Zm14RmlsZS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG5cbiAgICBwcm9jZXNzQ29tbWVudHMoZiwgZm14RmlsZSk7XG4gICAgcHJvY2Vzc0FsaWFzZXMoZiwgZm14RmlsZSk7XG4gICAgcHJvY2Vzc0NsYXNzZXMoZiwgZm14RmlsZSk7XG4gICAgcHJvY2Vzc0ludGVyZmFjZXMoZiwgZm14RmlsZSk7IFxuICAgIHByb2Nlc3NNb2R1bGVzKGYsIGZteEZpbGUpO1xuICAgIHByb2Nlc3NWYXJpYWJsZXMoZiwgZm14RmlsZSk7IC8vIFRoaXMgd2lsbCBoYW5kbGUgb3VyIG9iamVjdCBsaXRlcmFsIG1ldGhvZHNcbiAgICBwcm9jZXNzRW51bXMoZiwgZm14RmlsZSk7XG4gICAgcHJvY2Vzc0Z1bmN0aW9ucyhmLCBmbXhGaWxlKTtcbiAgIFxuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQW1iaWVudChub2RlOiBNb2R1bGVEZWNsYXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIC8vIEFuIGFtYmllbnQgbW9kdWxlIGhhcyB0aGUgRGVjbGFyZUtleXdvcmQgbW9kaWZpZXIuXG4gICAgcmV0dXJuIChub2RlLmdldE1vZGlmaWVycygpPy5zb21lKG1vZGlmaWVyID0+IG1vZGlmaWVyLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5EZWNsYXJlS2V5d29yZCkpID8/IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lc3BhY2Uobm9kZTogTW9kdWxlRGVjbGFyYXRpb24pOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uIGhhcyBhIG5hbWVzcGFjZSBrZXl3b3JkLlxuICAgIC8vIFRoaXMgYXBwcm9hY2ggdXNlcyB0aGUgZ2V0Q2hpbGRyZW4oKSBtZXRob2QgdG8gaW5zcGVjdCB0aGUgc3ludGF4IGRpcmVjdGx5LlxuICAgIHJldHVybiBub2RlLmdldENoaWxkcmVuT2ZLaW5kKFN5bnRheEtpbmQuTmFtZXNwYWNlS2V5d29yZCkubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBtb2R1bGUgKGFsc28gbmFtZXNwYWNlKVxuICogQHBhcmFtIG0gQSBuYW1lc3BhY2VcbiAqIEByZXR1cm5zIEEgRmFtaXguTW9kdWxlIHJlcHJlc2VudGluZyB0aGUgbW9kdWxlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NNb2R1bGUobTogTW9kdWxlRGVjbGFyYXRpb24pOiBGYW1peC5Nb2R1bGUge1xuICAgIGNvbnN0IGZteE1vZHVsZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1vZHVsZShtKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgbW9kdWxlOiAke20uZ2V0TmFtZSgpfSwgKCR7bS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksICR7Zm14TW9kdWxlLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc0FsaWFzZXMobSwgZm14TW9kdWxlKTtcblxuICAgIHByb2Nlc3NDbGFzc2VzKG0sIGZteE1vZHVsZSk7XG5cbiAgICBwcm9jZXNzSW50ZXJmYWNlcyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc1ZhcmlhYmxlcyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcHJvY2Vzc0VudW1zKG0sIGZteE1vZHVsZSk7XG5cbiAgICBwcm9jZXNzRnVuY3Rpb25zKG0sIGZteE1vZHVsZSk7XG5cbiAgICBwcm9jZXNzTW9kdWxlcyhtLCBmbXhNb2R1bGUpO1xuXG4gICAgcmV0dXJuIGZteE1vZHVsZTtcbn1cblxudHlwZSBDb250YWluZXJUeXBlcyA9IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEFycm93RnVuY3Rpb247XG5cbnR5cGUgU2NvcGVkVHlwZXMgPSBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGUgfCBGYW1peC5GdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yO1xuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgYWxpYXNlcyBvZiBhIGNvbnRhaW5lclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NBbGlhc2VzKG06IENvbnRhaW5lclR5cGVzLCBmbXhTY29wZTogU2NvcGVkVHlwZXMpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NBbGlhc2VzOiAtLS0tLS0tLS0tIEZpbmRpbmcgQWxpYXNlczpgKTtcbiAgICBtLmdldFR5cGVBbGlhc2VzKCkuZm9yRWFjaChhID0+IHtcbiAgICAgICAgY29uc3QgZm14QWxpYXMgPSBwcm9jZXNzQWxpYXMoYSk7XG4gICAgICAgIGZteFNjb3BlLmFkZEFsaWFzKGZteEFsaWFzKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGNsYXNzZXMgb2YgYSBjb250YWluZXJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NDbGFzc2VzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0NsYXNzZXM6IC0tLS0tLS0tLS0gRmluZGluZyBDbGFzc2VzOmApO1xuICAgIGNvbnN0IGNsYXNzZXNJbkFycm93RnVuY3Rpb25zID0gZ2V0Q2xhc3Nlc0RlY2xhcmVkSW5BcnJvd0Z1bmN0aW9ucyhtKTtcbiAgICBjb25zdCBjbGFzc2VzID0gbS5nZXRDbGFzc2VzKCkuY29uY2F0KGNsYXNzZXNJbkFycm93RnVuY3Rpb25zKTtcbiAgICBjbGFzc2VzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IGZteENsYXNzID0gcHJvY2Vzc0NsYXNzKGMpO1xuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteENsYXNzKTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0QXJyb3dGdW5jdGlvbkNsYXNzZXMoZjogQXJyb3dGdW5jdGlvbik6IENsYXNzRGVjbGFyYXRpb25bXSB7XG4gICAgY29uc3QgY2xhc3NlczogQ2xhc3NEZWNsYXJhdGlvbltdID0gW107XG5cbiAgICBmdW5jdGlvbiBmaW5kQ2xhc3Nlcyhub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLmdldEtpbmQoKSA9PT0gU3ludGF4S2luZC5DbGFzc0RlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gobm9kZSBhcyBDbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLmdldENoaWxkcmVuKCkuZm9yRWFjaChmaW5kQ2xhc3Nlcyk7XG4gICAgfVxuXG4gICAgZmluZENsYXNzZXMoZik7XG4gICAgcmV0dXJuIGNsYXNzZXM7XG59XG5cbi8qKlxuICogdHMtbW9ycGggZG9lc24ndCBmaW5kIGNsYXNzZXMgaW4gYXJyb3cgZnVuY3Rpb25zLCBzbyB3ZSBuZWVkIHRvIGZpbmQgdGhlbSBtYW51YWxseVxuICogQHBhcmFtIHMgQSBzb3VyY2UgZmlsZSBcbiAqIEByZXR1cm5zIHRoZSBDbGFzc0RlY2xhcmF0aW9uIG9iamVjdHMgZm91bmQgaW4gYXJyb3cgZnVuY3Rpb25zIG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5mdW5jdGlvbiBnZXRDbGFzc2VzRGVjbGFyZWRJbkFycm93RnVuY3Rpb25zKHM6IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbik6IENsYXNzRGVjbGFyYXRpb25bXSB7XG4gICAgY29uc3QgYXJyb3dGdW5jdGlvbnMgPSBzLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbik7XG4gICAgY29uc3QgY2xhc3Nlc0luQXJyb3dGdW5jdGlvbnMgPSBhcnJvd0Z1bmN0aW9ucy5tYXAoZiA9PiBnZXRBcnJvd0Z1bmN0aW9uQ2xhc3NlcyhmKSkuZmxhdCgpO1xuICAgIHJldHVybiBjbGFzc2VzSW5BcnJvd0Z1bmN0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGludGVyZmFjZXMgb2YgYSBjb250YWluZXJcbiAqIEBwYXJhbSBtIEEgY29udGFpbmVyIChhIHNvdXJjZSBmaWxlIG9yIGEgbmFtZXNwYWNlKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NJbnRlcmZhY2VzKG06IFNvdXJjZUZpbGUgfCBNb2R1bGVEZWNsYXJhdGlvbiwgZm14U2NvcGU6IEZhbWl4LlNjcmlwdEVudGl0eSB8IEZhbWl4Lk1vZHVsZSk6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0ludGVyZmFjZXM6IC0tLS0tLS0tLS0gRmluZGluZyBJbnRlcmZhY2VzOmApO1xuICAgIG0uZ2V0SW50ZXJmYWNlcygpLmZvckVhY2goaSA9PiB7XG4gICAgICAgIGNvbnN0IGZteEludGVyZmFjZSA9IHByb2Nlc3NJbnRlcmZhY2UoaSk7XG4gICAgICAgIGZteFNjb3BlLmFkZFR5cGUoZm14SW50ZXJmYWNlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHZhcmlhYmxlcyBvZiBhIGNvbnRhaW5lclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NWYXJpYWJsZXMobTogQ29udGFpbmVyVHlwZXMsIGZteFNjb3BlOiBGYW1peC5TY3JpcHRFbnRpdHkgfCBGYW1peC5Nb2R1bGUgfCBGYW1peC5GdW5jdGlvbiB8IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzVmFyaWFibGVzOiAtLS0tLS0tLS0tIEZpbmRpbmcgVmFyaWFibGVzOmApO1xuICAgIG0uZ2V0VmFyaWFibGVTdGF0ZW1lbnRzKCkuZm9yRWFjaCh2ID0+IHtcbiAgICAgICAgY29uc3QgZm14VmFyaWFibGVzID0gcHJvY2Vzc1ZhcmlhYmxlU3RhdGVtZW50KHYpO1xuICAgICAgICBmbXhWYXJpYWJsZXMuZm9yRWFjaChmbXhWYXJpYWJsZSA9PiB7XG4gICAgICAgICAgICBmbXhTY29wZS5hZGRWYXJpYWJsZShmbXhWYXJpYWJsZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGVhY2ggVmFyaWFibGVEZWNsYXJhdGlvbiBmb3Igb2JqZWN0IGxpdGVyYWwgbWV0aG9kc1xuICAgICAgICB2LmdldERlY2xhcmF0aW9ucygpLmZvckVhY2godmFyRGVjbCA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJOYW1lID0gdmFyRGVjbC5nZXROYW1lKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ2hlY2tpbmcgdmFyaWFibGU6ICR7dmFyTmFtZX0gYXQgcG9zPSR7dmFyRGVjbC5nZXRTdGFydCgpfWApO1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbGl6ZXIgPSB2YXJEZWNsLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgJiYgTm9kZS5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgIGluaXRpYWxpemVyLmdldFByb3BlcnRpZXMoKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoTm9kZS5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkID0gcHJvcC5nZXRJbml0aWFsaXplcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lc3RlZCAmJiBOb2RlLmlzT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24obmVzdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZC5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLk1ldGhvZERlY2xhcmF0aW9uKS5mb3JFYWNoKG1ldGhvZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCBvYmplY3QgbGl0ZXJhbCBtZXRob2Q6ICR7bWV0aG9kLmdldE5hbWUoKX0gYXQgcG9zPSR7bWV0aG9kLmdldFN0YXJ0KCl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peE1ldGhvZChtZXRob2QsIGN1cnJlbnRDQyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBlbnVtcyBvZiBhIGNvbnRhaW5lclxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUsIGEgbmFtZXNwYWNlLCBhIGZ1bmN0aW9uIG9yIGEgbWV0aG9kKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY29udGFpbmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NFbnVtcyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzRW51bXM6IC0tLS0tLS0tLS0gRmluZGluZyBFbnVtczpgKTtcbiAgICBtLmdldEVudW1zKCkuZm9yRWFjaChlID0+IHtcbiAgICAgICAgY29uc3QgZm14RW51bSA9IHByb2Nlc3NFbnVtKGUpO1xuICAgICAgICBmbXhTY29wZS5hZGRUeXBlKGZteEVudW0pO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgZnVuY3Rpb25zIG9mIGEgY29udGFpbmVyXG4gKiBAcGFyYW0gbSBBIGNvbnRhaW5lciAoYSBzb3VyY2UgZmlsZSwgYSBuYW1lc3BhY2UsIGEgZnVuY3Rpb24gb3IgYSBtZXRob2QpXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Z1bmN0aW9ucyhtOiBDb250YWluZXJUeXBlcywgZm14U2NvcGU6IFNjb3BlZFR5cGVzKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcbiAgICBtLmdldEZ1bmN0aW9ucygpLmZvckVhY2goZiA9PiB7XG4gICAgICAgIGNvbnN0IGZteEZ1bmN0aW9uID0gcHJvY2Vzc0Z1bmN0aW9uKGYpO1xuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XG4gICAgfSk7XG5cbiAgICAvL2ZpbmQgYXJyb3cgZnVuY3Rpb25zXG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIEZ1bmN0aW9uczpgKTtcbiAgICBjb25zdCBhcnJvd0Z1bmN0aW9ucyA9IG0uZ2V0RGVzY2VuZGFudHNPZktpbmQoU3ludGF4S2luZC5BcnJvd0Z1bmN0aW9uKTtcbiAgICBhcnJvd0Z1bmN0aW9ucy5mb3JFYWNoKGFmID0+IHtcbiAgICAgICAgY29uc3QgZm14RnVuY3Rpb24gPSBwcm9jZXNzRnVuY3Rpb24oYWYpO1xuICAgICAgICBmbXhTY29wZS5hZGRGdW5jdGlvbihmbXhGdW5jdGlvbik7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBtb2R1bGVzIG9mIGEgY29udGFpbmVyLlxuICogQHBhcmFtIG0gQSBjb250YWluZXIgKGEgc291cmNlIGZpbGUgb3IgYSBuYW1lc3BhY2UpXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBjb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc01vZHVsZXMobTogU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguU2NyaXB0RW50aXR5IHwgRmFtaXguTW9kdWxlKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIE1vZHVsZXM6YCk7XG4gICAgbS5nZXRNb2R1bGVzKCkuZm9yRWFjaChtZCA9PiB7XG4gICAgICAgIGNvbnN0IGZteE1vZHVsZSA9IHByb2Nlc3NNb2R1bGUobWQpO1xuICAgICAgICBmbXhTY29wZS5hZGRNb2R1bGUoZm14TW9kdWxlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYWxpYXNcbiAqIEBwYXJhbSBhIEFuIGFsaWFzXG4gKiBAcmV0dXJucyBBIEZhbWl4LkFsaWFzIHJlcHJlc2VudGluZyB0aGUgYWxpYXNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0FsaWFzKGE6IFR5cGVBbGlhc0RlY2xhcmF0aW9uKTogRmFtaXguQWxpYXMge1xuICAgIGNvbnN0IGZteEFsaWFzID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEFsaWFzKGEpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBBbGlhczogJHthLmdldE5hbWUoKX0sICgke2EuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEFsaWFzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhhLCBmbXhBbGlhcyk7XG5cbiAgICByZXR1cm4gZm14QWxpYXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgY2xhc3NcbiAqIEBwYXJhbSBjIEEgY2xhc3NcbiAqIEByZXR1cm5zIEEgRmFtaXguQ2xhc3Mgb3IgYSBGYW1peC5QYXJhbWV0cmljQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjbGFzc1xuICovXG5mdW5jdGlvbiBwcm9jZXNzQ2xhc3MoYzogQ2xhc3NEZWNsYXJhdGlvbik6IEZhbWl4LkNsYXNzIHwgRmFtaXguUGFyYW1ldHJpY0NsYXNzIHtcbiAgICBjbGFzc2VzLnB1c2goYyk7XG5cbiAgICBjb25zdCBmbXhDbGFzcyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peENsYXNzKGMpO1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBDbGFzczogJHtjLmdldE5hbWUoKX0sICgke2MuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteENsYXNzLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhjLCBmbXhDbGFzcyk7XG5cbiAgICBwcm9jZXNzRGVjb3JhdG9ycyhjLCBmbXhDbGFzcyk7XG5cbiAgICBwcm9jZXNzU3RydWN0dXJlZFR5cGUoYywgZm14Q2xhc3MpO1xuXG4gICAgYy5nZXRDb25zdHJ1Y3RvcnMoKS5mb3JFYWNoKGNvbiA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbiA9IHByb2Nlc3NNZXRob2QoY29uKTtcbiAgICAgICAgZm14Q2xhc3MuYWRkTWV0aG9kKGZteENvbik7XG4gICAgfSk7XG5cbiAgICBjLmdldEdldEFjY2Vzc29ycygpLmZvckVhY2goYWNjID0+IHtcbiAgICAgICAgY29uc3QgZm14QWNjID0gcHJvY2Vzc01ldGhvZChhY2MpO1xuICAgICAgICBmbXhDbGFzcy5hZGRNZXRob2QoZm14QWNjKTtcbiAgICB9KTtcblxuICAgIGMuZ2V0U2V0QWNjZXNzb3JzKCkuZm9yRWFjaChhY2MgPT4ge1xuICAgICAgICBjb25zdCBmbXhBY2MgPSBwcm9jZXNzTWV0aG9kKGFjYyk7XG4gICAgICAgIGZteENsYXNzLmFkZE1ldGhvZChmbXhBY2MpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZteENsYXNzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhbiBpbnRlcmZhY2VcbiAqIEBwYXJhbSBpIEFuIGludGVyZmFjZVxuICogQHJldHVybnMgQSBGYW1peC5JbnRlcmZhY2Ugb3IgYSBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHJlcHJlc2VudGluZyB0aGUgaW50ZXJmYWNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NJbnRlcmZhY2UoaTogSW50ZXJmYWNlRGVjbGFyYXRpb24pOiBGYW1peC5JbnRlcmZhY2UgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHtcbiAgICBpbnRlcmZhY2VzLnB1c2goaSk7XG5cbiAgICBjb25zdCBmbXhJbnRlcmZhY2UgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhJbnRlcmZhY2UoaSk7XG5cbiAgICBsb2dnZXIuZGVidWcoYEludGVyZmFjZTogJHtpLmdldE5hbWUoKX0sICgke2kuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEludGVyZmFjZS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG5cbiAgICBwcm9jZXNzQ29tbWVudHMoaSwgZm14SW50ZXJmYWNlKTtcblxuICAgIHByb2Nlc3NTdHJ1Y3R1cmVkVHlwZShpLCBmbXhJbnRlcmZhY2UpO1xuXG4gICAgcmV0dXJuIGZteEludGVyZmFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIHR5cGUgcGFyYW1ldGVycywgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiBhIHN0cnVjdHVyZWQgdHlwZVxuICogQHBhcmFtIGMgQSBzdHJ1Y3R1cmVkIHR5cGUgKGEgY2xhc3Mgb3IgYW4gaW50ZXJmYWNlKVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgc3RydWN0dXJlZCB0eXBlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NTdHJ1Y3R1cmVkVHlwZShjOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24sIGZteFNjb3BlOiBGYW1peC5DbGFzcyB8IEZhbWl4LlBhcmFtZXRyaWNDbGFzcyB8IEZhbWl4LkludGVyZmFjZSB8IEZhbWl4LlBhcmFtZXRyaWNJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYEZpbmRpbmcgUHJvcGVydGllcyBhbmQgTWV0aG9kczpgKTtcbiAgICBpZiAoZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfHwgZm14U2NvcGUgaW5zdGFuY2VvZiBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlKSB7XG4gICAgICAgIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhjLCBmbXhTY29wZSk7XG4gICAgfVxuXG4gICAgYy5nZXRQcm9wZXJ0aWVzKCkuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgY29uc3QgZm14UHJvcGVydHkgPSBwcm9jZXNzUHJvcGVydHkocHJvcCk7XG4gICAgICAgIGZteFNjb3BlLmFkZFByb3BlcnR5KGZteFByb3BlcnR5KTtcbiAgICB9KTtcblxuICAgIGMuZ2V0TWV0aG9kcygpLmZvckVhY2gobSA9PiB7XG4gICAgICAgIGNvbnN0IGZteE1ldGhvZCA9IHByb2Nlc3NNZXRob2QobSk7XG4gICAgICAgIGZteFNjb3BlLmFkZE1ldGhvZChmbXhNZXRob2QpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIHByb3BlcnR5XG4gKiBAcGFyYW0gcCBBIHByb3BlcnR5XG4gKiBAcmV0dXJucyBBIEZhbWl4LlByb3BlcnR5IHJlcHJlc2VudGluZyB0aGUgcHJvcGVydHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnR5KHA6IFByb3BlcnR5RGVjbGFyYXRpb24gfCBQcm9wZXJ0eVNpZ25hdHVyZSk6IEZhbWl4LlByb3BlcnR5IHtcbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvcGVydHk6ICR7cC5nZXROYW1lKCl9LCAoJHtwLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhQcm9wZXJ0eS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAgLS0tPiBJdCdzIGEgUHJvcGVydHkkeyhwIGluc3RhbmNlb2YgUHJvcGVydHlTaWduYXR1cmUpID8gXCJTaWduYXR1cmVcIiA6IFwiRGVjbGFyYXRpb25cIn0hYCk7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBwLmdldEZpcnN0QW5jZXN0b3JPclRocm93KCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAgLS0tPiBJdHMgZmlyc3QgYW5jZXN0b3IgaXMgYSAke2FuY2VzdG9yLmdldEtpbmROYW1lKCl9YCk7XG5cbiAgICAvLyBkZWNvcmF0b3JzXG4gICAgaWYgKCEocCBpbnN0YW5jZW9mIFByb3BlcnR5U2lnbmF0dXJlKSkge1xuICAgICAgICBwcm9jZXNzRGVjb3JhdG9ycyhwLCBmbXhQcm9wZXJ0eSk7XG4gICAgICAgIC8vIG9ubHkgYWRkIGFjY2VzcyBpZiB0aGUgcCdzIGZpcnN0IGFuY2VzdG9yIGlzIG5vdCBhIFByb3BlcnR5RGVjbGFyYXRpb25cbiAgICAgICAgaWYgKGFuY2VzdG9yLmdldEtpbmROYW1lKCkgIT09IFwiUHJvcGVydHlEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3MgdG8gbWFwOiAke3AuZ2V0TmFtZSgpfSwgKCR7cC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSkgRmFtaXggJHtmbXhQcm9wZXJ0eS5uYW1lfSBpZDogJHtmbXhQcm9wZXJ0eS5pZH1gKTtcbiAgICAgICAgICAgIGFjY2Vzc01hcC5zZXQoZm14UHJvcGVydHkuaWQsIHApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHAsIGZteFByb3BlcnR5KTtcblxuICAgIHJldHVybiBmbXhQcm9wZXJ0eTtcbn1cblxuLyoqXG4gICAgICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgbWV0aG9kIG9yIGFuIGFjY2Vzc29yXG4gICAgICogQHBhcmFtIG0gQSBtZXRob2Qgb3IgYW4gYWNjZXNzb3JcbiAgICAgKiBAcmV0dXJucyBBIEZhbWl4Lk1ldGhvZCBvciBhIEZhbWl4LkFjY2Vzc29yIHJlcHJlc2VudGluZyB0aGUgbWV0aG9kIG9yIHRoZSBhY2Nlc3NvclxuICAgICAqL1xuZnVuY3Rpb24gcHJvY2Vzc01ldGhvZChtOiBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbik6IEZhbWl4Lk1ldGhvZCB8IEZhbWl4LkFjY2Vzc29yIHtcbiAgICBjb25zdCBmbXhNZXRob2QgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhNZXRob2QobSwgY3VycmVudENDKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgTWV0aG9kOiAkeyEobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pID8gbS5nZXROYW1lKCkgOiBcImNvbnN0cnVjdG9yXCJ9LCAoJHttLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgcGFyZW50OiAkeyhtLmdldFBhcmVudCgpIGFzIENsYXNzRGVjbGFyYXRpb24gfCBJbnRlcmZhY2VEZWNsYXJhdGlvbikuZ2V0TmFtZSgpfSwgZnFuID0gJHtmbXhNZXRob2QuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKG0sIGZteE1ldGhvZCk7XG5cbiAgICBwcm9jZXNzVHlwZVBhcmFtZXRlcnMobSwgZm14TWV0aG9kKTtcblxuICAgIHByb2Nlc3NQYXJhbWV0ZXJzKG0sIGZteE1ldGhvZCk7XG5cbiAgICBpZiAoIShtIGluc3RhbmNlb2YgTWV0aG9kU2lnbmF0dXJlKSkge1xuICAgICAgICBwcm9jZXNzQWxpYXNlcyhtLCBmbXhNZXRob2QpO1xuXG4gICAgICAgIHByb2Nlc3NWYXJpYWJsZXMobSwgZm14TWV0aG9kKTtcblxuICAgICAgICBwcm9jZXNzRW51bXMobSwgZm14TWV0aG9kKTtcblxuICAgICAgICBwcm9jZXNzRnVuY3Rpb25zKG0sIGZteE1ldGhvZCk7XG5cbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRXhwcmVzc2lvbnMobSwgZm14TWV0aG9kKTtcblxuICAgICAgICBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkLnNldChmbXhNZXRob2QuaWQsIG0pO1xuICAgIH1cblxuICAgIGlmIChtIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24gfHwgbSBpbnN0YW5jZW9mIEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgbSBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24pIHtcbiAgICAgICAgcHJvY2Vzc0RlY29yYXRvcnMobSwgZm14TWV0aG9kKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm14TWV0aG9kO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZiBBIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBBIEZhbWl4LkZ1bmN0aW9uIHJlcHJlc2VudGluZyB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Z1bmN0aW9uKGY6IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uKTogRmFtaXguRnVuY3Rpb24ge1xuXG4gICAgbG9nZ2VyLmRlYnVnKGBGdW5jdGlvbjogJHsoZiBpbnN0YW5jZW9mIEFycm93RnVuY3Rpb24gPyBcImFub255bW91c1wiIDogZi5nZXROYW1lKCkgPyBmLmdldE5hbWUoKSA6IFwiYW5vbnltb3VzXCIpfSwgKCR7Zi5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Z2V0RlFOKGYpfWApO1xuXG4gICAgbGV0IGZteEZ1bmN0aW9uO1xuICAgIGlmIChmIGluc3RhbmNlb2YgQXJyb3dGdW5jdGlvbikge1xuICAgICAgICBmbXhGdW5jdGlvbiA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEFycm93RnVuY3Rpb24oZiwgY3VycmVudENDKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmbXhGdW5jdGlvbiA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEZ1bmN0aW9uKGYsIGN1cnJlbnRDQyk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NBbGlhc2VzKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhmLCBmbXhGdW5jdGlvbik7XG5cbiAgICBwcm9jZXNzUGFyYW1ldGVycyhmLCBmbXhGdW5jdGlvbik7XG5cbiAgICBwcm9jZXNzVmFyaWFibGVzKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIHByb2Nlc3NFbnVtcyhmLCBmbXhGdW5jdGlvbik7XG5cbiAgICBwcm9jZXNzRnVuY3Rpb25zKGYsIGZteEZ1bmN0aW9uKTtcblxuICAgIGlmIChmIGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbiAmJiAhKGYuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBCbG9jaykpIHtcbiAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uRXhwcmVzc2lvbnMoZiwgZm14RnVuY3Rpb24pO1xuICAgIH1cblxuICAgIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQuc2V0KGZteEZ1bmN0aW9uLmlkLCBmKTtcblxuICAgIHJldHVybiBmbXhGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb25zIG9mIGEgZnVuY3Rpb24gb3IgYSBtZXRob2RcbiAqIEBwYXJhbSBmIEEgZnVuY3Rpb24gb3IgYSBtZXRob2RcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGZ1bmN0aW9uIG9yIHRoZSBtZXRob2RcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0Z1bmN0aW9uRXhwcmVzc2lvbnMoZjogRnVuY3Rpb25EZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguRnVuY3Rpb24gfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3Nvcik6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmluZGluZyBGdW5jdGlvbiBFeHByZXNzaW9uczpgKTtcbiAgICBjb25zdCBmdW5jdGlvbkV4cHJlc3Npb25zID0gZi5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLkZ1bmN0aW9uRXhwcmVzc2lvbik7XG4gICAgZnVuY3Rpb25FeHByZXNzaW9ucy5mb3JFYWNoKChmdW5jKSA9PiB7XG4gICAgICAgIGNvbnN0IGZteEZ1bmMgPSBwcm9jZXNzRnVuY3Rpb24oZnVuYyk7XG4gICAgICAgIGZteFNjb3BlLmFkZEZ1bmN0aW9uKGZteEZ1bmMpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgcGFyYW1ldGVycyBvZiBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gZm14U2NvcGUgVGhlIEZhbWl4IG1vZGVsIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NQYXJhbWV0ZXJzKG06IE1ldGhvZERlY2xhcmF0aW9uIHwgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiB8IE1ldGhvZFNpZ25hdHVyZSB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRXhwcmVzc2lvbiB8IEFycm93RnVuY3Rpb24sIGZteFNjb3BlOiBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LkZ1bmN0aW9uKTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIFBhcmFtZXRlcnM6YCk7XG4gICAgbS5nZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGNvbnN0IGZteFBhcmFtID0gcHJvY2Vzc1BhcmFtZXRlcihwYXJhbSk7XG4gICAgICAgIGZteFNjb3BlLmFkZFBhcmFtZXRlcihmbXhQYXJhbSk7XG4gICAgICAgIC8vIEFkZGl0aW9uYWwgaGFuZGxpbmcgZm9yIFBhcmFtZXRlciBQcm9wZXJ0aWVzIGluIGNvbnN0cnVjdG9yc1xuICAgICAgICBpZiAobSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIgaGFzIGFueSB2aXNpYmlsaXR5IG1vZGlmaWVyXG4gICAgICAgICAgICBpZiAocGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkgfHwgcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSB8fCBwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpIHx8IHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUmVhZG9ubHlLZXl3b3JkKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzT2ZDb25zdHJ1Y3RvciA9IG0uZ2V0UGFyZW50KCk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFBhcmFtZXRlciBQcm9wZXJ0eSAke3BhcmFtLmdldE5hbWUoKX0gaW4gY29uc3RydWN0b3Igb2YgJHtjbGFzc09mQ29uc3RydWN0b3IuZ2V0TmFtZSgpfS5gKTtcbiAgICAgICAgICAgICAgICAvLyBUcmVhdCB0aGUgcGFyYW1ldGVyIGFzIGEgcHJvcGVydHkgYW5kIGFkZCBpdCB0byB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IHByb2Nlc3NQYXJhbWV0ZXJBc1Byb3BlcnR5KHBhcmFtLCBjbGFzc09mQ29uc3RydWN0b3IpO1xuICAgICAgICAgICAgICAgIGZteFByb3BlcnR5LnJlYWRPbmx5ID0gcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9KTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgY3JlYXRlIGEgRmFtaXguUHJvcGVydHkgbW9kZWwgZnJvbSBhIFBhcmFtZXRlckRlY2xhcmF0aW9uXG4vLyBZb3UnbGwgbmVlZCB0byBpbXBsZW1lbnQgaXQgYWNjb3JkaW5nIHRvIHlvdXIgRmFtaXggbW9kZWwgc3RydWN0dXJlXG5mdW5jdGlvbiBwcm9jZXNzUGFyYW1ldGVyQXNQcm9wZXJ0eShwYXJhbTogUGFyYW1ldGVyRGVjbGFyYXRpb24sIGNsYXNzRGVjbDogQ2xhc3NEZWNsYXJhdGlvbiB8IENsYXNzRXhwcmVzc2lvbik6IEZhbWl4LlByb3BlcnR5IHtcbiAgICAvLyBDb252ZXJ0IHRoZSBwYXJhbWV0ZXIgaW50byBhIFByb3BlcnR5XG4gICAgY29uc3QgcHJvcGVydHlSZXByZXNlbnRhdGlvbiA9IGNvbnZlcnRQYXJhbWV0ZXJUb1Byb3BlcnR5UmVwcmVzZW50YXRpb24ocGFyYW0pO1xuXG4gICAgLy8gQWRkIHRoZSBwcm9wZXJ0eSB0byB0aGUgY2xhc3Mgc28gd2UgY2FuIGhhdmUgYSBQcm9wZXJ0eURlY2xhcmF0aW9uIG9iamVjdFxuICAgIGNsYXNzRGVjbC5hZGRQcm9wZXJ0eShwcm9wZXJ0eVJlcHJlc2VudGF0aW9uKTtcblxuICAgIGNvbnN0IHByb3BlcnR5ID0gY2xhc3NEZWNsLmdldFByb3BlcnR5KHByb3BlcnR5UmVwcmVzZW50YXRpb24ubmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7cHJvcGVydHlSZXByZXNlbnRhdGlvbi5uYW1lfSBub3QgZm91bmQgaW4gY2xhc3MgJHtjbGFzc0RlY2wuZ2V0TmFtZSgpfWApO1xuICAgIH1cbiAgICBjb25zdCBmbXhQcm9wZXJ0eSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQcm9wZXJ0eShwcm9wZXJ0eSk7XG4gICAgaWYgKGNsYXNzRGVjbCBpbnN0YW5jZW9mIENsYXNzRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgZm14Q2xhc3MgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhDbGFzcyhjbGFzc0RlY2wpO1xuICAgICAgICBmbXhDbGFzcy5hZGRQcm9wZXJ0eShmbXhQcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCB0eXBlIENsYXNzRXhwcmVzc2lvbi5cIik7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHByb3BlcnR5LCBmbXhQcm9wZXJ0eSk7XG5cbiAgICAvLyByZW1vdmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIGNsYXNzXG4gICAgcHJvcGVydHkucmVtb3ZlKCk7XG5cbiAgICByZXR1cm4gZm14UHJvcGVydHk7XG5cbn1cblxuZnVuY3Rpb24gY29udmVydFBhcmFtZXRlclRvUHJvcGVydHlSZXByZXNlbnRhdGlvbihwYXJhbTogUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcbiAgICAvLyBFeHRyYWN0IG5hbWVcbiAgICBjb25zdCBwYXJhbU5hbWUgPSBwYXJhbS5nZXROYW1lKCk7XG5cbiAgICAvLyBFeHRyYWN0IHR5cGVcbiAgICBjb25zdCBwYXJhbVR5cGUgPSBwYXJhbS5nZXRUeXBlKCkuZ2V0VGV4dChwYXJhbSk7XG5cbiAgICAvLyBEZXRlcm1pbmUgdmlzaWJpbGl0eVxuICAgIGxldCBzY29wZTogU2NvcGU7XG4gICAgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHJpdmF0ZTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtLmhhc01vZGlmaWVyKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICAgICAgc2NvcGUgPSBTY29wZS5Qcm90ZWN0ZWQ7XG4gICAgfSBlbHNlIGlmIChwYXJhbS5oYXNNb2RpZmllcihTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpKSB7XG4gICAgICAgIHNjb3BlID0gU2NvcGUuUHVibGljO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyYW1ldGVyIHByb3BlcnR5ICR7cGFyYW1OYW1lfSBpbiBjb25zdHJ1Y3RvciBkb2VzIG5vdCBoYXZlIGEgdmlzaWJpbGl0eSBtb2RpZmllci5gKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgcmVhZG9ubHlcbiAgICBjb25zdCBpc1JlYWRvbmx5ID0gcGFyYW0uaGFzTW9kaWZpZXIoU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQpO1xuXG4gICAgLy8gQ3JlYXRlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3BlcnR5XG4gICAgY29uc3QgcHJvcGVydHlSZXByZXNlbnRhdGlvbiA9IHtcbiAgICAgICAgbmFtZTogcGFyYW1OYW1lLFxuICAgICAgICB0eXBlOiBwYXJhbVR5cGUsXG4gICAgICAgIHNjb3BlOiBzY29wZSxcbiAgICAgICAgaXNSZWFkb25seTogaXNSZWFkb25seSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BlcnR5UmVwcmVzZW50YXRpb247XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgcGFyYW1ldGVyXG4gKiBAcGFyYW0gcGFyYW1EZWNsIEEgcGFyYW1ldGVyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlBhcmFtZXRlciByZXByZXNlbnRpbmcgdGhlIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzUGFyYW1ldGVyKHBhcmFtRGVjbDogUGFyYW1ldGVyRGVjbGFyYXRpb24pOiBGYW1peC5QYXJhbWV0ZXIge1xuICAgIGNvbnN0IGZteFBhcmFtID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4UGFyYW1ldGVyKHBhcmFtRGVjbCk7ICAvLyBjcmVhdGUgb3IgR0VUXG5cbiAgICBsb2dnZXIuZGVidWcoYHBhcmFtZXRlcjogJHtwYXJhbURlY2wuZ2V0TmFtZSgpfSwgKCR7cGFyYW1EZWNsLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhQYXJhbS5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG5cbiAgICBwcm9jZXNzQ29tbWVudHMocGFyYW1EZWNsLCBmbXhQYXJhbSk7XG5cbiAgICBwcm9jZXNzRGVjb3JhdG9ycyhwYXJhbURlY2wsIGZteFBhcmFtKTtcblxuICAgIGNvbnN0IHBhcmVudCA9IHBhcmFtRGVjbC5nZXRQYXJlbnQoKTtcblxuICAgIGlmICghKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBhZGRpbmcgYWNjZXNzOiAke3BhcmFtRGVjbC5nZXROYW1lKCl9LCAoJHtwYXJhbURlY2wuZ2V0VHlwZSgpLmdldFRleHQoKX0pIEZhbWl4ICR7Zm14UGFyYW0ubmFtZX1gKTtcbiAgICAgICAgYWNjZXNzTWFwLnNldChmbXhQYXJhbS5pZCwgcGFyYW1EZWNsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm14UGFyYW07XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NUeXBlUGFyYW1ldGVycyhcbiAgICBlOiBDbGFzc0RlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBNZXRob2RTaWduYXR1cmUgfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uLFxuICAgIGZteFNjb3BlOiBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljSW50ZXJmYWNlIHwgRmFtaXguTWV0aG9kIHwgRmFtaXguQWNjZXNzb3IgfCBGYW1peC5GdW5jdGlvbiB8IEZhbWl4LkFycm93RnVuY3Rpb25cbik6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRmluZGluZyBUeXBlIFBhcmFtZXRlcnM6YCk7XG4gICAgY29uc3Qgbm9kZVN0YXJ0ID0gZS5nZXRTdGFydCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkXG4gICAgaWYgKHByb2Nlc3NlZE5vZGVzV2l0aFR5cGVQYXJhbXMuaGFzKG5vZGVTdGFydCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdldCB0eXBlIHBhcmFtZXRlcnNcbiAgICBjb25zdCB0eXBlUGFyYW1zID0gZS5nZXRUeXBlUGFyYW1ldGVycygpO1xuXG4gICAgLy8gUHJvY2VzcyBlYWNoIHR5cGUgcGFyYW1ldGVyXG4gICAgdHlwZVBhcmFtcy5mb3JFYWNoKCh0cCkgPT4ge1xuICAgICAgICBjb25zdCBmbXhQYXJhbSA9IHByb2Nlc3NUeXBlUGFyYW1ldGVyKHRwKTtcbiAgICAgICAgZm14U2NvcGUuYWRkR2VuZXJpY1BhcmFtZXRlcihmbXhQYXJhbSk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2cgaWYgbm8gdHlwZSBwYXJhbWV0ZXJzIHdlcmUgZm91bmRcbiAgICBpZiAodHlwZVBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbcHJvY2Vzc1R5cGVQYXJhbWV0ZXJzXSBObyB0eXBlIHBhcmFtZXRlcnMgZm91bmQgZm9yIHRoaXMgbm9kZWApO1xuICAgIH1cblxuICAgIC8vIE1hcmsgdGhpcyBub2RlIGFzIHByb2Nlc3NlZFxuICAgIHByb2Nlc3NlZE5vZGVzV2l0aFR5cGVQYXJhbXMuYWRkKG5vZGVTdGFydCk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgdHlwZSBwYXJhbWV0ZXJcbiAqIEBwYXJhbSB0cCBBIHR5cGUgcGFyYW1ldGVyXG4gKiBAcmV0dXJucyBBIEZhbWl4LlR5cGVQYXJhbWV0ZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIHBhcmFtZXRlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzVHlwZVBhcmFtZXRlcih0cDogVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uKTogRmFtaXguUGFyYW1ldGVyVHlwZSB7XG4gICAgY29uc3QgZm14VHlwZVBhcmFtZXRlciA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhQYXJhbWV0ZXJUeXBlKHRwKTtcbiAgICBsb2dnZXIuZGVidWcoYHR5cGUgcGFyYW1ldGVyOiAke3RwLmdldE5hbWUoKX0sICgke3RwLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhUeXBlUGFyYW1ldGVyLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcbiAgICBwcm9jZXNzQ29tbWVudHModHAsIGZteFR5cGVQYXJhbWV0ZXIpO1xuICAgIHJldHVybiBmbXhUeXBlUGFyYW1ldGVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciB0aGUgdmFyaWFibGVzIG9mIGEgdmFyaWFibGUgc3RhdGVtZW50XG4gKiBAcGFyYW0gdiBBIHZhcmlhYmxlIHN0YXRlbWVudFxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgRmFtaXguVmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZXNcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1ZhcmlhYmxlU3RhdGVtZW50KHY6IFZhcmlhYmxlU3RhdGVtZW50KTogQXJyYXk8RmFtaXguVmFyaWFibGU+IHtcbiAgICBjb25zdCBmbXhWYXJpYWJsZXMgPSBuZXcgQXJyYXk8RmFtaXguVmFyaWFibGU+KCk7XG5cbiAgICBsb2dnZXIuZGVidWcoYFZhcmlhYmxlIHN0YXRlbWVudDogJHt2LmdldFRleHQoKX0sICgke3YuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCAke3YuZ2V0RGVjbGFyYXRpb25LaW5kS2V5d29yZHMoKVswXX0sIGZxbiA9ICR7di5nZXREZWNsYXJhdGlvbnMoKVswXS5nZXROYW1lKCl9YCk7XG5cbiAgICB2LmdldERlY2xhcmF0aW9ucygpLmZvckVhY2godmFyaWFibGUgPT4ge1xuICAgICAgICBjb25zdCBmbXhWYXIgPSBwcm9jZXNzVmFyaWFibGUodmFyaWFibGUpO1xuICAgICAgICBwcm9jZXNzQ29tbWVudHModiwgZm14VmFyKTtcbiAgICAgICAgZm14VmFyaWFibGVzLnB1c2goZm14VmFyKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmbXhWYXJpYWJsZXM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGEgdmFyaWFibGVcbiAqIEBwYXJhbSB2IEEgdmFyaWFibGVcbiAqIEByZXR1cm5zIEEgRmFtaXguVmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB2YXJpYWJsZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzVmFyaWFibGUodjogVmFyaWFibGVEZWNsYXJhdGlvbik6IEZhbWl4LlZhcmlhYmxlIHtcbiAgICBjb25zdCBmbXhWYXIgPSBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhWYXJpYWJsZSh2KTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgdmFyaWFibGU6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgJHt2LmdldEluaXRpYWxpemVyKCkgPyBcImluaXRpYWxpemVyOiBcIiArIHYuZ2V0SW5pdGlhbGl6ZXIoKSEuZ2V0VGV4dCgpIDogXCJpbml0aWFsaXplcjogXCJ9LCBmcW4gPSAke2ZteFZhci5mdWxseVF1YWxpZmllZE5hbWV9YCk7XG5cbiAgICBwcm9jZXNzQ29tbWVudHModiwgZm14VmFyKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgYWRkaW5nIGFjY2VzczogJHt2LmdldE5hbWUoKX0sICgke3YuZ2V0VHlwZSgpLmdldFRleHQoKX0pIEZhbWl4ICR7Zm14VmFyLm5hbWV9YCk7XG4gICAgYWNjZXNzTWFwLnNldChmbXhWYXIuaWQsIHYpO1xuXG4gICAgcmV0dXJuIGZteFZhcjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gZW51bVxuICogQHBhcmFtIGUgQW4gZW51bVxuICogQHJldHVybnMgQSBGYW1peC5FbnVtIHJlcHJlc2VudGluZyB0aGUgZW51bVxuICovXG5mdW5jdGlvbiBwcm9jZXNzRW51bShlOiBFbnVtRGVjbGFyYXRpb24pOiBGYW1peC5FbnVtIHtcbiAgICBjb25zdCBmbXhFbnVtID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVPckdldEZhbWl4RW51bShlKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgZW51bTogJHtlLmdldE5hbWUoKX0sICgke2UuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCBmcW4gPSAke2ZteEVudW0uZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKGUsIGZteEVudW0pO1xuXG4gICAgZS5nZXRNZW1iZXJzKCkuZm9yRWFjaChtID0+IHtcbiAgICAgICAgY29uc3QgZm14RW51bVZhbHVlID0gcHJvY2Vzc0VudW1WYWx1ZShtKTtcbiAgICAgICAgZm14RW51bS5hZGRWYWx1ZShmbXhFbnVtVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZteEVudW07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIGFuIGVudW0gbWVtYmVyXG4gKiBAcGFyYW0gdiBBbiBlbnVtIG1lbWJlclxuICogQHJldHVybnMgQSBGYW1peC5FbnVtVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbnVtIG1lbWJlclxuICovXG5mdW5jdGlvbiBwcm9jZXNzRW51bVZhbHVlKHY6IEVudW1NZW1iZXIpOiBGYW1peC5FbnVtVmFsdWUge1xuICAgIGNvbnN0IGZteEVudW1WYWx1ZSA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhFbnVtVmFsdWUodik7XG5cbiAgICBsb2dnZXIuZGVidWcoYGVudW0gdmFsdWU6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZnFuID0gJHtmbXhFbnVtVmFsdWUuZnVsbHlRdWFsaWZpZWROYW1lfWApO1xuXG4gICAgcHJvY2Vzc0NvbW1lbnRzKHYsIGZteEVudW1WYWx1ZSk7XG5cbiAgICBsb2dnZXIuZGVidWcoYGFkZGluZyBhY2Nlc3M6ICR7di5nZXROYW1lKCl9LCAoJHt2LmdldFR5cGUoKS5nZXRUZXh0KCl9KSBGYW1peCAke2ZteEVudW1WYWx1ZS5uYW1lfWApO1xuICAgIGFjY2Vzc01hcC5zZXQoZm14RW51bVZhbHVlLmlkLCB2KTtcblxuICAgIHJldHVybiBmbXhFbnVtVmFsdWU7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBkZWNvcmF0b3JzIG9mIGEgY2xhc3MsIGEgbWV0aG9kLCBhIHBhcmFtZXRlciBvciBhIHByb3BlcnR5XG4gKiBAcGFyYW0gZSBBIGNsYXNzLCBhIG1ldGhvZCwgYSBwYXJhbWV0ZXIgb3IgYSBwcm9wZXJ0eVxuICogQHBhcmFtIGZteFNjb3BlIFRoZSBGYW1peCBtb2RlbCBvZiB0aGUgY2xhc3MsIHRoZSBtZXRob2QsIHRoZSBwYXJhbWV0ZXIgb3IgdGhlIHByb3BlcnR5XG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NEZWNvcmF0b3JzKGU6IENsYXNzRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBmbXhTY29wZTogRmFtaXguQ2xhc3MgfCBGYW1peC5QYXJhbWV0cmljQ2xhc3MgfCBGYW1peC5NZXRob2QgfCBGYW1peC5BY2Nlc3NvciB8IEZhbWl4LlBhcmFtZXRlciB8IEZhbWl4LlByb3BlcnR5KTogdm9pZCB7XG4gICAgbG9nZ2VyLmRlYnVnKGBGaW5kaW5nIERlY29yYXRvcnM6YCk7XG4gICAgZS5nZXREZWNvcmF0b3JzKCkuZm9yRWFjaChkZWMgPT4ge1xuICAgICAgICBjb25zdCBmbXhEZWMgPSBwcm9jZXNzRGVjb3JhdG9yKGRlYywgZSk7XG4gICAgICAgIGZteFNjb3BlLmFkZERlY29yYXRvcihmbXhEZWMpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIEZhbWl4IG1vZGVsIGZvciBhIGRlY29yYXRvclxuICogQHBhcmFtIGQgQSBkZWNvcmF0b3JcbiAqIEBwYXJhbSBlIEEgY2xhc3MsIGEgbWV0aG9kLCBhIHBhcmFtZXRlciBvciBhIHByb3BlcnR5XG4gKiBAcmV0dXJucyBBIEZhbWl4LkRlY29yYXRvciByZXByZXNlbnRpbmcgdGhlIGRlY29yYXRvclxuICovXG5mdW5jdGlvbiBwcm9jZXNzRGVjb3JhdG9yKGQ6IERlY29yYXRvciwgZTogQ2xhc3NEZWNsYXJhdGlvbiB8IE1ldGhvZERlY2xhcmF0aW9uIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24pOiBGYW1peC5EZWNvcmF0b3Ige1xuICAgIGNvbnN0IGZteERlYyA9IGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peERlY29yYXRvcihkLCBlKTtcblxuICAgIGxvZ2dlci5kZWJ1ZyhgZGVjb3JhdG9yOiAke2QuZ2V0TmFtZSgpfSwgKCR7ZC5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGZxbiA9ICR7Zm14RGVjLmZ1bGx5UXVhbGlmaWVkTmFtZX1gKTtcblxuICAgIHByb2Nlc3NDb21tZW50cyhkLCBmbXhEZWMpO1xuXG4gICAgcmV0dXJuIGZteERlYztcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGNvbW1lbnRzXG4gKiBAcGFyYW0gZSBBIHRzLW1vcnBoIGVsZW1lbnRcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIG5hbWVkIGVudGl0eVxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29tbWVudHMoZTogU291cmNlRmlsZSB8IE1vZHVsZURlY2xhcmF0aW9uIHwgQ2xhc3NEZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kU2lnbmF0dXJlIHwgR2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgRnVuY3Rpb25FeHByZXNzaW9uIHwgUGFyYW1ldGVyRGVjbGFyYXRpb24gfCBWYXJpYWJsZURlY2xhcmF0aW9uIHwgUHJvcGVydHlEZWNsYXJhdGlvbiB8IFByb3BlcnR5U2lnbmF0dXJlIHwgRGVjb3JhdG9yIHwgRW51bURlY2xhcmF0aW9uIHwgRW51bU1lbWJlciB8IFR5cGVQYXJhbWV0ZXJEZWNsYXJhdGlvbiB8IFZhcmlhYmxlU3RhdGVtZW50IHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBBcnJvd0Z1bmN0aW9uLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiB2b2lkIHtcbiAgICBsb2dnZXIuZGVidWcoYFByb2Nlc3MgY29tbWVudHM6YCk7XG4gICAgZS5nZXRMZWFkaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgbGVhZGluZyBjb21tZW50cywgYWRkQ29tbWVudDogJyR7Yy5nZXRUZXh0KCl9J2ApO1xuICAgICAgICBmbXhTY29wZS5hZGRDb21tZW50KGZteENvbW1lbnQpOyAvLyByZWR1bmRhbnQsIGJ1dCBqdXN0IGluIGNhc2VcbiAgICB9KTtcbiAgICBlLmdldFRyYWlsaW5nQ29tbWVudFJhbmdlcygpLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IGZteENvbW1lbnQgPSBwcm9jZXNzQ29tbWVudChjLCBmbXhTY29wZSk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgdHJhaWxpbmcgY29tbWVudHMsIGFkZENvbW1lbnQ6ICcke2MuZ2V0VGV4dCgpfSdgKTtcbiAgICAgICAgZm14U2NvcGUuYWRkQ29tbWVudChmbXhDb21tZW50KTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYSBjb21tZW50XG4gKiBAcGFyYW0gYyBBIGNvbW1lbnRcbiAqIEBwYXJhbSBmbXhTY29wZSBUaGUgRmFtaXggbW9kZWwgb2YgdGhlIGNvbW1lbnQncyBjb250YWluZXJcbiAqIEByZXR1cm5zIEEgRmFtaXguQ29tbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NvbW1lbnQoYzogQ29tbWVudFJhbmdlLCBmbXhTY29wZTogRmFtaXguTmFtZWRFbnRpdHkpOiBGYW1peC5Db21tZW50IHtcbiAgICBjb25zdCBpc0pTRG9jID0gYy5nZXRUZXh0KCkuc3RhcnRzV2l0aChcIi8qKlwiKTtcbiAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NDb21tZW50OiBjb21tZW50OiAke2MuZ2V0VGV4dCgpfSwgaXNKU0RvYyA9ICR7aXNKU0RvY31gKTtcbiAgICBjb25zdCBmbXhDb21tZW50ID0gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbW1lbnQoYywgZm14U2NvcGUsIGlzSlNEb2MpO1xuXG4gICAgcmV0dXJuIGZteENvbW1lbnQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBhY2Nlc3NlcyBvbiB0aGUgcGFyYW1ldGVycywgdmFyaWFibGVzLCBwcm9wZXJ0aWVzIGFuZCBlbnVtIG1lbWJlcnMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuICogQHBhcmFtIGFjY2Vzc01hcCBBIG1hcCBvZiBwYXJhbWV0ZXJzLCB2YXJpYWJsZXMsIHByb3BlcnRpZXMgYW5kIGVudW0gbWVtYmVycyB3aXRoIHRoZWlyIGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQWNjZXNzZXMoYWNjZXNzTWFwOiBNYXA8RmFtaXhJRCwgQWNjZXNzaWJsZVRTTW9ycGhFbGVtZW50Pik6IHZvaWQge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYWNjZXNzZXM6YCk7XG4gICAgYWNjZXNzTWFwLmZvckVhY2goKHYsIGlkKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQWNjZXNzZXMgdG8gJHt2LmdldE5hbWUoKX1gKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgY29uc3QgdGVtcF9ub2RlcyA9IHYuZmluZFJlZmVyZW5jZXNBc05vZGVzKCkgYXMgQXJyYXk8SWRlbnRpZmllcj47XG4gICAgICAgIHRlbXBfbm9kZXMuZm9yRWFjaChub2RlID0+IHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobm9kZSwgaWQpKTtcbiAgICAgICAgLy8gfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uIFwiJHtlcnJvcn1cIi5cXG5Db250aW51aW5nLi4uYCk7XG4gICAgICAgIC8vIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gYWNjZXNzIG9uIGEgcGFyYW1ldGVyLCB2YXJpYWJsZSwgcHJvcGVydHkgb3IgZW51bSBtZW1iZXJcbiAqIEBwYXJhbSBuIEEgbm9kZVxuICogQHBhcmFtIGlkIEFuIGlkIG9mIGEgcGFyYW1ldGVyLCBhIHZhcmlhYmxlLCBhIHByb3BlcnR5IG9yIGFuIGVudW0gbWVtYmVyXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NOb2RlRm9yQWNjZXNzZXMobjogSWRlbnRpZmllciwgaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIHRyeSB7XG4gICAgLy8gc29tZXRpbWVzIG5vZGUncyBmaXJzdCBhbmNlc3RvciBpcyBhIFByb3BlcnR5RGVjbGFyYXRpb24sIHdoaWNoIGlzIG5vdCBhbiBhY2Nlc3NcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Z1aHJtYW5hdG9yL0ZhbWl4VHlwZVNjcmlwdEltcG9ydGVyL2lzc3Vlcy85XG4gICAgLy8gY2hlY2sgZm9yIGEgbm9kZSB3aG9zZSBmaXJzdCBhbmNlc3RvciBpcyBhIHByb3BlcnR5IGRlY2xhcmF0aW9uIGFuZCBiYWlsP1xuICAgIC8vIFRoaXMgbWF5IGJlIGEgYnVnIGluIHRzLW1vcnBoP1xuICAgIGlmIChuLmdldEZpcnN0QW5jZXN0b3JPclRocm93KCkuZ2V0S2luZE5hbWUoKSA9PT0gXCJQcm9wZXJ0eURlY2xhcmF0aW9uXCIpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBwcm9jZXNzTm9kZUZvckFjY2Vzc2VzOiBub2RlIGtpbmQ6ICR7bi5nZXRLaW5kTmFtZSgpfSwgJHtuLmdldFRleHQoKX0sICgke24uZ2V0VHlwZSgpLmdldFRleHQoKX0pJ3MgZmlyc3QgYW5jZXN0b3IgaXMgYSBQcm9wZXJ0eURlY2xhcmF0aW9uLiBTa2lwcGluZy4uLmApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhBY2Nlc3MobiwgaWQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc05vZGVGb3JBY2Nlc3Nlczogbm9kZSBraW5kOiAke24uZ2V0S2luZE5hbWUoKX0sICR7bi5nZXRUZXh0KCl9LCAoJHtuLmdldFR5cGUoKS5nZXRUZXh0KCl9KWApO1xuICAgIC8vIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gICAgIGxvZ2dlci5lcnJvcihgPiBHb3QgZXhjZXB0aW9uIFwiJHtlcnJvcn1cIi5cXG5TY29wZURlY2xhcmF0aW9uIGludmFsaWQgZm9yIFwiJHtuLmdldFN5bWJvbCgpLmZ1bGx5UXVhbGlmaWVkTmFtZX1cIi5cXG5Db250aW51aW5nLi4uYCk7XG4gICAgLy8gfVxufVxuXG5cbi8vIGV4cG9ydHMgaGFzIG5hbWUgLT4gRGVjbGFyYXRpb24gLS0gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIEZhbWl4RWxlbWVudFxuXG4vLyBoYW5kbGUgYGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIilgIGZvciBleGFtcGxlXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ltcG9ydENsYXVzZXNGb3JJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbnMoc291cmNlRmlsZXM6IEFycmF5PFNvdXJjZUZpbGU+LCBleHBvcnRzOiBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+Pik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbXBvcnQgY2xhdXNlcyBmcm9tIEltcG9ydEVxdWFsc0RlY2xhcmF0aW9ucyBpbiBzb3VyY2UgZmlsZXM6YCk7XG4gICAgc291cmNlRmlsZXMuZm9yRWFjaChzb3VyY2VGaWxlID0+IHtcbiAgICAgICAgc291cmNlRmlsZS5mb3JFYWNoRGVzY2VuZGFudChub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChOb2RlLmlzSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBZb3UndmUgZm91bmQgYW4gSW1wb3J0RXF1YWxzRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIkRlY2xhcmF0aW9uIE5hbWU6XCIsIG5vZGUuZ2V0TmFtZSgpKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcIk1vZHVsZSBSZWZlcmVuY2UgVGV4dDpcIiwgbm9kZS5nZXRNb2R1bGVSZWZlcmVuY2UoKS5nZXRUZXh0KCkpO1xuICAgICAgICAgICAgICAgIC8vIHdoYXQncyB0aGUgbmFtZSBvZiB0aGUgaW1wb3J0ZWQgZW50aXR5P1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGltcG9ydGVkRW50aXR5ID0gbm9kZS5nZXROYW1lKCk7XG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIGEgZmFtaXggaW1wb3J0IGNsYXVzZVxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVkSW1wb3J0ID0gbm9kZS5nZXROYW1lTm9kZSgpO1xuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkub2xkQ3JlYXRlT3JHZXRGYW1peEltcG9ydENsYXVzZSh7XG4gICAgICAgICAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9uOiBub2RlLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRlclNvdXJjZUZpbGU6IHNvdXJjZUZpbGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBub2RlLmdldE1vZHVsZVJlZmVyZW5jZSgpLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogbmFtZWRJbXBvcnQsXG4gICAgICAgICAgICAgICAgICAgIGlzSW5FeHBvcnRzOiBleHBvcnRzLmZpbmQoZSA9PiBlLmhhcyhuYW1lZEltcG9ydC5nZXRUZXh0KCkpKSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peEltcG9ydENsYXVzZShpbXBvcnRlZEVudGl0eSwgaW1wb3J0aW5nRW50aXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgICk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbXBvcnQgY2xhdXNlcyBvZiB0aGUgc291cmNlIGZpbGVzIHdoaWNoIGFyZSBtb2R1bGVzXG4gKiBAcGFyYW0gbW9kdWxlcyBBbiBhcnJheSBvZiBtb2R1bGVzXG4gKiBAcGFyYW0gZXhwb3J0cyBBbiBhcnJheSBvZiBtYXBzIG9mIGV4cG9ydGVkIGRlY2xhcmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ltcG9ydENsYXVzZXNGb3JNb2R1bGVzKG1vZHVsZXM6IEFycmF5PFNvdXJjZUZpbGU+LCBleHBvcnRzOiBBcnJheTxSZWFkb25seU1hcDxzdHJpbmcsIEV4cG9ydGVkRGVjbGFyYXRpb25zW10+Pik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbXBvcnQgY2xhdXNlcyBmcm9tICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZXM6YCk7XG4gICAgbW9kdWxlcy5mb3JFYWNoKG1vZHVsZSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZHVsZVBhdGggPSBtb2R1bGUuZ2V0RmlsZVBhdGgoKTtcbiAgICAgICAgbW9kdWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpLmZvckVhY2goaW1wRGVjbCA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XG4gICAgICAgICAgICBjb25zdCBwYXRoID0gZ2V0TW9kdWxlUGF0aChpbXBEZWNsKTtcblxuICAgICAgICAgICAgaW1wRGVjbC5nZXROYW1lZEltcG9ydHMoKS5mb3JFYWNoKG5hbWVkSW1wb3J0ID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgSW1wb3J0aW5nIChuYW1lZCkgJHtuYW1lZEltcG9ydC5nZXROYW1lKCl9IGZyb20gJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBvcnRlZEVudGl0eU5hbWUgPSBuYW1lZEltcG9ydC5nZXROYW1lKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0Rm91bmRJbkV4cG9ydHMgPSBpc0luRXhwb3J0cyhleHBvcnRzLCBpbXBvcnRlZEVudGl0eU5hbWUpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgUHJvY2Vzc2luZyBJbXBvcnRTcGVjaWZpZXI6ICR7bmFtZWRJbXBvcnQuZ2V0VGV4dCgpfSwgcG9zPSR7bmFtZWRJbXBvcnQuZ2V0U3RhcnQoKX1gKTtcbiAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5Lm9sZENyZWF0ZU9yR2V0RmFtaXhJbXBvcnRDbGF1c2Uoe1xuICAgICAgICAgICAgICAgICAgICBpbXBvcnREZWNsYXJhdGlvbjogaW1wRGVjbCxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0ZXJTb3VyY2VGaWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllckZpbGVQYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgICAgICBpbXBvcnRFbGVtZW50OiBuYW1lZEltcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGltcG9ydEZvdW5kSW5FeHBvcnRzLFxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdEltcG9ydCA9IGltcERlY2wuZ2V0RGVmYXVsdEltcG9ydCgpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRJbXBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgKGRlZmF1bHQpICR7ZGVmYXVsdEltcG9ydC5nZXRUZXh0KCl9IGZyb20gJHtpbXBEZWNsLmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCl9IGluICR7bW9kdWxlUGF0aH1gKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFByb2Nlc3NpbmcgRGVmYXVsdCBJbXBvcnQ6ICR7ZGVmYXVsdEltcG9ydC5nZXRUZXh0KCl9LCBwb3M9JHtkZWZhdWx0SW1wb3J0LmdldFN0YXJ0KCl9YCk7XG4gICAgICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5vbGRDcmVhdGVPckdldEZhbWl4SW1wb3J0Q2xhdXNlKHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IGltcERlY2wsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydGVyU291cmNlRmlsZTogbW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogZGVmYXVsdEltcG9ydCxcbiAgICAgICAgICAgICAgICAgICAgaXNJbkV4cG9ydHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc0RlZmF1bHRFeHBvcnQ6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0ID0gaW1wRGVjbC5nZXROYW1lc3BhY2VJbXBvcnQoKTtcbiAgICAgICAgICAgIGlmIChuYW1lc3BhY2VJbXBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBJbXBvcnRpbmcgKG5hbWVzcGFjZSkgJHtuYW1lc3BhY2VJbXBvcnQuZ2V0VGV4dCgpfSBmcm9tICR7aW1wRGVjbC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpfSBpbiAke21vZHVsZVBhdGh9YCk7XG4gICAgICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5vbGRDcmVhdGVPckdldEZhbWl4SW1wb3J0Q2xhdXNlKHtcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RGVjbGFyYXRpb246IGltcERlY2wsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydGVyU291cmNlRmlsZTogbW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJGaWxlUGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgaW1wb3J0RWxlbWVudDogbmFtZXNwYWNlSW1wb3J0LFxuICAgICAgICAgICAgICAgICAgICBpc0luRXhwb3J0czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdEV4cG9ydDogZmFsc2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzSW5FeHBvcnRzKGV4cG9ydHM6IFJlYWRvbmx5TWFwPHN0cmluZywgRXhwb3J0ZWREZWNsYXJhdGlvbnNbXT5bXSwgaW1wb3J0ZWRFbnRpdHlOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgaW1wb3J0Rm91bmRJbkV4cG9ydHMgPSBmYWxzZTtcbiAgICBleHBvcnRzLmZvckVhY2goZSA9PiB7XG4gICAgICAgIGlmIChlLmhhcyhpbXBvcnRlZEVudGl0eU5hbWUpKSB7XG4gICAgICAgICAgICBpbXBvcnRGb3VuZEluRXhwb3J0cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW1wb3J0Rm91bmRJbkV4cG9ydHM7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgRmFtaXggbW9kZWwgZm9yIHRoZSBpbmhlcml0YW5jZXMgb2YgdGhlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuICogQHBhcmFtIGNsYXNzZXMgQW4gYXJyYXkgb2YgY2xhc3Nlc1xuICogQHBhcmFtIGludGVyZmFjZXMgQW4gYXJyYXkgb2YgaW50ZXJmYWNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0luaGVyaXRhbmNlcyhjbGFzc2VzOiBDbGFzc0RlY2xhcmF0aW9uW10sIGludGVyZmFjZXM6IEludGVyZmFjZURlY2xhcmF0aW9uW10pOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhgQ3JlYXRpbmcgaW5oZXJpdGFuY2VzOmApO1xuICAgIGNsYXNzZXMuZm9yRWFjaChjbHMgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGNsYXNzIGluaGVyaXRhbmNlIGZvciAke2Nscy5nZXROYW1lKCl9YCk7XG4gICAgICAgICAgICBjb25zdCBiYXNlQ2xhc3MgPSBjbHMuZ2V0QmFzZUNsYXNzKCk7XG4gICAgICAgICAgICBpZiAoYmFzZUNsYXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhJbmhlcml0YW5jZShjbHMsIGJhc2VDbGFzcyk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBjbGFzczogJHtjbHMuZ2V0TmFtZSgpfSwgKCR7Y2xzLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgZXh0Q2xhc3M6ICR7YmFzZUNsYXNzLmdldE5hbWUoKX0sICgke2Jhc2VDbGFzcy5nZXRUeXBlKCkuZ2V0VGV4dCgpfSlgKTtcbiAgICAgICAgICAgIH0gLy8gdGhpcyBpcyBmYWxzZSB3aGVuIHRoZSBjbGFzcyBleHRlbmRzIGFuIHVuZGVmaW5lZCBjbGFzc1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIFwiZXh0ZW5kc1wiIG9mIHVucmVzb2x2ZWQgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCB1bmRlZmluZWRFeHRlbmRlZENsYXNzID0gY2xzLmdldEV4dGVuZHMoKTtcbiAgICAgICAgICAgICAgICBpZiAodW5kZWZpbmVkRXh0ZW5kZWRDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZU9yR2V0RmFtaXhJbmhlcml0YW5jZShjbHMsIHVuZGVmaW5lZEV4dGVuZGVkQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYGNsYXNzOiAke2Nscy5nZXROYW1lKCl9LCAoJHtjbHMuZ2V0VHlwZSgpLmdldFRleHQoKX0pLCB1bmRlZmluZWRFeHRlbmRlZENsYXNzOiAke3VuZGVmaW5lZEV4dGVuZGVkQ2xhc3MuZ2V0VGV4dCgpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBDaGVja2luZyBpbnRlcmZhY2UgaW5oZXJpdGFuY2UgZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGVkSW50ZXJmYWNlcyA9IGdldEltcGxlbWVudGVkT3JFeHRlbmRlZEludGVyZmFjZXMoaW50ZXJmYWNlcywgY2xzKTtcbiAgICAgICAgICAgIGltcGxlbWVudGVkSW50ZXJmYWNlcy5mb3JFYWNoKGltcGxlbWVudGVkSUYgPT4ge1xuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGNscywgaW1wbGVtZW50ZWRJRik7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBjbGFzczogJHtjbHMuZ2V0TmFtZSgpfSwgKCR7Y2xzLmdldFR5cGUoKS5nZXRUZXh0KCl9KSwgaW1wSW50ZXI6ICR7KGltcGxlbWVudGVkSUYgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBpbXBsZW1lbnRlZElGLmdldE5hbWUoKSA6IGltcGxlbWVudGVkSUYuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0sICgkeyhpbXBsZW1lbnRlZElGIGluc3RhbmNlb2YgSW50ZXJmYWNlRGVjbGFyYXRpb24pID8gaW1wbGVtZW50ZWRJRi5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogaW1wbGVtZW50ZWRJRi5nZXRFeHByZXNzaW9uKCkuZ2V0VGV4dCgpfSlgKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaW50ZXJmYWNlcy5mb3JFYWNoKGludGVyRmFjZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYENoZWNraW5nIGludGVyZmFjZSBpbmhlcml0YW5jZSBmb3IgJHtpbnRlckZhY2UuZ2V0TmFtZSgpfWApO1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5kZWRJbnRlcmZhY2VzID0gZ2V0SW1wbGVtZW50ZWRPckV4dGVuZGVkSW50ZXJmYWNlcyhpbnRlcmZhY2VzLCBpbnRlckZhY2UpO1xuICAgICAgICAgICAgZXh0ZW5kZWRJbnRlcmZhY2VzLmZvckVhY2goZXh0ZW5kZWRJbnRlcmZhY2UgPT4ge1xuICAgICAgICAgICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlT3JHZXRGYW1peEluaGVyaXRhbmNlKGludGVyRmFjZSwgZXh0ZW5kZWRJbnRlcmZhY2UpO1xuXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBpbnRlckZhY2U6ICR7aW50ZXJGYWNlLmdldE5hbWUoKX0sICgke2ludGVyRmFjZS5nZXRUeXBlKCkuZ2V0VGV4dCgpfSksIGV4dGVuZGVkSW50ZXJmYWNlOiAkeyhleHRlbmRlZEludGVyZmFjZSBpbnN0YW5jZW9mIEludGVyZmFjZURlY2xhcmF0aW9uKSA/IGV4dGVuZGVkSW50ZXJmYWNlLmdldE5hbWUoKSA6IGV4dGVuZGVkSW50ZXJmYWNlLmdldEV4cHJlc3Npb24oKS5nZXRUZXh0KCl9LCAoJHsoZXh0ZW5kZWRJbnRlcmZhY2UgaW5zdGFuY2VvZiBJbnRlcmZhY2VEZWNsYXJhdGlvbikgPyBleHRlbmRlZEludGVyZmFjZS5nZXRUeXBlKCkuZ2V0VGV4dCgpIDogZXh0ZW5kZWRJbnRlcmZhY2UuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKX0pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgPiBXQVJOSU5HOiBnb3QgZXhjZXB0aW9uICR7ZXJyb3J9LiBDb250aW51aW5nLi4uYCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGludm9jYXRpb25zIG9mIHRoZSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgb2YgdGhlIHNvdXJjZSBmaWxlc1xuICogQHBhcmFtIG1ldGhvZHNBbmRGdW5jdGlvbnNXaXRoSWQgQSBtYXAgb2YgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIHdpdGggdGhlaXIgaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NJbnZvY2F0aW9ucyhtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkOiBNYXA8bnVtYmVyLCBJbnZvY2FibGVUeXBlPik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBDcmVhdGluZyBpbnZvY2F0aW9uczpgKTtcbiAgICBtZXRob2RzQW5kRnVuY3Rpb25zV2l0aElkLmZvckVhY2goKGludm9jYWJsZSwgaWQpID0+IHtcbiAgICAgICAgaWYgKCEoaW52b2NhYmxlIGluc3RhbmNlb2YgQXJyb3dGdW5jdGlvbikpIHsgIC8vIEFycm93RnVuY3Rpb25zIGFyZSBub3QgZGlyZWN0bHkgaW52b2tlZFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBJbnZvY2F0aW9ucyB0byAkeyhpbnZvY2FibGUgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbiB8fCBpbnZvY2FibGUgaW5zdGFuY2VvZiBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHx8IGludm9jYWJsZSBpbnN0YW5jZW9mIFNldEFjY2Vzc29yRGVjbGFyYXRpb24gfHwgaW52b2NhYmxlIGluc3RhbmNlb2YgRnVuY3Rpb25EZWNsYXJhdGlvbikgPyBpbnZvY2FibGUuZ2V0TmFtZSgpIDogKChpbnZvY2FibGUgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKSA/ICdjb25zdHJ1Y3RvcicgOiAoaW52b2NhYmxlLmdldE5hbWUoKSA/IGludm9jYWJsZS5nZXROYW1lKCkgOiAnYW5vbnltb3VzJykpfSAoJHtpbnZvY2FibGUuZ2V0VHlwZSgpLmdldFRleHQoKX0pYCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzUmVmZXJlbmNpbmdJbnZvY2FibGUgPSBpbnZvY2FibGUuZmluZFJlZmVyZW5jZXNBc05vZGVzKCkgYXMgQXJyYXk8SWRlbnRpZmllcj47XG4gICAgICAgICAgICAgICAgbm9kZXNSZWZlcmVuY2luZ0ludm9jYWJsZS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICBub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUgPT4gcHJvY2Vzc05vZGVGb3JJbnZvY2F0aW9ucyhub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIENvbnRpbnVpbmcuLi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2tpcHBpbmcgaW52b2NhdGlvbiB0byBBcnJvd0Z1bmN0aW9uOiAkeyhpbnZvY2FibGUuZ2V0Qm9keVRleHQoKSl9YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgYW4gaW52b2NhdGlvbiBvZiBhIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gbm9kZVJlZmVyZW5jaW5nSW52b2NhYmxlIEEgbm9kZVxuICogQHBhcmFtIGludm9jYWJsZSBBIG1ldGhvZCBvciBhIGZ1bmN0aW9uXG4gKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBtZXRob2Qgb3IgdGhlIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NOb2RlRm9ySW52b2NhdGlvbnMobm9kZVJlZmVyZW5jaW5nSW52b2NhYmxlOiBJZGVudGlmaWVyLCBpbnZvY2FibGU6IEludm9jYWJsZVR5cGUsIGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgICBlbnRpdHlEaWN0aW9uYXJ5LmNyZWF0ZUZhbWl4SW52b2NhdGlvbihub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUsIGludm9jYWJsZSwgaWQpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYG5vZGU6ICR7bm9kZVJlZmVyZW5jaW5nSW52b2NhYmxlLmdldEtpbmROYW1lKCl9LCAoJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0VHlwZSgpLmdldFRleHQoKX0pYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGA+IFdBUk5JTkc6IGdvdCBleGNlcHRpb24gJHtlcnJvcn0uIFNjb3BlRGVjbGFyYXRpb24gaW52YWxpZCBmb3IgJHtub2RlUmVmZXJlbmNpbmdJbnZvY2FibGUuZ2V0U3ltYm9sKCkhLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpfS4gQ29udGludWluZy4uLmApO1xuICAgIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBGYW1peCBtb2RlbCBmb3IgdGhlIGluaGVyaXRhbmNlcyBvZiB0aGUgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBvZiB0aGUgc291cmNlIGZpbGVzXG4gKiBAcGFyYW0gY2xhc3NlcyBBbiBhcnJheSBvZiBjbGFzc2VzXG4gKiBAcGFyYW0gaW50ZXJmYWNlcyBBbiBhcnJheSBvZiBpbnRlcmZhY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzQ29uY3JldGlzYXRpb25zKGNsYXNzZXM6IENsYXNzRGVjbGFyYXRpb25bXSwgaW50ZXJmYWNlczogSW50ZXJmYWNlRGVjbGFyYXRpb25bXSwgZnVuY3Rpb25zOiBNYXA8bnVtYmVyLCBNZXRob2REZWNsYXJhdGlvbiB8IENvbnN0cnVjdG9yRGVjbGFyYXRpb24gfCBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbiB8IEZ1bmN0aW9uRGVjbGFyYXRpb24gfCBGdW5jdGlvbkV4cHJlc3Npb24gfCBBcnJvd0Z1bmN0aW9uPik6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKGBwcm9jZXNzQ29uY3JldGlzYXRpb25zOiBDcmVhdGluZyBjb25jcmV0aXNhdGlvbnM6YCk7XG4gICAgY2xhc3Nlcy5mb3JFYWNoKGNscyA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgcHJvY2Vzc0NvbmNyZXRpc2F0aW9uczogQ2hlY2tpbmcgY2xhc3MgY29uY3JldGlzYXRpb24gZm9yICR7Y2xzLmdldE5hbWUoKX1gKTtcbiAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uQ2xhc3NPckludGVyZmFjZVNwZWNpYWxpc2F0aW9uKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkdlbmVyaWNJbnN0YW50aWF0aW9uKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvbkludGVyZmFjZUNsYXNzKGNscyk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGNscyk7XG5cbiAgICB9KTtcbiAgICBpbnRlcmZhY2VzLmZvckVhY2goaW50ZXIgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NDb25jcmV0aXNhdGlvbnM6IENoZWNraW5nIGludGVyZmFjZSBjb25jcmV0aXNhdGlvbiBmb3IgJHtpbnRlci5nZXROYW1lKCl9YCk7XG4gICAgICAgIGVudGl0eURpY3Rpb25hcnkuY3JlYXRlRmFtaXhDb25jcmV0aXNhdGlvblR5cGVJbnN0YW5jaWF0aW9uKGludGVyKTtcbiAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uQ2xhc3NPckludGVyZmFjZVNwZWNpYWxpc2F0aW9uKGludGVyKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbnMuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgaWYoZnVuYyBpbnN0YW5jZW9mIEZ1bmN0aW9uRGVjbGFyYXRpb24gfHwgZnVuYyBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uICl7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYHByb2Nlc3NDb25jcmV0aXNhdGlvbnM6IENoZWNraW5nIE1ldGhvZCBjb25jcmV0aXNhdGlvbmApO1xuICAgICAgICAgICAgZW50aXR5RGljdGlvbmFyeS5jcmVhdGVGYW1peENvbmNyZXRpc2F0aW9uRnVuY3Rpb25JbnN0YW50aWF0aW9uKGZ1bmMpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0=