ng-pli-commons 1.0.3 → 1.0.6-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 (251) hide show
  1. package/README.md +24 -24
  2. package/fesm2022/ng-pli-commons.mjs +2933 -2280
  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 +12 -4
  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/segmentation-user-service.service.d.ts +1 -0
  32. package/lib/services/send-application.service.d.ts +2 -2
  33. package/lib/services/status.service.d.ts +1 -0
  34. package/lib/services/tag-management.service.d.ts +23 -0
  35. package/lib/services/token.service.d.ts +3 -0
  36. package/lib/services/visualization-committee.service.d.ts +5 -4
  37. package/package.json +3 -6
  38. package/public-api.d.ts +11 -0
  39. package/version.d.ts +1 -1
  40. package/esm2022/lib/components/backoffice.commons.component.mjs +0 -40
  41. package/esm2022/lib/components/common.lists.component.mjs +0 -194
  42. package/esm2022/lib/components/configuration-token/configuration-token-subject.service.mjs +0 -23
  43. package/esm2022/lib/components/configuration-token/configuration-token.component.mjs +0 -665
  44. package/esm2022/lib/components/configuration-token/guarantee-token/guarantee-token.component.mjs +0 -103
  45. package/esm2022/lib/components/configuration-token/snapshot-token/snapshot-token.component.mjs +0 -108
  46. package/esm2022/lib/components/configuration.commons.component.mjs +0 -40
  47. package/esm2022/lib/components/dashboard.commons.component.mjs +0 -84
  48. package/esm2022/lib/components/dynamic-filter/dynamic-filter.component.mjs +0 -131
  49. package/esm2022/lib/components/excel-to-json/excel-to-json.component.mjs +0 -54
  50. package/esm2022/lib/components/frontoffice.commons.component.mjs +0 -86
  51. package/esm2022/lib/components/pdf-analyzer/pdf-analyzer.component.mjs +0 -162
  52. package/esm2022/lib/components/pdf-config/pdf-config.component.mjs +0 -170
  53. package/esm2022/lib/components/pdf-generator/pdf-generator.component.mjs +0 -223
  54. package/esm2022/lib/components/pdf-merge-visualizer/pdf-merge-visualizer.component.mjs +0 -307
  55. package/esm2022/lib/components/pdf-visualizer/pdf-visualizer.component.mjs +0 -387
  56. package/esm2022/lib/components/progress-bar/progress-bar.component.mjs +0 -92
  57. package/esm2022/lib/components/segmentation-tokens/segmentation-tokens.component.mjs +0 -199
  58. package/esm2022/lib/components/select-ppp/select-ppp.component.mjs +0 -199
  59. package/esm2022/lib/components/show-hide-columns/show-hide-columns-table.component.mjs +0 -116
  60. package/esm2022/lib/components/token/token.component.mjs +0 -1006
  61. package/esm2022/lib/components/tokens-calculator/tokens-calculator.component.mjs +0 -128
  62. package/esm2022/lib/directives/currency-colfuturo-formatter.directive.mjs +0 -47
  63. package/esm2022/lib/directives/currency-decimal-colfuturo-formatter.directive.mjs +0 -34
  64. package/esm2022/lib/ng-pli-commons.module.mjs +0 -387
  65. package/esm2022/lib/ng-pli-commons.service.mjs +0 -14
  66. package/esm2022/lib/pipes/currency-colfuturo.pipe.mjs +0 -35
  67. package/esm2022/lib/pipes/currency-decimal-colfuturo.pipe.mjs +0 -36
  68. package/esm2022/lib/pipes/currency-print-colfuturo.pipe.mjs +0 -33
  69. package/esm2022/lib/pipes/thousands.pipe.mjs +0 -60
  70. package/esm2022/lib/services/application-fill-percentage.service.mjs +0 -30
  71. package/esm2022/lib/services/application-tag.service.mjs +0 -56
  72. package/esm2022/lib/services/application.service.mjs +0 -247
  73. package/esm2022/lib/services/authentication.service.mjs +0 -133
  74. package/esm2022/lib/services/blocked-beneficiary.service.mjs +0 -42
  75. package/esm2022/lib/services/budget-application.service.mjs +0 -265
  76. package/esm2022/lib/services/budget-simulation.service.mjs +0 -61
  77. package/esm2022/lib/services/budget.service.mjs +0 -205
  78. package/esm2022/lib/services/closure-wallet.service.mjs +0 -39
  79. package/esm2022/lib/services/cnf-correspondence-document-manager.service.mjs +0 -39
  80. package/esm2022/lib/services/committee-money.service.mjs +0 -44
  81. package/esm2022/lib/services/committee-pdf.service.mjs +0 -27
  82. package/esm2022/lib/services/committee-snapshot.service.mjs +0 -60
  83. package/esm2022/lib/services/common-info.service.mjs +0 -51
  84. package/esm2022/lib/services/common.service.mjs +0 -291
  85. package/esm2022/lib/services/configuration-document.service.mjs +0 -297
  86. package/esm2022/lib/services/configuration-minisite.service.mjs +0 -26
  87. package/esm2022/lib/services/configuration.service.mjs +0 -53
  88. package/esm2022/lib/services/correspondence-document-category.service.mjs +0 -31
  89. package/esm2022/lib/services/correspondence-manager.service.mjs +0 -67
  90. package/esm2022/lib/services/credit-score.service.mjs +0 -48
  91. package/esm2022/lib/services/credit-study.service.mjs +0 -292
  92. package/esm2022/lib/services/cube.service.mjs +0 -27
  93. package/esm2022/lib/services/data-form-history.service.mjs +0 -25
  94. package/esm2022/lib/services/data-form.service.mjs +0 -176
  95. package/esm2022/lib/services/data-letter-segmentation.service.mjs +0 -64
  96. package/esm2022/lib/services/document-analysis-auto.service.mjs +0 -27
  97. package/esm2022/lib/services/document-history.service.mjs +0 -43
  98. package/esm2022/lib/services/document-management.service.mjs +0 -57
  99. package/esm2022/lib/services/document-validation-attempt.service.mjs +0 -32
  100. package/esm2022/lib/services/document.service.mjs +0 -131
  101. package/esm2022/lib/services/documentary.type.service.mjs +0 -69
  102. package/esm2022/lib/services/email.service.mjs +0 -30
  103. package/esm2022/lib/services/evaluation.service.mjs +0 -181
  104. package/esm2022/lib/services/export-excel.service.mjs +0 -32
  105. package/esm2022/lib/services/file.service.mjs +0 -153
  106. package/esm2022/lib/services/form.service.mjs +0 -112
  107. package/esm2022/lib/services/gic-client-disbursement-metadata.service.mjs +0 -31
  108. package/esm2022/lib/services/gic-client.service.mjs +0 -49
  109. package/esm2022/lib/services/gic-cnf-bankvision-transaction.service.mjs +0 -31
  110. package/esm2022/lib/services/gic-cnf-closing-date.service.mjs +0 -34
  111. package/esm2022/lib/services/gic-cnf-maintenance.service.mjs +0 -30
  112. package/esm2022/lib/services/gic-collection.service.mjs +0 -53
  113. package/esm2022/lib/services/gic-disbursement.service.mjs +0 -39
  114. package/esm2022/lib/services/gic-extract.service.mjs +0 -41
  115. package/esm2022/lib/services/gic-log.service.mjs +0 -41
  116. package/esm2022/lib/services/gic-payment-application.service.mjs +0 -35
  117. package/esm2022/lib/services/gic-payment-plan-cube.service.mjs +0 -27
  118. package/esm2022/lib/services/gic-payment-plan.service.mjs +0 -32
  119. package/esm2022/lib/services/gic-trm.service.mjs +0 -27
  120. package/esm2022/lib/services/global.show.task.service.mjs +0 -37
  121. package/esm2022/lib/services/guarantee-document.service.mjs +0 -52
  122. package/esm2022/lib/services/guarantee-enrollment.service.mjs +0 -37
  123. package/esm2022/lib/services/guarantee.service.mjs +0 -128
  124. package/esm2022/lib/services/hash.service.mjs +0 -36
  125. package/esm2022/lib/services/import-data.service.mjs +0 -27
  126. package/esm2022/lib/services/import-excel-gic.service.mjs +0 -45
  127. package/esm2022/lib/services/initial-configuration-gic-parameters.service.mjs +0 -51
  128. package/esm2022/lib/services/initial-record.service.mjs +0 -51
  129. package/esm2022/lib/services/integration-ado.service.mjs +0 -54
  130. package/esm2022/lib/services/interaction-application-user.service.mjs +0 -81
  131. package/esm2022/lib/services/interest-adjustment.service.mjs +0 -34
  132. package/esm2022/lib/services/keys-assignation.service.mjs +0 -127
  133. package/esm2022/lib/services/legalization.service.mjs +0 -150
  134. package/esm2022/lib/services/letter-campaing.service.mjs +0 -49
  135. package/esm2022/lib/services/letter-task-mapping.service.mjs +0 -40
  136. package/esm2022/lib/services/log.service.mjs +0 -41
  137. package/esm2022/lib/services/maintenance.service.mjs +0 -66
  138. package/esm2022/lib/services/master-category.service.mjs +0 -66
  139. package/esm2022/lib/services/master-program.service.mjs +0 -78
  140. package/esm2022/lib/services/master-university.service.mjs +0 -68
  141. package/esm2022/lib/services/migration-plis.service.mjs +0 -27
  142. package/esm2022/lib/services/migration-survey-queue.service.mjs +0 -24
  143. package/esm2022/lib/services/page.service.mjs +0 -38
  144. package/esm2022/lib/services/partner-system.service.mjs +0 -30
  145. package/esm2022/lib/services/partner.service.mjs +0 -34
  146. package/esm2022/lib/services/pdf-analyzer.service.mjs +0 -33
  147. package/esm2022/lib/services/people-master.service.mjs +0 -42
  148. package/esm2022/lib/services/permission.service.mjs +0 -29
  149. package/esm2022/lib/services/pli-cnf-acuity-fields.service.mjs +0 -34
  150. package/esm2022/lib/services/pli-cnf-app-card-filter.service.mjs +0 -40
  151. package/esm2022/lib/services/pli-cnf-appointment-type.service.mjs +0 -41
  152. package/esm2022/lib/services/pli-cnf-budget-program-type.service.mjs +0 -54
  153. package/esm2022/lib/services/pli-cnf-budget.service.mjs +0 -31
  154. package/esm2022/lib/services/pli-cnf-cloning.service.mjs +0 -27
  155. package/esm2022/lib/services/pli-cnf-committee-pdf-config-table-config.service.mjs +0 -47
  156. package/esm2022/lib/services/pli-cnf-committee-pdf-gen-status.service.mjs +0 -30
  157. package/esm2022/lib/services/pli-cnf-committee-valpro-columns.service.mjs +0 -42
  158. package/esm2022/lib/services/pli-cnf-committee-visualization-mode.service.mjs +0 -42
  159. package/esm2022/lib/services/pli-cnf-committee.service.mjs +0 -51
  160. package/esm2022/lib/services/pli-cnf-config-minisite.service.mjs +0 -90
  161. package/esm2022/lib/services/pli-cnf-configuration-credit-study.service.mjs +0 -41
  162. package/esm2022/lib/services/pli-cnf-document-management.service.mjs +0 -40
  163. package/esm2022/lib/services/pli-cnf-dynamic-keys-assign.service.mjs +0 -52
  164. package/esm2022/lib/services/pli-cnf-evaluation-task-mailing.service.mjs +0 -31
  165. package/esm2022/lib/services/pli-cnf-evaluation-task.service.mjs +0 -112
  166. package/esm2022/lib/services/pli-cnf-evaluation-template.service.mjs +0 -95
  167. package/esm2022/lib/services/pli-cnf-form-edit.service.mjs +0 -68
  168. package/esm2022/lib/services/pli-cnf-form-multiaplicacion.service.mjs +0 -46
  169. package/esm2022/lib/services/pli-cnf-guarantee-documents-template.service.mjs +0 -40
  170. package/esm2022/lib/services/pli-cnf-guarantee-token.service.mjs +0 -42
  171. package/esm2022/lib/services/pli-cnf-header.service.mjs +0 -39
  172. package/esm2022/lib/services/pli-cnf-indicator.service.mjs +0 -39
  173. package/esm2022/lib/services/pli-cnf-information-system.service.mjs +0 -24
  174. package/esm2022/lib/services/pli-cnf-interaction.service.mjs +0 -78
  175. package/esm2022/lib/services/pli-cnf-letter-template-type.service.mjs +0 -29
  176. package/esm2022/lib/services/pli-cnf-letter-template.service.mjs +0 -48
  177. package/esm2022/lib/services/pli-cnf-look-and-feel.service.mjs +0 -28
  178. package/esm2022/lib/services/pli-cnf-mail.service.mjs +0 -30
  179. package/esm2022/lib/services/pli-cnf-menu-form.service.mjs +0 -34
  180. package/esm2022/lib/services/pli-cnf-migration-plis-field-budget.service.mjs +0 -34
  181. package/esm2022/lib/services/pli-cnf-migration-plis-field.service.mjs +0 -47
  182. package/esm2022/lib/services/pli-cnf-migration-status-plis.service.mjs +0 -44
  183. package/esm2022/lib/services/pli-cnf-page-section-form.service.mjs +0 -66
  184. package/esm2022/lib/services/pli-cnf-page-sub-process.service.mjs +0 -25
  185. package/esm2022/lib/services/pli-cnf-pdfs.service.mjs +0 -31
  186. package/esm2022/lib/services/pli-cnf-profile-form.service.mjs +0 -40
  187. package/esm2022/lib/services/pli-cnf-profile-user.service.mjs +0 -49
  188. package/esm2022/lib/services/pli-cnf-project-summary.service.mjs +0 -39
  189. package/esm2022/lib/services/pli-cnf-scenario.service.mjs +0 -47
  190. package/esm2022/lib/services/pli-cnf-segmentation.service.mjs +0 -72
  191. package/esm2022/lib/services/pli-cnf-snapshot-token.service.mjs +0 -42
  192. package/esm2022/lib/services/pli-cnf-status-flow-interaction.service.mjs +0 -74
  193. package/esm2022/lib/services/pli-cnf-status-flow.service.mjs +0 -56
  194. package/esm2022/lib/services/pli-cnf-support-document-category.service.mjs +0 -47
  195. package/esm2022/lib/services/pli-cnf-support-document.service.mjs +0 -56
  196. package/esm2022/lib/services/pli-cnf-survey-document.service.mjs +0 -37
  197. package/esm2022/lib/services/pli-cnf-survey-pdf.service.mjs +0 -34
  198. package/esm2022/lib/services/pli-cnf-survey.service.mjs +0 -46
  199. package/esm2022/lib/services/pli-cnf-task-group.service.mjs +0 -33
  200. package/esm2022/lib/services/pli-cnf-text-category.service.mjs +0 -38
  201. package/esm2022/lib/services/pli-cnf-text-option.service.mjs +0 -39
  202. package/esm2022/lib/services/pli-cnf-text.service.mjs +0 -62
  203. package/esm2022/lib/services/pli-cnf-type-text.service.mjs +0 -45
  204. package/esm2022/lib/services/pli-cnf-university-article.service.mjs +0 -39
  205. package/esm2022/lib/services/pli-cnf-user-calendar.service.mjs +0 -36
  206. package/esm2022/lib/services/pli-cnf-user-workspace.service.mjs +0 -35
  207. package/esm2022/lib/services/pli-cnf-valpro-keys.service.mjs +0 -35
  208. package/esm2022/lib/services/pli-cnf-workspace-segmentation.service.mjs +0 -31
  209. package/esm2022/lib/services/pli-message-type.service.mjs +0 -40
  210. package/esm2022/lib/services/pli-multiple-value-filter.service.mjs +0 -39
  211. package/esm2022/lib/services/pli-promocion-username.service.mjs +0 -57
  212. package/esm2022/lib/services/pli-seg-action-user.service.mjs +0 -37
  213. package/esm2022/lib/services/pli-segmentation.service.mjs +0 -130
  214. package/esm2022/lib/services/pli-tag-assignment.service.mjs +0 -36
  215. package/esm2022/lib/services/pli-tag.service.mjs +0 -55
  216. package/esm2022/lib/services/pli-user.service.mjs +0 -51
  217. package/esm2022/lib/services/plis-beneficiario.service.mjs +0 -29
  218. package/esm2022/lib/services/plis-estatus-change.service.mjs +0 -30
  219. package/esm2022/lib/services/ppp.service.mjs +0 -360
  220. package/esm2022/lib/services/profile.service.mjs +0 -60
  221. package/esm2022/lib/services/progress-bar.service.mjs +0 -40
  222. package/esm2022/lib/services/promotion-score.service.mjs +0 -44
  223. package/esm2022/lib/services/registry-identifier.service.mjs +0 -39
  224. package/esm2022/lib/services/return-refund.service.mjs +0 -53
  225. package/esm2022/lib/services/segmentation-tokens.service.mjs +0 -43
  226. package/esm2022/lib/services/segmentation-user-service.service.mjs +0 -90
  227. package/esm2022/lib/services/segmentation.service.mjs +0 -31
  228. package/esm2022/lib/services/send-application.service.mjs +0 -492
  229. package/esm2022/lib/services/sesion-form.service.mjs +0 -31
  230. package/esm2022/lib/services/sesion.service.mjs +0 -48
  231. package/esm2022/lib/services/spinner.service.mjs +0 -16
  232. package/esm2022/lib/services/sponsorship-letter.service.mjs +0 -68
  233. package/esm2022/lib/services/status.service.mjs +0 -100
  234. package/esm2022/lib/services/summary-budget.service.mjs +0 -24
  235. package/esm2022/lib/services/survey-metadata.service.mjs +0 -28
  236. package/esm2022/lib/services/survey-queue.service.mjs +0 -24
  237. package/esm2022/lib/services/survey.service.mjs +0 -52
  238. package/esm2022/lib/services/tasa.cambio.service.mjs +0 -35
  239. package/esm2022/lib/services/token-transformation.service.mjs +0 -62
  240. package/esm2022/lib/services/token.service.mjs +0 -1345
  241. package/esm2022/lib/services/university.service.mjs +0 -50
  242. package/esm2022/lib/services/upload-documents.service.mjs +0 -60
  243. package/esm2022/lib/services/user.service.mjs +0 -28
  244. package/esm2022/lib/services/visualization-committee.service.mjs +0 -84
  245. package/esm2022/lib/utils/custom-validator.mjs +0 -95
  246. package/esm2022/lib/utils/form-util.mjs +0 -35
  247. package/esm2022/lib/utils/formio-util.mjs +0 -582
  248. package/esm2022/lib/utils/version-commons.mjs +0 -10
  249. package/esm2022/ng-pli-commons.mjs +0 -5
  250. package/esm2022/public-api.mjs +0 -215
  251. package/esm2022/version.mjs +0 -29
