ng-pli-commons 1.0.6 → 1.0.7-dev.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 (250) hide show
  1. package/README.md +24 -24
  2. package/fesm2022/ng-pli-commons.mjs +2681 -2064
  3. package/fesm2022/ng-pli-commons.mjs.map +1 -1
  4. package/lib/components/backoffice.commons.component.d.ts +1 -1
  5. package/lib/components/common.lists.component.d.ts +0 -1
  6. package/lib/components/configuration.commons.component.d.ts +1 -1
  7. package/lib/components/pdf-generator/pdf-generator.component.d.ts +3 -16
  8. package/lib/components/pdf-visualizer/pdf-visualizer.component.d.ts +2 -0
  9. package/lib/components/token/token.component.d.ts +7 -2
  10. package/lib/ng-pli-commons.module.d.ts +12 -13
  11. package/lib/services/application-pdf-form.service.d.ts +14 -0
  12. package/lib/services/application.service.d.ts +3 -1
  13. package/lib/services/assign-task.service.d.ts +16 -0
  14. package/lib/services/budget-setup.service.d.ts +12 -0
  15. package/lib/services/budget-simulation.service.d.ts +2 -0
  16. package/lib/services/codebtors.service.d.ts +14 -0
  17. package/lib/services/committee-assistant.service.d.ts +19 -0
  18. package/lib/services/common.service.d.ts +1 -7
  19. package/lib/services/correspondence-manager.service.d.ts +1 -0
  20. package/lib/services/document-process.service.d.ts +12 -0
  21. package/lib/services/document.service.d.ts +5 -4
  22. package/lib/services/guarantees-summary-service.d.ts +13 -0
  23. package/lib/services/import-excel-gic.service.d.ts +2 -0
  24. package/lib/services/maintenance.service.d.ts +4 -0
  25. package/lib/services/master-university.service.d.ts +7 -0
  26. package/lib/services/openkm-document.service.d.ts +11 -0
  27. package/lib/services/pli-cnf-committee.service.d.ts +2 -0
  28. package/lib/services/pli-cnf-evaluation-task-template.service.d.ts +20 -0
  29. package/lib/services/post-selection.service.d.ts +11 -0
  30. package/lib/services/registry-identifier.service.d.ts +2 -1
  31. package/lib/services/send-application.service.d.ts +2 -2
  32. package/lib/services/status.service.d.ts +1 -0
  33. package/lib/services/tag-management.service.d.ts +23 -0
  34. package/lib/services/token.service.d.ts +2 -0
  35. package/lib/services/visualization-committee.service.d.ts +5 -4
  36. package/package.json +3 -6
  37. package/public-api.d.ts +11 -0
  38. package/version.d.ts +1 -1
  39. package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
  40. package/esm2022/lib/components/common.lists.component.mjs +0 -194
  41. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
  42. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  43. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  44. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  45. package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
  46. package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
  47. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  48. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  49. package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -86
  50. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  51. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
  52. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  53. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  54. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  55. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  56. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  57. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  58. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  59. package/esm2022/lib/components/token/token.component.mjs +0 -1026
  60. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  61. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
  62. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
  63. package/esm2022/lib/ng-pli-commons.module.mjs +0 -387
  64. package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
  65. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  66. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
  67. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
  68. package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
  69. package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
  70. package/esm2022/lib/services/application-tag.service.mjs +0 -56
  71. package/esm2022/lib/services/application.service.mjs +0 -247
  72. package/esm2022/lib/services/authentication.service.mjs +0 -133
  73. package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
  74. package/esm2022/lib/services/budget-application.service.mjs +0 -265
  75. package/esm2022/lib/services/budget-simulation.service.mjs +0 -61
  76. package/esm2022/lib/services/budget.service.mjs +0 -205
  77. package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
  78. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
  79. package/esm2022/lib/services/committee-money.service.mjs +0 -44
  80. package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
  81. package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
  82. package/esm2022/lib/services/common-info.service.mjs +0 -51
  83. package/esm2022/lib/services/common.service.mjs +0 -291
  84. package/esm2022/lib/services/configuration-document.service.mjs +0 -297
  85. package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
  86. package/esm2022/lib/services/configuration.service.mjs +0 -53
  87. package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
  88. package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
  89. package/esm2022/lib/services/credit-score.service.mjs +0 -48
  90. package/esm2022/lib/services/credit-study.service.mjs +0 -292
  91. package/esm2022/lib/services/cube.service.mjs +0 -27
  92. package/esm2022/lib/services/data-form-history.service.mjs +0 -25
  93. package/esm2022/lib/services/data-form.service.mjs +0 -176
  94. package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
  95. package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
  96. package/esm2022/lib/services/document-history.service.mjs +0 -43
  97. package/esm2022/lib/services/document-management.service.mjs +0 -57
  98. package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
  99. package/esm2022/lib/services/document.service.mjs +0 -131
  100. package/esm2022/lib/services/documentary.type.service.mjs +0 -69
  101. package/esm2022/lib/services/email.service.mjs +0 -30
  102. package/esm2022/lib/services/evaluation.service.mjs +0 -181
  103. package/esm2022/lib/services/export-excel.service.mjs +0 -32
  104. package/esm2022/lib/services/file.service.mjs +0 -153
  105. package/esm2022/lib/services/form.service.mjs +0 -112
  106. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
  107. package/esm2022/lib/services/gic-client.service.mjs +0 -49
  108. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
  109. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
  110. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
  111. package/esm2022/lib/services/gic-collection.service.mjs +0 -53
  112. package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
  113. package/esm2022/lib/services/gic-extract.service.mjs +0 -41
  114. package/esm2022/lib/services/gic-log.service.mjs +0 -41
  115. package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
  116. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
  117. package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
  118. package/esm2022/lib/services/gic-trm.service.mjs +0 -27
  119. package/esm2022/lib/services/global.show.task.service.mjs +0 -37
  120. package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
  121. package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
  122. package/esm2022/lib/services/guarantee.service.mjs +0 -128
  123. package/esm2022/lib/services/hash.service.mjs +0 -36
  124. package/esm2022/lib/services/import-data.service.mjs +0 -27
  125. package/esm2022/lib/services/import-excel-gic.service.mjs +0 -45
  126. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
  127. package/esm2022/lib/services/initial-record.service.mjs +0 -51
  128. package/esm2022/lib/services/integration-ado.service.mjs +0 -54
  129. package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
  130. package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
  131. package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
  132. package/esm2022/lib/services/legalization.service.mjs +0 -150
  133. package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
  134. package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
  135. package/esm2022/lib/services/log.service.mjs +0 -41
  136. package/esm2022/lib/services/maintenance.service.mjs +0 -66
  137. package/esm2022/lib/services/master-category.service.mjs +0 -66
  138. package/esm2022/lib/services/master-program.service.mjs +0 -78
  139. package/esm2022/lib/services/master-university.service.mjs +0 -68
  140. package/esm2022/lib/services/migration-plis.service.mjs +0 -27
  141. package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
  142. package/esm2022/lib/services/page.service.mjs +0 -38
  143. package/esm2022/lib/services/partner-system.service.mjs +0 -30
  144. package/esm2022/lib/services/partner.service.mjs +0 -34
  145. package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
  146. package/esm2022/lib/services/people-master.service.mjs +0 -42
  147. package/esm2022/lib/services/permission.service.mjs +0 -29
  148. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
  149. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
  150. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
  151. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
  152. package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
  153. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
  154. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
  155. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
  156. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
  157. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
  158. package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -51
  159. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
  160. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
  161. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
  162. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
  163. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
  164. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  165. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
  166. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
  167. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
  168. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
  169. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
  170. package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
  171. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
  172. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
  173. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
  174. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
  175. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
  176. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
  177. package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
  178. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
  179. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
  180. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
  181. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
  182. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
  183. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
  184. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
  185. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
  186. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
  187. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
  188. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
  189. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
  190. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
  191. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
  192. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
  193. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
  194. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
  195. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
  196. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
  197. package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
  198. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
  199. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
  200. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
  201. package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
  202. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
  203. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
  204. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
  205. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
  206. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
  207. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
  208. package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
  209. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
  210. package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
  211. package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
  212. package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
  213. package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
  214. package/esm2022/lib/services/pli-tag.service.mjs +0 -55
  215. package/esm2022/lib/services/pli-user.service.mjs +0 -51
  216. package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
  217. package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
  218. package/esm2022/lib/services/ppp.service.mjs +0 -360
  219. package/esm2022/lib/services/profile.service.mjs +0 -60
  220. package/esm2022/lib/services/progress-bar.service.mjs +0 -40
  221. package/esm2022/lib/services/promotion-score.service.mjs +0 -44
  222. package/esm2022/lib/services/registry-identifier.service.mjs +0 -39
  223. package/esm2022/lib/services/return-refund.service.mjs +0 -53
  224. package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
  225. package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -94
  226. package/esm2022/lib/services/segmentation.service.mjs +0 -31
  227. package/esm2022/lib/services/send-application.service.mjs +0 -492
  228. package/esm2022/lib/services/sesion-form.service.mjs +0 -31
  229. package/esm2022/lib/services/sesion.service.mjs +0 -48
  230. package/esm2022/lib/services/spinner.service.mjs +0 -16
  231. package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
  232. package/esm2022/lib/services/status.service.mjs +0 -100
  233. package/esm2022/lib/services/summary-budget.service.mjs +0 -24
  234. package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
  235. package/esm2022/lib/services/survey-queue.service.mjs +0 -24
  236. package/esm2022/lib/services/survey.service.mjs +0 -52
  237. package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
  238. package/esm2022/lib/services/token-transformation.service.mjs +0 -62
  239. package/esm2022/lib/services/token.service.mjs +0 -1358
  240. package/esm2022/lib/services/university.service.mjs +0 -50
  241. package/esm2022/lib/services/upload-documents.service.mjs +0 -60
  242. package/esm2022/lib/services/user.service.mjs +0 -28
  243. package/esm2022/lib/services/visualization-committee.service.mjs +0 -84
  244. package/esm2022/lib/utils/custom-validator.mjs +0 -95
  245. package/esm2022/lib/utils/form-util.mjs +0 -35
  246. package/esm2022/lib/utils/formio-util.mjs +0 -582
  247. package/esm2022/lib/utils/version-commons.mjs +0 -10
  248. package/esm2022/ng-pli-commons.mjs +0 -5
  249. package/esm2022/public-api.mjs +0 -215
  250. package/esm2022/version.mjs +0 -29
@@ -1,1358 +0,0 @@
1
- import { HttpParams } from '@angular/common/http';
2
- import { Inject, Injectable, LOCALE_ID } from '@angular/core';
3
- import { DateUtil, HEADER_JSON, UtilString } from 'ng-pli-util';
4
- import { FormioUtil } from '../utils/formio-util';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common/http";
7
- import * as i2 from "./form.service";
8
- import * as i3 from "@angular/common";
9
- export class TokenService {
10
- /** */
11
- static { this.SIGN_LETTER_TAG_ID = '_sign-letter-tag-id'; }
12
- /** */
13
- static { this.TOKEN_LABEL_FORM = 'Frm'; }
14
- /** */
15
- static { this.TOKEN_LABEL_BUDGET = 'Presupuesto'; }
16
- /** */
17
- static { this.TOKEN_LABEL_CALCULATED = 'Calculado'; }
18
- /** */
19
- static { this.TOKEN_LABEL_SNAPSHOT = 'Snapshot'; }
20
- /** */
21
- static { this.TOKEN_LABEL_STATIC = 'Estático'; }
22
- /** */
23
- static { this.TOKEN_LABEL_DOCUMENTO = 'Documento'; }
24
- /** */
25
- static { this.TOKEN_LABEL_DOCUMENTO_ANALISIS_AUTOMATICO = 'Análisis automático de documentos'; }
26
- /** */
27
- static { this.TOKEN_DOCUMENTO_ANALYSIS_TYPE = 'document_analysis'; }
28
- /** */
29
- static { this.TOKEN_LABEL_TASK = 'Tarea'; }
30
- /** */
31
- static { this.TOKEN_LABEL_TASKL = 'task'; }
32
- /** */
33
- static { this.TOKEN_LABEL_GUARANTEE = 'Garantia'; }
34
- /** */
35
- static { this.BUDGET_TOKENS_KEY_TOTAL_AMOUNT = 'totalAmount'; }
36
- /** */
37
- static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_AMOUNT = 'applicationTotal'; }
38
- /** */
39
- static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_OWN_FOUNDS = 'applicationOwnFounds'; }
40
- /** */
41
- static { this.BUDGET_TOKENS_KEY_APPLICATION_PROCESS_TOTAL_FINANCING = 'applicationFinancing'; }
42
- /** */
43
- static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_AMOUNT = 'legalizationTotal'; }
44
- /** */
45
- static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_OWN_FOUNDS = 'legalizationOwnFounds'; }
46
- /** */
47
- static { this.BUDGET_TOKENS_KEY_LEGALIZATION_PROCESS_TOTAL_FINANCING = 'legalizationFinancing'; }
48
- /** */
49
- static { this.BUDGET_TOKENS_KEY_INSURANCE_AMOUNT = 'insuranceAmount'; }
50
- /** */
51
- static { this.LEGALIZATION_OR_APPLICATION_TOTAL_FINANCING = 'leglizationOrApplicationTotalFinancing'; }
52
- /** */
53
- static { this.BUDGET_TOKENS_KEY_RESUME_CATEGORY_YEAR = 'resumeCategoryYear'; }
54
- /** */
55
- static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_START = 'fechaInicioFinanciacion'; }
56
- /** */
57
- static { this.BUDGET_TOKENS_KEY_FECHA_FINANCING_END = 'fechaFinFinanciacion'; }
58
- /** */
59
- static { this.BUDGET_TOKENS_DURATION_STUDIES = 'duracionEstudios'; }
60
- /** */
61
- static { this.BUDGET_TOKENS_FINANCING_DURATION = 'duracionFinanciacion'; }
62
- /** */
63
- static { this.STATIC_TOKENS_KEY_CODIGO_VERIFICACION = 'codigoVerificacion'; }
64
- /** */
65
- static { this.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO = 'aQuienVaDirigido'; }
66
- /** */
67
- static { this.STATIC_TOKENS_KEY_FECHA_ACTUAL = 'fechaActual'; }
68
- /** */
69
- static { this.STATIC_TOKENS_KEY_STATUS_NAME = 'statusName'; }
70
- /** */
71
- static { this.STATIC_TOKENS_KEY_PATROCINADOR = 'pliPatrocinador'; }
72
- /** */
73
- static { this.STATIC_TOKENS_KEY_PATROCINADOR_CORTO = 'pliPatrocinadorCorto'; }
74
- /** */
75
- static { this.STATIC_TOKENS_KEY_PROGRAMA = 'pliPrograma'; }
76
- /** */
77
- static { this.STATIC_TOKENS_KEY_PROGRAMA_CORTO = 'pliProgramaCorto'; }
78
- /** */
79
- static { this.STATIC_TOKENS_KEY_PROMOCION = 'pliPromocion'; }
80
- /** */
81
- static { this.STATIC_TOKENS_KEY_PROMOCION_CORTO = 'pliPromocionCorto'; }
82
- /** */
83
- static { this.STATIC_TOKENS_KEY_ANIO_PROMOCION = 'anioPromocion'; }
84
- /** */
85
- static { this.STATIC_TOKENS_KEY_ISO_MONEDA_BASE = 'isoMonedaBase'; }
86
- /** */
87
- static { this.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO = 'saludoComplementario'; }
88
- /** */
89
- static { this.STATIC_TOKENS_KEY_NUMBER_APPLICATION = 'numeroRadicado'; }
90
- /** */
91
- static { this.STATIC_TOKENS_KEY_USER_INITIALS = 'inicialesUsuario'; }
92
- /** */
93
- static { this.STATIC_TOKENS_KEY_LETTER_SIGN = 'firmaCarta'; }
94
- /** */
95
- static { this.STATIC_TOKENS_COMMITTEE_NAME = 'comiteNombre'; }
96
- /** */
97
- static { this.STATIC_TOKENS_COMMITTEE_SEGMENTATION = 'comiteSegmentacion'; }
98
- /** */
99
- static { this.STATIC_TOKENS_COMMITTEE_AGGRUPATION = 'comiteAgrupacion'; }
100
- /** */
101
- static { this.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE = 'comiteFechaLinea'; }
102
- /** */
103
- static { this.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT = 'confirmacionCita'; }
104
- /** */
105
- static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER = 'numeroDocumentoCodeudor'; }
106
- /** */
107
- static { this.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE = 'tipoDocumentoCodeudor'; }
108
- /** */
109
- static { this.STATIC_TOKENS_CODEBTOR_NAME = 'nombresCodeudor'; }
110
- /** */
111
- static { this.STATIC_TOKENS_CODEBTOR_LASTNAME = 'apellidosCodeudor'; }
112
- /** */
113
- static { this.STATIC_TOKENS_TYPE_CODEBTOR = 'tipoPersonaCodeudor'; }
114
- /** */
115
- static { this.STATIC_TOKENS_CODEBTOR_REVIEWER = 'revisorCodeudores'; }
116
- /** */
117
- static { this.STATIC_TOKENS_TOTAL_WEIGHTED = 'ponderadoTotal'; }
118
- /** */
119
- static { this.STATIC_TOKENS_CONSECUTIVE_GUARANTEE = 'consecutivoGarantias'; }
120
- /** */
121
- static { this.STATIC_TOKENS_DAY = 'dia'; }
122
- /** */
123
- static { this.STATIC_TOKENS_MONTH = 'mes'; }
124
- /** */
125
- static { this.STATIC_TOKENS_YEAR = 'ano'; }
126
- /** */
127
- static { this.STATIC_TOKENS_REPRESENTATIVE_NAME = 'nombresRepresentante'; }
128
- /** */
129
- static { this.STATIC_TOKENS_REPRESENTATIVE_LASTNAME = 'apellidosRepresentante'; }
130
- /** */
131
- static { this.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER = 'cedulaRepresentante'; }
132
- /** */
133
- static { this.STATIC_TOKENS_CITY_SIGNATURE = 'ciudadFirma'; }
134
- /** */
135
- static { this.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY = 'tipoUsuarioEstudioCredito'; }
136
- /** */
137
- static { this.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY = 'cantidadVehiculosCodeudor'; }
138
- /** */
139
- static { this.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY = 'cantidadBienesCodeudor'; }
140
- /** */
141
- static { this.STATIC_TOKENS_LIST_CODEBTORS = 'listaCodeudores'; }
142
- /** */
143
- static { this.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA = 'ingresoCodeudorHabeasData'; }
144
- /** */
145
- static { this.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR = 'pdfResumenCodeudor'; }
146
- /** */
147
- static { this.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY = 'cantidadVehiculosSeleccionado'; }
148
- /** */
149
- static { this.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY = 'cantidadBienesSeleccionado'; }
150
- /** */
151
- static { this.STATIC_TOKENS_BEN_CODIGO = 'benCodigo'; }
152
- /** */
153
- static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR = 'creditReviewerObservationsCodebtor'; }
154
- /** */
155
- static { this.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS = 'creditReviewerObservations'; }
156
- static { this.STATIC_TOKEN_TAG_NAME = 'tagName'; }
157
- static { this.STATIC_TOKEN_NAME_REVIEWER_TASK = 'nameReviwerTask'; }
158
- static { this.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK = 'lastNameReviwerTask'; }
159
- static { this.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER = 'taskTotalAssignedToReviewer'; }
160
- static { this.STATIC_TOKEN_SURNAME = 'surname'; }
161
- static { this.STATIC_TOKENS = [
162
- {
163
- key: TokenService.STATIC_TOKENS_KEY_PATROCINADOR,
164
- label: 'Patrocinador'
165
- },
166
- {
167
- key: TokenService.STATIC_TOKENS_KEY_PROGRAMA,
168
- label: 'Programa'
169
- },
170
- {
171
- key: TokenService.STATIC_TOKENS_KEY_PROMOCION,
172
- label: 'Promoción'
173
- },
174
- {
175
- key: TokenService.STATIC_TOKENS_KEY_ANIO_PROMOCION,
176
- label: 'Año promoción'
177
- },
178
- {
179
- key: TokenService.STATIC_TOKENS_KEY_ISO_MONEDA_BASE,
180
- label: 'ISO Moneda base'
181
- },
182
- {
183
- key: TokenService.STATIC_TOKENS_KEY_SALUDO_COMPLEMENTARIO,
184
- label: 'Saludo complementario'
185
- },
186
- {
187
- key: TokenService.STATIC_TOKENS_KEY_CODIGO_VERIFICACION,
188
- label: 'Código de verificación'
189
- },
190
- {
191
- key: TokenService.STATIC_TOKENS_KEY_A_QUIEN_VA_DIRIGIDO,
192
- label: 'A quien va dirigido'
193
- },
194
- {
195
- key: TokenService.STATIC_TOKENS_KEY_FECHA_ACTUAL,
196
- label: 'Fecha actual'
197
- },
198
- {
199
- key: TokenService.STATIC_TOKENS_KEY_STATUS_NAME,
200
- label: 'Estado actual'
201
- },
202
- {
203
- key: TokenService.STATIC_TOKENS_KEY_NUMBER_APPLICATION,
204
- label: 'Número radicado'
205
- },
206
- {
207
- key: TokenService.STATIC_TOKENS_KEY_USER_INITIALS,
208
- label: 'Iniciales de usuario'
209
- },
210
- {
211
- key: TokenService.STATIC_TOKENS_KEY_LETTER_SIGN,
212
- label: 'Firma de cartas'
213
- },
214
- {
215
- key: TokenService.STATIC_TOKENS_COMMITTEE_NAME,
216
- label: 'Nombre comité'
217
- },
218
- {
219
- key: TokenService.STATIC_TOKENS_COMMITTEE_SEGMENTATION,
220
- label: 'Segmentación comité'
221
- },
222
- {
223
- key: TokenService.STATIC_TOKENS_COMMITTEE_AGGRUPATION,
224
- label: 'Agrupación comité'
225
- },
226
- {
227
- key: TokenService.STATIC_TOKENS_COMMITTEE_CUTLINE_DATE,
228
- label: 'Fecha Línea de corte'
229
- },
230
- {
231
- key: TokenService.STATIC_TOKENS_CONFIRM_LEGALIZATION_APPOINTMENT,
232
- label: 'Confirmación de cita'
233
- },
234
- {
235
- key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_NUMBER,
236
- label: 'Número de documento de codeudor'
237
- },
238
- {
239
- key: TokenService.STATIC_TOKENS_CODEBTOR_DOCUMENT_TYPE,
240
- label: 'Tipo de documento de codeudor'
241
- },
242
- {
243
- key: TokenService.STATIC_TOKENS_CODEBTOR_NAME,
244
- label: 'Nombres codeudor'
245
- },
246
- {
247
- key: TokenService.STATIC_TOKENS_CODEBTOR_LASTNAME,
248
- label: 'Apellidos codeudor'
249
- },
250
- {
251
- key: TokenService.STATIC_TOKENS_TYPE_CODEBTOR,
252
- label: 'Tipo de persona codeudor'
253
- },
254
- {
255
- key: TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY,
256
- label: 'Cantidad vehiculos codeudor'
257
- },
258
- {
259
- key: TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY,
260
- label: 'Cantidad bienes codeudor'
261
- },
262
- {
263
- key: TokenService.STATIC_TOKENS_CODEBTOR_REVIEWER,
264
- label: 'Revisor de codeudores'
265
- },
266
- {
267
- key: TokenService.STATIC_TOKENS_TOTAL_WEIGHTED,
268
- label: 'Ponderado total'
269
- },
270
- {
271
- key: TokenService.STATIC_TOKENS_CONSECUTIVE_GUARANTEE,
272
- label: 'Consecutivo de garantias'
273
- },
274
- {
275
- key: TokenService.STATIC_TOKENS_REPRESENTATIVE_NAME,
276
- label: 'Nombres representante legal'
277
- },
278
- {
279
- key: TokenService.STATIC_TOKENS_REPRESENTATIVE_LASTNAME,
280
- label: 'Apellidos representante legal'
281
- },
282
- {
283
- key: TokenService.STATIC_TOKENS_REPRESENTATIVE_DOCUMENT_NUMBER,
284
- label: 'Cedula representante legal'
285
- },
286
- {
287
- key: TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY,
288
- label: 'Tipo usuario estudio crédito'
289
- },
290
- {
291
- key: TokenService.STATIC_TOKENS_DAY,
292
- label: 'Dia'
293
- },
294
- {
295
- key: TokenService.STATIC_TOKENS_MONTH,
296
- label: 'Mes'
297
- },
298
- {
299
- key: TokenService.STATIC_TOKENS_YEAR,
300
- label: 'Año'
301
- },
302
- {
303
- key: TokenService.STATIC_TOKENS_CITY_SIGNATURE,
304
- label: 'Ciudad de la firma'
305
- },
306
- {
307
- key: TokenService.STATIC_TOKENS_LIST_CODEBTORS,
308
- label: 'Lista de codeudores'
309
- },
310
- {
311
- key: TokenService.STATIC_TOKEN_INGRESO_CODEUDOR_HABEAS_DATA,
312
- label: 'Ingreso Codeudor Habeas Data'
313
- },
314
- {
315
- key: TokenService.STATIC_TOKEN_PDF_RESUMEN_CODEUDOR,
316
- label: 'Pdf codeudor'
317
- },
318
- {
319
- key: TokenService.STATIC_TOKENS_QUANTITY_VEHICLE_BENEFICIARY,
320
- label: 'Cantidad de vehículos del seleccionado'
321
- },
322
- {
323
- key: TokenService.STATIC_TOKENS_QUANTITY_ASSETS_BENEFICIARY,
324
- label: 'Cantidad bienes del seleccionado'
325
- },
326
- {
327
- key: TokenService.STATIC_TOKENS_BEN_CODIGO,
328
- label: 'Código beneficiario'
329
- },
330
- {
331
- key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS,
332
- label: 'Observaciones revisor financiero seleccionado'
333
- },
334
- {
335
- key: TokenService.STATIC_TOKEN_CREDIT_REVIEWER_OBSERVATIONS_CODEBTOR,
336
- label: 'Observaciones revisor financiero codeudores'
337
- },
338
- {
339
- key: TokenService.STATIC_TOKEN_TAG_NAME,
340
- label: 'Nombre del tag'
341
- },
342
- { key: TokenService.STATIC_TOKEN_NAME_REVIEWER_TASK, label: 'Nombre revisor tareas' },
343
- {
344
- key: TokenService.STATIC_TOKEN_LAST_NAME_REVIEWER_TASK,
345
- label: 'Apellido revisor tareas'
346
- },
347
- {
348
- key: TokenService.STATIC_TOKEN_TASK_TOTAL_ASSIGNED_TO_REVIEWER,
349
- label: 'Total tareas asignadas a revisor'
350
- },
351
- {
352
- key: TokenService.STATIC_TOKEN_SURNAME,
353
- label: 'Apellidos candidato'
354
- }
355
- ]; }
356
- static { this.excludedToken = [
357
- TokenService.STATIC_TOKENS_USER_TYPE_CREDIT_STUDY.toLowerCase(),
358
- TokenService.STATIC_TOKENS_CODEBTOR_VEHICLES_QUANTITY.toLowerCase(),
359
- TokenService.STATIC_TOKENS_CODEBTOR_ASSETS_QUANTITY.toLowerCase()
360
- ]; }
361
- constructor(environment, httpClient, formService, currencyPipe) {
362
- this.environment = environment;
363
- this.httpClient = httpClient;
364
- this.formService = formService;
365
- this.currencyPipe = currencyPipe;
366
- }
367
- /** This promise allows to execute a function when consulting the form fields. */
368
- getFormFieldsByPromCode(promCodigo) {
369
- return new Promise((resolve, reject) => {
370
- // Search the dynamic form
371
- let lFormFieldsToken = null;
372
- this.formService.getByPromCodigo(promCodigo).subscribe({
373
- next: (arrayForms) => {
374
- if (arrayForms.length > 0) {
375
- for (const forms of arrayForms) {
376
- let components = [];
377
- components.push(...FormioUtil.getComponents(forms.components));
378
- if (forms.components && forms.components.length > 0) {
379
- for (const components of forms.components) {
380
- if (components.components && components.components.length > 0) {
381
- for (const component of components.components) {
382
- if (component.columns && component.columns.length > 0) {
383
- for (const cComponents of component.columns) {
384
- if (cComponents.components &&
385
- cComponents.components.length > 0) {
386
- for (const iterator of cComponents.components) {
387
- if (iterator.type === 'address') {
388
- delete iterator.components;
389
- }
390
- }
391
- }
392
- }
393
- }
394
- }
395
- }
396
- }
397
- }
398
- }
399
- }
400
- let form = arrayForms;
401
- if (!form ||
402
- !form[0] ||
403
- !form[0].promCodigo ||
404
- form[0].promCodigo != promCodigo) {
405
- // this.router.navigate(['404']);
406
- resolve(lFormFieldsToken);
407
- }
408
- lFormFieldsToken = [];
409
- for (let formComp of form) {
410
- let newComponents;
411
- let components = [];
412
- if (formComp.components) {
413
- newComponents = formComp.components;
414
- }
415
- else if (formComp.columns) {
416
- newComponents = formComp.columns;
417
- }
418
- if (newComponents && UtilString.isValid(formComp.title)) {
419
- lFormFieldsToken.push({
420
- title: {
421
- key: TokenService.getKeyFormulario(formComp.title),
422
- value: formComp.title,
423
- object: formComp
424
- },
425
- value: []
426
- });
427
- lFormFieldsToken[lFormFieldsToken.length - 1].value =
428
- this.getComponenetForm(components, newComponents, null, false, null);
429
- }
430
- }
431
- resolve(lFormFieldsToken);
432
- },
433
- error: (error) => {
434
- reject(error);
435
- }
436
- });
437
- });
438
- }
439
- getFormFieldsByFormId(formId) {
440
- return new Promise((resolve, reject) => {
441
- // Search the dynamic form
442
- let lFormFieldsToken = null;
443
- this.formService.getById(formId).subscribe((result) => {
444
- let form = result;
445
- if (!form || !form[0]) {
446
- resolve(lFormFieldsToken);
447
- }
448
- lFormFieldsToken = [];
449
- for (let formComp of form) {
450
- let newComponents;
451
- let components = [];
452
- if (formComp.components) {
453
- newComponents = formComp.components;
454
- }
455
- else if (formComp.columns) {
456
- newComponents = formComp.columns;
457
- }
458
- if (newComponents && UtilString.isValid(formComp.title)) {
459
- lFormFieldsToken.push({
460
- title: {
461
- key: TokenService.getKeyFormulario(formComp.title),
462
- value: formComp.title,
463
- object: formComp
464
- },
465
- value: []
466
- });
467
- lFormFieldsToken[lFormFieldsToken.length - 1].value =
468
- this.getComponenetForm(components, newComponents, null, false, null);
469
- }
470
- }
471
- resolve(lFormFieldsToken);
472
- }, (error) => {
473
- reject(error);
474
- });
475
- });
476
- }
477
- /** This promise allows to execute a function when consulting the form fields. */
478
- getFormPanelsByPromCode(promCodigo) {
479
- return new Promise((resolve, reject) => {
480
- // Search the dynamic form
481
- let lFormPannelsToken = null;
482
- this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
483
- let form = result;
484
- if (!form ||
485
- !form[0] ||
486
- !form[0].promCodigo ||
487
- form[0].promCodigo != promCodigo) {
488
- // this.router.navigate(['404']);
489
- resolve(lFormPannelsToken);
490
- }
491
- lFormPannelsToken = [];
492
- for (let formComp of form) {
493
- let newComponents;
494
- let components = [];
495
- if (formComp.components) {
496
- newComponents = formComp.components;
497
- }
498
- else if (formComp.columns) {
499
- newComponents = formComp.columns;
500
- }
501
- if (newComponents && UtilString.isValid(formComp.title)) {
502
- lFormPannelsToken.push({
503
- title: {
504
- key: TokenService.getKeyFormulario(formComp.title),
505
- value: formComp.title,
506
- object: formComp
507
- },
508
- value: []
509
- });
510
- lFormPannelsToken[lFormPannelsToken.length - 1].value =
511
- this.getPanelComponenet(components, newComponents, null);
512
- }
513
- }
514
- resolve(lFormPannelsToken);
515
- }, (error) => {
516
- reject(error);
517
- });
518
- });
519
- }
520
- /**
521
- * A recursive method to get all the information of the editGrid dynamic form
522
- * @param components
523
- * @param form
524
- */
525
- getPanelComponenet(components, form, panelName) {
526
- for (let formComp of form) {
527
- if (formComp.type === 'panel') {
528
- components.push(formComp);
529
- }
530
- else if (formComp.components || formComp.columns) {
531
- let newComponents;
532
- if (formComp.components) {
533
- newComponents = formComp.components;
534
- }
535
- else if (formComp.columns) {
536
- newComponents = formComp.columns;
537
- }
538
- components = this.getPanelComponenet(components, newComponents, panelName);
539
- }
540
- }
541
- return components;
542
- }
543
- /**
544
- * A recursive method to get all the information of the components a columns of the dynamic form
545
- * @param components
546
- * @param form
547
- */
548
- getComponenetForm(components, form, panelName, editgrid, editGridKey) {
549
- for (let formComp of form) {
550
- //MO- mantis 8743 fix address token
551
- if ((formComp.components || formComp.columns) && formComp.type !== 'address') {
552
- let newComponents;
553
- if (formComp.components) {
554
- newComponents = formComp.components;
555
- if (formComp.type === 'editgrid') {
556
- editgrid = true;
557
- editGridKey = formComp.key;
558
- }
559
- }
560
- else if (formComp.columns) {
561
- newComponents = formComp.columns;
562
- }
563
- if (formComp.type && formComp.type === 'panel') {
564
- panelName = formComp.title;
565
- }
566
- components = this.getComponenetForm(components, newComponents, panelName, editgrid, editGridKey);
567
- }
568
- else {
569
- formComp.panelName = panelName;
570
- formComp.editgrid = editgrid;
571
- formComp.editGridKey = editGridKey;
572
- components.push(formComp);
573
- }
574
- }
575
- return components;
576
- }
577
- /** This promise allows to execute a function when consulting the form fields. */
578
- getFormEditGridFieldsByPromCode(promCodigo) {
579
- return new Promise((resolve, reject) => {
580
- // Search the dynamic form
581
- let lFormFieldsToken = null;
582
- this.formService.getByPromCodigo(promCodigo).subscribe((result) => {
583
- let form = result;
584
- if (!form ||
585
- !form[0] ||
586
- !form[0].promCodigo ||
587
- form[0].promCodigo != promCodigo) {
588
- // this.router.navigate(['404']);
589
- resolve(lFormFieldsToken);
590
- }
591
- lFormFieldsToken = [];
592
- for (let formComp of form) {
593
- let newComponents;
594
- let components = [];
595
- if (formComp.components) {
596
- newComponents = formComp.components;
597
- }
598
- else if (formComp.columns) {
599
- newComponents = formComp.columns;
600
- }
601
- if (newComponents && UtilString.isValid(formComp.title)) {
602
- lFormFieldsToken.push({
603
- title: {
604
- key: TokenService.getKeyFormulario(formComp.title),
605
- value: formComp.title,
606
- object: formComp
607
- },
608
- value: []
609
- });
610
- lFormFieldsToken[lFormFieldsToken.length - 1].value =
611
- this.getEditGridComponenet(components, newComponents, null);
612
- }
613
- }
614
- resolve(lFormFieldsToken);
615
- }, (error) => {
616
- reject(error);
617
- });
618
- });
619
- }
620
- /**
621
- * A recursive method to get all the information of the editGrid dynamic form
622
- * @param components
623
- * @param form
624
- */
625
- getEditGridComponenet(components, form, panelName) {
626
- for (let formComp of form) {
627
- if (formComp.type === 'editgrid') {
628
- formComp.panelName = panelName;
629
- components.push(formComp);
630
- }
631
- else if (formComp.components || formComp.columns) {
632
- let newComponents;
633
- if (formComp.components) {
634
- newComponents = formComp.components;
635
- }
636
- else if (formComp.columns) {
637
- newComponents = formComp.columns;
638
- }
639
- if (formComp.type && formComp.type === 'panel') {
640
- panelName = formComp.title;
641
- }
642
- components = this.getEditGridComponenet(components, newComponents, panelName);
643
- }
644
- }
645
- return components;
646
- }
647
- /** It returns the tokens by promCodigo */
648
- getListByPromCodigo(promCode) {
649
- return this.httpClient.get(this.environment.host.backend.configuration + 'token/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCode.toString()) });
650
- }
651
- /** It returns the token by id */
652
- getById(id) {
653
- return this.httpClient.get(this.environment.host.backend.configuration + 'token/getById', {
654
- params: new HttpParams().set('id', id.toString())
655
- });
656
- }
657
- /** It deletes a form by id */
658
- delete(id) {
659
- return this.httpClient.delete(this.environment.host.backend.configuration + 'token/delete', { params: new HttpParams().set('id', id) });
660
- }
661
- /** It saves the token */
662
- save(token) {
663
- return this.httpClient.post(this.environment.host.backend.configuration + 'token/save', token, HEADER_JSON);
664
- }
665
- static getKeyFormulario(formTitle) {
666
- if (UtilString.isValid(formTitle)) {
667
- return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM) +
668
- UtilString.replaceAccentSpacesOthers(formTitle).replace(/_/g, '-'));
669
- }
670
- return '';
671
- }
672
- /** It returns the unique verification code */
673
- getUniqueVerificationCode(login, token) {
674
- return this.httpClient.get(this.environment.host.backend.documentsRepository +
675
- 'documento/consultarCodigoUnico/' +
676
- login +
677
- '/' +
678
- token, { params: new HttpParams() });
679
- }
680
- /** It send the information to copy the Document viewer */
681
- copyDocumentInformationViewer(login, token, uniqueCode, documentURL, documentName) {
682
- let infoDocumento = {
683
- codigoUnico: uniqueCode,
684
- rutaDocumento: documentURL,
685
- documentName: documentName
686
- };
687
- return this.httpClient.post(this.environment.host.backend.documentsRepository +
688
- 'documento/adicionarDocumento/' +
689
- login +
690
- '/' +
691
- token, infoDocumento, HEADER_JSON);
692
- }
693
- static getKeyBudget() {
694
- return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET);
695
- }
696
- static getKeyDocument() {
697
- return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_DOCUMENTO);
698
- }
699
- static getKeyDocumentAnalysis() {
700
- return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE);
701
- }
702
- static getKeyTask() {
703
- return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL);
704
- }
705
- static getKeyStatic() {
706
- return UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC);
707
- }
708
- static getKeyCalculated(token) {
709
- return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED) +
710
- '_' +
711
- UtilString.replaceAccentSpacesOthers(token.name));
712
- }
713
- static getKeySnapshot(token) {
714
- return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_SNAPSHOT) +
715
- '_' +
716
- UtilString.replaceAccentSpacesOthers(token.name));
717
- }
718
- static getKeyGuarantee(token) {
719
- return (UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_GUARANTEE) +
720
- '_' +
721
- UtilString.replaceAccentSpacesOthers(token.name));
722
- }
723
- /**
724
- * Return a value that represent the type of label: 1=Form, 2=Budget, 3=Static, 4=Calculated
725
- * @param key Value to evalueate
726
- */
727
- static getKeyType(key) {
728
- key = key.replace('{', '').replace('}', '');
729
- key = key.substring(1, key.indexOf('_'));
730
- if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_FORM))) {
731
- return 1;
732
- }
733
- else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_BUDGET))) {
734
- return 2;
735
- }
736
- else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_STATIC))) {
737
- return 3;
738
- }
739
- else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_CALCULATED))) {
740
- return 4;
741
- }
742
- else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_LABEL_TASKL))) {
743
- return 5;
744
- }
745
- else if (key.startsWith(UtilString.replaceAccentSpacesOthers(TokenService.TOKEN_DOCUMENTO_ANALYSIS_TYPE))) {
746
- return 6;
747
- }
748
- return null;
749
- }
750
- /**
751
- * Depends of the type of formFieldToken return de value of the valueData
752
- * @param formFieldToken
753
- * @param valueData
754
- */
755
- getValueFromFormField(formFieldToken, valueData) {
756
- if (typeof valueData == 'object') {
757
- if (formFieldToken.type) {
758
- if (formFieldToken.type == 'address') {
759
- return valueData.formatted_address;
760
- }
761
- if (formFieldToken.type == 'select' &&
762
- valueData.hasOwnProperty(formFieldToken.searchField)) {
763
- if (valueData.hasOwnProperty('original_name') !== '') {
764
- return valueData.original_name;
765
- }
766
- else if (valueData.hasOwnProperty('nativeName') !== '') {
767
- return valueData.nativeName;
768
- }
769
- else if (formFieldToken.searchField) {
770
- return valueData[formFieldToken.searchField];
771
- }
772
- }
773
- }
774
- }
775
- return valueData;
776
- }
777
- formatDate(value, locale) {
778
- const date = new Date(value);
779
- const months = {
780
- es: [
781
- 'enero',
782
- 'febrero',
783
- 'marzo',
784
- 'abril',
785
- 'mayo',
786
- 'junio',
787
- 'julio',
788
- 'agosto',
789
- 'septiembre',
790
- 'octubre',
791
- 'noviembre',
792
- 'diciembre'
793
- ],
794
- en: [
795
- 'January',
796
- 'February',
797
- 'March',
798
- 'April',
799
- 'May',
800
- 'June',
801
- 'July',
802
- 'August',
803
- 'September',
804
- 'October',
805
- 'November',
806
- 'December'
807
- ],
808
- fr: [
809
- 'janvier',
810
- 'février',
811
- 'mars',
812
- 'avril',
813
- 'mai',
814
- 'juin',
815
- 'juillet',
816
- 'août',
817
- 'septembre',
818
- 'octobre',
819
- 'novembre',
820
- 'décembre'
821
- ],
822
- de: [
823
- 'Januar',
824
- 'Februar',
825
- 'März',
826
- 'April',
827
- 'Mai',
828
- 'Juni',
829
- 'Juli',
830
- 'August',
831
- 'September',
832
- 'Oktober',
833
- 'November',
834
- 'Dezember'
835
- ],
836
- it: [
837
- 'gennaio',
838
- 'febbraio',
839
- 'marzo',
840
- 'aprile',
841
- 'maggio',
842
- 'giugno',
843
- 'luglio',
844
- 'agosto',
845
- 'settembre',
846
- 'ottobre',
847
- 'novembre',
848
- 'dicembre'
849
- ]
850
- };
851
- const localeMonths = months[locale];
852
- const month = localeMonths[date.getMonth()];
853
- const year = date.getFullYear();
854
- return `${month} ${year}`;
855
- }
856
- /**
857
- * Try to find the token in the stringText and replace with dataValue. If detect format of number or date try to format the dataValue
858
- * @param stringText
859
- * @param token
860
- * @param dataValue
861
- */
862
- replaceToken(stringText, token, dataValue, locale) {
863
- let valueReplace = null;
864
- if (token && token[0] == '#') {
865
- let typeToken = token.substring(1, token.indexOf('('));
866
- if (typeToken == 'date') {
867
- let dateFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
868
- dateFormat = dateFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
869
- let dateValue = DateUtil.getDate(dataValue);
870
- if (locale != null && locale) {
871
- valueReplace = this.formatDate(dateValue, locale);
872
- }
873
- else if (dateValue) {
874
- valueReplace = DateUtil.getMoment(dateValue).format(dateFormat);
875
- }
876
- else {
877
- valueReplace = '';
878
- }
879
- }
880
- else if (typeToken == 'number') {
881
- let numberValue = Number(dataValue);
882
- if (numberValue != undefined && !isNaN(numberValue)) {
883
- let numberFormat = token.substring(token.indexOf('}') + 1, token.indexOf(')'));
884
- numberFormat = numberFormat.trim().replace(/\"/g, '').replace(/\'/g, '');
885
- valueReplace = this.currencyPipe.transform(numberValue, this.locale, '', numberFormat);
886
- }
887
- else {
888
- console.log('El dato [' +
889
- dataValue +
890
- '] para el token [' +
891
- token +
892
- '] tipo númerico no es valido');
893
- valueReplace = '';
894
- }
895
- }
896
- else {
897
- console.log('tipo de token indefinido. [typeToken[' + typeToken + ']]');
898
- }
899
- }
900
- else if (token && token[0] == '$') {
901
- if (dataValue !== null &&
902
- dataValue !== undefined &&
903
- dataValue.original_name !== undefined &&
904
- dataValue.original_name !== null) {
905
- valueReplace = dataValue.original_name;
906
- }
907
- else {
908
- valueReplace = dataValue;
909
- }
910
- // valueReplace = dataValue;
911
- }
912
- else {
913
- console.log('El token no es valido. [token[' + token + ']]');
914
- }
915
- if (stringText && valueReplace !== null) {
916
- if (token && token === '${estatico_' + TokenService.STATIC_TOKEN_SURNAME + '}') {
917
- valueReplace = dataValue;
918
- stringText = stringText.split(token).join(valueReplace);
919
- }
920
- else {
921
- // replace text in a more efficient way
922
- stringText = stringText.split(token).join(valueReplace);
923
- //stringText = stringText.replace(token, valueReplace);
924
- }
925
- }
926
- return stringText;
927
- }
928
- getListTokensByStringSegmentation(stringText) {
929
- const arrayToken = stringText.match(/\${([^}]+)\}/g);
930
- const arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
931
- const arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
932
- let arrayTokenFormatted = [];
933
- if (arrayTokenFormattedDate &&
934
- arrayTokenFormattedDate.length > 0 &&
935
- arrayTokenFormattedNumber &&
936
- arrayTokenFormattedNumber.length > 0) {
937
- arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
938
- }
939
- else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
940
- arrayTokenFormatted = arrayTokenFormattedDate.slice();
941
- }
942
- else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
943
- arrayTokenFormatted = arrayTokenFormattedNumber.slice();
944
- }
945
- const result = [];
946
- if (arrayToken) {
947
- for (const token of arrayToken) {
948
- const infoToken = { key: token, value: token };
949
- if (arrayTokenFormatted) {
950
- for (const tokenFormatted of arrayTokenFormatted) {
951
- const index = tokenFormatted.indexOf(token);
952
- if (index >= 0) {
953
- infoToken.value = tokenFormatted;
954
- break;
955
- }
956
- }
957
- }
958
- result.push(infoToken);
959
- }
960
- }
961
- return result;
962
- }
963
- changeIdPropertiesOfObject(normalizationColumns, listData) {
964
- const newData = [];
965
- listData.forEach((data) => {
966
- const objData = {};
967
- Object.keys(data).forEach((property) => {
968
- if (data.hasOwnProperty(property)) {
969
- normalizationColumns.forEach((column) => {
970
- if (column.idColumn.toString() === property) {
971
- objData[column.key] = data[property];
972
- }
973
- });
974
- }
975
- });
976
- if (objData) {
977
- newData.push(objData);
978
- }
979
- });
980
- return newData;
981
- }
982
- generateHtmlByTokensAndData(html, listData, listTokens) {
983
- const translatedCards = [];
984
- listData.forEach((data) => {
985
- const objToken = {};
986
- const htmlTranslated = { html: html };
987
- Object.keys(data).forEach((property) => {
988
- listTokens.forEach((token) => {
989
- if (property == token.key.replace('${', '').replace('}', '')) {
990
- objToken[token.key] = data[property];
991
- htmlTranslated.html = htmlTranslated.html.replace(token.key, data[property]);
992
- }
993
- });
994
- });
995
- translatedCards.push(htmlTranslated);
996
- });
997
- return translatedCards;
998
- }
999
- getListTokensByString(stringText) {
1000
- var arrayToken = stringText.match(/\${([^}]+)\}/g);
1001
- var arrayTokenFormattedDate = stringText.match(/\#date[^)]+\)/g);
1002
- var arrayTokenFormattedNumber = stringText.match(/\#number[^)]+\)/g);
1003
- var arrayTokenFormatted = [];
1004
- if (arrayTokenFormattedDate &&
1005
- arrayTokenFormattedDate.length > 0 &&
1006
- arrayTokenFormattedNumber &&
1007
- arrayTokenFormattedNumber.length > 0) {
1008
- arrayTokenFormatted = arrayTokenFormattedDate.concat(arrayTokenFormattedNumber);
1009
- }
1010
- else if (arrayTokenFormattedDate && arrayTokenFormattedDate.length > 0) {
1011
- arrayTokenFormatted = arrayTokenFormattedDate.slice();
1012
- }
1013
- else if (arrayTokenFormattedNumber && arrayTokenFormattedNumber.length > 0) {
1014
- arrayTokenFormatted = arrayTokenFormattedNumber.slice();
1015
- }
1016
- var result = [];
1017
- if (arrayToken) {
1018
- for (const token of arrayToken) {
1019
- let keyType = TokenService.getKeyType(token);
1020
- if (keyType === null) {
1021
- continue;
1022
- }
1023
- var infoToken = { key: token, value: token };
1024
- if (arrayTokenFormatted) {
1025
- for (const tokenFormatted of arrayTokenFormatted) {
1026
- var index = tokenFormatted.indexOf(token);
1027
- if (index >= 0) {
1028
- infoToken.value = tokenFormatted;
1029
- break;
1030
- }
1031
- }
1032
- }
1033
- result.push(infoToken);
1034
- }
1035
- }
1036
- return result;
1037
- // let tokens: any[] = [];
1038
- // let i = this.nextValidPositionTokens(stringText, 0);
1039
- // let count = 0;
1040
- // while (i >= 0 && count <= 10) {
1041
- // let infoToken: {} = null;
1042
- // let nextI: number = i;
1043
- // let character = stringText.substring(i, (i + 1));
1044
- // if (character == "$") {
1045
- // let nextCharacter = stringText.substring((i + 1), (i + 2));
1046
- // // The next character need to be a { sign
1047
- // if (nextCharacter != "{") {
1048
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1049
- // continue;
1050
- // }
1051
- // let keyToken: string = stringText.substring(i, stringText.indexOf("}", i) + 1);
1052
- // // If the token have a valid key type
1053
- // let keyType: number = TokenService.getKeyType(keyToken.replace("{", "").replace("}", ""));
1054
- // if (keyType === null) {
1055
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1056
- // continue;
1057
- // }
1058
- // infoToken = {
1059
- // key: keyToken,
1060
- // value: keyToken
1061
- // };
1062
- // nextI = stringText.indexOf("}", i);
1063
- // } else {
1064
- // let nextSign: number = stringText.indexOf("$", i);
1065
- // // We inly support #date($ and #number($ in this 2 scenarios the lenght can't be more than 10 characters
1066
- // if (nextSign < 0 || (nextSign - i) > 10) {
1067
- // i = this.nextValidPositionTokens(stringText, nextI + 1);
1068
- // continue;
1069
- // }
1070
- // let keyToken: string = stringText.substring(stringText.indexOf("$", i), stringText.indexOf("}", i) + 1);
1071
- // let valueToken: string = stringText.substring(i, stringText.indexOf(")", i) + 1);
1072
- // infoToken = {
1073
- // key: keyToken,
1074
- // value: valueToken
1075
- // };
1076
- // nextI = stringText.indexOf(")", i);
1077
- // }
1078
- // tokens.push(infoToken);
1079
- // i = this.nextValidPositionTokens(stringText, nextI);
1080
- // count++;
1081
- // }
1082
- // return tokens;
1083
- }
1084
- nextValidPositionTokens(stringText, nextI) {
1085
- let tokenDollarSign = stringText.indexOf('$', nextI);
1086
- let tokenNumSign = stringText.indexOf('#', nextI);
1087
- let i = tokenDollarSign < 0 && tokenNumSign >= 0
1088
- ? tokenNumSign
1089
- : tokenNumSign < 0 && tokenDollarSign >= 0
1090
- ? tokenDollarSign
1091
- : tokenDollarSign < tokenNumSign
1092
- ? tokenDollarSign
1093
- : tokenNumSign;
1094
- return i;
1095
- }
1096
- /**
1097
- * It reuses replaceTokensFromListObjectPublic but set all keys lobjecttokens as lowercase
1098
- * @param tokenName
1099
- * @param formula
1100
- * @param lObjectTokens
1101
- */
1102
- replaceTokensFromListObjectPublic(tokenName, formula, lObjectTokens) {
1103
- let lDataOrg = [];
1104
- if (lObjectTokens) {
1105
- for (let dataForm in lObjectTokens) {
1106
- lDataOrg[dataForm.toLowerCase()] = lObjectTokens[dataForm];
1107
- }
1108
- }
1109
- return this.replaceTokensFromListObject(tokenName, formula, lDataOrg);
1110
- }
1111
- /**
1112
- * @param tokenName token name
1113
- * @param formula String with the formula to execute
1114
- * @param lObjectTokens List of tokens with the values to replace
1115
- */
1116
- replaceTokensFromListObject(tokenName, formula, lObjectTokens) {
1117
- if (!formula || formula.length == 0) {
1118
- throw {
1119
- message: 'La formula del token ' + tokenName + ' esta vacía',
1120
- title: 'Alerta!',
1121
- error: 'La formula del token ' + tokenName + ' esta vacía. [formula[' + formula + ']]'
1122
- };
1123
- }
1124
- let replacedTokens = formula.toString();
1125
- if (replacedTokens.startsWith('file://')) {
1126
- return replacedTokens;
1127
- }
1128
- // Find the tokens in the formula
1129
- let tokensArray = this.getListTokensByString(replacedTokens);
1130
- if (tokensArray.length == 0) {
1131
- return replacedTokens;
1132
- }
1133
- // If there any token, try to replace
1134
- for (let i = 0; i < tokensArray.length; i++) {
1135
- let objectToken = lObjectTokens[tokensArray[i].key] !== undefined
1136
- ? lObjectTokens[tokensArray[i].key]
1137
- : null;
1138
- let clearKey;
1139
- if (objectToken == null) {
1140
- clearKey = tokensArray[i].key.replace('${', '').replace('}', '').toLowerCase();
1141
- objectToken =
1142
- lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1143
- if (objectToken == null) {
1144
- clearKey = tokensArray[i].key
1145
- .replace('{', '')
1146
- .replace('}', '')
1147
- .split('_')[1]
1148
- .toLowerCase();
1149
- objectToken =
1150
- lObjectTokens[clearKey] !== undefined ? lObjectTokens[clearKey] : null;
1151
- if (objectToken === null || objectToken === undefined) {
1152
- const arrayKey = tokensArray[i].key
1153
- .replace('{', '')
1154
- .replace('}', '')
1155
- .split('_')[1]
1156
- .split('.');
1157
- if (arrayKey.length > 0) {
1158
- let value = lObjectTokens;
1159
- for (let index = 0; index < arrayKey.length; index++) {
1160
- let element = arrayKey[index];
1161
- if (index == 0) {
1162
- element = element.toLowerCase();
1163
- }
1164
- value = value[element];
1165
- }
1166
- objectToken = value;
1167
- }
1168
- }
1169
- }
1170
- }
1171
- if (objectToken == null) {
1172
- // If not find the token, by default put an empty string
1173
- /*if (TokenService.excludedToken.indexOf(clearKey) === -1) {
1174
- console.error(
1175
- 'El token ' + tokensArray[i].value + ' no fue encontrado.',
1176
- lObjectTokens,
1177
- tokensArray
1178
- );
1179
- }*/
1180
- objectToken = '';
1181
- }
1182
- if (objectToken != null) {
1183
- // let value: any = Number(objectToken)
1184
- // ? objectToken
1185
- // : Array.isArray(objectToken)
1186
- // ? JSON.stringify(objectToken)
1187
- // : "'" + objectToken + "'";
1188
- let value;
1189
- if (Number(objectToken)) {
1190
- value = Number(objectToken);
1191
- }
1192
- else if (Array.isArray(objectToken)) {
1193
- value = Array.isArray(objectToken);
1194
- }
1195
- else if (JSON.stringify(objectToken)) {
1196
- value = objectToken.original_name
1197
- ? "'" + objectToken.original_name + "'"
1198
- : JSON.stringify(objectToken);
1199
- }
1200
- else {
1201
- value = "'" + objectToken + "'";
1202
- }
1203
- replacedTokens = this.replaceToken(replacedTokens, tokensArray[i].value, value);
1204
- // } else {
1205
- // console.error(lObjectTokens, tokensArray);
1206
- // throw {
1207
- // message: "No se encontró valor para un token",
1208
- // title: "Alerta!",
1209
- // error: "El token " + tokensArray[i].value + " no fue encontrado."
1210
- // };
1211
- //
1212
- // Si es la ultima iteracion y la formula tiene [ es porque tiene un array en el valor que resolvio el token
1213
- if (i == tokensArray.length - 1 && replacedTokens.includes('[')) {
1214
- // Se ponen todos los operandos como elementos en un array ['expresion a', '&&', 'Expresion B']
1215
- let formExpressions = replacedTokens.split(/ (\|\||&&) /);
1216
- let lAuxformExpression = [];
1217
- formExpressions.forEach((expression) => {
1218
- if (expression.charAt(0) == '[') {
1219
- let isTagFound = '';
1220
- isTagFound = this.findTag(expression);
1221
- lAuxformExpression.push(isTagFound);
1222
- }
1223
- else {
1224
- lAuxformExpression.push(expression);
1225
- }
1226
- });
1227
- replacedTokens = lAuxformExpression.join(' ');
1228
- }
1229
- }
1230
- }
1231
- return replacedTokens;
1232
- }
1233
- /**
1234
- * MEtodo que teniendo una expresion de la forma ['tag1', 'tag2']==tag3
1235
- * evalua si tag3 hace parte del array si tiene el operador ==.
1236
- * Si tiene el operador != examina que tag3 no haga parte del array+
1237
- *
1238
- * @param expression Operando que evalua tag. Es de la forma ['tag1', 'tag2']==tag3
1239
- * @returns Retorna 'true' o 'false' en string que despues sera pasado a un eval()
1240
- * mas adelante en el flujo
1241
- */
1242
- findTag(expression) {
1243
- let regexOperator = new RegExp('(===|==|!==|!=)');
1244
- // Retorna el operador
1245
- let operator = expression.match(regexOperator);
1246
- // Si no encuentra un operador segun el patron retorna 'false'
1247
- // para evitar resultados inesperados
1248
- if (operator == null) {
1249
- console.error('No se encontro un operador permitido para la expresion');
1250
- return 'false';
1251
- }
1252
- // Separa la sentencia por el operador
1253
- // La primera parte es el valor por el cual se remplaza el token que es un array en string "['a', 'b']"
1254
- // El segundo es el valor con el cual se va a comparar
1255
- let valueToken, valueToCompare;
1256
- [valueToken, valueToCompare] = expression.split(operator[0]);
1257
- // Se limpia el string correspondiente al array para que los elementos queden separados por ","
1258
- valueToken = valueToken.replace(/[^a-zA-Z0-9 ,]/g, '');
1259
- // Si no hay tags asociados al registro se devuelve 'false'
1260
- if (!valueToken) {
1261
- console.error('No hay tags asociados a esta aplicación');
1262
- return 'false';
1263
- }
1264
- // Se limpia el string correspondiente al valor por comparar
1265
- valueToCompare = valueToCompare.replace(/[^a-zA-Z0-9 ]/g, '');
1266
- // El string correspondiente al array pasa a ser tipo array
1267
- valueToken = valueToken.split(',');
1268
- // Se trata de constatar si el valor a comparar se encuetra o no dentro
1269
- // Si el operador que se encontro == returna true si lo encuentra
1270
- let isTagFound = true;
1271
- switch (operator[0]) {
1272
- case '==':
1273
- isTagFound = valueToken.some((tag) => tag == valueToCompare);
1274
- break;
1275
- case '===':
1276
- isTagFound = valueToken.some((tag) => tag === valueToCompare);
1277
- break;
1278
- case '!==':
1279
- isTagFound = valueToken.some((tag) => tag !== valueToCompare);
1280
- break;
1281
- case '!=':
1282
- isTagFound = valueToken.some((tag) => tag != valueToCompare);
1283
- break;
1284
- default:
1285
- break;
1286
- }
1287
- expression = isTagFound ? 'true' : 'false';
1288
- return expression;
1289
- }
1290
- /**
1291
- * Try to eval the formula depend of the type of fields.
1292
- * @param lStaticToken
1293
- * @param formulaName
1294
- * @param formula
1295
- */
1296
- validateFormula(lStaticToken, formulaName, formula) {
1297
- let evalFormula = false;
1298
- // To validate the formula, first organize the info to key - value array
1299
- let objectTokens = [];
1300
- for (let panel of lStaticToken) {
1301
- for (let groupToken of panel.value) {
1302
- for (let staticToken of groupToken.value) {
1303
- for (let arrayTokenInfo of staticToken) {
1304
- objectTokens[arrayTokenInfo.key] = arrayTokenInfo.object
1305
- ? arrayTokenInfo.object.type == 'number'
1306
- ? '0'
1307
- : ''
1308
- : '';
1309
- }
1310
- }
1311
- }
1312
- }
1313
- try {
1314
- formula = this.replaceTokensFromListObject(formulaName, formula, objectTokens);
1315
- }
1316
- catch (error) {
1317
- //console.error(error);
1318
- throw error;
1319
- }
1320
- if (formula !== null) {
1321
- try {
1322
- let result = formula.startsWith('file://') ? formula : eval(formula);
1323
- evalFormula = true;
1324
- }
1325
- catch (e) {
1326
- //console.error("Error evaluating the formula", e);
1327
- throw {
1328
- message: 'La formula no fue posible evaluar',
1329
- title: 'Alerta!',
1330
- error: e
1331
- };
1332
- }
1333
- }
1334
- return evalFormula;
1335
- }
1336
- getConfigCloningTokenMap(oldPPP, newPPP) {
1337
- return this.httpClient.get(this.environment.host.backend.configuration + 'token/getConfigCloningTokenMap', {
1338
- params: new HttpParams()
1339
- .set('oldPPP', oldPPP.toString())
1340
- .set('newPPP', newPPP.toString())
1341
- });
1342
- }
1343
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, deps: [{ token: 'environment' }, { token: i1.HttpClient }, { token: i2.FormService }, { token: i3.CurrencyPipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
1344
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, providedIn: 'root' }); }
1345
- }
1346
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TokenService, decorators: [{
1347
- type: Injectable,
1348
- args: [{
1349
- providedIn: 'root'
1350
- }]
1351
- }], ctorParameters: () => [{ type: undefined, decorators: [{
1352
- type: Inject,
1353
- args: ['environment']
1354
- }] }, { type: i1.HttpClient }, { type: i2.FormService }, { type: i3.CurrencyPipe }], propDecorators: { locale: [{
1355
- type: Inject,
1356
- args: [LOCALE_ID]
1357
- }] } });
1358
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvdG9rZW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUErQixVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7OztBQU1sRCxNQUFNLE9BQU8sWUFBWTtJQUN4QixNQUFNO2FBQ0MsdUJBQWtCLEdBQVcscUJBQXFCLEFBQWhDLENBQWlDO0lBSzFELE1BQU07YUFDQyxxQkFBZ0IsR0FBVyxLQUFLLEFBQWhCLENBQWlCO0lBQ3hDLE1BQU07YUFDQyx1QkFBa0IsR0FBVyxhQUFhLEFBQXhCLENBQXlCO0lBQ2xELE1BQU07YUFDQywyQkFBc0IsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ3BELE1BQU07YUFDQyx5QkFBb0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQ2pELE1BQU07YUFDQyx1QkFBa0IsR0FBVyxVQUFVLEFBQXJCLENBQXNCO0lBQy9DLE1BQU07YUFDQywwQkFBcUIsR0FBVyxXQUFXLEFBQXRCLENBQXVCO0lBQ25ELE1BQU07YUFDQyw4Q0FBeUMsR0FBVyxtQ0FBbUMsQUFBOUMsQ0FBK0M7SUFDL0YsTUFBTTthQUNDLGtDQUE2QixHQUFXLG1CQUFtQixBQUE5QixDQUErQjtJQUNuRSxNQUFNO2FBQ0MscUJBQWdCLEdBQVcsT0FBTyxBQUFsQixDQUFtQjtJQUMxQyxNQUFNO2FBQ0Msc0JBQWlCLEdBQVcsTUFBTSxBQUFqQixDQUFrQjtJ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RSxtQ0FBbUM7b0JBQzVDLEtBQUssRUFBRSxTQUFTO29CQUNoQixLQUFLLEVBQUUsQ0FBQztpQkFDUixDQUFDO1lBQ0gsQ0FBQztRQUNGLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNwQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDdEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxnQ0FBZ0MsRUFDOUU7WUFDQyxNQUFNLEVBQUUsSUFBSSxVQUFVLEVBQUU7aUJBQ3RCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNoQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNsQyxDQUNELENBQUM7SUFDSCxDQUFDOytHQWo4Q1csWUFBWSxrQkEwV2YsYUFBYTttSEExV1YsWUFBWSxjQUZaLE1BQU07OzRGQUVOLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCOzswQkEyV0UsTUFBTTsyQkFBQyxhQUFhO3VIQXJXSSxNQUFNO3NCQUEvQixNQUFNO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIExPQ0FMRV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVXRpbCwgSEVBREVSX0pTT04sIFBsaUNuZkd1YXJhbnRlZVRva2VuLCBUb2tlbiwgVXRpbFN0cmluZyB9IGZyb20gJ25nLXBsaS11dGlsJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGb3JtaW9VdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWlvLXV0aWwnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4vZm9ybS5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRva2VuU2VydmljZSB7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNJR05fTEVUVEVSX1RBR19JRDogc3RyaW5nID0gJ19zaWduLWxldHRlci10YWctaWQnO1xyXG5cclxuXHQvKiogKi9cclxuXHRASW5qZWN0KExPQ0FMRV9JRCkgcHVibGljIGxvY2FsZTogc3RyaW5nO1xyXG5cclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfRk9STTogc3RyaW5nID0gJ0ZybSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0JVREdFVDogc3RyaW5nID0gJ1ByZXN1cHVlc3RvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRDogc3RyaW5nID0gJ0NhbGN1bGFkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1NOQVBTSE9UOiBzdHJpbmcgPSAnU25hcHNob3QnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9TVEFUSUM6IHN0cmluZyA9ICdFc3TDoXRpY28nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9ET0NVTUVOVE86IHN0cmluZyA9ICdEb2N1bWVudG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBUT0tFTl9MQUJFTF9ET0NVTUVOVE9fQU5BTElTSVNfQVVUT01BVElDTzogc3RyaW5nID0gJ0Fuw6FsaXNpcyBhdXRvbcOhdGljbyBkZSBkb2N1bWVudG9zJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgVE9LRU5fRE9DVU1FTlRPX0FOQUxZU0lTX1RZUEU6IHN0cmluZyA9ICdkb2N1bWVudF9hbmFseXNpcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1RBU0s6IHN0cmluZyA9ICdUYXJlYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX1RBU0tMOiBzdHJpbmcgPSAndGFzayc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFRPS0VOX0xBQkVMX0dVQVJBTlRFRTogc3RyaW5nID0gJ0dhcmFudGlhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfVE9UQUxfQU1PVU5UOiBzdHJpbmcgPSAndG90YWxBbW91bnQnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX0FNT1VOVDogc3RyaW5nID0gJ2FwcGxpY2F0aW9uVG90YWwnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9BUFBMSUNBVElPTl9QUk9DRVNTX1RPVEFMX09XTl9GT1VORFM6IHN0cmluZyA9ICdhcHBsaWNhdGlvbk93bkZvdW5kcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0FQUExJQ0FUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HOiBzdHJpbmcgPSAnYXBwbGljYXRpb25GaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9MRUdBTElaQVRJT05fUFJPQ0VTU19UT1RBTF9BTU9VTlQ6IHN0cmluZyA9ICdsZWdhbGl6YXRpb25Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0xFR0FMSVpBVElPTl9QUk9DRVNTX1RPVEFMX09XTl9GT1VORFM6IHN0cmluZyA9XHJcblx0XHQnbGVnYWxpemF0aW9uT3duRm91bmRzJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfTEVHQUxJWkFUSU9OX1BST0NFU1NfVE9UQUxfRklOQU5DSU5HOiBzdHJpbmcgPSAnbGVnYWxpemF0aW9uRmluYW5jaW5nJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfSU5TVVJBTkNFX0FNT1VOVDogc3RyaW5nID0gJ2luc3VyYW5jZUFtb3VudCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIExFR0FMSVpBVElPTl9PUl9BUFBMSUNBVElPTl9UT1RBTF9GSU5BTkNJTkc6IHN0cmluZyA9XHJcblx0XHQnbGVnbGl6YXRpb25PckFwcGxpY2F0aW9uVG90YWxGaW5hbmNpbmcnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBCVURHRVRfVE9LRU5TX0tFWV9SRVNVTUVfQ0FURUdPUllfWUVBUjogc3RyaW5nID0gJ3Jlc3VtZUNhdGVnb3J5WWVhcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfS0VZX0ZFQ0hBX0ZJTkFOQ0lOR19TVEFSVDogc3RyaW5nID0gJ2ZlY2hhSW5pY2lvRmluYW5jaWFjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19LRVlfRkVDSEFfRklOQU5DSU5HX0VORDogc3RyaW5nID0gJ2ZlY2hhRmluRmluYW5jaWFjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgQlVER0VUX1RPS0VOU19EVVJBVElPTl9TVFVESUVTOiBzdHJpbmcgPSAnZHVyYWNpb25Fc3R1ZGlvcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIEJVREdFVF9UT0tFTlNfRklOQU5DSU5HX0RVUkFUSU9OOiBzdHJpbmcgPSAnZHVyYWNpb25GaW5hbmNpYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OOiBzdHJpbmcgPSAnY29kaWdvVmVyaWZpY2FjaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfQV9RVUlFTl9WQV9ESVJJR0lETzogc3RyaW5nID0gJ2FRdWllblZhRGlyaWdpZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9GRUNIQV9BQ1RVQUw6IHN0cmluZyA9ICdmZWNoYUFjdHVhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1NUQVRVU19OQU1FOiBzdHJpbmcgPSAnc3RhdHVzTmFtZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUjogc3RyaW5nID0gJ3BsaVBhdHJvY2luYWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUl9DT1JUTzogc3RyaW5nID0gJ3BsaVBhdHJvY2luYWRvckNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfUFJPR1JBTUE6IHN0cmluZyA9ICdwbGlQcm9ncmFtYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST0dSQU1BX0NPUlRPOiBzdHJpbmcgPSAncGxpUHJvZ3JhbWFDb3J0byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTjogc3RyaW5nID0gJ3BsaVByb21vY2lvbic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTl9DT1JUTzogc3RyaW5nID0gJ3BsaVByb21vY2lvbkNvcnRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfQU5JT19QUk9NT0NJT046IHN0cmluZyA9ICdhbmlvUHJvbW9jaW9uJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfSVNPX01PTkVEQV9CQVNFOiBzdHJpbmcgPSAnaXNvTW9uZWRhQmFzZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTzogc3RyaW5nID0gJ3NhbHVkb0NvbXBsZW1lbnRhcmlvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OOiBzdHJpbmcgPSAnbnVtZXJvUmFkaWNhZG8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTOiBzdHJpbmcgPSAnaW5pY2lhbGVzVXN1YXJpbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfS0VZX0xFVFRFUl9TSUdOOiBzdHJpbmcgPSAnZmlybWFDYXJ0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX05BTUU6IHN0cmluZyA9ICdjb21pdGVOb21icmUnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9TRUdNRU5UQVRJT046IHN0cmluZyA9ICdjb21pdGVTZWdtZW50YWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTjogc3RyaW5nID0gJ2NvbWl0ZUFncnVwYWNpb24nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9DVVRMSU5FX0RBVEU6IHN0cmluZyA9ICdjb21pdGVGZWNoYUxpbmVhJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT05GSVJNX0xFR0FMSVpBVElPTl9BUFBPSU5UTUVOVDogc3RyaW5nID0gJ2NvbmZpcm1hY2lvbkNpdGEnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX05VTUJFUjogc3RyaW5nID0gJ251bWVyb0RvY3VtZW50b0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9ET0NVTUVOVF9UWVBFOiBzdHJpbmcgPSAndGlwb0RvY3VtZW50b0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9OQU1FOiBzdHJpbmcgPSAnbm9tYnJlc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9MQVNUTkFNRTogc3RyaW5nID0gJ2FwZWxsaWRvc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19UWVBFX0NPREVCVE9SOiBzdHJpbmcgPSAndGlwb1BlcnNvbmFDb2RldWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfUkVWSUVXRVI6IHN0cmluZyA9ICdyZXZpc29yQ29kZXVkb3Jlcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfVE9UQUxfV0VJR0hURUQ6IHN0cmluZyA9ICdwb25kZXJhZG9Ub3RhbCc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09OU0VDVVRJVkVfR1VBUkFOVEVFOiBzdHJpbmcgPSAnY29uc2VjdXRpdm9HYXJhbnRpYXMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX0RBWTogc3RyaW5nID0gJ2RpYSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfTU9OVEg6IHN0cmluZyA9ICdtZXMnO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1lFQVI6IHN0cmluZyA9ICdhbm8nO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX05BTUU6IHN0cmluZyA9ICdub21icmVzUmVwcmVzZW50YW50ZSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTEFTVE5BTUU6IHN0cmluZyA9ICdhcGVsbGlkb3NSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9ET0NVTUVOVF9OVU1CRVI6IHN0cmluZyA9ICdjZWR1bGFSZXByZXNlbnRhbnRlJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DSVRZX1NJR05BVFVSRTogc3RyaW5nID0gJ2NpdWRhZEZpcm1hJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19VU0VSX1RZUEVfQ1JFRElUX1NUVURZOiBzdHJpbmcgPSAndGlwb1VzdWFyaW9Fc3R1ZGlvQ3JlZGl0byc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFk6IHN0cmluZyA9ICdjYW50aWRhZFZlaGljdWxvc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19DT0RFQlRPUl9BU1NFVFNfUVVBTlRJVFk6IHN0cmluZyA9ICdjYW50aWRhZEJpZW5lc0NvZGV1ZG9yJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19MSVNUX0NPREVCVE9SUzogc3RyaW5nID0gJ2xpc3RhQ29kZXVkb3Jlcyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9JTkdSRVNPX0NPREVVRE9SX0hBQkVBU19EQVRBOiBzdHJpbmcgPSAnaW5ncmVzb0NvZGV1ZG9ySGFiZWFzRGF0YSc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9QREZfUkVTVU1FTl9DT0RFVURPUjogc3RyaW5nID0gJ3BkZlJlc3VtZW5Db2RldWRvcic7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfVkVISUNMRV9CRU5FRklDSUFSWTogc3RyaW5nID0gJ2NhbnRpZGFkVmVoaWN1bG9zU2VsZWNjaW9uYWRvJztcclxuXHQvKiogKi9cclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOU19RVUFOVElUWV9BU1NFVFNfQkVORUZJQ0lBUlk6IHN0cmluZyA9ICdjYW50aWRhZEJpZW5lc1NlbGVjY2lvbmFkbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTzogc3RyaW5nID0gJ2JlbkNvZGlnbyc7XHJcblx0LyoqICovXHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TX0NPREVCVE9SOiBzdHJpbmcgPVxyXG5cdFx0J2NyZWRpdFJldmlld2VyT2JzZXJ2YXRpb25zQ29kZWJ0b3InO1xyXG5cdC8qKiAqL1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fQ1JFRElUX1JFVklFV0VSX09CU0VSVkFUSU9OUzogc3RyaW5nID0gJ2NyZWRpdFJldmlld2VyT2JzZXJ2YXRpb25zJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX1RBR19OQU1FOiBzdHJpbmcgPSAndGFnTmFtZSc7XHJcblx0c3RhdGljIFNUQVRJQ19UT0tFTl9OQU1FX1JFVklFV0VSX1RBU0sgPSAnbmFtZVJldml3ZXJUYXNrJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOX0xBU1RfTkFNRV9SRVZJRVdFUl9UQVNLID0gJ2xhc3ROYW1lUmV2aXdlclRhc2snO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fVEFTS19UT1RBTF9BU1NJR05FRF9UT19SRVZJRVdFUiA9ICd0YXNrVG90YWxBc3NpZ25lZFRvUmV2aWV3ZXInO1xyXG5cdHN0YXRpYyBTVEFUSUNfVE9LRU5fU1VSTkFNRSA9ICdzdXJuYW1lJztcclxuXHRzdGF0aWMgU1RBVElDX1RPS0VOUzogYW55W10gPSBbXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BBVFJPQ0lOQURPUixcclxuXHRcdFx0bGFiZWw6ICdQYXRyb2NpbmFkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9QUk9HUkFNQSxcclxuXHRcdFx0bGFiZWw6ICdQcm9ncmFtYSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1BST01PQ0lPTixcclxuXHRcdFx0bGFiZWw6ICdQcm9tb2Npw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfQU5JT19QUk9NT0NJT04sXHJcblx0XHRcdGxhYmVsOiAnQcOxbyBwcm9tb2Npw7NuJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfSVNPX01PTkVEQV9CQVNFLFxyXG5cdFx0XHRsYWJlbDogJ0lTTyBNb25lZGEgYmFzZSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX1NBTFVET19DT01QTEVNRU5UQVJJTyxcclxuXHRcdFx0bGFiZWw6ICdTYWx1ZG8gY29tcGxlbWVudGFyaW8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9DT0RJR09fVkVSSUZJQ0FDSU9OLFxyXG5cdFx0XHRsYWJlbDogJ0PDs2RpZ28gZGUgdmVyaWZpY2FjacOzbidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0FfUVVJRU5fVkFfRElSSUdJRE8sXHJcblx0XHRcdGxhYmVsOiAnQSBxdWllbiB2YSBkaXJpZ2lkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfS0VZX0ZFQ0hBX0FDVFVBTCxcclxuXHRcdFx0bGFiZWw6ICdGZWNoYSBhY3R1YWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9TVEFUVVNfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdFc3RhZG8gYWN0dWFsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTlVNQkVSX0FQUExJQ0FUSU9OLFxyXG5cdFx0XHRsYWJlbDogJ07Dum1lcm8gcmFkaWNhZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0tFWV9VU0VSX0lOSVRJQUxTLFxyXG5cdFx0XHRsYWJlbDogJ0luaWNpYWxlcyBkZSB1c3VhcmlvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19LRVlfTEVUVEVSX1NJR04sXHJcblx0XHRcdGxhYmVsOiAnRmlybWEgZGUgY2FydGFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmUgY29taXTDqSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09NTUlUVEVFX1NFR01FTlRBVElPTixcclxuXHRcdFx0bGFiZWw6ICdTZWdtZW50YWNpw7NuIGNvbWl0w6knXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPTU1JVFRFRV9BR0dSVVBBVElPTixcclxuXHRcdFx0bGFiZWw6ICdBZ3J1cGFjacOzbiBjb21pdMOpJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT01NSVRURUVfQ1VUTElORV9EQVRFLFxyXG5cdFx0XHRsYWJlbDogJ0ZlY2hhIEzDrW5lYSBkZSBjb3J0ZSdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ORklSTV9MRUdBTElaQVRJT05fQVBQT0lOVE1FTlQsXHJcblx0XHRcdGxhYmVsOiAnQ29uZmlybWFjacOzbiBkZSBjaXRhJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9ET0NVTUVOVF9OVU1CRVIsXHJcblx0XHRcdGxhYmVsOiAnTsO6bWVybyBkZSBkb2N1bWVudG8gZGUgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0RPQ1VNRU5UX1RZUEUsXHJcblx0XHRcdGxhYmVsOiAnVGlwbyBkZSBkb2N1bWVudG8gZGUgY29kZXVkb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlcyBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfTEFTVE5BTUUsXHJcblx0XHRcdGxhYmVsOiAnQXBlbGxpZG9zIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19UWVBFX0NPREVCVE9SLFxyXG5cdFx0XHRsYWJlbDogJ1RpcG8gZGUgcGVyc29uYSBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgdmVoaWN1bG9zIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9BU1NFVFNfUVVBTlRJVFksXHJcblx0XHRcdGxhYmVsOiAnQ2FudGlkYWQgYmllbmVzIGNvZGV1ZG9yJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DT0RFQlRPUl9SRVZJRVdFUixcclxuXHRcdFx0bGFiZWw6ICdSZXZpc29yIGRlIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1RPVEFMX1dFSUdIVEVELFxyXG5cdFx0XHRsYWJlbDogJ1BvbmRlcmFkbyB0b3RhbCdcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09OU0VDVVRJVkVfR1VBUkFOVEVFLFxyXG5cdFx0XHRsYWJlbDogJ0NvbnNlY3V0aXZvIGRlIGdhcmFudGlhcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUkVQUkVTRU5UQVRJVkVfTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdOb21icmVzIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1JFUFJFU0VOVEFUSVZFX0xBU1ROQU1FLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvcyByZXByZXNlbnRhbnRlIGxlZ2FsJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19SRVBSRVNFTlRBVElWRV9ET0NVTUVOVF9OVU1CRVIsXHJcblx0XHRcdGxhYmVsOiAnQ2VkdWxhIHJlcHJlc2VudGFudGUgbGVnYWwnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1VTRVJfVFlQRV9DUkVESVRfU1RVRFksXHJcblx0XHRcdGxhYmVsOiAnVGlwbyB1c3VhcmlvIGVzdHVkaW8gY3LDqWRpdG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0RBWSxcclxuXHRcdFx0bGFiZWw6ICdEaWEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX01PTlRILFxyXG5cdFx0XHRsYWJlbDogJ01lcydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfWUVBUixcclxuXHRcdFx0bGFiZWw6ICdBw7FvJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOU19DSVRZX1NJR05BVFVSRSxcclxuXHRcdFx0bGFiZWw6ICdDaXVkYWQgZGUgbGEgZmlybWEnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0xJU1RfQ09ERUJUT1JTLFxyXG5cdFx0XHRsYWJlbDogJ0xpc3RhIGRlIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fSU5HUkVTT19DT0RFVURPUl9IQUJFQVNfREFUQSxcclxuXHRcdFx0bGFiZWw6ICdJbmdyZXNvIENvZGV1ZG9yIEhhYmVhcyBEYXRhJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX1BERl9SRVNVTUVOX0NPREVVRE9SLFxyXG5cdFx0XHRsYWJlbDogJ1BkZiBjb2RldWRvcidcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfUVVBTlRJVFlfVkVISUNMRV9CRU5FRklDSUFSWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBkZSB2ZWjDrWN1bG9zIGRlbCBzZWxlY2Npb25hZG8nXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX1FVQU5USVRZX0FTU0VUU19CRU5FRklDSUFSWSxcclxuXHRcdFx0bGFiZWw6ICdDYW50aWRhZCBiaWVuZXMgZGVsIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQkVOX0NPRElHTyxcclxuXHRcdFx0bGFiZWw6ICdDw7NkaWdvIGJlbmVmaWNpYXJpbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TLFxyXG5cdFx0XHRsYWJlbDogJ09ic2VydmFjaW9uZXMgcmV2aXNvciBmaW5hbmNpZXJvIHNlbGVjY2lvbmFkbydcclxuXHRcdH0sXHJcblx0XHR7XHJcblx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9DUkVESVRfUkVWSUVXRVJfT0JTRVJWQVRJT05TX0NPREVCVE9SLFxyXG5cdFx0XHRsYWJlbDogJ09ic2VydmFjaW9uZXMgcmV2aXNvciBmaW5hbmNpZXJvIGNvZGV1ZG9yZXMnXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fVEFHX05BTUUsXHJcblx0XHRcdGxhYmVsOiAnTm9tYnJlIGRlbCB0YWcnXHJcblx0XHR9LFxyXG5cdFx0eyBrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fTkFNRV9SRVZJRVdFUl9UQVNLLCBsYWJlbDogJ05vbWJyZSByZXZpc29yIHRhcmVhcycgfSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX0xBU1RfTkFNRV9SRVZJRVdFUl9UQVNLLFxyXG5cdFx0XHRsYWJlbDogJ0FwZWxsaWRvIHJldmlzb3IgdGFyZWFzJ1xyXG5cdFx0fSxcclxuXHRcdHtcclxuXHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuU1RBVElDX1RPS0VOX1RBU0tfVE9UQUxfQVNTSUdORURfVE9fUkVWSUVXRVIsXHJcblx0XHRcdGxhYmVsOiAnVG90YWwgdGFyZWFzIGFzaWduYWRhcyBhIHJldmlzb3InXHJcblx0XHR9LFxyXG5cdFx0e1xyXG5cdFx0XHRrZXk6IFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5fU1VSTkFNRSxcclxuXHRcdFx0bGFiZWw6ICdBcGVsbGlkb3MgY2FuZGlkYXRvJ1xyXG5cdFx0fVxyXG5cdF07XHJcblxyXG5cdHN0YXRpYyBleGNsdWRlZFRva2VuID0gW1xyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfVVNFUl9UWVBFX0NSRURJVF9TVFVEWS50b0xvd2VyQ2FzZSgpLFxyXG5cdFx0VG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTlNfQ09ERUJUT1JfVkVISUNMRVNfUVVBTlRJVFkudG9Mb3dlckNhc2UoKSxcclxuXHRcdFRva2VuU2VydmljZS5TVEFUSUNfVE9LRU5TX0NPREVCVE9SX0FTU0VUU19RVUFOVElUWS50b0xvd2VyQ2FzZSgpXHJcblx0XTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcblx0XHRwcml2YXRlIGZvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSxcclxuXHRcdHByaXZhdGUgY3VycmVuY3lQaXBlOiBDdXJyZW5jeVBpcGVcclxuXHQpIHt9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1GaWVsZHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1GaWVsZHNUb2tlbjogYW55W10gPSBudWxsO1xyXG5cdFx0XHR0aGlzLmZvcm1TZXJ2aWNlLmdldEJ5UHJvbUNvZGlnbyhwcm9tQ29kaWdvKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChhcnJheUZvcm1zOiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGlmIChhcnJheUZvcm1zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBmb3JtcyBvZiBhcnJheUZvcm1zKSB7XHJcblx0XHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHMgPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cy5wdXNoKC4uLkZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3Jtcy5jb21wb25lbnRzKSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChmb3Jtcy5jb21wb25lbnRzICYmIGZvcm1zLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb21wb25lbnRzIG9mIGZvcm1zLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudHMuY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgY29tcG9uZW50IG9mIGNvbXBvbmVudHMuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb2x1bW5zICYmIGNvbXBvbmVudC5jb2x1bW5zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjQ29tcG9uZW50cyBvZiBjb21wb25lbnQuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMgJiZcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNDb21wb25lbnRzLmNvbXBvbmVudHMubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVyYXRvciBvZiBjQ29tcG9uZW50cy5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChpdGVyYXRvci50eXBlID09PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgaXRlcmF0b3IuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSBhcnJheUZvcm1zO1xyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHQhZm9ybSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXSB8fFxyXG5cdFx0XHRcdFx0XHQhZm9ybVswXS5wcm9tQ29kaWdvIHx8XHJcblx0XHRcdFx0XHRcdGZvcm1bMF0ucHJvbUNvZGlnbyAhPSBwcm9tQ29kaWdvXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWyc0MDQnXSk7XHJcblx0XHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbi5wdXNoKHtcclxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGtleTogVG9rZW5TZXJ2aWNlLmdldEtleUZvcm11bGFyaW8oZm9ybUNvbXAudGl0bGUpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogZm9ybUNvbXAudGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG9iamVjdDogZm9ybUNvbXBcclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZTogW11cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuW2xGb3JtRmllbGRzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRDb21wb25lbmV0Rm9ybShcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdG51bGxcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1GaWVsZHNUb2tlbik7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdGdldEZvcm1GaWVsZHNCeUZvcm1JZChmb3JtSWQ6IHN0cmluZyk6IFByb21pc2U8YW55W10+IHtcclxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHRcdC8vIFNlYXJjaCB0aGUgZHluYW1pYyBmb3JtXHJcblx0XHRcdGxldCBsRm9ybUZpZWxkc1Rva2VuOiBhbnlbXSA9IG51bGw7XHJcblx0XHRcdHRoaXMuZm9ybVNlcnZpY2UuZ2V0QnlJZChmb3JtSWQpLnN1YnNjcmliZShcclxuXHRcdFx0XHQocmVzdWx0OiBhbnkpID0+IHtcclxuXHRcdFx0XHRcdGxldCBmb3JtOiBhbnkgPSByZXN1bHQ7XHJcblx0XHRcdFx0XHRpZiAoIWZvcm0gfHwgIWZvcm1bMF0pIHtcclxuXHRcdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4gPSBbXTtcclxuXHRcdFx0XHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRcdFx0bGV0IGNvbXBvbmVudHM6IGFueVtdID0gW107XHJcblx0XHRcdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb2x1bW5zO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChuZXdDb21wb25lbnRzICYmIFV0aWxTdHJpbmcuaXNWYWxpZChmb3JtQ29tcC50aXRsZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRsRm9ybUZpZWxkc1Rva2VuLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdFx0dGl0bGU6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0a2V5OiBUb2tlblNlcnZpY2UuZ2V0S2V5Rm9ybXVsYXJpbyhmb3JtQ29tcC50aXRsZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBmb3JtQ29tcC50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0OiBmb3JtQ29tcFxyXG5cdFx0XHRcdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBbXVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW5bbEZvcm1GaWVsZHNUb2tlbi5sZW5ndGggLSAxXS52YWx1ZSA9XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRudWxsLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0bnVsbFxyXG5cdFx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmVzb2x2ZShsRm9ybUZpZWxkc1Rva2VuKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKiBUaGlzIHByb21pc2UgYWxsb3dzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiB3aGVuIGNvbnN1bHRpbmcgdGhlIGZvcm0gZmllbGRzLiAqL1xyXG5cdGdldEZvcm1QYW5lbHNCeVByb21Db2RlKHByb21Db2RpZ28pOiBQcm9taXNlPGFueVtdPiB7XHJcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggdGhlIGR5bmFtaWMgZm9ybVxyXG5cdFx0XHRsZXQgbEZvcm1QYW5uZWxzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtUGFubmVsc1Rva2VuKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxGb3JtUGFubmVsc1Rva2VuID0gW107XHJcblx0XHRcdFx0XHRmb3IgKGxldCBmb3JtQ29tcCBvZiBmb3JtKSB7XHJcblx0XHRcdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0XHRcdGxldCBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xyXG5cdFx0XHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbHVtbnMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRpZiAobmV3Q29tcG9uZW50cyAmJiBVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybUNvbXAudGl0bGUpKSB7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1QYW5uZWxzVG9rZW5bbEZvcm1QYW5uZWxzVG9rZW4ubGVuZ3RoIC0gMV0udmFsdWUgPVxyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRQYW5lbENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgbnVsbCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc29sdmUobEZvcm1QYW5uZWxzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0bGV0IG5ld0NvbXBvbmVudHM6IGFueTtcclxuXHRcdFx0XHRpZiAoZm9ybUNvbXAuY29tcG9uZW50cykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbXBvbmVudHM7XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29tcG9uZW50cyA9IHRoaXMuZ2V0UGFuZWxDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIHBhbmVsTmFtZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBjb21wb25lbnRzIGEgY29sdW1ucyBvZiB0aGUgZHluYW1pYyBmb3JtXHJcblx0ICogQHBhcmFtIGNvbXBvbmVudHNcclxuXHQgKiBAcGFyYW0gZm9ybVxyXG5cdCAqL1xyXG5cdGdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0Y29tcG9uZW50czogYW55W10sXHJcblx0XHRmb3JtOiBhbnksXHJcblx0XHRwYW5lbE5hbWU6IHN0cmluZyxcclxuXHRcdGVkaXRncmlkOiBib29sZWFuLFxyXG5cdFx0ZWRpdEdyaWRLZXk6IHN0cmluZ1xyXG5cdCk6IGFueVtdIHtcclxuXHRcdGZvciAobGV0IGZvcm1Db21wIG9mIGZvcm0pIHtcclxuXHRcdFx0Ly9NTy0gIG1hbnRpcyA4NzQzIGZpeCBhZGRyZXNzIHRva2VuXHJcblx0XHRcdGlmICgoZm9ybUNvbXAuY29tcG9uZW50cyB8fCBmb3JtQ29tcC5jb2x1bW5zKSAmJiBmb3JtQ29tcC50eXBlICE9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC5jb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlID09PSAnZWRpdGdyaWQnKSB7XHJcblx0XHRcdFx0XHRcdGVkaXRncmlkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0ZWRpdEdyaWRLZXkgPSBmb3JtQ29tcC5rZXk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29sdW1ucztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLnR5cGUgJiYgZm9ybUNvbXAudHlwZSA9PT0gJ3BhbmVsJykge1xyXG5cdFx0XHRcdFx0cGFuZWxOYW1lID0gZm9ybUNvbXAudGl0bGU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGNvbXBvbmVudHMgPSB0aGlzLmdldENvbXBvbmVuZXRGb3JtKFxyXG5cdFx0XHRcdFx0Y29tcG9uZW50cyxcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRwYW5lbE5hbWUsXHJcblx0XHRcdFx0XHRlZGl0Z3JpZCxcclxuXHRcdFx0XHRcdGVkaXRHcmlkS2V5XHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3JtQ29tcC5wYW5lbE5hbWUgPSBwYW5lbE5hbWU7XHJcblx0XHRcdFx0Zm9ybUNvbXAuZWRpdGdyaWQgPSBlZGl0Z3JpZDtcclxuXHRcdFx0XHRmb3JtQ29tcC5lZGl0R3JpZEtleSA9IGVkaXRHcmlkS2V5O1xyXG5cdFx0XHRcdGNvbXBvbmVudHMucHVzaChmb3JtQ29tcCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBjb21wb25lbnRzO1xyXG5cdH1cclxuXHJcblx0LyoqIFRoaXMgcHJvbWlzZSBhbGxvd3MgdG8gZXhlY3V0ZSBhIGZ1bmN0aW9uIHdoZW4gY29uc3VsdGluZyB0aGUgZm9ybSBmaWVsZHMuICovXHJcblx0Z2V0Rm9ybUVkaXRHcmlkRmllbGRzQnlQcm9tQ29kZShwcm9tQ29kaWdvKTogUHJvbWlzZTxhbnlbXT4ge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHRcdFx0Ly8gU2VhcmNoIHRoZSBkeW5hbWljIGZvcm1cclxuXHRcdFx0bGV0IGxGb3JtRmllbGRzVG9rZW46IGFueVtdID0gbnVsbDtcclxuXHRcdFx0dGhpcy5mb3JtU2VydmljZS5nZXRCeVByb21Db2RpZ28ocHJvbUNvZGlnbykuc3Vic2NyaWJlKFxyXG5cdFx0XHRcdChyZXN1bHQ6IGFueSkgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGZvcm06IGFueSA9IHJlc3VsdDtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0IWZvcm0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0gfHxcclxuXHRcdFx0XHRcdFx0IWZvcm1bMF0ucHJvbUNvZGlnbyB8fFxyXG5cdFx0XHRcdFx0XHRmb3JtWzBdLnByb21Db2RpZ28gIT0gcHJvbUNvZGlnb1xyXG5cdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnNDA0J10pO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbiA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRcdFx0XHRsZXQgbmV3Q29tcG9uZW50czogYW55O1xyXG5cdFx0XHRcdFx0XHRsZXQgY29tcG9uZW50czogYW55W10gPSBbXTtcclxuXHRcdFx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRuZXdDb21wb25lbnRzID0gZm9ybUNvbXAuY29tcG9uZW50cztcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtQ29tcC5jb2x1bW5zKSB7XHJcblx0XHRcdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKG5ld0NvbXBvbmVudHMgJiYgVXRpbFN0cmluZy5pc1ZhbGlkKGZvcm1Db21wLnRpdGxlKSkge1xyXG5cdFx0XHRcdFx0XHRcdGxGb3JtRmllbGRzVG9rZW4ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0XHR0aXRsZToge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRrZXk6IFRva2VuU2VydmljZS5nZXRLZXlGb3JtdWxhcmlvKGZvcm1Db21wLnRpdGxlKSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFsdWU6IGZvcm1Db21wLnRpdGxlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvYmplY3Q6IGZvcm1Db21wXHJcblx0XHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWU6IFtdXHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0bEZvcm1GaWVsZHNUb2tlbltsRm9ybUZpZWxkc1Rva2VuLmxlbmd0aCAtIDFdLnZhbHVlID1cclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHMsIG5ld0NvbXBvbmVudHMsIG51bGwpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXNvbHZlKGxGb3JtRmllbGRzVG9rZW4pO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQSByZWN1cnNpdmUgbWV0aG9kIHRvIGdldCBhbGwgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBlZGl0R3JpZCBkeW5hbWljIGZvcm1cclxuXHQgKiBAcGFyYW0gY29tcG9uZW50c1xyXG5cdCAqIEBwYXJhbSBmb3JtXHJcblx0ICovXHJcblx0Z2V0RWRpdEdyaWRDb21wb25lbmV0KGNvbXBvbmVudHM6IGFueVtdLCBmb3JtOiBhbnksIHBhbmVsTmFtZTogc3RyaW5nKTogYW55W10ge1xyXG5cdFx0Zm9yIChsZXQgZm9ybUNvbXAgb2YgZm9ybSkge1xyXG5cdFx0XHRpZiAoZm9ybUNvbXAudHlwZSA9PT0gJ2VkaXRncmlkJykge1xyXG5cdFx0XHRcdGZvcm1Db21wLnBhbmVsTmFtZSA9IHBhbmVsTmFtZTtcclxuXHRcdFx0XHRjb21wb25lbnRzLnB1c2goZm9ybUNvbXApO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGZvcm1Db21wLmNvbXBvbmVudHMgfHwgZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdGxldCBuZXdDb21wb25lbnRzOiBhbnk7XHJcblx0XHRcdFx0aWYgKGZvcm1Db21wLmNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdG5ld0NvbXBvbmVudHMgPSBmb3JtQ29tcC5jb21wb25lbnRzO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZm9ybUNvbXAuY29sdW1ucykge1xyXG5cdFx0XHRcdFx0bmV3Q29tcG9uZW50cyA9IGZvcm1Db21wLmNvbHVtbnM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChmb3JtQ29tcC50eXBlICYmIGZvcm1Db21wLnR5cGUgPT09ICdwYW5lbCcpIHtcclxuXHRcdFx0XHRcdHBhbmVsTmFtZSA9IGZvcm1Db21wLnRpdGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb21wb25lbnRzID0gdGhpcy5nZXRFZGl0R3JpZENvbXBvbmVuZXQoY29tcG9uZW50cywgbmV3Q29tcG9uZW50cywgcGFuZWxOYW1lKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGNvbXBvbmVudHM7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgdG9rZW5zIGJ5IHByb21Db2RpZ28gKi9cclxuXHRnZXRMaXN0QnlQcm9tQ29kaWdvKHByb21Db2RlOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vZ2V0QnlQcm9tQ29kaWdvJyxcclxuXHRcdFx0eyBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KCdwcm9tQ29kaWdvJywgcHJvbUNvZGUudG9TdHJpbmcoKSkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCByZXR1cm5zIHRoZSB0b2tlbiBieSBpZCAqL1xyXG5cdGdldEJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldCh0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2dldEJ5SWQnLCB7XHJcblx0XHRcdHBhcmFtczogbmV3IEh0dHBQYXJhbXMoKS5zZXQoJ2lkJywgaWQudG9TdHJpbmcoKSlcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IGRlbGV0ZXMgYSBmb3JtIGJ5IGlkICovXHJcblx0ZGVsZXRlKGlkKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZGVsZXRlKFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2RlbGV0ZScsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWQnLCBpZCkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzYXZlcyB0aGUgdG9rZW4gKi9cclxuXHRzYXZlKHRva2VuOiBUb2tlbik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3QoXHJcblx0XHRcdHRoaXMuZW52aXJvbm1lbnQuaG9zdC5iYWNrZW5kLmNvbmZpZ3VyYXRpb24gKyAndG9rZW4vc2F2ZScsXHJcblx0XHRcdHRva2VuLFxyXG5cdFx0XHRIRUFERVJfSlNPTlxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlGb3JtdWxhcmlvKGZvcm1UaXRsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGlmIChVdGlsU3RyaW5nLmlzVmFsaWQoZm9ybVRpdGxlKSkge1xyXG5cdFx0XHRyZXR1cm4gKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STSkgK1xyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhmb3JtVGl0bGUpLnJlcGxhY2UoL18vZywgJy0nKVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuICcnO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHVuaXF1ZSB2ZXJpZmljYXRpb24gY29kZSAqL1xyXG5cdGdldFVuaXF1ZVZlcmlmaWNhdGlvbkNvZGUobG9naW46IHN0cmluZywgdG9rZW46IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuZG9jdW1lbnRzUmVwb3NpdG9yeSArXHJcblx0XHRcdFx0J2RvY3VtZW50by9jb25zdWx0YXJDb2RpZ29Vbmljby8nICtcclxuXHRcdFx0XHRsb2dpbiArXHJcblx0XHRcdFx0Jy8nICtcclxuXHRcdFx0XHR0b2tlbixcclxuXHRcdFx0eyBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzZW5kIHRoZSBpbmZvcm1hdGlvbiB0byBjb3B5IHRoZSBEb2N1bWVudCB2aWV3ZXIgKi9cclxuXHRjb3B5RG9jdW1lbnRJbmZvcm1hdGlvblZpZXdlcihcclxuXHRcdGxvZ2luOiBzdHJpbmcsXHJcblx0XHR0b2tlbjogc3RyaW5nLFxyXG5cdFx0dW5pcXVlQ29kZTogc3RyaW5nLFxyXG5cdFx0ZG9jdW1lbnRVUkw6IHN0cmluZyxcclxuXHRcdGRvY3VtZW50TmFtZTogc3RyaW5nXHJcblx0KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCBpbmZvRG9jdW1lbnRvID0ge1xyXG5cdFx0XHRjb2RpZ29VbmljbzogdW5pcXVlQ29kZSxcclxuXHRcdFx0cnV0YURvY3VtZW50bzogZG9jdW1lbnRVUkwsXHJcblx0XHRcdGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lXHJcblx0XHR9O1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5kb2N1bWVudHNSZXBvc2l0b3J5ICtcclxuXHRcdFx0XHQnZG9jdW1lbnRvL2FkaWNpb25hckRvY3VtZW50by8nICtcclxuXHRcdFx0XHRsb2dpbiArXHJcblx0XHRcdFx0Jy8nICtcclxuXHRcdFx0XHR0b2tlbixcclxuXHRcdFx0aW5mb0RvY3VtZW50byxcclxuXHRcdFx0SEVBREVSX0pTT05cclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5QnVkZ2V0KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleURvY3VtZW50KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9ET0NVTUVOVE8pO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleURvY3VtZW50QW5hbHlzaXMoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0RPQ1VNRU5UT19BTkFMWVNJU19UWVBFKTtcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBnZXRLZXlUYXNrKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9UQVNLTCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5U3RhdGljKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUMpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUNhbGN1bGF0ZWQodG9rZW46IFRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfQ0FMQ1VMQVRFRCkgK1xyXG5cdFx0XHQnXycgK1xyXG5cdFx0XHRVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnModG9rZW4ubmFtZSlcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHRzdGF0aWMgZ2V0S2V5U25hcHNob3QodG9rZW46IFRva2VuKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiAoXHJcblx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfU05BUFNIT1QpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0c3RhdGljIGdldEtleUd1YXJhbnRlZSh0b2tlbjogUGxpQ25mR3VhcmFudGVlVG9rZW4pOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIChcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9HVUFSQU5URUUpICtcclxuXHRcdFx0J18nICtcclxuXHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKHRva2VuLm5hbWUpXHJcblx0XHQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJuIGEgdmFsdWUgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgbGFiZWw6IDE9Rm9ybSwgMj1CdWRnZXQsIDM9U3RhdGljLCA0PUNhbGN1bGF0ZWRcclxuXHQgKiBAcGFyYW0ga2V5IFZhbHVlIHRvIGV2YWx1ZWF0ZVxyXG5cdCAqL1xyXG5cdHN0YXRpYyBnZXRLZXlUeXBlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdGtleSA9IGtleS5yZXBsYWNlKCd7JywgJycpLnJlcGxhY2UoJ30nLCAnJyk7XHJcblx0XHRrZXkgPSBrZXkuc3Vic3RyaW5nKDEsIGtleS5pbmRleE9mKCdfJykpO1xyXG5cdFx0aWYgKGtleS5zdGFydHNXaXRoKFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fTEFCRUxfRk9STSkpKSB7XHJcblx0XHRcdHJldHVybiAxO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9CVURHRVQpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiAyO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoVXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9TVEFUSUMpKVxyXG5cdFx0KSB7XHJcblx0XHRcdHJldHVybiAzO1xyXG5cdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0a2V5LnN0YXJ0c1dpdGgoXHJcblx0XHRcdFx0VXRpbFN0cmluZy5yZXBsYWNlQWNjZW50U3BhY2VzT3RoZXJzKFRva2VuU2VydmljZS5UT0tFTl9MQUJFTF9DQUxDVUxBVEVEKVxyXG5cdFx0XHQpXHJcblx0XHQpIHtcclxuXHRcdFx0cmV0dXJuIDQ7XHJcblx0XHR9IGVsc2UgaWYgKFxyXG5cdFx0XHRrZXkuc3RhcnRzV2l0aChVdGlsU3RyaW5nLnJlcGxhY2VBY2NlbnRTcGFjZXNPdGhlcnMoVG9rZW5TZXJ2aWNlLlRPS0VOX0xBQkVMX1RBU0tMKSlcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gNTtcclxuXHRcdH0gZWxzZSBpZiAoXHJcblx0XHRcdGtleS5zdGFydHNXaXRoKFxyXG5cdFx0XHRcdFV0aWxTdHJpbmcucmVwbGFjZUFjY2VudFNwYWNlc090aGVycyhUb2tlblNlcnZpY2UuVE9LRU5fRE9DVU1FTlRPX0FOQUxZU0lTX1RZUEUpXHJcblx0XHRcdClcclxuXHRcdCkge1xyXG5cdFx0XHRyZXR1cm4gNjtcclxuXHRcdH1cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVwZW5kcyBvZiB0aGUgdHlwZSBvZiBmb3JtRmllbGRUb2tlbiByZXR1cm4gZGUgdmFsdWUgb2YgdGhlIHZhbHVlRGF0YVxyXG5cdCAqIEBwYXJhbSBmb3JtRmllbGRUb2tlblxyXG5cdCAqIEBwYXJhbSB2YWx1ZURhdGFcclxuXHQgKi9cclxuXHRnZXRWYWx1ZUZyb21Gb3JtRmllbGQoZm9ybUZpZWxkVG9rZW46IGFueSwgdmFsdWVEYXRhOiBhbnkpOiBhbnkge1xyXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZURhdGEgPT0gJ29iamVjdCcpIHtcclxuXHRcdFx0aWYgKGZvcm1GaWVsZFRva2VuLnR5cGUpIHtcclxuXHRcdFx0XHRpZiAoZm9ybUZpZWxkVG9rZW4udHlwZSA9PSAnYWRkcmVzcycpIHtcclxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZURhdGEuZm9ybWF0dGVkX2FkZHJlc3M7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdGZvcm1GaWVsZFRva2VuLnR5cGUgPT0gJ3NlbGVjdCcgJiZcclxuXHRcdFx0XHRcdHZhbHVlRGF0YS5oYXNPd25Qcm9wZXJ0eShmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdGlmICh2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoJ29yaWdpbmFsX25hbWUnKSAhPT0gJycpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5vcmlnaW5hbF9uYW1lO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZURhdGEuaGFzT3duUHJvcGVydHkoJ25hdGl2ZU5hbWUnKSAhPT0gJycpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlRGF0YS5uYXRpdmVOYW1lO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChmb3JtRmllbGRUb2tlbi5zZWFyY2hGaWVsZCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWVEYXRhW2Zvcm1GaWVsZFRva2VuLnNlYXJjaEZpZWxkXTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZURhdGE7XHJcblx0fVxyXG5cdGZvcm1hdERhdGUodmFsdWU6IERhdGUsIGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcblxyXG5cdFx0Y29uc3QgbW9udGhzID0ge1xyXG5cdFx0XHRlczogW1xyXG5cdFx0XHRcdCdlbmVybycsXHJcblx0XHRcdFx0J2ZlYnJlcm8nLFxyXG5cdFx0XHRcdCdtYXJ6bycsXHJcblx0XHRcdFx0J2FicmlsJyxcclxuXHRcdFx0XHQnbWF5bycsXHJcblx0XHRcdFx0J2p1bmlvJyxcclxuXHRcdFx0XHQnanVsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXB0aWVtYnJlJyxcclxuXHRcdFx0XHQnb2N0dWJyZScsXHJcblx0XHRcdFx0J25vdmllbWJyZScsXHJcblx0XHRcdFx0J2RpY2llbWJyZSdcclxuXHRcdFx0XSxcclxuXHRcdFx0ZW46IFtcclxuXHRcdFx0XHQnSmFudWFyeScsXHJcblx0XHRcdFx0J0ZlYnJ1YXJ5JyxcclxuXHRcdFx0XHQnTWFyY2gnLFxyXG5cdFx0XHRcdCdBcHJpbCcsXHJcblx0XHRcdFx0J01heScsXHJcblx0XHRcdFx0J0p1bmUnLFxyXG5cdFx0XHRcdCdKdWx5JyxcclxuXHRcdFx0XHQnQXVndXN0JyxcclxuXHRcdFx0XHQnU2VwdGVtYmVyJyxcclxuXHRcdFx0XHQnT2N0b2JlcicsXHJcblx0XHRcdFx0J05vdmVtYmVyJyxcclxuXHRcdFx0XHQnRGVjZW1iZXInXHJcblx0XHRcdF0sXHJcblx0XHRcdGZyOiBbXHJcblx0XHRcdFx0J2phbnZpZXInLFxyXG5cdFx0XHRcdCdmw6l2cmllcicsXHJcblx0XHRcdFx0J21hcnMnLFxyXG5cdFx0XHRcdCdhdnJpbCcsXHJcblx0XHRcdFx0J21haScsXHJcblx0XHRcdFx0J2p1aW4nLFxyXG5cdFx0XHRcdCdqdWlsbGV0JyxcclxuXHRcdFx0XHQnYW/Du3QnLFxyXG5cdFx0XHRcdCdzZXB0ZW1icmUnLFxyXG5cdFx0XHRcdCdvY3RvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkw6ljZW1icmUnXHJcblx0XHRcdF0sXHJcblx0XHRcdGRlOiBbXHJcblx0XHRcdFx0J0phbnVhcicsXHJcblx0XHRcdFx0J0ZlYnJ1YXInLFxyXG5cdFx0XHRcdCdNw6RyeicsXHJcblx0XHRcdFx0J0FwcmlsJyxcclxuXHRcdFx0XHQnTWFpJyxcclxuXHRcdFx0XHQnSnVuaScsXHJcblx0XHRcdFx0J0p1bGknLFxyXG5cdFx0XHRcdCdBdWd1c3QnLFxyXG5cdFx0XHRcdCdTZXB0ZW1iZXInLFxyXG5cdFx0XHRcdCdPa3RvYmVyJyxcclxuXHRcdFx0XHQnTm92ZW1iZXInLFxyXG5cdFx0XHRcdCdEZXplbWJlcidcclxuXHRcdFx0XSxcclxuXHRcdFx0aXQ6IFtcclxuXHRcdFx0XHQnZ2VubmFpbycsXHJcblx0XHRcdFx0J2ZlYmJyYWlvJyxcclxuXHRcdFx0XHQnbWFyem8nLFxyXG5cdFx0XHRcdCdhcHJpbGUnLFxyXG5cdFx0XHRcdCdtYWdnaW8nLFxyXG5cdFx0XHRcdCdnaXVnbm8nLFxyXG5cdFx0XHRcdCdsdWdsaW8nLFxyXG5cdFx0XHRcdCdhZ29zdG8nLFxyXG5cdFx0XHRcdCdzZXR0ZW1icmUnLFxyXG5cdFx0XHRcdCdvdHRvYnJlJyxcclxuXHRcdFx0XHQnbm92ZW1icmUnLFxyXG5cdFx0XHRcdCdkaWNlbWJyZSdcclxuXHRcdFx0XVxyXG5cdFx0fTtcclxuXHJcblx0XHRjb25zdCBsb2NhbGVNb250aHMgPSBtb250aHNbbG9jYWxlXTtcclxuXHJcblx0XHRjb25zdCBtb250aCA9IGxvY2FsZU1vbnRoc1tkYXRlLmdldE1vbnRoKCldO1xyXG5cdFx0Y29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcblx0XHRyZXR1cm4gYCR7bW9udGh9ICR7eWVhcn1gO1xyXG5cdH1cclxuXHQvKipcclxuXHQgKiBUcnkgdG8gZmluZCB0aGUgdG9rZW4gaW4gdGhlIHN0cmluZ1RleHQgYW5kIHJlcGxhY2Ugd2l0aCBkYXRhVmFsdWUuIElmIGRldGVjdCBmb3JtYXQgb2YgbnVtYmVyIG9yIGRhdGUgdHJ5IHRvIGZvcm1hdCB0aGUgZGF0YVZhbHVlXHJcblx0ICogQHBhcmFtIHN0cmluZ1RleHRcclxuXHQgKiBAcGFyYW0gdG9rZW5cclxuXHQgKiBAcGFyYW0gZGF0YVZhbHVlXHJcblx0ICovXHJcblx0cmVwbGFjZVRva2VuKHN0cmluZ1RleHQ6IHN0cmluZywgdG9rZW46IGFueSwgZGF0YVZhbHVlOiBhbnksIGxvY2FsZT86IHN0cmluZyk6IHN0cmluZyB7XHJcblx0XHRsZXQgdmFsdWVSZXBsYWNlOiBzdHJpbmcgPSBudWxsO1xyXG5cdFx0aWYgKHRva2VuICYmIHRva2VuWzBdID09ICcjJykge1xyXG5cdFx0XHRsZXQgdHlwZVRva2VuID0gdG9rZW4uc3Vic3RyaW5nKDEsIHRva2VuLmluZGV4T2YoJygnKSk7XHJcblx0XHRcdGlmICh0eXBlVG9rZW4gPT0gJ2RhdGUnKSB7XHJcblx0XHRcdFx0bGV0IGRhdGVGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdHRva2VuLmluZGV4T2YoJ30nKSArIDEsXHJcblx0XHRcdFx0XHR0b2tlbi5pbmRleE9mKCcpJylcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGRhdGVGb3JtYXQgPSBkYXRlRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdGxldCBkYXRlVmFsdWUgPSBEYXRlVXRpbC5nZXREYXRlKGRhdGFWYWx1ZSk7XHJcblx0XHRcdFx0aWYgKGxvY2FsZSAhPSBudWxsICYmIGxvY2FsZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5mb3JtYXREYXRlKGRhdGVWYWx1ZSwgbG9jYWxlKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGRhdGVWYWx1ZSkge1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gRGF0ZVV0aWwuZ2V0TW9tZW50KGRhdGVWYWx1ZSkuZm9ybWF0KGRhdGVGb3JtYXQpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR2YWx1ZVJlcGxhY2UgPSAnJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAodHlwZVRva2VuID09ICdudW1iZXInKSB7XHJcblx0XHRcdFx0bGV0IG51bWJlclZhbHVlOiBudW1iZXIgPSBOdW1iZXIoZGF0YVZhbHVlKTtcclxuXHRcdFx0XHRpZiAobnVtYmVyVmFsdWUgIT0gdW5kZWZpbmVkICYmICFpc05hTihudW1iZXJWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdGxldCBudW1iZXJGb3JtYXQ6IHN0cmluZyA9IHRva2VuLnN1YnN0cmluZyhcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignfScpICsgMSxcclxuXHRcdFx0XHRcdFx0dG9rZW4uaW5kZXhPZignKScpXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0bnVtYmVyRm9ybWF0ID0gbnVtYmVyRm9ybWF0LnRyaW0oKS5yZXBsYWNlKC9cXFwiL2csICcnKS5yZXBsYWNlKC9cXCcvZywgJycpO1xyXG5cdFx0XHRcdFx0dmFsdWVSZXBsYWNlID0gdGhpcy5jdXJyZW5jeVBpcGUudHJhbnNmb3JtKFxyXG5cdFx0XHRcdFx0XHRudW1iZXJWYWx1ZSxcclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhbGUsXHJcblx0XHRcdFx0XHRcdCcnLFxyXG5cdFx0XHRcdFx0XHRudW1iZXJGb3JtYXRcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFxyXG5cdFx0XHRcdFx0XHQnRWwgZGF0byBbJyArXHJcblx0XHRcdFx0XHRcdFx0ZGF0YVZhbHVlICtcclxuXHRcdFx0XHRcdFx0XHQnXSBwYXJhIGVsIHRva2VuIFsnICtcclxuXHRcdFx0XHRcdFx0XHR0b2tlbiArXHJcblx0XHRcdFx0XHRcdFx0J10gdGlwbyBuw7ptZXJpY28gbm8gZXMgdmFsaWRvJ1xyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHZhbHVlUmVwbGFjZSA9ICcnO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygndGlwbyBkZSB0b2tlbiBpbmRlZmluaWRvLiBbdHlwZVRva2VuWycgKyB0eXBlVG9rZW4gKyAnXV0nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b2tlbiAmJiB0b2tlblswXSA9PSAnJCcpIHtcclxuXHRcdFx0aWYgKFxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZSAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0ZGF0YVZhbHVlLm9yaWdpbmFsX25hbWUgIT09IHVuZGVmaW5lZCAmJlxyXG5cdFx0XHRcdGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lICE9PSBudWxsXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZS5vcmlnaW5hbF9uYW1lO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhbHVlUmVwbGFjZSA9IGRhdGFWYWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyB2YWx1ZVJlcGxhY2UgPSBkYXRhVmFsdWU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zb2xlLmxvZygnRWwgdG9rZW4gbm8gZXMgdmFsaWRvLiBbdG9rZW5bJyArIHRva2VuICsgJ11dJyk7XHJcblx0XHR9XHJcblx0XHRpZiAoc3RyaW5nVGV4dCAmJiB2YWx1ZVJlcGxhY2UgIT09IG51bGwpIHtcclxuXHRcdFx0aWYgKHRva2VuICYmIHRva2VuID09PSAnJHtlc3RhdGljb18nICsgVG9rZW5TZXJ2aWNlLlNUQVRJQ19UT0tFTl9TVVJOQU1FICsgJ30nKSB7XHJcblx0XHRcdFx0dmFsdWVSZXBsYWNlID0gZGF0YVZhbHVlO1xyXG5cdFx0XHRcdHN0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnNwbGl0KHRva2VuKS5qb2luKHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gcmVwbGFjZSB0ZXh0IGluIGEgbW9yZSBlZmZpY2llbnQgd2F5XHJcblx0XHRcdFx0c3RyaW5nVGV4dCA9IHN0cmluZ1RleHQuc3BsaXQodG9rZW4pLmpvaW4odmFsdWVSZXBsYWNlKTtcclxuXHRcdFx0XHQvL3N0cmluZ1RleHQgPSBzdHJpbmdUZXh0LnJlcGxhY2UodG9rZW4sIHZhbHVlUmVwbGFjZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBzdHJpbmdUZXh0O1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nU2VnbWVudGF0aW9uKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW4gPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCR7KFtefV0rKVxcfS9nKTtcclxuXHRcdGNvbnN0IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwjZGF0ZVteKV0rXFwpL2cpO1xyXG5cdFx0Y29uc3QgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0bGV0IGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHRjb25zdCByZXN1bHQ6IGFueVtdID0gW107XHJcblxyXG5cdFx0aWYgKGFycmF5VG9rZW4pIHtcclxuXHRcdFx0Zm9yIChjb25zdCB0b2tlbiBvZiBhcnJheVRva2VuKSB7XHJcblx0XHRcdFx0Y29uc3QgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdG9rZW5Gb3JtYXR0ZWQuaW5kZXhPZih0b2tlbik7XHJcblx0XHRcdFx0XHRcdGlmIChpbmRleCA+PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0aW5mb1Rva2VuLnZhbHVlID0gdG9rZW5Gb3JtYXR0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmVzdWx0LnB1c2goaW5mb1Rva2VuKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRjaGFuZ2VJZFByb3BlcnRpZXNPZk9iamVjdChub3JtYWxpemF0aW9uQ29sdW1uczogYW55W10sIGxpc3REYXRhOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGNvbnN0IG5ld0RhdGEgPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqRGF0YSA9IHt9O1xyXG5cdFx0XHRPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChwcm9wZXJ0eSkgPT4ge1xyXG5cdFx0XHRcdGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0bm9ybWFsaXphdGlvbkNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcblx0XHRcdFx0XHRcdGlmIChjb2x1bW4uaWRDb2x1bW4udG9TdHJpbmcoKSA9PT0gcHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRvYmpEYXRhW2NvbHVtbi5rZXldID0gZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHRcdGlmIChvYmpEYXRhKSB7XHJcblx0XHRcdFx0bmV3RGF0YS5wdXNoKG9iakRhdGEpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBuZXdEYXRhO1xyXG5cdH1cclxuXHJcblx0Z2VuZXJhdGVIdG1sQnlUb2tlbnNBbmREYXRhKGh0bWw6IHN0cmluZywgbGlzdERhdGE6IGFueVtdLCBsaXN0VG9rZW5zOiBhbnlbXSk6IHN0cmluZ1tdIHtcclxuXHRcdGNvbnN0IHRyYW5zbGF0ZWRDYXJkczogYW55W10gPSBbXTtcclxuXHRcdGxpc3REYXRhLmZvckVhY2goKGRhdGEpID0+IHtcclxuXHRcdFx0Y29uc3Qgb2JqVG9rZW4gPSB7fTtcclxuXHRcdFx0Y29uc3QgaHRtbFRyYW5zbGF0ZWQgPSB7IGh0bWw6IGh0bWwgfTtcclxuXHRcdFx0T2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaCgocHJvcGVydHkpID0+IHtcclxuXHRcdFx0XHRsaXN0VG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XHJcblx0XHRcdFx0XHRpZiAocHJvcGVydHkgPT0gdG9rZW4ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykpIHtcclxuXHRcdFx0XHRcdFx0b2JqVG9rZW5bdG9rZW4ua2V5XSA9IGRhdGFbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRodG1sVHJhbnNsYXRlZC5odG1sID0gaHRtbFRyYW5zbGF0ZWQuaHRtbC5yZXBsYWNlKFxyXG5cdFx0XHRcdFx0XHRcdHRva2VuLmtleSxcclxuXHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5XVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dHJhbnNsYXRlZENhcmRzLnB1c2goaHRtbFRyYW5zbGF0ZWQpO1xyXG5cdFx0fSk7XHJcblx0XHRyZXR1cm4gdHJhbnNsYXRlZENhcmRzO1xyXG5cdH1cclxuXHJcblx0Z2V0TGlzdFRva2Vuc0J5U3RyaW5nKHN0cmluZ1RleHQ6IHN0cmluZyk6IGFueVtdIHtcclxuXHRcdHZhciBhcnJheVRva2VuID0gc3RyaW5nVGV4dC5tYXRjaCgvXFwkeyhbXn1dKylcXH0vZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgPSBzdHJpbmdUZXh0Lm1hdGNoKC9cXCNkYXRlW14pXStcXCkvZyk7XHJcblx0XHR2YXIgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlciA9IHN0cmluZ1RleHQubWF0Y2goL1xcI251bWJlclteKV0rXFwpL2cpO1xyXG5cdFx0dmFyIGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBbXTtcclxuXHRcdGlmIChcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUgJiZcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZERhdGUubGVuZ3RoID4gMCAmJlxyXG5cdFx0XHRhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyICYmXHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkRGF0ZS5jb25jYXQoYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlcik7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlICYmIGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0YXJyYXlUb2tlbkZvcm1hdHRlZCA9IGFycmF5VG9rZW5Gb3JtYXR0ZWREYXRlLnNsaWNlKCk7XHJcblx0XHR9IGVsc2UgaWYgKGFycmF5VG9rZW5Gb3JtYXR0ZWROdW1iZXIgJiYgYXJyYXlUb2tlbkZvcm1hdHRlZE51bWJlci5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGFycmF5VG9rZW5Gb3JtYXR0ZWQgPSBhcnJheVRva2VuRm9ybWF0dGVkTnVtYmVyLnNsaWNlKCk7XHJcblx0XHR9XHJcblx0XHR2YXIgcmVzdWx0OiBhbnlbXSA9IFtdO1xyXG5cclxuXHRcdGlmIChhcnJheVRva2VuKSB7XHJcblx0XHRcdGZvciAoY29uc3QgdG9rZW4gb2YgYXJyYXlUb2tlbikge1xyXG5cdFx0XHRcdGxldCBrZXlUeXBlOiBudW1iZXIgPSBUb2tlblNlcnZpY2UuZ2V0S2V5VHlwZSh0b2tlbik7XHJcblx0XHRcdFx0aWYgKGtleVR5cGUgPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHR2YXIgaW5mb1Rva2VuID0geyBrZXk6IHRva2VuLCB2YWx1ZTogdG9rZW4gfTtcclxuXHRcdFx0XHRpZiAoYXJyYXlUb2tlbkZvcm1hdHRlZCkge1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCB0b2tlbkZvcm1hdHRlZCBvZiBhcnJheVRva2VuRm9ybWF0dGVkKSB7XHJcblx0XHRcdFx0XHRcdHZhciBpbmRleCA9IHRva2VuRm9ybWF0dGVkLmluZGV4T2YodG9rZW4pO1xyXG5cdFx0XHRcdFx0XHRpZiAoaW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGluZm9Ub2tlbi52YWx1ZSA9IHRva2VuRm9ybWF0dGVkO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdC5wdXNoKGluZm9Ub2tlbik7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cclxuXHRcdC8vIGxldCB0b2tlbnM6IGFueVtdID0gW107XHJcblx0XHQvLyBsZXQgaSA9IHRoaXMubmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dCwgMCk7XHJcblx0XHQvLyBsZXQgY291bnQgPSAwO1xyXG5cdFx0Ly8gd2hpbGUgKGkgPj0gMCAmJiBjb3VudCA8PSAxMCkge1xyXG5cdFx0Ly8gICBsZXQgaW5mb1Rva2VuOiB7fSA9IG51bGw7XHJcblx0XHQvLyAgIGxldCBuZXh0STogbnVtYmVyID0gaTtcclxuXHRcdC8vICAgbGV0IGNoYXJhY3RlciA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIChpICsgMSkpO1xyXG5cdFx0Ly8gICBpZiAoY2hhcmFjdGVyID09IFwiJFwiKSB7XHJcblx0XHQvLyAgICAgbGV0IG5leHRDaGFyYWN0ZXIgPSBzdHJpbmdUZXh0LnN1YnN0cmluZygoaSArIDEpLCAoaSArIDIpKTtcclxuXHRcdC8vICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgbmVlZCB0byBiZSBhIHsgc2lnblxyXG5cdFx0Ly8gICAgIGlmIChuZXh0Q2hhcmFjdGVyICE9IFwie1wiKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGxldCBrZXlUb2tlbjogc3RyaW5nID0gc3RyaW5nVGV4dC5zdWJzdHJpbmcoaSwgc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKSArIDEpO1xyXG5cdFx0Ly8gICAgIC8vIElmIHRoZSB0b2tlbiBoYXZlIGEgdmFsaWQga2V5IHR5cGVcclxuXHRcdC8vICAgICBsZXQga2V5VHlwZTogbnVtYmVyID0gVG9rZW5TZXJ2aWNlLmdldEtleVR5cGUoa2V5VG9rZW4ucmVwbGFjZShcIntcIiwgXCJcIikucmVwbGFjZShcIn1cIiwgXCJcIikpO1xyXG5cdFx0Ly8gICAgIGlmIChrZXlUeXBlID09PSBudWxsKSB7XHJcblx0XHQvLyAgICAgICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSArIDEpO1xyXG5cdFx0Ly8gICAgICAgY29udGludWU7XHJcblx0XHQvLyAgICAgfVxyXG5cdFx0Ly8gICAgIGluZm9Ub2tlbiA9IHtcclxuXHRcdC8vICAgICAgIGtleToga2V5VG9rZW4sXHJcblx0XHQvLyAgICAgICB2YWx1ZToga2V5VG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwifVwiLCBpKTtcclxuXHRcdC8vICAgfSBlbHNlIHtcclxuXHRcdC8vICAgICBsZXQgbmV4dFNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZihcIiRcIiwgaSk7XHJcblx0XHQvLyAgICAgLy8gV2UgaW5seSBzdXBwb3J0ICNkYXRlKCQgYW5kICNudW1iZXIoJCBpbiB0aGlzIDIgc2NlbmFyaW9zIHRoZSBsZW5naHQgY2FuJ3QgYmUgbW9yZSB0aGFuIDEwIGNoYXJhY3RlcnNcclxuXHRcdC8vICAgICBpZiAobmV4dFNpZ24gPCAwIHx8IChuZXh0U2lnbiAtIGkpID4gMTApIHtcclxuXHRcdC8vICAgICAgIGkgPSB0aGlzLm5leHRWYWxpZFBvc2l0aW9uVG9rZW5zKHN0cmluZ1RleHQsIG5leHRJICsgMSk7XHJcblx0XHQvLyAgICAgICBjb250aW51ZTtcclxuXHRcdC8vICAgICB9XHJcblx0XHQvLyAgICAgbGV0IGtleVRva2VuOiBzdHJpbmcgPSBzdHJpbmdUZXh0LnN1YnN0cmluZyhzdHJpbmdUZXh0LmluZGV4T2YoXCIkXCIsIGkpLCBzdHJpbmdUZXh0LmluZGV4T2YoXCJ9XCIsIGkpICsgMSk7XHJcblx0XHQvLyAgICAgbGV0IHZhbHVlVG9rZW46IHN0cmluZyA9IHN0cmluZ1RleHQuc3Vic3RyaW5nKGksIHN0cmluZ1RleHQuaW5kZXhPZihcIilcIiwgaSkgKyAxKTtcclxuXHRcdC8vICAgICBpbmZvVG9rZW4gPSB7XHJcblx0XHQvLyAgICAgICBrZXk6IGtleVRva2VuLFxyXG5cdFx0Ly8gICAgICAgdmFsdWU6IHZhbHVlVG9rZW5cclxuXHRcdC8vICAgICB9O1xyXG5cdFx0Ly8gICAgIG5leHRJID0gc3RyaW5nVGV4dC5pbmRleE9mKFwiKVwiLCBpKTtcclxuXHRcdC8vICAgfVxyXG5cdFx0Ly8gICB0b2tlbnMucHVzaChpbmZvVG9rZW4pO1xyXG5cdFx0Ly8gICBpID0gdGhpcy5uZXh0VmFsaWRQb3NpdGlvblRva2VucyhzdHJpbmdUZXh0LCBuZXh0SSk7XHJcblx0XHQvLyAgIGNvdW50Kys7XHJcblx0XHQvLyB9XHJcblx0XHQvLyByZXR1cm4gdG9rZW5zO1xyXG5cdH1cclxuXHJcblx0bmV4dFZhbGlkUG9zaXRpb25Ub2tlbnMoc3RyaW5nVGV4dDogc3RyaW5nLCBuZXh0STogbnVtYmVyKTogbnVtYmVyIHtcclxuXHRcdGxldCB0b2tlbkRvbGxhclNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignJCcsIG5leHRJKTtcclxuXHRcdGxldCB0b2tlbk51bVNpZ246IG51bWJlciA9IHN0cmluZ1RleHQuaW5kZXhPZignIycsIG5leHRJKTtcclxuXHRcdGxldCBpOiBudW1iZXIgPVxyXG5cdFx0XHR0b2tlbkRvbGxhclNpZ24gPCAwICYmIHRva2VuTnVtU2lnbiA+PSAwXHJcblx0XHRcdFx0PyB0b2tlbk51bVNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbiA8IDAgJiYgdG9rZW5Eb2xsYXJTaWduID49IDBcclxuXHRcdFx0XHQ/IHRva2VuRG9sbGFyU2lnblxyXG5cdFx0XHRcdDogdG9rZW5Eb2xsYXJTaWduIDwgdG9rZW5OdW1TaWduXHJcblx0XHRcdFx0PyB0b2tlbkRvbGxhclNpZ25cclxuXHRcdFx0XHQ6IHRva2VuTnVtU2lnbjtcclxuXHRcdHJldHVybiBpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSXQgcmV1c2VzIHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdFB1YmxpYyBidXQgc2V0IGFsbCBrZXlzIGxvYmplY3R0b2tlbnMgYXMgbG93ZXJjYXNlXHJcblx0ICogQHBhcmFtIHRva2VuTmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhXHJcblx0ICogQHBhcmFtIGxPYmplY3RUb2tlbnNcclxuXHQgKi9cclxuXHRyZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3RQdWJsaWMoXHJcblx0XHR0b2tlbk5hbWU6IHN0cmluZyxcclxuXHRcdGZvcm11bGE6IHN0cmluZyxcclxuXHRcdGxPYmplY3RUb2tlbnM6IGFueVtdXHJcblx0KTogc3RyaW5nIHtcclxuXHRcdGxldCBsRGF0YU9yZzogYW55W10gPSBbXTtcclxuXHRcdGlmIChsT2JqZWN0VG9rZW5zKSB7XHJcblx0XHRcdGZvciAobGV0IGRhdGFGb3JtIGluIGxPYmplY3RUb2tlbnMpIHtcclxuXHRcdFx0XHRsRGF0YU9yZ1tkYXRhRm9ybS50b0xvd2VyQ2FzZSgpXSA9IGxPYmplY3RUb2tlbnNbZGF0YUZvcm1dO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5yZXBsYWNlVG9rZW5zRnJvbUxpc3RPYmplY3QodG9rZW5OYW1lLCBmb3JtdWxhLCBsRGF0YU9yZyk7XHJcblx0fVxyXG5cdC8qKlxyXG5cdCAqIEBwYXJhbSB0b2tlbk5hbWUgdG9rZW4gbmFtZVxyXG5cdCAqIEBwYXJhbSBmb3JtdWxhIFN0cmluZyB3aXRoIHRoZSBmb3JtdWxhIHRvIGV4ZWN1dGVcclxuXHQgKiBAcGFyYW0gbE9iamVjdFRva2VucyBMaXN0IG9mIHRva2VucyB3aXRoIHRoZSB2YWx1ZXMgdG8gcmVwbGFjZVxyXG5cdCAqL1xyXG5cdHJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdCh0b2tlbk5hbWU6IHN0cmluZywgZm9ybXVsYTogc3RyaW5nLCBsT2JqZWN0VG9rZW5zOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0aWYgKCFmb3JtdWxhIHx8IGZvcm11bGEubGVuZ3RoID09IDApIHtcclxuXHRcdFx0dGhyb3cge1xyXG5cdFx0XHRcdG1lc3NhZ2U6ICdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYScsXHJcblx0XHRcdFx0dGl0bGU6ICdBbGVydGEhJyxcclxuXHRcdFx0XHRlcnJvcjpcclxuXHRcdFx0XHRcdCdMYSBmb3JtdWxhIGRlbCB0b2tlbiAnICsgdG9rZW5OYW1lICsgJyBlc3RhIHZhY8OtYS4gW2Zvcm11bGFbJyArIGZvcm11bGEgKyAnXV0nXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRsZXQgcmVwbGFjZWRUb2tlbnM6IHN0cmluZyA9IGZvcm11bGEudG9TdHJpbmcoKTtcclxuXHRcdGlmIChyZXBsYWNlZFRva2Vucy5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcclxuXHRcdFx0cmV0dXJuIHJlcGxhY2VkVG9rZW5zO1xyXG5cdFx0fVxyXG5cdFx0Ly8gRmluZCB0aGUgdG9rZW5zIGluIHRoZSBmb3JtdWxhXHJcblx0XHRsZXQgdG9rZW5zQXJyYXk6IGFueVtdID0gdGhpcy5nZXRMaXN0VG9rZW5zQnlTdHJpbmcocmVwbGFjZWRUb2tlbnMpO1xyXG5cdFx0aWYgKHRva2Vuc0FycmF5Lmxlbmd0aCA9PSAwKSB7XHJcblx0XHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHRcdH1cclxuXHRcdC8vIElmIHRoZXJlIGFueSB0b2tlbiwgdHJ5IHRvIHJlcGxhY2VcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0bGV0IG9iamVjdFRva2VuID1cclxuXHRcdFx0XHRsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV0gIT09IHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0PyBsT2JqZWN0VG9rZW5zW3Rva2Vuc0FycmF5W2ldLmtleV1cclxuXHRcdFx0XHRcdDogbnVsbDtcclxuXHRcdFx0bGV0IGNsZWFyS2V5O1xyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdGNsZWFyS2V5ID0gdG9rZW5zQXJyYXlbaV0ua2V5LnJlcGxhY2UoJyR7JywgJycpLnJlcGxhY2UoJ30nLCAnJykudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSAhPT0gdW5kZWZpbmVkID8gbE9iamVjdFRva2Vuc1tjbGVhcktleV0gOiBudWxsO1xyXG5cclxuXHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0Y2xlYXJLZXkgPSB0b2tlbnNBcnJheVtpXS5rZXlcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ3snLCAnJylcclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0LnNwbGl0KCdfJylbMV1cclxuXHRcdFx0XHRcdFx0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRvYmplY3RUb2tlbiA9XHJcblx0XHRcdFx0XHRcdGxPYmplY3RUb2tlbnNbY2xlYXJLZXldICE9PSB1bmRlZmluZWQgPyBsT2JqZWN0VG9rZW5zW2NsZWFyS2V5XSA6IG51bGw7XHJcblx0XHRcdFx0XHRpZiAob2JqZWN0VG9rZW4gPT09IG51bGwgfHwgb2JqZWN0VG9rZW4gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBhcnJheUtleSA9IHRva2Vuc0FycmF5W2ldLmtleVxyXG5cdFx0XHRcdFx0XHRcdC5yZXBsYWNlKCd7JywgJycpXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoJ30nLCAnJylcclxuXHRcdFx0XHRcdFx0XHQuc3BsaXQoJ18nKVsxXVxyXG5cdFx0XHRcdFx0XHRcdC5zcGxpdCgnLicpO1xyXG5cdFx0XHRcdFx0XHRpZiAoYXJyYXlLZXkubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCB2YWx1ZSA9IGxPYmplY3RUb2tlbnM7XHJcblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5S2V5Lmxlbmd0aDsgaW5kZXgrKykge1xyXG5cdFx0XHRcdFx0XHRcdFx0bGV0IGVsZW1lbnQgPSBhcnJheUtleVtpbmRleF07XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5kZXggPT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbGVtZW50ID0gZWxlbWVudC50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtlbGVtZW50XTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0VG9rZW4gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAob2JqZWN0VG9rZW4gPT0gbnVsbCkge1xyXG5cdFx0XHRcdC8vIElmIG5vdCBmaW5kIHRoZSB0b2tlbiwgYnkgZGVmYXVsdCBwdXQgYW4gZW1wdHkgc3RyaW5nXHJcblx0XHRcdFx0LyppZiAoVG9rZW5TZXJ2aWNlLmV4Y2x1ZGVkVG9rZW4uaW5kZXhPZihjbGVhcktleSkgPT09IC0xKSB7XHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFxyXG5cdFx0XHRcdFx0XHQnRWwgdG9rZW4gJyArIHRva2Vuc0FycmF5W2ldLnZhbHVlICsgJyBubyBmdWUgZW5jb250cmFkby4nLFxyXG5cdFx0XHRcdFx0XHRsT2JqZWN0VG9rZW5zLFxyXG5cdFx0XHRcdFx0XHR0b2tlbnNBcnJheVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHR9Ki9cclxuXHRcdFx0XHRvYmplY3RUb2tlbiA9ICcnO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChvYmplY3RUb2tlbiAhPSBudWxsKSB7XHJcblx0XHRcdFx0Ly8gbGV0IHZhbHVlOiBhbnkgPSBOdW1iZXIob2JqZWN0VG9rZW4pXHJcblx0XHRcdFx0Ly8gXHQ/IG9iamVjdFRva2VuXHJcblx0XHRcdFx0Ly8gXHQ6IEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pXHJcblx0XHRcdFx0Ly8gXHQ/IEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKVxyXG5cdFx0XHRcdC8vIFx0OiBcIidcIiArIG9iamVjdFRva2VuICsgXCInXCI7XHJcblx0XHRcdFx0bGV0IHZhbHVlOiBhbnk7XHJcblx0XHRcdFx0aWYgKE51bWJlcihvYmplY3RUb2tlbikpIHtcclxuXHRcdFx0XHRcdHZhbHVlID0gTnVtYmVyKG9iamVjdFRva2VuKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IEFycmF5LmlzQXJyYXkob2JqZWN0VG9rZW4pO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkob2JqZWN0VG9rZW4pKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IG9iamVjdFRva2VuLm9yaWdpbmFsX25hbWVcclxuXHRcdFx0XHRcdFx0PyBcIidcIiArIG9iamVjdFRva2VuLm9yaWdpbmFsX25hbWUgKyBcIidcIlxyXG5cdFx0XHRcdFx0XHQ6IEpTT04uc3RyaW5naWZ5KG9iamVjdFRva2VuKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBcIidcIiArIG9iamVjdFRva2VuICsgXCInXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlcGxhY2VkVG9rZW5zID0gdGhpcy5yZXBsYWNlVG9rZW4ocmVwbGFjZWRUb2tlbnMsIHRva2Vuc0FycmF5W2ldLnZhbHVlLCB2YWx1ZSk7XHJcblx0XHRcdFx0Ly8gfSBlbHNlIHtcclxuXHRcdFx0XHQvLyAgIGNvbnNvbGUuZXJyb3IobE9iamVjdFRva2VucywgdG9rZW5zQXJyYXkpO1xyXG5cdFx0XHRcdC8vICAgdGhyb3cge1xyXG5cdFx0XHRcdC8vICAgICBtZXNzYWdlOiBcIk5vIHNlIGVuY29udHLDsyB2YWxvciBwYXJhIHVuIHRva2VuXCIsXHJcblx0XHRcdFx0Ly8gICAgIHRpdGxlOiBcIkFsZXJ0YSFcIixcclxuXHRcdFx0XHQvLyAgICAgZXJyb3I6IFwiRWwgdG9rZW4gXCIgKyB0b2tlbnNBcnJheVtpXS52YWx1ZSArIFwiIG5vIGZ1ZSBlbmNvbnRyYWRvLlwiXHJcblx0XHRcdFx0Ly8gICB9O1xyXG5cdFx0XHRcdC8vXHJcblx0XHRcdFx0Ly8gU2kgZXMgbGEgdWx0aW1hIGl0ZXJhY2lvbiB5IGxhIGZvcm11bGEgdGllbmUgWyBlcyBwb3JxdWUgdGllbmUgdW4gYXJyYXkgZW4gZWwgdmFsb3IgcXVlIHJlc29sdmlvIGVsIHRva2VuXHJcblx0XHRcdFx0aWYgKGkgPT0gdG9rZW5zQXJyYXkubGVuZ3RoIC0gMSAmJiByZXBsYWNlZFRva2Vucy5pbmNsdWRlcygnWycpKSB7XHJcblx0XHRcdFx0XHQvLyBTZSBwb25lbiB0b2RvcyBsb3Mgb3BlcmFuZG9zIGNvbW8gZWxlbWVudG9zIGVuIHVuIGFycmF5IFsnZXhwcmVzaW9uIGEnLCAnJiYnLCAnRXhwcmVzaW9uIEInXVxyXG5cdFx0XHRcdFx0bGV0IGZvcm1FeHByZXNzaW9uczogc3RyaW5nW10gPSByZXBsYWNlZFRva2Vucy5zcGxpdCgvIChcXHxcXHx8JiYpIC8pO1xyXG5cdFx0XHRcdFx0bGV0IGxBdXhmb3JtRXhwcmVzc2lvbjogc3RyaW5nW10gPSBbXTtcclxuXHRcdFx0XHRcdGZvcm1FeHByZXNzaW9ucy5mb3JFYWNoKChleHByZXNzaW9uOiBzdHJpbmcpID0+IHtcclxuXHRcdFx0XHRcdFx0aWYgKGV4cHJlc3Npb24uY2hhckF0KDApID09ICdbJykge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBpc1RhZ0ZvdW5kOiBzdHJpbmcgPSAnJztcclxuXHRcdFx0XHRcdFx0XHRpc1RhZ0ZvdW5kID0gdGhpcy5maW5kVGFnKGV4cHJlc3Npb24pO1xyXG5cdFx0XHRcdFx0XHRcdGxBdXhmb3JtRXhwcmVzc2lvbi5wdXNoKGlzVGFnRm91bmQpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGxBdXhmb3JtRXhwcmVzc2lvbi5wdXNoKGV4cHJlc3Npb24pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHJlcGxhY2VkVG9rZW5zID0gbEF1eGZvcm1FeHByZXNzaW9uLmpvaW4oJyAnKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiByZXBsYWNlZFRva2VucztcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE1FdG9kbyBxdWUgdGVuaWVuZG8gdW5hIGV4cHJlc2lvbiBkZSBsYSBmb3JtYSBbJ3RhZzEnLCAndGFnMiddPT10YWczXHJcblx0ICogZXZhbHVhIHNpIHRhZzMgaGFjZSBwYXJ0ZSBkZWwgYXJyYXkgc2kgdGllbmUgZWwgb3BlcmFkb3IgPT0uXHJcblx0ICogU2kgdGllbmUgZWwgb3BlcmFkb3IgIT0gZXhhbWluYSBxdWUgdGFnMyBubyBoYWdhIHBhcnRlIGRlbCBhcnJheStcclxuXHQgKlxyXG5cdCAqIEBwYXJhbSBleHByZXNzaW9uIE9wZXJhbmRvIHF1ZSBldmFsdWEgdGFnLiBFcyBkZSBsYSBmb3JtYSBbJ3RhZzEnLCAndGFnMiddPT10YWczXHJcblx0ICogQHJldHVybnMgUmV0b3JuYSAndHJ1ZScgbyAnZmFsc2UnIGVuIHN0cmluZyBxdWUgZGVzcHVlcyBzZXJhIHBhc2FkbyBhIHVuIGV2YWwoKVxyXG5cdCAqIG1hcyBhZGVsYW50ZSBlbiBlbCBmbHVqb1xyXG5cdCAqL1xyXG5cdGZpbmRUYWcoZXhwcmVzc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcclxuXHRcdGxldCByZWdleE9wZXJhdG9yID0gbmV3IFJlZ0V4cCgnKD09PXw9PXwhPT18IT0pJyk7XHJcblx0XHQvLyBSZXRvcm5hIGVsIG9wZXJhZG9yXHJcblx0XHRsZXQgb3BlcmF0b3I6IHN0cmluZ1tdID0gZXhwcmVzc2lvbi5tYXRjaChyZWdleE9wZXJhdG9yKTtcclxuXHRcdC8vIFNpIG5vIGVuY3VlbnRyYSB1biBvcGVyYWRvciBzZWd1biBlbCBwYXRyb24gcmV0b3JuYSAnZmFsc2UnXHJcblx0XHQvLyBwYXJhIGV2aXRhciByZXN1bHRhZG9zIGluZXNwZXJhZG9zXHJcblx0XHRpZiAob3BlcmF0b3IgPT0gbnVsbCkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdObyBzZSBlbmNvbnRybyB1biBvcGVyYWRvciBwZXJtaXRpZG8gcGFyYSBsYSBleHByZXNpb24nKTtcclxuXHRcdFx0cmV0dXJuICdmYWxzZSc7XHJcblx0XHR9XHJcblx0XHQvLyBTZXBhcmEgbGEgc2VudGVuY2lhIHBvciBlbCBvcGVyYWRvclxyXG5cdFx0Ly8gTGEgcHJpbWVyYSBwYXJ0ZSBlcyBlbCB2YWxvciBwb3IgZWwgY3VhbCBzZSByZW1wbGF6YSBlbCB0b2tlbiBxdWUgZXMgdW4gYXJyYXkgZW4gc3RyaW5nIFwiWydhJywgJ2InXVwiXHJcblx0XHQvLyBFbCBzZWd1bmRvIGVzIGVsIHZhbG9yIGNvbiBlbCBjdWFsIHNlIHZhIGEgY29tcGFyYXJcclxuXHRcdGxldCB2YWx1ZVRva2VuLCB2YWx1ZVRvQ29tcGFyZTtcclxuXHRcdFt2YWx1ZVRva2VuLCB2YWx1ZVRvQ29tcGFyZV0gPSBleHByZXNzaW9uLnNwbGl0KG9wZXJhdG9yWzBdKTtcclxuXHRcdC8vIFNlIGxpbXBpYSBlbCBzdHJpbmcgY29ycmVzcG9uZGllbnRlIGFsIGFycmF5IHBhcmEgcXVlIGxvcyBlbGVtZW50b3MgcXVlZGVuIHNlcGFyYWRvcyBwb3IgXCIsXCJcclxuXHRcdHZhbHVlVG9rZW4gPSB2YWx1ZVRva2VuLnJlcGxhY2UoL1teYS16QS1aMC05ICxdL2csICcnKTtcclxuXHRcdC8vIFNpIG5vIGhheSB0YWdzIGFzb2NpYWRvcyBhbCByZWdpc3RybyBzZSBkZXZ1ZWx2ZSAnZmFsc2UnXHJcblx0XHRpZiAoIXZhbHVlVG9rZW4pIHtcclxuXHRcdFx0Y29uc29sZS5lcnJvcignTm8gaGF5IHRhZ3MgYXNvY2lhZG9zIGEgZXN0YSBhcGxpY2FjacOzbicpO1xyXG5cdFx0XHRyZXR1cm4gJ2ZhbHNlJztcclxuXHRcdH1cclxuXHRcdC8vIFNlIGxpbXBpYSBlbCBzdHJpbmcgY29ycmVzcG9uZGllbnRlIGFsIHZhbG9yIHBvciBjb21wYXJhclxyXG5cdFx0dmFsdWVUb0NvbXBhcmUgPSB2YWx1ZVRvQ29tcGFyZS5yZXBsYWNlKC9bXmEtekEtWjAtOSBdL2csICcnKTtcclxuXHRcdC8vIEVsIHN0cmluZyBjb3JyZXNwb25kaWVudGUgYWwgYXJyYXkgcGFzYSBhIHNlciB0aXBvIGFycmF5XHJcblx0XHR2YWx1ZVRva2VuID0gdmFsdWVUb2tlbi5zcGxpdCgnLCcpO1xyXG5cclxuXHRcdC8vIFNlIHRyYXRhIGRlIGNvbnN0YXRhciBzaSBlbCB2YWxvciBhIGNvbXBhcmFyIHNlIGVuY3VldHJhIG8gbm8gZGVudHJvXHJcblx0XHQvLyBTaSBlbCBvcGVyYWRvciBxdWUgc2UgZW5jb250cm8gPT0gcmV0dXJuYSB0cnVlIHNpIGxvIGVuY3VlbnRyYVxyXG5cdFx0bGV0IGlzVGFnRm91bmQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdFx0c3dpdGNoIChvcGVyYXRvclswXSkge1xyXG5cdFx0XHRjYXNlICc9PSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgPT0gdmFsdWVUb0NvbXBhcmUpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICc9PT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnID09PSB2YWx1ZVRvQ29tcGFyZSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJyE9PSc6XHJcblx0XHRcdFx0aXNUYWdGb3VuZCA9IHZhbHVlVG9rZW4uc29tZSgodGFnKSA9PiB0YWcgIT09IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnIT0nOlxyXG5cdFx0XHRcdGlzVGFnRm91bmQgPSB2YWx1ZVRva2VuLnNvbWUoKHRhZykgPT4gdGFnICE9IHZhbHVlVG9Db21wYXJlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHRcdGV4cHJlc3Npb24gPSBpc1RhZ0ZvdW5kID8gJ3RydWUnIDogJ2ZhbHNlJztcclxuXHRcdHJldHVybiBleHByZXNzaW9uO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVHJ5IHRvIGV2YWwgdGhlIGZvcm11bGEgZGVwZW5kIG9mIHRoZSB0eXBlIG9mIGZpZWxkcy5cclxuXHQgKiBAcGFyYW0gbFN0YXRpY1Rva2VuXHJcblx0ICogQHBhcmFtIGZvcm11bGFOYW1lXHJcblx0ICogQHBhcmFtIGZvcm11bGFcclxuXHQgKi9cclxuXHR2YWxpZGF0ZUZvcm11bGEobFN0YXRpY1Rva2VuOiBhbnksIGZvcm11bGFOYW1lOiBzdHJpbmcsIGZvcm11bGE6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cdFx0bGV0IGV2YWxGb3JtdWxhOiBib29sZWFuID0gZmFsc2U7XHJcblx0XHQvLyBUbyB2YWxpZGF0ZSB0aGUgZm9ybXVsYSwgZmlyc3Qgb3JnYW5pemUgdGhlIGluZm8gdG8ga2V5IC0gdmFsdWUgYXJyYXlcclxuXHRcdGxldCBvYmplY3RUb2tlbnM6IGFueVtdID0gW107XHJcblx0XHRmb3IgKGxldCBwYW5lbCBvZiBsU3RhdGljVG9rZW4pIHtcclxuXHRcdFx0Zm9yIChsZXQgZ3JvdXBUb2tlbiBvZiBwYW5lbC52YWx1ZSkge1xyXG5cdFx0XHRcdGZvciAobGV0IHN0YXRpY1Rva2VuIG9mIGdyb3VwVG9rZW4udmFsdWUpIHtcclxuXHRcdFx0XHRcdGZvciAobGV0IGFycmF5VG9rZW5JbmZvIG9mIHN0YXRpY1Rva2VuKSB7XHJcblx0XHRcdFx0XHRcdG9iamVjdFRva2Vuc1thcnJheVRva2VuSW5mby5rZXldID0gYXJyYXlUb2tlbkluZm8ub2JqZWN0XHJcblx0XHRcdFx0XHRcdFx0PyBhcnJheVRva2VuSW5mby5vYmplY3QudHlwZSA9PSAnbnVtYmVyJ1xyXG5cdFx0XHRcdFx0XHRcdFx0PyAnMCdcclxuXHRcdFx0XHRcdFx0XHRcdDogJydcclxuXHRcdFx0XHRcdFx0XHQ6ICcnO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Zm9ybXVsYSA9IHRoaXMucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KGZvcm11bGFOYW1lLCBmb3JtdWxhLCBvYmplY3RUb2tlbnMpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Ly9jb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHRcdFx0dGhyb3cgZXJyb3I7XHJcblx0XHR9XHJcblx0XHRpZiAoZm9ybXVsYSAhPT0gbnVsbCkge1xyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdGxldCByZXN1bHQgPSBmb3JtdWxhLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IGZvcm11bGEgOiBldmFsKGZvcm11bGEpO1xyXG5cdFx0XHRcdGV2YWxGb3JtdWxhID0gdHJ1ZTtcclxuXHRcdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRcdC8vY29uc29sZS5lcnJvcihcIkVycm9yIGV2YWx1YXRpbmcgdGhlIGZvcm11bGFcIiwgZSk7XHJcblx0XHRcdFx0dGhyb3cge1xyXG5cdFx0XHRcdFx0bWVzc2FnZTogJ0xhIGZvcm11bGEgbm8gZnVlIHBvc2libGUgZXZhbHVhcicsXHJcblx0XHRcdFx0XHR0aXRsZTogJ0FsZXJ0YSEnLFxyXG5cdFx0XHRcdFx0ZXJyb3I6IGVcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZXZhbEZvcm11bGE7XHJcblx0fVxyXG5cclxuXHRnZXRDb25maWdDbG9uaW5nVG9rZW5NYXAob2xkUFBQOiBudW1iZXIsIG5ld1BQUDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Rva2VuL2dldENvbmZpZ0Nsb25pbmdUb2tlbk1hcCcsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKClcclxuXHRcdFx0XHRcdC5zZXQoJ29sZFBQUCcsIG9sZFBQUC50b1N0cmluZygpKVxyXG5cdFx0XHRcdFx0LnNldCgnbmV3UFBQJywgbmV3UFBQLnRvU3RyaW5nKCkpXHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblx0fVxyXG59XHJcbiJdfQ==