@@ -1,492 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { BehaviorSubject } from 'rxjs';
3
- import { SendApplication, ETipoPresupuesto, EBudgetBuildType, EBudgetError, Document, EDocumentState, Email, InteractionApplicationUser, ETypeStaticInteraction, AuthenticationUtil, ECnfPageSection } from 'ng-pli-util';
4
- import { FormioUtil } from '../utils/formio-util';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./token.service";
7
- import * as i2 from "./email.service";
8
- import * as i3 from "./interaction-application-user.service";
9
- export class SendApplicationService {
10
- constructor(environment, tokenService, emailService, interactionApplicationUserService) {
11
- this.environment = environment;
12
- this.tokenService = tokenService;
13
- this.emailService = emailService;
14
- this.interactionApplicationUserService = interactionApplicationUserService;
15
- /** This observable allows to get the porcentage */
16
- this.percentageSubject = new BehaviorSubject(0);
17
- }
18
- /** It has an observable to notify if the percentage is changed */
19
- onChangePercentage() {
20
- return this.percentageSubject.asObservable();
21
- }
22
- /** it defines the value for percentage */
23
- setPercentage(current, total) {
24
- if (current && total) {
25
- const percentage = (current / total) * 100;
26
- this.percentageSubject.next(percentage);
27
- }
28
- else {
29
- this.resetPercentage();
30
- }
31
- }
32
- /** it resets the percentage */
33
- resetPercentage() {
34
- this.percentageSubject.next(0);
35
- }
36
- /**
37
- * It send email masively
38
- * @param application
39
- * @param i current idnex
40
- * @param length length
41
- * @param sendApplication
42
- */
43
- sendEmailMassively(application) {
44
- let email = new Email();
45
- email.addTo('pruebaconvo@ben.colfuturo.org');
46
- // uncomment when the environment
47
- email.setSubject('Envío de solicitud ' + application.id);
48
- email.setBody('Cordial saludo, <br/>Hemos enviado la solicitud ' + application.id);
49
- return this.emailService.send(email);
50
- }
51
- /** Send email application */
52
- sendEmail(application) {
53
- let email = new Email();
54
- email.addTo('pruebaconvo@ben.colfuturo.org');
55
- // uncomment when the environment
56
- email.setSubject('Envío de solicitud ' + application.id);
57
- email.setBody('Cordial saludo, <br/>Has enviado la solicitud ' + application.id);
58
- return this.emailService.send(email);
59
- }
60
- /** It saves the interaction */
61
- saveInteraction(applicationId, promCodigo, pliCnfStatusFlowInteraction, observation) {
62
- let interactionAppUser = new InteractionApplicationUser();
63
- interactionAppUser.applicationId = applicationId;
64
- interactionAppUser.promCodigo = promCodigo;
65
- if (pliCnfStatusFlowInteraction.pliCnfInteraction &&
66
- pliCnfStatusFlowInteraction.pliCnfInteraction.id)
67
- interactionAppUser.pliCnfInteractionId =
68
- pliCnfStatusFlowInteraction.pliCnfInteraction.id;
69
- if (pliCnfStatusFlowInteraction.pliCnfStatusFlow &&
70
- pliCnfStatusFlowInteraction.pliCnfStatusFlow.id)
71
- interactionAppUser.pliCnfStatusFlowId = pliCnfStatusFlowInteraction.pliCnfStatusFlow.id;
72
- if (pliCnfStatusFlowInteraction.id)
73
- interactionAppUser.pliCnfStatusFlowInteractionId = pliCnfStatusFlowInteraction.id;
74
- interactionAppUser.interactionStaticId = ETypeStaticInteraction.SEND_APPLICATION;
75
- interactionAppUser.pliUserId = AuthenticationUtil.getPliUsuario()
76
- ? AuthenticationUtil.getPliUsuario().usuCodigo
77
- : null;
78
- interactionAppUser.positive = true;
79
- interactionAppUser.observation = observation ? observation : 'Envío de solicitud';
80
- return this.interactionApplicationUserService.save(interactionAppUser);
81
- }
82
- saveInteractionInformation(interactionAppUser, resolve, reject) {
83
- this.interactionApplicationUserService.save(interactionAppUser).subscribe((result) => {
84
- resolve(result);
85
- }, (error) => {
86
- console.error('ERROR - saveInteraction - interactionApplicationUserService.save ', error);
87
- reject(error);
88
- });
89
- }
90
- /**
91
- * It validates the data
92
- * @param listApplication
93
- * @param listForm
94
- * @param listDataForm
95
- * @param listBudgetSetting
96
- * @param listBudget
97
- * @param listConfigurationDocument
98
- * @param listDocument
99
- * @param validateJustRequired eg. when the screern require get just require documents (send application)
100
- */
101
- validate(listTotalStatus, listApplication, listForm, listDataForm, listBudgetSetting, listBudget, listConfigurationDocument, listDocument, callback, validateJustRequired, validateSummarizedBudget) {
102
- let listSendApplication = [];
103
- // reset percentage
104
- // this.resetPercentage();
105
- if (listApplication && listApplication.length > 0) {
106
- // iterate over listApplication
107
- for (let i = 0; i < listApplication.length; i++) {
108
- // define application
109
- const application = listApplication[i];
110
- // create send application object
111
- let sendApplication = new SendApplication();
112
- // define applicationId
113
- sendApplication.applicationId = application.id;
114
- let currentStatus = [];
115
- if (listTotalStatus &&
116
- listTotalStatus.length &&
117
- application.stateId &&
118
- listForm &&
119
- listForm.length)
120
- // get the list page section according to statusId
121
- for (const status of listTotalStatus)
122
- if (status.id == application.stateId) {
123
- currentStatus = status;
124
- break;
125
- }
126
- // define the listForm that can be valdiated according to status
127
- const listFormActivated = this.getListFormsByStatus(currentStatus, listForm);
128
- // get validated list form
129
- sendApplication.listValidatedForm = this.getValidatedFormList(listFormActivated, listDataForm, sendApplication.applicationId);
130
- // get validated list budget
131
- if (!validateSummarizedBudget) {
132
- sendApplication.listValidatedBudget = this.getValidatedBudget(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
133
- }
134
- else {
135
- sendApplication.listValidatedBudget = this.getValidatedBudgetSummarized(listBudgetSetting, listBudget, sendApplication.applicationId, currentStatus);
136
- }
137
- // get validated list document
138
- sendApplication.listValidatedDocument = this.getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired);
139
- // resolve validation - no listValidatedDoc - listValidatedBudget - listValidatedForm
140
- sendApplication.validation =
141
- !sendApplication.listValidatedDocument.length &&
142
- !sendApplication.listValidatedBudget.length &&
143
- !sendApplication.listValidatedForm.length;
144
- // add to array
145
- listSendApplication.push(sendApplication);
146
- // call callback
147
- if (callback)
148
- callback(sendApplication, application, i, listApplication.length);
149
- }
150
- }
151
- return listSendApplication;
152
- }
153
- /** it returns the forms that are activated according to status */
154
- getListFormsByStatus(currentStatus, listForm) {
155
- let listActivatedForm = [];
156
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
157
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
158
- // fill the list activated form
159
- for (const form of listForm)
160
- for (const section of listPliCnfStatusPageSection)
161
- if (section.idForm == form.id) {
162
- listActivatedForm.push(form);
163
- break;
164
- }
165
- return listActivatedForm;
166
- }
167
- /** it returns the validated document list */
168
- getValidatedDocument(currentStatus, listConfigurationDocument, listDocument, application, listDataForm, validateJustRequired) {
169
- let listValidatedDocument = [];
170
- if (listConfigurationDocument) {
171
- // it contains the documents that are visible
172
- let listConfigurationDocumentVisible = [];
173
- //checkIfShouldValidate
174
- let shouldValidateDocuments = false;
175
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
176
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
177
- for (const section of listPliCnfStatusPageSection)
178
- if (section.pliCnfPageSection)
179
- switch (section.pliCnfPageSection.keyLabel) {
180
- case 'documentos': {
181
- shouldValidateDocuments = true;
182
- break;
183
- }
184
- }
185
- if (!shouldValidateDocuments)
186
- return listValidatedDocument;
187
- // resolve the configuration that is visible
188
- if (listConfigurationDocument) {
189
- for (const configurationDocument of listConfigurationDocument) {
190
- let visible = true;
191
- if (configurationDocument.formula && configurationDocument.formula.length) {
192
- let formula = '';
193
- try {
194
- let data = { statusname: application.stateName };
195
- if (listDataForm)
196
- for (const dataForm of listDataForm)
197
- for (const property in dataForm.data)
198
- data[property.toLowerCase()] = dataForm.data[property];
199
- formula = this.tokenService.replaceTokensFromListObject(configurationDocument.name, configurationDocument.formula, data);
200
- let result = eval(formula);
201
- if (result !== true) {
202
- visible = false;
203
- }
204
- }
205
- catch (error) {
206
- visible = false;
207
- }
208
- }
209
- if (visible) {
210
- listConfigurationDocumentVisible.push(configurationDocument);
211
- }
212
- }
213
- }
214
- // resolve the list of documents
215
- if (listConfigurationDocumentVisible) {
216
- for (let i = 0; i < listConfigurationDocumentVisible.length; i++) {
217
- let configurationDocument = listConfigurationDocumentVisible[i];
218
- let document = this.getDocumentByConfigurationId(configurationDocument.id, listDocument, application.id);
219
- if (validateJustRequired) {
220
- if ((!document ||
221
- (document && document.listArchive.length == 0) ||
222
- this.automaticDocumentsValidated(configurationDocument, listDataForm, document)) &&
223
- configurationDocument.required) {
224
- this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
225
- }
226
- }
227
- else {
228
- if (document) {
229
- if (document.state == EDocumentState.PENDIENTE) {
230
- listValidatedDocument.push(document);
231
- }
232
- }
233
- else {
234
- this.fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument);
235
- }
236
- }
237
- }
238
- }
239
- }
240
- return listValidatedDocument;
241
- }
242
- fillListValidateDocumentDefault(listValidatedDocument, application, configurationDocument) {
243
- let document = new Document();
244
- document.applicationId = application.id;
245
- document.promCodigo = configurationDocument.promCodigo;
246
- document.state = EDocumentState.PENDIENTE;
247
- document.configurationDocumentId = configurationDocument.id;
248
- document.listArchive = [];
249
- listValidatedDocument.push(document);
250
- }
251
- /** It gets document by configuration Id */
252
- getDocumentByConfigurationId(configurationDocumentId, list, applicationId) {
253
- if (list)
254
- for (const document of list)
255
- if (document.configurationDocumentId === configurationDocumentId &&
256
- document.applicationId === applicationId)
257
- return document;
258
- return null;
259
- }
260
- /** get the budget application by type budget and budget setup id */
261
- getValidatedBudgetApplication(budgetSetting, typeBudget, listBudget, applicationId) {
262
- if (listBudget)
263
- for (const budget of listBudget)
264
- if (budget.tag == typeBudget &&
265
- budgetSetting.cpreCodigo == budget.budgetSetupId &&
266
- budget.applicationId == applicationId) {
267
- return this.validateBudget(budget, budgetSetting, typeBudget);
268
- }
269
- return this.validateBudget(null, budgetSetting, typeBudget);
270
- }
271
- /** It validates the budget */
272
- validateBudget(budget, budgetSetting, type) {
273
- if (!budget || !budget.summary || !budget.summary.budgetTotal)
274
- // validate if there is a budget object
275
- return {
276
- budget: budget,
277
- type: type,
278
- budgetSetting: budgetSetting,
279
- error: EBudgetError.NO_OBJECT
280
- };
281
- else if ((type === EBudgetBuildType.financing || type === EBudgetBuildType.mixed) &&
282
- budget.summary.budgetTotal > budgetSetting.cpreMontoTotal)
283
- // validate if amount total overcomes the maximum
284
- return {
285
- budget: budget,
286
- type: type,
287
- budgetSetting: budgetSetting,
288
- error: EBudgetError.OVERCOME_MAXIMUM_AMOUNT
289
- };
290
- else if (type === EBudgetBuildType.financing &&
291
- (!budget.financingStart || !budget.financingEnd))
292
- // validate if financing dates are defined
293
- return {
294
- budget: budget,
295
- type: type,
296
- budgetSetting: budgetSetting,
297
- error: EBudgetError.FINANCING_DATES
298
- };
299
- return null;
300
- }
301
- validateSummarizedBudget(budgetSetting, type, budget) {
302
- if (!budget || !budget.summary || !budget.summary.budgetTotal) {
303
- // validate if there is a budget object
304
- return {
305
- budget: budget,
306
- type: type,
307
- budgetSetting: budgetSetting,
308
- error: EBudgetError.NO_OBJECT
309
- };
310
- }
311
- return null;
312
- }
313
- validateCompleteBudget(listBudgetSetting, listBudget, applicationId) {
314
- return this.getValidatedBudget(listBudgetSetting, listBudget, applicationId);
315
- }
316
- /** it returns the validated budget list */
317
- getValidatedBudget(listBudgetSetting, listBudget, applicationId, currentStatus) {
318
- let listValidatedBudget = [];
319
- if (listBudgetSetting) {
320
- let shouldValidateTotalBudget = false;
321
- let shouldValidateFinancingBudget = false;
322
- if (currentStatus) {
323
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
324
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
325
- for (const section of listPliCnfStatusPageSection)
326
- if (section.pliCnfPageSection)
327
- switch (section.pliCnfPageSection.keyLabel) {
328
- case 'presupuesto.total': {
329
- shouldValidateTotalBudget = true;
330
- break;
331
- }
332
- case 'presupuesto.financiacion': {
333
- shouldValidateFinancingBudget = true;
334
- break;
335
- }
336
- }
337
- }
338
- else {
339
- shouldValidateTotalBudget = true;
340
- shouldValidateFinancingBudget = true;
341
- }
342
- // iterate over listBudgetSetting
343
- for (const budgetSetting of listBudgetSetting) {
344
- // skip general budget
345
- if (budgetSetting.pliTipoPresupuesto.tpresCodigo == ETipoPresupuesto.GENERAL)
346
- continue;
347
- // budget total
348
- const budgetDataTotal = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.total, listBudget, applicationId);
349
- if (budgetDataTotal && shouldValidateTotalBudget)
350
- listValidatedBudget.push(budgetDataTotal);
351
- // if it has own funds, so it validates total and financing
352
- if (budgetSetting.cpreEsFondosPropios) {
353
- const budgetDataFinancing = this.getValidatedBudgetApplication(budgetSetting, EBudgetBuildType.financing, listBudget, applicationId);
354
- if (budgetDataFinancing && shouldValidateFinancingBudget)
355
- listValidatedBudget.push(budgetDataFinancing);
356
- }
357
- }
358
- }
359
- return listValidatedBudget;
360
- }
361
- /** It returns the validated form list */
362
- getValidatedFormList(listForm, listDataForm, applicationId) {
363
- let listValidatedForm = [];
364
- if (listForm) {
365
- // iterate over listform
366
- for (const form of listForm) {
367
- // get errors by formId and ApplicationId
368
- const errors = this.getErrorsByFormIdAndApplicationId(listDataForm, form.id, applicationId);
369
- if (errors && errors.length) {
370
- const components = FormioUtil.getComponents(form.components);
371
- // generate the error components according to errors
372
- let errorComponent = [];
373
- for (const error of errors) {
374
- if (error && error.component && error.component.key && components) {
375
- for (const component of components) {
376
- if (component.key == error.component.key) {
377
- errorComponent.push(component);
378
- break;
379
- }
380
- }
381
- }
382
- }
383
- if (errorComponent && errorComponent.length) {
384
- // organizing by panels
385
- const panels = FormioUtil.getFormattedComponentsByPanel(errorComponent);
386
- // add to listValidatedForm
387
- listValidatedForm.push({
388
- id: form.id,
389
- name: form.title,
390
- panels: panels,
391
- toggle: false
392
- });
393
- }
394
- }
395
- else {
396
- // verify if data is completed
397
- // get data by form id and app id
398
- const data = this.getDataByFormIdAndApplicationId(listDataForm, form.id, applicationId);
399
- // get components are required according to data
400
- const components = FormioUtil.getRequiredComponentsByData(form.components, data);
401
- if (components && components.length) {
402
- // organizing by panels
403
- const panels = FormioUtil.getFormattedComponentsByPanel(components);
404
- // add to listValidatedForm
405
- listValidatedForm.push({
406
- id: form.id,
407
- name: form.title,
408
- panels: panels,
409
- toggle: false
410
- });
411
- }
412
- }
413
- }
414
- }
415
- return listValidatedForm;
416
- }
417
- /** It returns the data by formId and ApplicationId */
418
- getErrorsByFormIdAndApplicationId(listDataForm, formId, applicationId) {
419
- if (listDataForm && formId && applicationId)
420
- for (const data of listDataForm)
421
- if (data.formId == formId && data.applicationId == applicationId)
422
- return data.errors;
423
- return null;
424
- }
425
- /** It returns the data by formId and ApplicationId */
426
- getDataByFormIdAndApplicationId(listDataForm, formId, applicationId) {
427
- if (listDataForm && formId && applicationId)
428
- for (const data of listDataForm)
429
- if (data.formId == formId && data.applicationId == applicationId)
430
- return data.data;
431
- return null;
432
- }
433
- getValidatedBudgetSummarized(listBudgetSetting, listBudget, applicationId, currentStatus) {
434
- let listValidatedBudget = [];
435
- if (listBudgetSetting) {
436
- let shouldValidateTotalBudget = false;
437
- if (currentStatus) {
438
- let listPliCnfStatusPageSection = currentStatus.listPliCnfStatusPageSection;
439
- if (listPliCnfStatusPageSection && listPliCnfStatusPageSection.length)
440
- for (const section of listPliCnfStatusPageSection)
441
- if (section.pliCnfPageSection)
442
- switch (section.pliCnfPageSection.keyLabel) {
443
- case ECnfPageSection.presupuestoResumido: {
444
- shouldValidateTotalBudget = true;
445
- break;
446
- }
447
- }
448
- }
449
- else {
450
- shouldValidateTotalBudget = true;
451
- }
452
- const budgetDataTotal = this.validateSummarizedBudget(listBudgetSetting[0], EBudgetBuildType.total, listBudget[0]);
453
- if (budgetDataTotal && shouldValidateTotalBudget)
454
- listValidatedBudget.push(budgetDataTotal);
455
- }
456
- return listValidatedBudget;
457
- }
458
- automaticDocumentsValidated(configDocument, listDataForm, document) {
459
- if (configDocument.formulaValidateMultiple &&
460
- configDocument.formulaValidateMultiple.length > 0) {
461
- let data = { statusname: '' };
462
- if (listDataForm)
463
- for (const dataForm of listDataForm)
464
- for (const property in dataForm.data)
465
- data[property.toLowerCase()] = dataForm.data[property];
466
- let formula = this.tokenService.replaceTokensFromListObject(configDocument.name, configDocument.formulaValidateMultiple, data);
467
- let result = eval(formula);
468
- if (result) {
469
- let resultArray = JSON.parse(result);
470
- if (resultArray && resultArray.length > 0) {
471
- //Then document must have archives
472
- if (!document || document.listArchive.length !== resultArray.length) {
473
- return true;
474
- }
475
- }
476
- }
477
- }
478
- return false;
479
- }
480
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SendApplicationService, deps: [{ token: 'environment' }, { token: i1.TokenService }, { token: i2.EmailService }, { token: i3.InteractionApplicationUserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
481
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SendApplicationService, providedIn: 'root' }); }
482
- }
483
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SendApplicationService, decorators: [{
484
- type: Injectable,
485
- args: [{
486
- providedIn: 'root'
487
- }]
488
- }], ctorParameters: () => [{ type: undefined, decorators: [{
489
- type: Inject,
490
- args: ['environment']
491
- }] }, { type: i1.TokenService }, { type: i2.EmailService }, { type: i3.InteractionApplicationUserService }] });
492
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC1hcHBsaWNhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctcGxpLWNvbW1vbnMvc3JjL2xpYi9zZXJ2aWNlcy9zZW5kLWFwcGxpY2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUluRCxPQUFPLEVBSU4sZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFFBQVEsRUFDUixjQUFjLEVBQ2QsS0FBSyxFQUNMLDBCQUEwQixFQUUxQixzQkFBc0IsRUFHdEIsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7O0FBS2xELE1BQU0sT0FBTyxzQkFBc0I7SUFJbEMsWUFDZ0MsV0FBVyxFQUNsQyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixpQ0FBb0U7UUFIN0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0NBQWlDLEdBQWpDLGlDQUFpQyxDQUFtQztRQVA3RSxtREFBbUQ7UUFDM0Msc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVMsQ0FBQyxDQUFDLENBQUM7SUFPeEQsQ0FBQztJQUVKLG1FQUFtRTtJQUM1RCxrQkFBa0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVELDBDQUEwQztJQUNuQyxhQUFhLENBQUMsT0FBZSxFQUFFLEtBQWE7UUFDbEQsSUFBSSxPQUFPLElBQUksS0FBSyxFQUFF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Q0FBQyxJQUFJO3dCQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUMxRCxjQUFjLENBQUMsSUFBSSxFQUNuQixjQUFjLENBQUMsdUJBQXVCLEVBQ3RDLElBQUksQ0FDSixDQUFDO1lBQ0YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1osSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFFckMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0Msa0NBQWtDO29CQUNsQyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt3QkFDckUsT0FBTyxJQUFJLENBQUM7b0JBQ2IsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7K0dBN29CVyxzQkFBc0Isa0JBS3pCLGFBQWE7bUhBTFYsc0JBQXNCLGNBRnRCLE1BQU07OzRGQUVOLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQU1FLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW1haWxTZXJ2aWNlIH0gZnJvbSAnLi9lbWFpbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbnRlcmFjdGlvbi1hcHBsaWNhdGlvbi11c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG5cdEFwcGxpY2F0aW9uLFxyXG5cdEJ1ZGdldERhdGEsXHJcblx0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFNlbmRBcHBsaWNhdGlvbixcclxuXHRFVGlwb1ByZXN1cHVlc3RvLFxyXG5cdEVCdWRnZXRCdWlsZFR5cGUsXHJcblx0RUJ1ZGdldEVycm9yLFxyXG5cdERvY3VtZW50LFxyXG5cdEVEb2N1bWVudFN0YXRlLFxyXG5cdEVtYWlsLFxyXG5cdEludGVyYWN0aW9uQXBwbGljYXRpb25Vc2VyLFxyXG5cdFBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbixcclxuXHRFVHlwZVN0YXRpY0ludGVyYWN0aW9uLFxyXG5cdFBsaUNuZlN0YXR1cyxcclxuXHRQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbixcclxuXHRBdXRoZW50aWNhdGlvblV0aWwsXHJcblx0RUNuZlBhZ2VTZWN0aW9uXHJcbn0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5pbXBvcnQgeyBGb3JtaW9VdGlsIH0gZnJvbSAnLi4vdXRpbHMvZm9ybWlvLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VuZEFwcGxpY2F0aW9uU2VydmljZSB7XHJcblx0LyoqIFRoaXMgb2JzZXJ2YWJsZSBhbGxvd3MgdG8gZ2V0IHRoZSBwb3JjZW50YWdlICovXHJcblx0cHJpdmF0ZSBwZXJjZW50YWdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQsXHJcblx0XHRwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBlbWFpbFNlcnZpY2U6IEVtYWlsU2VydmljZSxcclxuXHRcdHByaXZhdGUgaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlclNlcnZpY2VcclxuXHQpIHt9XHJcblxyXG5cdC8qKiAgSXQgaGFzIGFuIG9ic2VydmFibGUgdG8gbm90aWZ5IGlmIHRoZSBwZXJjZW50YWdlIGlzIGNoYW5nZWQgKi9cclxuXHRwdWJsaWMgb25DaGFuZ2VQZXJjZW50YWdlKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5wZXJjZW50YWdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKiBpdCBkZWZpbmVzIHRoZSB2YWx1ZSBmb3IgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyBzZXRQZXJjZW50YWdlKGN1cnJlbnQ6IG51bWJlciwgdG90YWw6IG51bWJlcikge1xyXG5cdFx0aWYgKGN1cnJlbnQgJiYgdG90YWwpIHtcclxuXHRcdFx0Y29uc3QgcGVyY2VudGFnZSA9IChjdXJyZW50IC8gdG90YWwpICogMTAwO1xyXG5cdFx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQocGVyY2VudGFnZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnJlc2V0UGVyY2VudGFnZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJlc2V0cyB0aGUgcGVyY2VudGFnZSAqL1xyXG5cdHB1YmxpYyByZXNldFBlcmNlbnRhZ2UoKSB7XHJcblx0XHR0aGlzLnBlcmNlbnRhZ2VTdWJqZWN0Lm5leHQoMCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJdCBzZW5kIGVtYWlsIG1hc2l2ZWx5XHJcblx0ICogQHBhcmFtIGFwcGxpY2F0aW9uXHJcblx0ICogQHBhcmFtIGkgY3VycmVudCBpZG5leFxyXG5cdCAqIEBwYXJhbSBsZW5ndGggbGVuZ3RoXHJcblx0ICogQHBhcmFtIHNlbmRBcHBsaWNhdGlvblxyXG5cdCAqL1xyXG5cdHNlbmRFbWFpbE1hc3NpdmVseShhcHBsaWNhdGlvbjogQXBwbGljYXRpb24pIHtcclxuXHRcdGxldCBlbWFpbDogRW1haWwgPSBuZXcgRW1haWwoKTtcclxuXHRcdGVtYWlsLmFkZFRvKCdwcnVlYmFjb252b0BiZW4uY29sZnV0dXJvLm9yZycpO1xyXG5cdFx0Ly8gdW5jb21tZW50IHdoZW4gdGhlIGVudmlyb25tZW50XHJcblx0XHRlbWFpbC5zZXRTdWJqZWN0KCdFbnbDrW8gZGUgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRlbWFpbC5zZXRCb2R5KCdDb3JkaWFsIHNhbHVkbywgPGJyLz5IZW1vcyBlbnZpYWRvIGxhIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuZW1haWxTZXJ2aWNlLnNlbmQoZW1haWwpO1xyXG5cdH1cclxuXHJcblx0LyoqIFNlbmQgZW1haWwgYXBwbGljYXRpb24gKi9cclxuXHRzZW5kRW1haWwoYXBwbGljYXRpb246IEFwcGxpY2F0aW9uKSB7XHJcblx0XHRsZXQgZW1haWw6IEVtYWlsID0gbmV3IEVtYWlsKCk7XHJcblx0XHRlbWFpbC5hZGRUbygncHJ1ZWJhY29udm9AYmVuLmNvbGZ1dHVyby5vcmcnKTtcclxuXHRcdC8vIHVuY29tbWVudCB3aGVuIHRoZSBlbnZpcm9ubWVudFxyXG5cdFx0ZW1haWwuc2V0U3ViamVjdCgnRW52w61vIGRlIHNvbGljaXR1ZCAnICsgYXBwbGljYXRpb24uaWQpO1xyXG5cdFx0ZW1haWwuc2V0Qm9keSgnQ29yZGlhbCBzYWx1ZG8sIDxici8+SGFzIGVudmlhZG8gbGEgc29saWNpdHVkICcgKyBhcHBsaWNhdGlvbi5pZCk7XHJcblx0XHRyZXR1cm4gdGhpcy5lbWFpbFNlcnZpY2Uuc2VuZChlbWFpbCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgc2F2ZXMgdGhlIGludGVyYWN0aW9uICovXHJcblx0c2F2ZUludGVyYWN0aW9uKFxyXG5cdFx0YXBwbGljYXRpb25JZDogc3RyaW5nLFxyXG5cdFx0cHJvbUNvZGlnbzogbnVtYmVyLFxyXG5cdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uOiBQbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24sXHJcblx0XHRvYnNlcnZhdGlvbj86IHN0cmluZ1xyXG5cdCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgaW50ZXJhY3Rpb25BcHBVc2VyOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlciA9IG5ldyBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlcigpO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmFwcGxpY2F0aW9uSWQgPSBhcHBsaWNhdGlvbklkO1xyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLnByb21Db2RpZ28gPSBwcm9tQ29kaWdvO1xyXG5cclxuXHRcdGlmIChcclxuXHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uICYmXHJcblx0XHRcdHBsaUNuZlN0YXR1c0Zsb3dJbnRlcmFjdGlvbi5wbGlDbmZJbnRlcmFjdGlvbi5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mSW50ZXJhY3Rpb25JZCA9XHJcblx0XHRcdFx0cGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZkludGVyYWN0aW9uLmlkO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdyAmJlxyXG5cdFx0XHRwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24ucGxpQ25mU3RhdHVzRmxvdy5pZFxyXG5cdFx0KVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0lkID0gcGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLnBsaUNuZlN0YXR1c0Zsb3cuaWQ7XHJcblx0XHRpZiAocGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uLmlkKVxyXG5cdFx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpQ25mU3RhdHVzRmxvd0ludGVyYWN0aW9uSWQgPSBwbGlDbmZTdGF0dXNGbG93SW50ZXJhY3Rpb24uaWQ7XHJcblxyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyLmludGVyYWN0aW9uU3RhdGljSWQgPSBFVHlwZVN0YXRpY0ludGVyYWN0aW9uLlNFTkRfQVBQTElDQVRJT047XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIucGxpVXNlcklkID0gQXV0aGVudGljYXRpb25VdGlsLmdldFBsaVVzdWFyaW8oKVxyXG5cdFx0XHQ/IEF1dGhlbnRpY2F0aW9uVXRpbC5nZXRQbGlVc3VhcmlvKCkudXN1Q29kaWdvXHJcblx0XHRcdDogbnVsbDtcclxuXHRcdGludGVyYWN0aW9uQXBwVXNlci5wb3NpdGl2ZSA9IHRydWU7XHJcblx0XHRpbnRlcmFjdGlvbkFwcFVzZXIub2JzZXJ2YXRpb24gPSBvYnNlcnZhdGlvbiA/IG9ic2VydmF0aW9uIDogJ0VudsOtbyBkZSBzb2xpY2l0dWQnO1xyXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25BcHBsaWNhdGlvblVzZXJTZXJ2aWNlLnNhdmUoaW50ZXJhY3Rpb25BcHBVc2VyKTtcclxuXHR9XHJcblxyXG5cdHNhdmVJbnRlcmFjdGlvbkluZm9ybWF0aW9uKFxyXG5cdFx0aW50ZXJhY3Rpb25BcHBVc2VyOiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlcixcclxuXHRcdHJlc29sdmU6IGFueSxcclxuXHRcdHJlamVjdDogYW55XHJcblx0KSB7XHJcblx0XHR0aGlzLmludGVyYWN0aW9uQXBwbGljYXRpb25Vc2VyU2VydmljZS5zYXZlKGludGVyYWN0aW9uQXBwVXNlcikuc3Vic2NyaWJlKFxyXG5cdFx0XHQocmVzdWx0OiBJbnRlcmFjdGlvbkFwcGxpY2F0aW9uVXNlcikgPT4ge1xyXG5cdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0KGVycm9yKSA9PiB7XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcclxuXHRcdFx0XHRcdCdFUlJPUiAtIHNhdmVJbnRlcmFjdGlvbiAtIGludGVyYWN0aW9uQXBwbGljYXRpb25Vc2VyU2VydmljZS5zYXZlICcsXHJcblx0XHRcdFx0XHRlcnJvclxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEl0IHZhbGlkYXRlcyB0aGUgZGF0YVxyXG5cdCAqIEBwYXJhbSBsaXN0QXBwbGljYXRpb25cclxuXHQgKiBAcGFyYW0gbGlzdEZvcm1cclxuXHQgKiBAcGFyYW0gbGlzdERhdGFGb3JtXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0ICogQHBhcmFtIGxpc3RCdWRnZXRcclxuXHQgKiBAcGFyYW0gbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdCAqIEBwYXJhbSBsaXN0RG9jdW1lbnRcclxuXHQgKiBAcGFyYW0gdmFsaWRhdGVKdXN0UmVxdWlyZWQgZWcuIHdoZW4gdGhlIHNjcmVlcm4gcmVxdWlyZSBnZXQganVzdCByZXF1aXJlIGRvY3VtZW50cyAoc2VuZCBhcHBsaWNhdGlvbilcclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsaWRhdGUoXHJcblx0XHRsaXN0VG90YWxTdGF0dXM6IFBsaUNuZlN0YXR1c1tdLFxyXG5cdFx0bGlzdEFwcGxpY2F0aW9uOiBBcHBsaWNhdGlvbltdLFxyXG5cdFx0bGlzdEZvcm06IGFueVtdLFxyXG5cdFx0bGlzdERhdGFGb3JtOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXRTZXR0aW5nOiBhbnlbXSxcclxuXHRcdGxpc3RCdWRnZXQ6IEJ1ZGdldERhdGFbXSxcclxuXHRcdGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudFtdLFxyXG5cdFx0bGlzdERvY3VtZW50OiBEb2N1bWVudFtdLFxyXG5cdFx0Y2FsbGJhY2s6IGFueSxcclxuXHRcdHZhbGlkYXRlSnVzdFJlcXVpcmVkOiBib29sZWFuLFxyXG5cdFx0dmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0PzogYm9vbGVhblxyXG5cdCk6IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4ge1xyXG5cdFx0bGV0IGxpc3RTZW5kQXBwbGljYXRpb246IEFycmF5PFNlbmRBcHBsaWNhdGlvbj4gPSBbXTtcclxuXHRcdC8vIHJlc2V0IHBlcmNlbnRhZ2VcclxuXHRcdC8vIHRoaXMucmVzZXRQZXJjZW50YWdlKCk7XHJcblx0XHRpZiAobGlzdEFwcGxpY2F0aW9uICYmIGxpc3RBcHBsaWNhdGlvbi5sZW5ndGggPiAwKSB7XHJcblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBsaXN0QXBwbGljYXRpb25cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHQvLyBkZWZpbmUgYXBwbGljYXRpb25cclxuXHRcdFx0XHRjb25zdCBhcHBsaWNhdGlvbiA9IGxpc3RBcHBsaWNhdGlvbltpXTtcclxuXHRcdFx0XHQvLyBjcmVhdGUgc2VuZCBhcHBsaWNhdGlvbiBvYmplY3RcclxuXHRcdFx0XHRsZXQgc2VuZEFwcGxpY2F0aW9uOiBTZW5kQXBwbGljYXRpb24gPSBuZXcgU2VuZEFwcGxpY2F0aW9uKCk7XHJcblx0XHRcdFx0Ly8gZGVmaW5lIGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24uYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cclxuXHRcdFx0XHRsZXQgY3VycmVudFN0YXR1czogYW55ID0gW107XHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0bGlzdFRvdGFsU3RhdHVzICYmXHJcblx0XHRcdFx0XHRsaXN0VG90YWxTdGF0dXMubGVuZ3RoICYmXHJcblx0XHRcdFx0XHRhcHBsaWNhdGlvbi5zdGF0ZUlkICYmXHJcblx0XHRcdFx0XHRsaXN0Rm9ybSAmJlxyXG5cdFx0XHRcdFx0bGlzdEZvcm0ubGVuZ3RoXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0Ly8gZ2V0IHRoZSBsaXN0IHBhZ2Ugc2VjdGlvbiBhY2NvcmRpbmcgdG8gc3RhdHVzSWRcclxuXHRcdFx0XHRcdGZvciAoY29uc3Qgc3RhdHVzIG9mIGxpc3RUb3RhbFN0YXR1cylcclxuXHRcdFx0XHRcdFx0aWYgKHN0YXR1cy5pZCA9PSBhcHBsaWNhdGlvbi5zdGF0ZUlkKSB7XHJcblx0XHRcdFx0XHRcdFx0Y3VycmVudFN0YXR1cyA9IHN0YXR1cztcclxuXHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBkZWZpbmUgdGhlIGxpc3RGb3JtIHRoYXQgY2FuIGJlIHZhbGRpYXRlZCBhY2NvcmRpbmcgdG8gc3RhdHVzXHJcblx0XHRcdFx0Y29uc3QgbGlzdEZvcm1BY3RpdmF0ZWQgPSB0aGlzLmdldExpc3RGb3Jtc0J5U3RhdHVzKGN1cnJlbnRTdGF0dXMsIGxpc3RGb3JtKTtcclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZm9ybVxyXG5cdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRm9ybSA9IHRoaXMuZ2V0VmFsaWRhdGVkRm9ybUxpc3QoXHJcblx0XHRcdFx0XHRsaXN0Rm9ybUFjdGl2YXRlZCxcclxuXHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5hcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Ly8gZ2V0IHZhbGlkYXRlZCBsaXN0IGJ1ZGdldFxyXG5cdFx0XHRcdGlmICghdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KSB7XHJcblx0XHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZEJ1ZGdldCA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkQnVkZ2V0ID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0U2V0dGluZyxcclxuXHRcdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLmFwcGxpY2F0aW9uSWQsXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRTdGF0dXNcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBnZXQgdmFsaWRhdGVkIGxpc3QgZG9jdW1lbnRcclxuXHRcdFx0XHRzZW5kQXBwbGljYXRpb24ubGlzdFZhbGlkYXRlZERvY3VtZW50ID0gdGhpcy5nZXRWYWxpZGF0ZWREb2N1bWVudChcclxuXHRcdFx0XHRcdGN1cnJlbnRTdGF0dXMsXHJcblx0XHRcdFx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHR2YWxpZGF0ZUp1c3RSZXF1aXJlZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdC8vIHJlc29sdmUgdmFsaWRhdGlvbiAtIG5vIGxpc3RWYWxpZGF0ZWREb2MgLSAgbGlzdFZhbGlkYXRlZEJ1ZGdldCAtIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0c2VuZEFwcGxpY2F0aW9uLnZhbGlkYXRpb24gPVxyXG5cdFx0XHRcdFx0IXNlbmRBcHBsaWNhdGlvbi5saXN0VmFsaWRhdGVkRG9jdW1lbnQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRCdWRnZXQubGVuZ3RoICYmXHJcblx0XHRcdFx0XHQhc2VuZEFwcGxpY2F0aW9uLmxpc3RWYWxpZGF0ZWRGb3JtLmxlbmd0aDtcclxuXHRcdFx0XHQvLyBhZGQgdG8gYXJyYXlcclxuXHRcdFx0XHRsaXN0U2VuZEFwcGxpY2F0aW9uLnB1c2goc2VuZEFwcGxpY2F0aW9uKTtcclxuXHRcdFx0XHQvLyBjYWxsIGNhbGxiYWNrXHJcblx0XHRcdFx0aWYgKGNhbGxiYWNrKSBjYWxsYmFjayhzZW5kQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uLCBpLCBsaXN0QXBwbGljYXRpb24ubGVuZ3RoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RTZW5kQXBwbGljYXRpb247XHJcblx0fVxyXG5cclxuXHQvKiogaXQgcmV0dXJucyB0aGUgZm9ybXMgdGhhdCBhcmUgYWN0aXZhdGVkIGFjY29yZGluZyB0byBzdGF0dXMgKi9cclxuXHRnZXRMaXN0Rm9ybXNCeVN0YXR1cyhjdXJyZW50U3RhdHVzOiBQbGlDbmZTdGF0dXMsIGxpc3RGb3JtOiBhbnlbXSk6IGFueVtdIHtcclxuXHRcdGxldCBsaXN0QWN0aXZhdGVkRm9ybTogYW55W10gPSBbXTtcclxuXHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0Ly8gZmlsbCB0aGUgbGlzdCBhY3RpdmF0ZWQgZm9ybVxyXG5cdFx0XHRmb3IgKGNvbnN0IGZvcm0gb2YgbGlzdEZvcm0pXHJcblx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdGlmIChzZWN0aW9uLmlkRm9ybSA9PSBmb3JtLmlkKSB7XHJcblx0XHRcdFx0XHRcdGxpc3RBY3RpdmF0ZWRGb3JtLnB1c2goZm9ybSk7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RBY3RpdmF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBkb2N1bWVudCBsaXN0ICovXHJcblx0Z2V0VmFsaWRhdGVkRG9jdW1lbnQoXHJcblx0XHRjdXJyZW50U3RhdHVzOiBhbnksXHJcblx0XHRsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0bGlzdERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb246IEFwcGxpY2F0aW9uLFxyXG5cdFx0bGlzdERhdGFGb3JtLFxyXG5cdFx0dmFsaWRhdGVKdXN0UmVxdWlyZWQ6IGJvb2xlYW5cclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZERvY3VtZW50ID0gW107XHJcblx0XHRpZiAobGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHQvLyBpdCBjb250YWlucyB0aGUgZG9jdW1lbnRzIHRoYXQgYXJlIHZpc2libGVcclxuXHRcdFx0bGV0IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlID0gW107XHJcblxyXG5cdFx0XHQvL2NoZWNrSWZTaG91bGRWYWxpZGF0ZVxyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVEb2N1bWVudHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdGlmIChsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24gJiYgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uLmxlbmd0aClcclxuXHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdHN3aXRjaCAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbi5rZXlMYWJlbCkge1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50b3MnOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZURvY3VtZW50cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0aWYgKCFzaG91bGRWYWxpZGF0ZURvY3VtZW50cykgcmV0dXJuIGxpc3RWYWxpZGF0ZWREb2N1bWVudDtcclxuXHJcblx0XHRcdC8vIHJlc29sdmUgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBpcyB2aXNpYmxlXHJcblx0XHRcdGlmIChsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50KSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBjb25maWd1cmF0aW9uRG9jdW1lbnQgb2YgbGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0bGV0IHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cdFx0XHRcdFx0aWYgKGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhICYmIGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5mb3JtdWxhLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgZm9ybXVsYSA9ICcnO1xyXG5cdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiBhcHBsaWNhdGlvbi5zdGF0ZU5hbWUgfTtcclxuXHRcdFx0XHRcdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBkYXRhRm9ybSBvZiBsaXN0RGF0YUZvcm0pXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgcHJvcGVydHkgaW4gZGF0YUZvcm0uZGF0YSlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdFx0Zm9ybXVsYSA9IHRoaXMudG9rZW5TZXJ2aWNlLnJlcGxhY2VUb2tlbnNGcm9tTGlzdE9iamVjdChcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5uYW1lLFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmZvcm11bGEsXHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhXHJcblx0XHRcdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAocmVzdWx0ICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2aXNpYmxlID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdHZpc2libGUgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKHZpc2libGUpIHtcclxuXHRcdFx0XHRcdFx0bGlzdENvbmZpZ3VyYXRpb25Eb2N1bWVudFZpc2libGUucHVzaChjb25maWd1cmF0aW9uRG9jdW1lbnQpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gcmVzb2x2ZSB0aGUgbGlzdCBvZiBkb2N1bWVudHNcclxuXHRcdFx0aWYgKGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlKSB7XHJcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Q29uZmlndXJhdGlvbkRvY3VtZW50VmlzaWJsZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0bGV0IGNvbmZpZ3VyYXRpb25Eb2N1bWVudCA9IGxpc3RDb25maWd1cmF0aW9uRG9jdW1lbnRWaXNpYmxlW2ldO1xyXG5cdFx0XHRcdFx0bGV0IGRvY3VtZW50OiBEb2N1bWVudCA9IHRoaXMuZ2V0RG9jdW1lbnRCeUNvbmZpZ3VyYXRpb25JZChcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LmlkLFxyXG5cdFx0XHRcdFx0XHRsaXN0RG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdGFwcGxpY2F0aW9uLmlkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKHZhbGlkYXRlSnVzdFJlcXVpcmVkKSB7XHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQoIWRvY3VtZW50IHx8XHJcblx0XHRcdFx0XHRcdFx0XHQoZG9jdW1lbnQgJiYgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoID09IDApIHx8XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF1dG9tYXRpY0RvY3VtZW50c1ZhbGlkYXRlZChcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGRvY3VtZW50XHJcblx0XHRcdFx0XHRcdFx0XHQpKSAmJlxyXG5cdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5yZXF1aXJlZFxyXG5cdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmZpbGxMaXN0VmFsaWRhdGVEb2N1bWVudERlZmF1bHQoXHJcblx0XHRcdFx0XHRcdFx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRhcHBsaWNhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdGNvbmZpZ3VyYXRpb25Eb2N1bWVudFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGlmIChkb2N1bWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkb2N1bWVudC5zdGF0ZSA9PSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWREb2N1bWVudC5wdXNoKGRvY3VtZW50KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5maWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0XHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0XHRcdFx0XHRcdFx0YXBwbGljYXRpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbGlzdFZhbGlkYXRlZERvY3VtZW50O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBmaWxsTGlzdFZhbGlkYXRlRG9jdW1lbnREZWZhdWx0KFxyXG5cdFx0bGlzdFZhbGlkYXRlZERvY3VtZW50LFxyXG5cdFx0YXBwbGljYXRpb24sXHJcblx0XHRjb25maWd1cmF0aW9uRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGxldCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpO1xyXG5cdFx0ZG9jdW1lbnQuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uLmlkO1xyXG5cdFx0ZG9jdW1lbnQucHJvbUNvZGlnbyA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5wcm9tQ29kaWdvO1xyXG5cdFx0ZG9jdW1lbnQuc3RhdGUgPSBFRG9jdW1lbnRTdGF0ZS5QRU5ESUVOVEU7XHJcblx0XHRkb2N1bWVudC5jb25maWd1cmF0aW9uRG9jdW1lbnRJZCA9IGNvbmZpZ3VyYXRpb25Eb2N1bWVudC5pZDtcclxuXHRcdGRvY3VtZW50Lmxpc3RBcmNoaXZlID0gW107XHJcblx0XHRsaXN0VmFsaWRhdGVkRG9jdW1lbnQucHVzaChkb2N1bWVudCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgZ2V0cyBkb2N1bWVudCBieSBjb25maWd1cmF0aW9uIElkICovXHJcblx0cHJpdmF0ZSBnZXREb2N1bWVudEJ5Q29uZmlndXJhdGlvbklkKFxyXG5cdFx0Y29uZmlndXJhdGlvbkRvY3VtZW50SWQ6IG51bWJlcixcclxuXHRcdGxpc3Q6IEFycmF5PERvY3VtZW50PixcclxuXHRcdGFwcGxpY2F0aW9uSWQ6IHN0cmluZ1xyXG5cdCk6IERvY3VtZW50IHtcclxuXHRcdGlmIChsaXN0KVxyXG5cdFx0XHRmb3IgKGNvbnN0IGRvY3VtZW50IG9mIGxpc3QpXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0ZG9jdW1lbnQuY29uZmlndXJhdGlvbkRvY3VtZW50SWQgPT09IGNvbmZpZ3VyYXRpb25Eb2N1bWVudElkICYmXHJcblx0XHRcdFx0XHRkb2N1bWVudC5hcHBsaWNhdGlvbklkID09PSBhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRvY3VtZW50O1xyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0LyoqIGdldCB0aGUgYnVkZ2V0IGFwcGxpY2F0aW9uIGJ5IHR5cGUgYnVkZ2V0IGFuZCBidWRnZXQgc2V0dXAgaWQgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEJ1ZGdldEFwcGxpY2F0aW9uKFxyXG5cdFx0YnVkZ2V0U2V0dGluZzogYW55LFxyXG5cdFx0dHlwZUJ1ZGdldDogYW55LFxyXG5cdFx0bGlzdEJ1ZGdldDogQnVkZ2V0RGF0YVtdLFxyXG5cdFx0YXBwbGljYXRpb25JZFxyXG5cdCk6IGFueSB7XHJcblx0XHRpZiAobGlzdEJ1ZGdldClcclxuXHRcdFx0Zm9yIChjb25zdCBidWRnZXQgb2YgbGlzdEJ1ZGdldClcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRidWRnZXQudGFnID09IHR5cGVCdWRnZXQgJiZcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcuY3ByZUNvZGlnbyA9PSBidWRnZXQuYnVkZ2V0U2V0dXBJZCAmJlxyXG5cdFx0XHRcdFx0YnVkZ2V0LmFwcGxpY2F0aW9uSWQgPT0gYXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQoYnVkZ2V0LCBidWRnZXRTZXR0aW5nLCB0eXBlQnVkZ2V0KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVCdWRnZXQobnVsbCwgYnVkZ2V0U2V0dGluZywgdHlwZUJ1ZGdldCk7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgdmFsaWRhdGVzIHRoZSBidWRnZXQgKi9cclxuXHRwcml2YXRlIHZhbGlkYXRlQnVkZ2V0KGJ1ZGdldDogYW55LCBidWRnZXRTZXR0aW5nOiBhbnksIHR5cGU6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgdGhlcmUgaXMgYSBidWRnZXQgb2JqZWN0XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuTk9fT0JKRUNUXHJcblx0XHRcdH07XHJcblx0XHRlbHNlIGlmIChcclxuXHRcdFx0KHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nIHx8IHR5cGUgPT09IEVCdWRnZXRCdWlsZFR5cGUubWl4ZWQpICYmXHJcblx0XHRcdGJ1ZGdldC5zdW1tYXJ5LmJ1ZGdldFRvdGFsID4gYnVkZ2V0U2V0dGluZy5jcHJlTW9udG9Ub3RhbFxyXG5cdFx0KVxyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiBhbW91bnQgdG90YWwgb3ZlcmNvbWVzIHRoZSBtYXhpbXVtXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuT1ZFUkNPTUVfTUFYSU1VTV9BTU9VTlRcclxuXHRcdFx0fTtcclxuXHRcdGVsc2UgaWYgKFxyXG5cdFx0XHR0eXBlID09PSBFQnVkZ2V0QnVpbGRUeXBlLmZpbmFuY2luZyAmJlxyXG5cdFx0XHQoIWJ1ZGdldC5maW5hbmNpbmdTdGFydCB8fCAhYnVkZ2V0LmZpbmFuY2luZ0VuZClcclxuXHRcdClcclxuXHRcdFx0Ly8gdmFsaWRhdGUgaWYgZmluYW5jaW5nIGRhdGVzIGFyZSBkZWZpbmVkXHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0YnVkZ2V0OiBidWRnZXQsXHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRidWRnZXRTZXR0aW5nOiBidWRnZXRTZXR0aW5nLFxyXG5cdFx0XHRcdGVycm9yOiBFQnVkZ2V0RXJyb3IuRklOQU5DSU5HX0RBVEVTXHJcblx0XHRcdH07XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgdmFsaWRhdGVTdW1tYXJpemVkQnVkZ2V0KGJ1ZGdldFNldHRpbmc6IGFueSwgdHlwZTogYW55LCBidWRnZXQ6IGFueSkge1xyXG5cdFx0aWYgKCFidWRnZXQgfHwgIWJ1ZGdldC5zdW1tYXJ5IHx8ICFidWRnZXQuc3VtbWFyeS5idWRnZXRUb3RhbCkge1xyXG5cdFx0XHQvLyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIGJ1ZGdldCBvYmplY3RcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRidWRnZXQ6IGJ1ZGdldCxcclxuXHRcdFx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0XHRcdGJ1ZGdldFNldHRpbmc6IGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0ZXJyb3I6IEVCdWRnZXRFcnJvci5OT19PQkpFQ1RcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblxyXG5cdHZhbGlkYXRlQ29tcGxldGVCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXQobGlzdEJ1ZGdldFNldHRpbmcsIGxpc3RCdWRnZXQsIGFwcGxpY2F0aW9uSWQpO1xyXG5cdH1cclxuXHJcblx0LyoqIGl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBidWRnZXQgbGlzdCAqL1xyXG5cdHByaXZhdGUgZ2V0VmFsaWRhdGVkQnVkZ2V0KFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXM/XHJcblx0KTogYW55W10ge1xyXG5cdFx0bGV0IGxpc3RWYWxpZGF0ZWRCdWRnZXQ6IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEJ1ZGdldFNldHRpbmcpIHtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRcdFx0bGV0IHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0OiBib29sZWFuID0gZmFsc2U7XHJcblx0XHRcdGlmIChjdXJyZW50U3RhdHVzKSB7XHJcblx0XHRcdFx0bGV0IGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjogUGxpQ25mU3RhdHVzUGFnZVNlY3Rpb25bXSA9XHJcblx0XHRcdFx0XHRjdXJyZW50U3RhdHVzLmxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbjtcclxuXHRcdFx0XHRpZiAobGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uICYmIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbi5sZW5ndGgpXHJcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHNlY3Rpb24gb2YgbGlzdFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uKVxyXG5cdFx0XHRcdFx0XHRpZiAoc2VjdGlvbi5wbGlDbmZQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24ua2V5TGFiZWwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgJ3ByZXN1cHVlc3RvLnRvdGFsJzoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzaG91bGRWYWxpZGF0ZVRvdGFsQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlICdwcmVzdXB1ZXN0by5maW5hbmNpYWNpb24nOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdHNob3VsZFZhbGlkYXRlRmluYW5jaW5nQnVkZ2V0ID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3RCdWRnZXRTZXR0aW5nXHJcblx0XHRcdGZvciAoY29uc3QgYnVkZ2V0U2V0dGluZyBvZiBsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRcdC8vIHNraXAgZ2VuZXJhbCBidWRnZXRcclxuXHRcdFx0XHRpZiAoYnVkZ2V0U2V0dGluZy5wbGlUaXBvUHJlc3VwdWVzdG8udHByZXNDb2RpZ28gPT0gRVRpcG9QcmVzdXB1ZXN0by5HRU5FUkFMKVxyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0Ly8gYnVkZ2V0IHRvdGFsXHJcblx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy5nZXRWYWxpZGF0ZWRCdWRnZXRBcHBsaWNhdGlvbihcclxuXHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRFQnVkZ2V0QnVpbGRUeXBlLnRvdGFsLFxyXG5cdFx0XHRcdFx0bGlzdEJ1ZGdldCxcclxuXHRcdFx0XHRcdGFwcGxpY2F0aW9uSWRcclxuXHRcdFx0XHQpO1xyXG5cdFx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhVG90YWwpO1xyXG5cdFx0XHRcdC8vIGlmIGl0IGhhcyBvd24gZnVuZHMsIHNvIGl0IHZhbGlkYXRlcyB0b3RhbCBhbmQgZmluYW5jaW5nXHJcblx0XHRcdFx0aWYgKGJ1ZGdldFNldHRpbmcuY3ByZUVzRm9uZG9zUHJvcGlvcykge1xyXG5cdFx0XHRcdFx0Y29uc3QgYnVkZ2V0RGF0YUZpbmFuY2luZyA9IHRoaXMuZ2V0VmFsaWRhdGVkQnVkZ2V0QXBwbGljYXRpb24oXHJcblx0XHRcdFx0XHRcdGJ1ZGdldFNldHRpbmcsXHJcblx0XHRcdFx0XHRcdEVCdWRnZXRCdWlsZFR5cGUuZmluYW5jaW5nLFxyXG5cdFx0XHRcdFx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0XHRcdFx0XHRhcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0aWYgKGJ1ZGdldERhdGFGaW5hbmNpbmcgJiYgc2hvdWxkVmFsaWRhdGVGaW5hbmNpbmdCdWRnZXQpXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRCdWRnZXQucHVzaChidWRnZXREYXRhRmluYW5jaW5nKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIHZhbGlkYXRlZCBmb3JtIGxpc3QgKi9cclxuXHRwcml2YXRlIGdldFZhbGlkYXRlZEZvcm1MaXN0KGxpc3RGb3JtLCBsaXN0RGF0YUZvcm0sIGFwcGxpY2F0aW9uSWQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEZvcm06IGFueVtdID0gW107XHJcblx0XHRpZiAobGlzdEZvcm0pIHtcclxuXHRcdFx0Ly8gaXRlcmF0ZSBvdmVyIGxpc3Rmb3JtXHJcblx0XHRcdGZvciAoY29uc3QgZm9ybSBvZiBsaXN0Rm9ybSkge1xyXG5cdFx0XHRcdC8vIGdldCBlcnJvcnMgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkXHJcblx0XHRcdFx0Y29uc3QgZXJyb3JzID0gdGhpcy5nZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRsaXN0RGF0YUZvcm0sXHJcblx0XHRcdFx0XHRmb3JtLmlkLFxyXG5cdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHRcdGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0Q29tcG9uZW50cyhmb3JtLmNvbXBvbmVudHMpO1xyXG5cclxuXHRcdFx0XHRcdC8vIGdlbmVyYXRlIHRoZSBlcnJvciBjb21wb25lbnRzIGFjY29yZGluZyB0byBlcnJvcnNcclxuXHRcdFx0XHRcdGxldCBlcnJvckNvbXBvbmVudCA9IFtdO1xyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBlcnJvciBvZiBlcnJvcnMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGVycm9yICYmIGVycm9yLmNvbXBvbmVudCAmJiBlcnJvci5jb21wb25lbnQua2V5ICYmIGNvbXBvbmVudHMpIHtcclxuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY29tcG9uZW50LmtleSA9PSBlcnJvci5jb21wb25lbnQua2V5KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ29tcG9uZW50LnB1c2goY29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0aWYgKGVycm9yQ29tcG9uZW50ICYmIGVycm9yQ29tcG9uZW50Lmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGVycm9yQ29tcG9uZW50KTtcclxuXHRcdFx0XHRcdFx0Ly8gYWRkIHRvIGxpc3RWYWxpZGF0ZWRGb3JtXHJcblx0XHRcdFx0XHRcdGxpc3RWYWxpZGF0ZWRGb3JtLnB1c2goe1xyXG5cdFx0XHRcdFx0XHRcdGlkOiBmb3JtLmlkLFxyXG5cdFx0XHRcdFx0XHRcdG5hbWU6IGZvcm0udGl0bGUsXHJcblx0XHRcdFx0XHRcdFx0cGFuZWxzOiBwYW5lbHMsXHJcblx0XHRcdFx0XHRcdFx0dG9nZ2xlOiBmYWxzZVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gdmVyaWZ5IGlmIGRhdGEgaXMgY29tcGxldGVkXHJcblx0XHRcdFx0XHQvLyBnZXQgZGF0YSBieSBmb3JtIGlkIGFuZCBhcHAgaWRcclxuXHRcdFx0XHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQoXHJcblx0XHRcdFx0XHRcdGxpc3REYXRhRm9ybSxcclxuXHRcdFx0XHRcdFx0Zm9ybS5pZCxcclxuXHRcdFx0XHRcdFx0YXBwbGljYXRpb25JZFxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdC8vIGdldCBjb21wb25lbnRzIGFyZSByZXF1aXJlZCBhY2NvcmRpbmcgdG8gZGF0YVxyXG5cdFx0XHRcdFx0Y29uc3QgY29tcG9uZW50cyA9IEZvcm1pb1V0aWwuZ2V0UmVxdWlyZWRDb21wb25lbnRzQnlEYXRhKFxyXG5cdFx0XHRcdFx0XHRmb3JtLmNvbXBvbmVudHMsXHJcblx0XHRcdFx0XHRcdGRhdGFcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpZiAoY29tcG9uZW50cyAmJiBjb21wb25lbnRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHQvLyBvcmdhbml6aW5nIGJ5IHBhbmVsc1xyXG5cdFx0XHRcdFx0XHRjb25zdCBwYW5lbHMgPSBGb3JtaW9VdGlsLmdldEZvcm1hdHRlZENvbXBvbmVudHNCeVBhbmVsKGNvbXBvbmVudHMpO1xyXG5cdFx0XHRcdFx0XHQvLyBhZGQgdG8gbGlzdFZhbGlkYXRlZEZvcm1cclxuXHRcdFx0XHRcdFx0bGlzdFZhbGlkYXRlZEZvcm0ucHVzaCh7XHJcblx0XHRcdFx0XHRcdFx0aWQ6IGZvcm0uaWQsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogZm9ybS50aXRsZSxcclxuXHRcdFx0XHRcdFx0XHRwYW5lbHM6IHBhbmVscyxcclxuXHRcdFx0XHRcdFx0XHR0b2dnbGU6IGZhbHNlXHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGxpc3RWYWxpZGF0ZWRGb3JtO1xyXG5cdH1cclxuXHJcblx0LyoqIEl0IHJldHVybnMgdGhlIGRhdGEgYnkgZm9ybUlkIGFuZCBBcHBsaWNhdGlvbklkICovXHJcblx0cHJpdmF0ZSBnZXRFcnJvcnNCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKVxyXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEuZXJyb3JzO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgZGF0YSBieSBmb3JtSWQgYW5kIEFwcGxpY2F0aW9uSWQgKi9cclxuXHRwcml2YXRlIGdldERhdGFCeUZvcm1JZEFuZEFwcGxpY2F0aW9uSWQobGlzdERhdGFGb3JtLCBmb3JtSWQsIGFwcGxpY2F0aW9uSWQpOiBhbnkge1xyXG5cdFx0aWYgKGxpc3REYXRhRm9ybSAmJiBmb3JtSWQgJiYgYXBwbGljYXRpb25JZClcclxuXHRcdFx0Zm9yIChjb25zdCBkYXRhIG9mIGxpc3REYXRhRm9ybSlcclxuXHRcdFx0XHRpZiAoZGF0YS5mb3JtSWQgPT0gZm9ybUlkICYmIGRhdGEuYXBwbGljYXRpb25JZCA9PSBhcHBsaWNhdGlvbklkKSByZXR1cm4gZGF0YS5kYXRhO1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRnZXRWYWxpZGF0ZWRCdWRnZXRTdW1tYXJpemVkKFxyXG5cdFx0bGlzdEJ1ZGdldFNldHRpbmcsXHJcblx0XHRsaXN0QnVkZ2V0LFxyXG5cdFx0YXBwbGljYXRpb25JZCxcclxuXHRcdGN1cnJlbnRTdGF0dXNcclxuXHQpOiBhbnlbXSB7XHJcblx0XHRsZXQgbGlzdFZhbGlkYXRlZEJ1ZGdldDogYW55W10gPSBbXTtcclxuXHRcdGlmIChsaXN0QnVkZ2V0U2V0dGluZykge1xyXG5cdFx0XHRsZXQgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdFx0XHRpZiAoY3VycmVudFN0YXR1cykge1xyXG5cdFx0XHRcdGxldCBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb246IFBsaUNuZlN0YXR1c1BhZ2VTZWN0aW9uW10gPVxyXG5cdFx0XHRcdFx0Y3VycmVudFN0YXR1cy5saXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb247XHJcblx0XHRcdFx0aWYgKGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbiAmJiBsaXN0UGxpQ25mU3RhdHVzUGFnZVNlY3Rpb24ubGVuZ3RoKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBzZWN0aW9uIG9mIGxpc3RQbGlDbmZTdGF0dXNQYWdlU2VjdGlvbilcclxuXHRcdFx0XHRcdFx0aWYgKHNlY3Rpb24ucGxpQ25mUGFnZVNlY3Rpb24pXHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChzZWN0aW9uLnBsaUNuZlBhZ2VTZWN0aW9uLmtleUxhYmVsKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIEVDbmZQYWdlU2VjdGlvbi5wcmVzdXB1ZXN0b1Jlc3VtaWRvOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHNob3VsZFZhbGlkYXRlVG90YWxCdWRnZXQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0c2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldCA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdFx0Y29uc3QgYnVkZ2V0RGF0YVRvdGFsID0gdGhpcy52YWxpZGF0ZVN1bW1hcml6ZWRCdWRnZXQoXHJcblx0XHRcdFx0bGlzdEJ1ZGdldFNldHRpbmdbMF0sXHJcblx0XHRcdFx0RUJ1ZGdldEJ1aWxkVHlwZS50b3RhbCxcclxuXHRcdFx0XHRsaXN0QnVkZ2V0WzBdXHJcblx0XHRcdCk7XHJcblx0XHRcdGlmIChidWRnZXREYXRhVG90YWwgJiYgc2hvdWxkVmFsaWRhdGVUb3RhbEJ1ZGdldClcclxuXHRcdFx0XHRsaXN0VmFsaWRhdGVkQnVkZ2V0LnB1c2goYnVkZ2V0RGF0YVRvdGFsKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBsaXN0VmFsaWRhdGVkQnVkZ2V0O1xyXG5cdH1cclxuXHJcblx0YXV0b21hdGljRG9jdW1lbnRzVmFsaWRhdGVkKFxyXG5cdFx0Y29uZmlnRG9jdW1lbnQ6IENvbmZpZ3VyYXRpb25Eb2N1bWVudCxcclxuXHRcdGxpc3REYXRhRm9ybTogYW55W10sXHJcblx0XHRkb2N1bWVudDogRG9jdW1lbnRcclxuXHQpIHtcclxuXHRcdGlmIChcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUgJiZcclxuXHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUubGVuZ3RoID4gMFxyXG5cdFx0KSB7XHJcblx0XHRcdGxldCBkYXRhID0geyBzdGF0dXNuYW1lOiAnJyB9O1xyXG5cdFx0XHRpZiAobGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdGZvciAoY29uc3QgZGF0YUZvcm0gb2YgbGlzdERhdGFGb3JtKVxyXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwcm9wZXJ0eSBpbiBkYXRhRm9ybS5kYXRhKVxyXG5cdFx0XHRcdFx0XHRkYXRhW3Byb3BlcnR5LnRvTG93ZXJDYXNlKCldID0gZGF0YUZvcm0uZGF0YVtwcm9wZXJ0eV07XHJcblx0XHRcdGxldCBmb3JtdWxhID0gdGhpcy50b2tlblNlcnZpY2UucmVwbGFjZVRva2Vuc0Zyb21MaXN0T2JqZWN0KFxyXG5cdFx0XHRcdGNvbmZpZ0RvY3VtZW50Lm5hbWUsXHJcblx0XHRcdFx0Y29uZmlnRG9jdW1lbnQuZm9ybXVsYVZhbGlkYXRlTXVsdGlwbGUsXHJcblx0XHRcdFx0ZGF0YVxyXG5cdFx0XHQpO1xyXG5cdFx0XHRsZXQgcmVzdWx0ID0gZXZhbChmb3JtdWxhKTtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdGxldCByZXN1bHRBcnJheSA9IEpTT04ucGFyc2UocmVzdWx0KTtcclxuXHJcblx0XHRcdFx0aWYgKHJlc3VsdEFycmF5ICYmIHJlc3VsdEFycmF5Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8vVGhlbiBkb2N1bWVudCBtdXN0IGhhdmUgYXJjaGl2ZXNcclxuXHRcdFx0XHRcdGlmICghZG9jdW1lbnQgfHwgZG9jdW1lbnQubGlzdEFyY2hpdmUubGVuZ3RoICE9PSByZXN1bHRBcnJheS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiJdfQ==
@@ -1,31 +0,0 @@
1
- import { Injectable, Inject } from '@angular/core';
2
- import { HttpHeaders, HttpParams } from '@angular/common/http';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common/http";
5
- export class SesionFormService {
6
- constructor(environment, httpClient) {
7
- this.environment = environment;
8
- this.httpClient = httpClient;
9
- this.headerJson = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) };
10
- }
11
- /** It returns the list of form by prom codigo */
12
- getByPromCodigo(promCodigo) {
13
- return this.httpClient.get(this.environment.host.backend.configuration + 'sesionForm/getByPromCodigo', { params: new HttpParams().set('promCodigo', promCodigo.toString()) });
14
- }
15
- /** It saves a form */
16
- save(sesionForm) {
17
- return this.httpClient.post(this.environment.host.backend.configuration + 'sesionForm/save', sesionForm, this.headerJson);
18
- }
19
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SesionFormService, deps: [{ token: 'environment' }, { token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
20
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SesionFormService, providedIn: 'root' }); }
21
- }
22
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SesionFormService, decorators: [{
23
- type: Injectable,
24
- args: [{
25
- providedIn: 'root'
26
- }]
27
- }], ctorParameters: () => [{ type: undefined, decorators: [{
28
- type: Inject,
29
- args: ['environment']
30
- }] }, { type: i1.HttpClient }] });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VzaW9uLWZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXBsaS1jb21tb25zL3NyYy9saWIvc2VydmljZXMvc2VzaW9uLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFPM0UsTUFBTSxPQUFPLGlCQUFpQjtJQUU3QixZQUEyQyxXQUFXLEVBQVUsVUFBc0I7UUFBM0MsZ0JBQVcsR0FBWCxXQUFXLENBQUE7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRDlFLGVBQVUsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNELENBQUM7SUFFMUYsaURBQWlEO0lBQ2pELGVBQWUsQ0FBQyxVQUFrQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLDRCQUE0QixFQUMxRSxFQUFFLE1BQU0sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FDckUsQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7SUFDdEIsSUFBSSxDQUFDLFVBQXNCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLEVBQy9ELFVBQVUsRUFDVixJQUFJLENBQUMsVUFBVSxDQUNmLENBQUM7SUFDSCxDQUFDOytHQW5CVyxpQkFBaUIsa0JBRVQsYUFBYTttSEFGckIsaUJBQWlCLGNBRmpCLE1BQU07OzRGQUVOLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7OzBCQUdhLE1BQU07MkJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBTZXNpb25Gb3JtIH0gZnJvbSAnbmctcGxpLXV0aWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG5cdHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VzaW9uRm9ybVNlcnZpY2Uge1xyXG5cdHByaXZhdGUgaGVhZGVySnNvbiA9IHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KSB9O1xyXG5cdGNvbnN0cnVjdG9yKEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudCwgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxyXG5cclxuXHQvKiogSXQgcmV0dXJucyB0aGUgbGlzdCBvZiBmb3JtIGJ5IHByb20gY29kaWdvICovXHJcblx0Z2V0QnlQcm9tQ29kaWdvKHByb21Db2RpZ286IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldChcclxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudC5ob3N0LmJhY2tlbmQuY29uZmlndXJhdGlvbiArICdzZXNpb25Gb3JtL2dldEJ5UHJvbUNvZGlnbycsXHJcblx0XHRcdHsgcGFyYW1zOiBuZXcgSHR0cFBhcmFtcygpLnNldCgncHJvbUNvZGlnbycsIHByb21Db2RpZ28udG9TdHJpbmcoKSkgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKiBJdCBzYXZlcyBhIGZvcm0gKi9cclxuXHRzYXZlKHNlc2lvbkZvcm06IFNlc2lvbkZvcm0pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG5cdFx0XHR0aGlzLmVudmlyb25tZW50Lmhvc3QuYmFja2VuZC5jb25maWd1cmF0aW9uICsgJ3Nlc2lvbkZvcm0vc2F2ZScsXHJcblx0XHRcdHNlc2lvbkZvcm0sXHJcblx0XHRcdHRoaXMuaGVhZGVySnNvblxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIl19