@openmrs/ngx-formentry 19.0.1-pre.492 → 19.0.1-pre.497

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 (200) hide show
  1. package/components/input/label.component.d.ts +1 -1
  2. package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
  3. package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
  4. package/components/number-input/number-input.component.d.ts +1 -1
  5. package/components/select/select.component.d.ts +1 -1
  6. package/fesm2022/openmrs-ngx-formentry.mjs +364 -346
  7. package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
  8. package/form-entry/helpers/js-expression-helper.d.ts +1 -1
  9. package/package.json +10 -12
  10. package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
  11. package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
  12. package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
  13. package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
  14. package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
  15. package/esm2022/abstract-controls-extension/index.mjs +0 -5
  16. package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
  17. package/esm2022/change-tracking/control-relation.mjs +0 -42
  18. package/esm2022/change-tracking/control-relations.mjs +0 -32
  19. package/esm2022/components/afe-ng-select.component.mjs +0 -101
  20. package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
  21. package/esm2022/components/check-box/checkbox.component.mjs +0 -110
  22. package/esm2022/components/check-box/checkbox.module.mjs +0 -19
  23. package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
  24. package/esm2022/components/custom-component-wrapper/custom-component-wrapper.module.mjs +0 -22
  25. package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
  26. package/esm2022/components/custom-control-wrapper/custom-control-wrapper.module.mjs +0 -23
  27. package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
  28. package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
  29. package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
  30. package/esm2022/components/date-time-picker/index.mjs +0 -9
  31. package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
  32. package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
  33. package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
  34. package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
  35. package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
  36. package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
  37. package/esm2022/components/input/input.directive.mjs +0 -78
  38. package/esm2022/components/input/input.module.mjs +0 -23
  39. package/esm2022/components/input/label.component.mjs +0 -263
  40. package/esm2022/components/input/text-area.directive.mjs +0 -58
  41. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
  42. package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
  43. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
  44. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
  45. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
  46. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
  47. package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
  48. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
  49. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
  50. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
  51. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
  52. package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
  53. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
  54. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
  55. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
  56. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
  57. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
  58. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
  59. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
  60. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
  61. package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
  62. package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
  63. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
  64. package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
  65. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
  66. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
  67. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
  68. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
  69. package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
  70. package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
  71. package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
  72. package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
  73. package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
  74. package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
  75. package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
  76. package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
  77. package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
  78. package/esm2022/components/number-input/number-input.component.mjs +0 -254
  79. package/esm2022/components/number-input/number-input.module.mjs +0 -21
  80. package/esm2022/components/number-input/number.directive.mjs +0 -22
  81. package/esm2022/components/radio-button/radio.component.mjs +0 -98
  82. package/esm2022/components/radio-button/radio.module.mjs +0 -19
  83. package/esm2022/components/select/optgroup.directive.mjs +0 -19
  84. package/esm2022/components/select/option.directive.mjs +0 -19
  85. package/esm2022/components/select/select.component.mjs +0 -182
  86. package/esm2022/components/select/select.module.mjs +0 -23
  87. package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
  88. package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
  89. package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
  90. package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
  91. package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
  92. package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
  93. package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
  94. package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
  95. package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
  96. package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
  97. package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
  98. package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
  99. package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
  100. package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
  101. package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
  102. package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
  103. package/esm2022/form-entry/form-entry.module.mjs +0 -188
  104. package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
  105. package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
  106. package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
  107. package/esm2022/form-entry/form-factory/form.factory.mjs +0 -143
  108. package/esm2022/form-entry/form-factory/form.mjs +0 -190
  109. package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
  110. package/esm2022/form-entry/form-factory/index.mjs +0 -7
  111. package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
  112. package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
  113. package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
  114. package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
  115. package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
  116. package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
  117. package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -322
  118. package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
  119. package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
  120. package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
  121. package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
  122. package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
  123. package/esm2022/form-entry/question-models/date-question.mjs +0 -12
  124. package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
  125. package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
  126. package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
  127. package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
  128. package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
  129. package/esm2022/form-entry/question-models/group-question.mjs +0 -12
  130. package/esm2022/form-entry/question-models/index.mjs +0 -24
  131. package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
  132. package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
  133. package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
  134. package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
  135. package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
  136. package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
  137. package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
  138. package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
  139. package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
  140. package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
  141. package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
  142. package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
  143. package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
  144. package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
  145. package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
  146. package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
  147. package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
  148. package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
  149. package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
  150. package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
  151. package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
  152. package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
  153. package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
  154. package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
  155. package/esm2022/form-entry/question-models/models.mjs +0 -13
  156. package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
  157. package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
  158. package/esm2022/form-entry/question-models/question-base.mjs +0 -26
  159. package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
  160. package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
  161. package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
  162. package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
  163. package/esm2022/form-entry/question-models/select-option.mjs +0 -7
  164. package/esm2022/form-entry/question-models/select-question.mjs +0 -12
  165. package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
  166. package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
  167. package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
  168. package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
  169. package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
  170. package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
  171. package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
  172. package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
  173. package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -262
  174. package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
  175. package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
  176. package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
  177. package/esm2022/form-entry/validators/date.validator.mjs +0 -18
  178. package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
  179. package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
  180. package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
  181. package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
  182. package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
  183. package/esm2022/form-entry/validators/max.validator.mjs +0 -21
  184. package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
  185. package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
  186. package/esm2022/form-entry/validators/min.validator.mjs +0 -21
  187. package/esm2022/form-entry/validators/required.validator.mjs +0 -11
  188. package/esm2022/form-entry/validators/validations.mjs +0 -5
  189. package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
  190. package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
  191. package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
  192. package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -541
  193. package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
  194. package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
  195. package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
  196. package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
  197. package/esm2022/lib/index.mjs +0 -59
  198. package/esm2022/openmrs-ngx-formentry.mjs +0 -5
  199. package/esm2022/public_api.mjs +0 -2
  200. package/esm2022/shared.module.mjs +0 -21
@@ -1,39 +0,0 @@
1
- import * as _ from 'lodash';
2
- import { Injectable } from '@angular/core';
3
- import * as i0 from "@angular/core";
4
- export class HistoricalFieldHelperService {
5
- getDisplayTextFromOptions(question, valueProperty, displayProperty) {
6
- let displayText = '';
7
- const historicalValue = question.historicalDataValue;
8
- if (_.isArray(historicalValue.value)) {
9
- let valueConverted = 0;
10
- _.each(historicalValue.value, (val) => {
11
- _.each(question.options, (option) => {
12
- if (option[valueProperty] === val) {
13
- if (valueConverted === 0) {
14
- displayText = displayText + option[displayProperty];
15
- }
16
- else {
17
- displayText = displayText + ', ' + option[displayProperty];
18
- }
19
- valueConverted++;
20
- }
21
- });
22
- });
23
- }
24
- else {
25
- _.each(question.options, (option) => {
26
- if (option[valueProperty] === historicalValue.value) {
27
- displayText = option[displayProperty];
28
- }
29
- });
30
- }
31
- return displayText;
32
- }
33
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService }); }
35
- }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService, decorators: [{
37
- type: Injectable
38
- }] });
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1maWVsZC1oZWxwZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtZW50cnkvc3JjL2Zvcm0tZW50cnkvaGVscGVycy9oaXN0b3JpY2FsLWZpZWxkLWhlbHBlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyw0QkFBNEI7SUFDaEMseUJBQXlCLENBQzlCLFFBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGVBQXVCO1FBRXZCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDckQsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2xDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDekIsV0FBVyxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ3RELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQzdELENBQUM7d0JBQ0QsY0FBYyxFQUFFLENBQUM7b0JBQ25CLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDcEQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7K0dBOUJVLDRCQUE0QjttSEFBNUIsNEJBQTRCOzs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3F1ZXN0aW9uLWJhc2UnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGlzdG9yaWNhbEZpZWxkSGVscGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXREaXNwbGF5VGV4dEZyb21PcHRpb25zKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UsXG4gICAgdmFsdWVQcm9wZXJ0eTogc3RyaW5nLFxuICAgIGRpc3BsYXlQcm9wZXJ0eTogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IGRpc3BsYXlUZXh0ID0gJyc7XG4gICAgY29uc3QgaGlzdG9yaWNhbFZhbHVlID0gcXVlc3Rpb24uaGlzdG9yaWNhbERhdGFWYWx1ZTtcbiAgICBpZiAoXy5pc0FycmF5KGhpc3RvcmljYWxWYWx1ZS52YWx1ZSkpIHtcbiAgICAgIGxldCB2YWx1ZUNvbnZlcnRlZCA9IDA7XG4gICAgICBfLmVhY2goaGlzdG9yaWNhbFZhbHVlLnZhbHVlLCAodmFsKSA9PiB7XG4gICAgICAgIF8uZWFjaChxdWVzdGlvbi5vcHRpb25zLCAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvblt2YWx1ZVByb3BlcnR5XSA9PT0gdmFsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVDb252ZXJ0ZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgZGlzcGxheVRleHQgPSBkaXNwbGF5VGV4dCArIG9wdGlvbltkaXNwbGF5UHJvcGVydHldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlzcGxheVRleHQgPSBkaXNwbGF5VGV4dCArICcsICcgKyBvcHRpb25bZGlzcGxheVByb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlQ29udmVydGVkKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfLmVhY2gocXVlc3Rpb24ub3B0aW9ucywgKG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uW3ZhbHVlUHJvcGVydHldID09PSBoaXN0b3JpY2FsVmFsdWUudmFsdWUpIHtcbiAgICAgICAgICBkaXNwbGF5VGV4dCA9IG9wdGlvbltkaXNwbGF5UHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXlUZXh0O1xuICB9XG59XG4iXX0=
@@ -1,322 +0,0 @@
1
- import * as _ from 'lodash';
2
- import { Injectable } from '@angular/core';
3
- import { southEastAsiaCvdRiskTables } from './risk-dataset-table';
4
- import moment from 'moment';
5
- import * as i0 from "@angular/core";
6
- export class JsExpressionHelper {
7
- calcBMI(height, weight) {
8
- let r;
9
- if (height && weight) {
10
- r = (weight / (((height / 100) * height) / 100)).toFixed(1);
11
- }
12
- return height && weight ? parseFloat(r) : null;
13
- }
14
- calcBSA(height, weight) {
15
- let result;
16
- if (height && weight) {
17
- result = Math.sqrt((height * weight) / 3600).toFixed(2);
18
- }
19
- return height && weight ? parseFloat(result) : null;
20
- }
21
- calcBMIForAgeZscore(bmiForAgeRef, height, weight) {
22
- let bmi;
23
- const maxAgeInDays = 1856;
24
- if (height && weight) {
25
- bmi = (weight / (((height / 100) * height) / 100)).toFixed(1);
26
- }
27
- const refSectionObject = _.first(bmiForAgeRef);
28
- let formattedSDValue;
29
- if (refSectionObject) {
30
- const refObjectValues = Object.keys(refSectionObject)
31
- .map((key) => refSectionObject[key])
32
- .map((x) => x);
33
- const refObjectKeys = Object.keys(refSectionObject);
34
- const minimumValue = refObjectValues[1];
35
- const minReferencePoint = [];
36
- if (bmi < minimumValue) {
37
- minReferencePoint.push(minimumValue);
38
- }
39
- else {
40
- _.forEach(refObjectValues, (value) => {
41
- if (value <= bmi) {
42
- minReferencePoint.push(value);
43
- }
44
- });
45
- }
46
- const lastReferenceValue = _.last(minReferencePoint);
47
- const lastValueIndex = _.findIndex(refObjectValues, (o) => {
48
- return o === lastReferenceValue;
49
- });
50
- const SDValue = refObjectKeys[lastValueIndex];
51
- formattedSDValue = SDValue.replace('SD', '');
52
- if (formattedSDValue.includes('neg')) {
53
- formattedSDValue = formattedSDValue.substring(1, 0);
54
- formattedSDValue = '-' + formattedSDValue;
55
- }
56
- if (formattedSDValue === 'S' ||
57
- formattedSDValue === 'L' ||
58
- formattedSDValue === 'M' ||
59
- formattedSDValue === '-5') {
60
- formattedSDValue = '-4';
61
- }
62
- }
63
- return bmi && refSectionObject ? formattedSDValue : null;
64
- }
65
- calcWeightForHeightZscore(weightForHeightRef, height, weight) {
66
- let refSection;
67
- let formattedSDValue;
68
- if (height && weight) {
69
- height = parseFloat(height).toFixed(1);
70
- }
71
- const standardHeightMin = 45;
72
- const standardMaxHeight = 110;
73
- if (height < standardHeightMin || height > standardMaxHeight) {
74
- formattedSDValue = -4;
75
- }
76
- else {
77
- refSection = _.filter(weightForHeightRef, (refObject) => {
78
- return parseFloat(refObject['Length']).toFixed(1) === height;
79
- });
80
- }
81
- const refSectionObject = _.first(refSection);
82
- if (refSectionObject) {
83
- const refObjectValues = Object.keys(refSectionObject)
84
- .map((key) => refSectionObject[key])
85
- .map((x) => x);
86
- const refObjectKeys = Object.keys(refSectionObject);
87
- const minimumValue = refObjectValues[1];
88
- const minReferencePoint = [];
89
- if (weight < minimumValue) {
90
- minReferencePoint.push(minimumValue);
91
- }
92
- else {
93
- _.forEach(refObjectValues, (value) => {
94
- if (value <= weight) {
95
- minReferencePoint.push(value);
96
- }
97
- });
98
- }
99
- const lastReferenceValue = _.last(minReferencePoint);
100
- const lastValueIndex = _.findIndex(refObjectValues, (o) => {
101
- return o === lastReferenceValue;
102
- });
103
- const SDValue = refObjectKeys[lastValueIndex];
104
- formattedSDValue = SDValue.replace('SD', '');
105
- if (formattedSDValue.includes('neg')) {
106
- formattedSDValue = formattedSDValue.substring(1, 0);
107
- formattedSDValue = '-' + formattedSDValue;
108
- }
109
- if (formattedSDValue === 'S' ||
110
- formattedSDValue === 'L' ||
111
- formattedSDValue === 'M' ||
112
- formattedSDValue === '-5') {
113
- formattedSDValue = '-4';
114
- }
115
- }
116
- return height && weight ? formattedSDValue : null;
117
- }
118
- calcHeightForAgeZscore(heightForAgeRef, height, weight) {
119
- const refSectionObject = _.first(heightForAgeRef);
120
- let formattedSDValue;
121
- if (refSectionObject) {
122
- const refObjectValues = Object.keys(refSectionObject)
123
- .map((key) => refSectionObject[key])
124
- .map((x) => x);
125
- const refObjectKeys = Object.keys(refSectionObject);
126
- const minimumValue = refObjectValues[1];
127
- const minReferencePoint = [];
128
- if (height < minimumValue) {
129
- minReferencePoint.push(minimumValue);
130
- }
131
- else {
132
- _.forEach(refObjectValues, (value) => {
133
- if (value <= height) {
134
- minReferencePoint.push(value);
135
- }
136
- });
137
- }
138
- const lastReferenceValue = _.last(minReferencePoint);
139
- const lastValueIndex = _.findIndex(refObjectValues, (o) => {
140
- return o === lastReferenceValue;
141
- });
142
- const SDValue = refObjectKeys[lastValueIndex];
143
- formattedSDValue = SDValue.replace('SD', '');
144
- if (formattedSDValue.includes('neg')) {
145
- formattedSDValue = formattedSDValue.substring(1, 0);
146
- formattedSDValue = '-' + formattedSDValue;
147
- }
148
- if (formattedSDValue === 'S' ||
149
- formattedSDValue === 'L' ||
150
- formattedSDValue === 'M' ||
151
- formattedSDValue === '-5') {
152
- formattedSDValue = '-4';
153
- }
154
- }
155
- return height && weight && refSectionObject ? formattedSDValue : null;
156
- }
157
- calcSouthEastAsiaNonLabCVDRisk(sex, smoker, age, sbp, bmi) {
158
- const hasValidValues = typeof sex === 'string' &&
159
- typeof smoker === 'boolean' &&
160
- typeof age === 'number' &&
161
- typeof sbp === 'number' &&
162
- typeof bmi === 'number';
163
- if (!hasValidValues) {
164
- return null;
165
- }
166
- // Bin functions
167
- const getAgeBin = (age) => Math.floor((Math.min(Math.max(40, age), 74) - 40) / 5);
168
- const getSbpBin = (sbp) => Math.max(0, Math.floor((Math.min(sbp, 180) - 120) / 20) + 1);
169
- const getBmiBin = (bmi) => Math.max(0, Math.floor((Math.min(bmi, 35) - 20) / 5) + 1);
170
- // Variables
171
- const sexIdx = sex === 'M' ? 0 : 1;
172
- const smokerIdx = smoker ? 1 : 0;
173
- const ageIdx = 6 - getAgeBin(age);
174
- const bmiIdx = getBmiBin(bmi);
175
- const sbpIdx = 4 - getSbpBin(sbp);
176
- return southEastAsiaCvdRiskTables[sexIdx][smokerIdx][ageIdx][sbpIdx][bmiIdx];
177
- }
178
- isEmpty(val) {
179
- if (val === undefined ||
180
- val === null ||
181
- val === '' ||
182
- val === 'null' ||
183
- val === 'undefined') {
184
- return true;
185
- }
186
- if (Array.isArray(val) && val.length === 0) {
187
- return true;
188
- }
189
- return false;
190
- }
191
- arrayContains(array, members) {
192
- if (Array.isArray(members)) {
193
- if (members.length === 0) {
194
- return true;
195
- }
196
- let contains = true;
197
- for (let i = 0; i < members.length; i++) {
198
- const val = members[i];
199
- if (array.indexOf(val) === -1) {
200
- contains = false;
201
- }
202
- }
203
- return contains;
204
- }
205
- else {
206
- return array.indexOf(members) !== -1;
207
- }
208
- }
209
- extractRepeatingGroupValues(key, array) {
210
- const values = array.map(function (item) {
211
- return item[key];
212
- });
213
- return values;
214
- }
215
- formatDate(value, format, offset) {
216
- format = format || 'yyyy-MM-dd';
217
- offset = offset || '+0300';
218
- if (value === null || value === undefined || value === '') {
219
- throw new Error('DateFormatException: value passed is not a valid date');
220
- }
221
- const date = moment(value);
222
- if (!date.isValid()) {
223
- throw new Error('DateFormatException: value passed is not a valid date');
224
- }
225
- if (offset) {
226
- date.utcOffset(offset);
227
- }
228
- const momentFormat = format
229
- .replace(/yyyy/g, 'YYYY')
230
- .replace(/yy/g, 'YY')
231
- .replace(/dd/g, 'DD');
232
- return date.format(momentFormat);
233
- }
234
- arrayContainsAny(array, members) {
235
- if (Array.isArray(members)) {
236
- if (members.length === 0) {
237
- return true;
238
- }
239
- let contains = false;
240
- for (let i = 0; i < members.length; i++) {
241
- const val = members[i];
242
- if (array.indexOf(val) !== -1) {
243
- contains = true;
244
- }
245
- }
246
- return contains;
247
- }
248
- else {
249
- return array.indexOf(members) !== -1;
250
- }
251
- }
252
- /**
253
- * Takes a target control, an encounter and concept uuid. If the target control has a value it returns it
254
- * otherwise it tries to find it in the encounter. Finally it returns null of it can't find either of them.
255
- * @param targetControl
256
- * @param rawEncounter
257
- * @param uuid
258
- * @returns
259
- */
260
- getObsFromControlOrEncounter(targetControl, rawEncounter, uuid) {
261
- const findObs = (obs, uuid) => {
262
- let result;
263
- obs?.some((o) => (result =
264
- o?.concept?.uuid === uuid ? o : findObs(o.groupMembers || [], uuid)));
265
- return result;
266
- };
267
- const obsValue = findObs(rawEncounter?.obs, uuid)?.value;
268
- return !!targetControl
269
- ? targetControl
270
- : typeof obsValue === 'object'
271
- ? obsValue.uuid
272
- : !!obsValue
273
- ? obsValue
274
- : null;
275
- }
276
- doesNotMatchExpression(regexString, val) {
277
- if (!val || ['undefined', 'null', ''].includes(val.toString())) {
278
- return true;
279
- }
280
- const pattern = new RegExp(regexString);
281
- if (!pattern.test(val)) {
282
- return true;
283
- }
284
- return false;
285
- }
286
- calcGravida(parityTerm, parityAbortion) {
287
- let gravida = 0;
288
- if (Number.isInteger(parityTerm)) {
289
- gravida += parityTerm + 1;
290
- }
291
- if (Number.isInteger(parityAbortion)) {
292
- gravida += parityAbortion + 1;
293
- }
294
- if (Number.isInteger(parityTerm) && Number.isInteger(parityAbortion)) {
295
- gravida = parityTerm + parityAbortion + 1;
296
- }
297
- return gravida;
298
- }
299
- get helperFunctions() {
300
- const helper = this;
301
- return {
302
- arrayContainsAny: helper.arrayContainsAny,
303
- calcBMI: helper.calcBMI,
304
- calcBMIForAgeZscore: helper.calcBMIForAgeZscore,
305
- calcWeightForHeightZscore: helper.calcWeightForHeightZscore,
306
- calcHeightForAgeZscore: helper.calcHeightForAgeZscore,
307
- calcSouthEastAsiaNonLabCVDRisk: helper.calcSouthEastAsiaNonLabCVDRisk,
308
- isEmpty: helper.isEmpty,
309
- arrayContains: helper.arrayContains,
310
- extractRepeatingGroupValues: helper.extractRepeatingGroupValues,
311
- getObsFromControlOrEncounter: helper.getObsFromControlOrEncounter,
312
- doesNotMatchExpression: helper.doesNotMatchExpression,
313
- calcGravida: helper.calcGravida
314
- };
315
- }
316
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
317
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper }); }
318
- }
319
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper, decorators: [{
320
- type: Injectable
321
- }] });
322
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtZXhwcmVzc2lvbi1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9mb3JtLWVudHJ5L2hlbHBlcnMvanMtZXhwcmVzc2lvbi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O0FBRzVCLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNO1FBQ3BCLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckIsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqRCxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQ3BDLElBQUksTUFBTSxDQUFDO1FBQ1gsSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckIsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU07UUFDOUMsSUFBSSxHQUFHLENBQUM7UUFDUixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDckIsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksZ0JBQWdCLENBQUM7UUFDckIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7aUJBQ2xELEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ25DLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUM3QixJQUFJLEdBQUcsR0FBRyxZQUFZLEVBQUUsQ0FBQztnQkFDdkIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNuQyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDakIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3JELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxLQUFLLGtCQUFrQixDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELGdCQUFnQixHQUFHLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFDRSxnQkFBZ0IsS0FBSyxHQUFHO2dCQUN4QixnQkFBZ0IsS0FBSyxHQUFHO2dCQUN4QixnQkFBZ0IsS0FBSyxHQUFHO2dCQUN4QixnQkFBZ0IsS0FBSyxJQUFJLEVBQ3pCLENBQUM7Z0JBQ0QsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUNELHlCQUF5QixDQUFDLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNO1FBQzFELElBQUksVUFBVSxDQUFDO1FBQ2YsSUFBSSxnQkFBZ0IsQ0FBQztRQUNyQixJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQixNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQ0QsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsaUJBQWlCLElBQUksTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDN0QsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDTixVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN0RCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDO1lBQy9ELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3QyxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbEQsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDcEQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO2dCQUMxQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ25DLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO3dCQUNwQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLEtBQUssa0JBQWtCLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDO1lBQzVDLENBQUM7WUFDRCxJQUNFLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLElBQUksRUFDekIsQ0FBQztnQkFDRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEQsQ0FBQztJQUVELHNCQUFzQixDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTTtRQUNwRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEQsSUFBSSxnQkFBZ0IsQ0FBQztRQUNyQixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDbEQsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDcEQsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzdCLElBQUksTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO2dCQUMxQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ25DLElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO3dCQUNwQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLEtBQUssa0JBQWtCLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDOUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLGdCQUFnQixDQUFDO1lBQzVDLENBQUM7WUFFRCxJQUNFLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLEdBQUc7Z0JBQ3hCLGdCQUFnQixLQUFLLElBQUksRUFDekIsQ0FBQztnQkFDRCxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sSUFBSSxNQUFNLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEUsQ0FBQztJQUVELDhCQUE4QixDQUM1QixHQUFjLEVBQ2QsTUFBZ0IsRUFDaEIsR0FBWSxFQUNaLEdBQVksRUFDWixHQUFZO1FBRVosTUFBTSxjQUFjLEdBQ2xCLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFDdkIsT0FBTyxNQUFNLEtBQUssU0FBUztZQUMzQixPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQ3ZCLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFDdkIsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDO1FBRTFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxnQkFBZ0I7UUFDaEIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1RCxZQUFZO1FBQ1osTUFBTSxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLE9BQU8sMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQ2xFLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHO1FBQ1QsSUFDRSxHQUFHLEtBQUssU0FBUztZQUNqQixHQUFHLEtBQUssSUFBSTtZQUNaLEdBQUcsS0FBSyxFQUFFO1lBQ1YsR0FBRyxLQUFLLE1BQU07WUFDZCxHQUFHLEtBQUssV0FBVyxFQUNuQixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUssRUFBRSxPQUFPO1FBQzFCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBRXBCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzlCLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDO1lBRUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFDRCwyQkFBMkIsQ0FBQyxHQUFHLEVBQUUsS0FBSztRQUNwQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSTtZQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDRCxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNO1FBQzlCLE1BQU0sR0FBRyxNQUFNLElBQUksWUFBWSxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxNQUFNLElBQUksT0FBTyxDQUFDO1FBRTNCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFFRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTTthQUN4QixPQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQzthQUN4QixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQzthQUNwQixPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU87UUFDN0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFFckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw0QkFBNEIsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLElBQUk7UUFDNUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDNUIsSUFBSSxNQUFNLENBQUM7WUFDWCxHQUFHLEVBQUUsSUFBSSxDQUNQLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLE1BQU07Z0JBQ0wsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6RSxDQUFDO1lBQ0YsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxDQUFDLGFBQWE7WUFDcEIsQ0FBQyxDQUFDLGFBQWE7WUFDZixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFDOUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJO2dCQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtvQkFDWixDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVELHNCQUFzQixDQUNwQixXQUFtQixFQUNuQixHQUE4QjtRQUU5QixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMvRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFdBQVcsQ0FBQyxVQUFVLEVBQUUsY0FBYztRQUNwQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFFaEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDakMsT0FBTyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUVELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sR0FBRyxVQUFVLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDcEIsT0FBTztZQUNMLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7WUFDekMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7WUFDL0MseUJBQXlCLEVBQUUsTUFBTSxDQUFDLHlCQUF5QjtZQUMzRCxzQkFBc0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCO1lBQ3JELDhCQUE4QixFQUFFLE1BQU0sQ0FBQyw4QkFBOEI7WUFDckUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtZQUNuQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsMkJBQTJCO1lBQy9ELDRCQUE0QixFQUFFLE1BQU0sQ0FBQyw0QkFBNEI7WUFDakUsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQjtZQUNyRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztJQUNKLENBQUM7K0dBMVdVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc291dGhFYXN0QXNpYUN2ZFJpc2tUYWJsZXMgfSBmcm9tICcuL3Jpc2stZGF0YXNldC10YWJsZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc0V4cHJlc3Npb25IZWxwZXIge1xuICBjYWxjQk1JKGhlaWdodCwgd2VpZ2h0KSB7XG4gICAgbGV0IHI7XG4gICAgaWYgKGhlaWdodCAmJiB3ZWlnaHQpIHtcbiAgICAgIHIgPSAod2VpZ2h0IC8gKCgoaGVpZ2h0IC8gMTAwKSAqIGhlaWdodCkgLyAxMDApKS50b0ZpeGVkKDEpO1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCA/IHBhcnNlRmxvYXQocikgOiBudWxsO1xuICB9XG5cbiAgY2FsY0JTQShoZWlnaHQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChoZWlnaHQgJiYgd2VpZ2h0KSB7XG4gICAgICByZXN1bHQgPSBNYXRoLnNxcnQoKGhlaWdodCAqIHdlaWdodCkgLyAzNjAwKS50b0ZpeGVkKDIpO1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCA/IHBhcnNlRmxvYXQocmVzdWx0KSA6IG51bGw7XG4gIH1cblxuICBjYWxjQk1JRm9yQWdlWnNjb3JlKGJtaUZvckFnZVJlZiwgaGVpZ2h0LCB3ZWlnaHQpIHtcbiAgICBsZXQgYm1pO1xuICAgIGNvbnN0IG1heEFnZUluRGF5cyA9IDE4NTY7XG4gICAgaWYgKGhlaWdodCAmJiB3ZWlnaHQpIHtcbiAgICAgIGJtaSA9ICh3ZWlnaHQgLyAoKChoZWlnaHQgLyAxMDApICogaGVpZ2h0KSAvIDEwMCkpLnRvRml4ZWQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHJlZlNlY3Rpb25PYmplY3QgPSBfLmZpcnN0KGJtaUZvckFnZVJlZik7XG4gICAgbGV0IGZvcm1hdHRlZFNEVmFsdWU7XG4gICAgaWYgKHJlZlNlY3Rpb25PYmplY3QpIHtcbiAgICAgIGNvbnN0IHJlZk9iamVjdFZhbHVlcyA9IE9iamVjdC5rZXlzKHJlZlNlY3Rpb25PYmplY3QpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gcmVmU2VjdGlvbk9iamVjdFtrZXldKVxuICAgICAgICAubWFwKCh4KSA9PiB4KTtcbiAgICAgIGNvbnN0IHJlZk9iamVjdEtleXMgPSBPYmplY3Qua2V5cyhyZWZTZWN0aW9uT2JqZWN0KTtcbiAgICAgIGNvbnN0IG1pbmltdW1WYWx1ZSA9IHJlZk9iamVjdFZhbHVlc1sxXTtcbiAgICAgIGNvbnN0IG1pblJlZmVyZW5jZVBvaW50ID0gW107XG4gICAgICBpZiAoYm1pIDwgbWluaW11bVZhbHVlKSB7XG4gICAgICAgIG1pblJlZmVyZW5jZVBvaW50LnB1c2gobWluaW11bVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF8uZm9yRWFjaChyZWZPYmplY3RWYWx1ZXMsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSA8PSBibWkpIHtcbiAgICAgICAgICAgIG1pblJlZmVyZW5jZVBvaW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXN0UmVmZXJlbmNlVmFsdWUgPSBfLmxhc3QobWluUmVmZXJlbmNlUG9pbnQpO1xuICAgICAgY29uc3QgbGFzdFZhbHVlSW5kZXggPSBfLmZpbmRJbmRleChyZWZPYmplY3RWYWx1ZXMsIChvKSA9PiB7XG4gICAgICAgIHJldHVybiBvID09PSBsYXN0UmVmZXJlbmNlVmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IFNEVmFsdWUgPSByZWZPYmplY3RLZXlzW2xhc3RWYWx1ZUluZGV4XTtcbiAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSBTRFZhbHVlLnJlcGxhY2UoJ1NEJywgJycpO1xuICAgICAgaWYgKGZvcm1hdHRlZFNEVmFsdWUuaW5jbHVkZXMoJ25lZycpKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSBmb3JtYXR0ZWRTRFZhbHVlLnN1YnN0cmluZygxLCAwKTtcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9ICctJyArIGZvcm1hdHRlZFNEVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ1MnIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdMJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTScgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJy01J1xuICAgICAgKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLTQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBibWkgJiYgcmVmU2VjdGlvbk9iamVjdCA/IGZvcm1hdHRlZFNEVmFsdWUgOiBudWxsO1xuICB9XG4gIGNhbGNXZWlnaHRGb3JIZWlnaHRac2NvcmUod2VpZ2h0Rm9ySGVpZ2h0UmVmLCBoZWlnaHQsIHdlaWdodCkge1xuICAgIGxldCByZWZTZWN0aW9uO1xuICAgIGxldCBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgIGlmIChoZWlnaHQgJiYgd2VpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBwYXJzZUZsb2F0KGhlaWdodCkudG9GaXhlZCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhbmRhcmRIZWlnaHRNaW4gPSA0NTtcbiAgICBjb25zdCBzdGFuZGFyZE1heEhlaWdodCA9IDExMDtcbiAgICBpZiAoaGVpZ2h0IDwgc3RhbmRhcmRIZWlnaHRNaW4gfHwgaGVpZ2h0ID4gc3RhbmRhcmRNYXhIZWlnaHQpIHtcbiAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAtNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmU2VjdGlvbiA9IF8uZmlsdGVyKHdlaWdodEZvckhlaWdodFJlZiwgKHJlZk9iamVjdCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChyZWZPYmplY3RbJ0xlbmd0aCddKS50b0ZpeGVkKDEpID09PSBoZWlnaHQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWZTZWN0aW9uT2JqZWN0ID0gXy5maXJzdChyZWZTZWN0aW9uKTtcbiAgICBpZiAocmVmU2VjdGlvbk9iamVjdCkge1xuICAgICAgY29uc3QgcmVmT2JqZWN0VmFsdWVzID0gT2JqZWN0LmtleXMocmVmU2VjdGlvbk9iamVjdClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiByZWZTZWN0aW9uT2JqZWN0W2tleV0pXG4gICAgICAgIC5tYXAoKHgpID0+IHgpO1xuICAgICAgY29uc3QgcmVmT2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzKHJlZlNlY3Rpb25PYmplY3QpO1xuICAgICAgY29uc3QgbWluaW11bVZhbHVlID0gcmVmT2JqZWN0VmFsdWVzWzFdO1xuICAgICAgY29uc3QgbWluUmVmZXJlbmNlUG9pbnQgPSBbXTtcbiAgICAgIGlmICh3ZWlnaHQgPCBtaW5pbXVtVmFsdWUpIHtcbiAgICAgICAgbWluUmVmZXJlbmNlUG9pbnQucHVzaChtaW5pbXVtVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlZk9iamVjdFZhbHVlcywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlIDw9IHdlaWdodCkge1xuICAgICAgICAgICAgbWluUmVmZXJlbmNlUG9pbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RSZWZlcmVuY2VWYWx1ZSA9IF8ubGFzdChtaW5SZWZlcmVuY2VQb2ludCk7XG4gICAgICBjb25zdCBsYXN0VmFsdWVJbmRleCA9IF8uZmluZEluZGV4KHJlZk9iamVjdFZhbHVlcywgKG8pID0+IHtcbiAgICAgICAgcmV0dXJuIG8gPT09IGxhc3RSZWZlcmVuY2VWYWx1ZTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgU0RWYWx1ZSA9IHJlZk9iamVjdEtleXNbbGFzdFZhbHVlSW5kZXhdO1xuICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9IFNEVmFsdWUucmVwbGFjZSgnU0QnLCAnJyk7XG4gICAgICBpZiAoZm9ybWF0dGVkU0RWYWx1ZS5pbmNsdWRlcygnbmVnJykpIHtcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9IGZvcm1hdHRlZFNEVmFsdWUuc3Vic3RyaW5nKDEsIDApO1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gJy0nICsgZm9ybWF0dGVkU0RWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ1MnIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdMJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTScgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJy01J1xuICAgICAgKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLTQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoZWlnaHQgJiYgd2VpZ2h0ID8gZm9ybWF0dGVkU0RWYWx1ZSA6IG51bGw7XG4gIH1cblxuICBjYWxjSGVpZ2h0Rm9yQWdlWnNjb3JlKGhlaWdodEZvckFnZVJlZiwgaGVpZ2h0LCB3ZWlnaHQpIHtcbiAgICBjb25zdCByZWZTZWN0aW9uT2JqZWN0ID0gXy5maXJzdChoZWlnaHRGb3JBZ2VSZWYpO1xuICAgIGxldCBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgIGlmIChyZWZTZWN0aW9uT2JqZWN0KSB7XG4gICAgICBjb25zdCByZWZPYmplY3RWYWx1ZXMgPSBPYmplY3Qua2V5cyhyZWZTZWN0aW9uT2JqZWN0KVxuICAgICAgICAubWFwKChrZXkpID0+IHJlZlNlY3Rpb25PYmplY3Rba2V5XSlcbiAgICAgICAgLm1hcCgoeCkgPT4geCk7XG4gICAgICBjb25zdCByZWZPYmplY3RLZXlzID0gT2JqZWN0LmtleXMocmVmU2VjdGlvbk9iamVjdCk7XG4gICAgICBjb25zdCBtaW5pbXVtVmFsdWUgPSByZWZPYmplY3RWYWx1ZXNbMV07XG4gICAgICBjb25zdCBtaW5SZWZlcmVuY2VQb2ludCA9IFtdO1xuICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1WYWx1ZSkge1xuICAgICAgICBtaW5SZWZlcmVuY2VQb2ludC5wdXNoKG1pbmltdW1WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfLmZvckVhY2gocmVmT2JqZWN0VmFsdWVzLCAodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUgPD0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBtaW5SZWZlcmVuY2VQb2ludC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFJlZmVyZW5jZVZhbHVlID0gXy5sYXN0KG1pblJlZmVyZW5jZVBvaW50KTtcbiAgICAgIGNvbnN0IGxhc3RWYWx1ZUluZGV4ID0gXy5maW5kSW5kZXgocmVmT2JqZWN0VmFsdWVzLCAobykgPT4ge1xuICAgICAgICByZXR1cm4gbyA9PT0gbGFzdFJlZmVyZW5jZVZhbHVlO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBTRFZhbHVlID0gcmVmT2JqZWN0S2V5c1tsYXN0VmFsdWVJbmRleF07XG4gICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gU0RWYWx1ZS5yZXBsYWNlKCdTRCcsICcnKTtcbiAgICAgIGlmIChmb3JtYXR0ZWRTRFZhbHVlLmluY2x1ZGVzKCduZWcnKSkge1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gZm9ybWF0dGVkU0RWYWx1ZS5zdWJzdHJpbmcoMSwgMCk7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLScgKyBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdTJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTCcgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ00nIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICctNSdcbiAgICAgICkge1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gJy00JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCAmJiByZWZTZWN0aW9uT2JqZWN0ID8gZm9ybWF0dGVkU0RWYWx1ZSA6IG51bGw7XG4gIH1cblxuICBjYWxjU291dGhFYXN0QXNpYU5vbkxhYkNWRFJpc2soXG4gICAgc2V4OiAnTScgfCAnRicsXG4gICAgc21va2VyPzogYm9vbGVhbixcbiAgICBhZ2U/OiBudW1iZXIsXG4gICAgc2JwPzogbnVtYmVyLFxuICAgIGJtaT86IG51bWJlclxuICApIHtcbiAgICBjb25zdCBoYXNWYWxpZFZhbHVlcyA9XG4gICAgICB0eXBlb2Ygc2V4ID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIHNtb2tlciA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgICB0eXBlb2YgYWdlID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHNicCA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiBibWkgPT09ICdudW1iZXInO1xuXG4gICAgaWYgKCFoYXNWYWxpZFZhbHVlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEJpbiBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRBZ2VCaW4gPSAoYWdlKSA9PlxuICAgICAgTWF0aC5mbG9vcigoTWF0aC5taW4oTWF0aC5tYXgoNDAsIGFnZSksIDc0KSAtIDQwKSAvIDUpO1xuICAgIGNvbnN0IGdldFNicEJpbiA9IChzYnApID0+XG4gICAgICBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChNYXRoLm1pbihzYnAsIDE4MCkgLSAxMjApIC8gMjApICsgMSk7XG4gICAgY29uc3QgZ2V0Qm1pQmluID0gKGJtaSkgPT5cbiAgICAgIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKE1hdGgubWluKGJtaSwgMzUpIC0gMjApIC8gNSkgKyAxKTtcblxuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IHNleElkeCA9IHNleCA9PT0gJ00nID8gMCA6IDE7XG4gICAgY29uc3Qgc21va2VySWR4ID0gc21va2VyID8gMSA6IDA7XG4gICAgY29uc3QgYWdlSWR4ID0gNiAtIGdldEFnZUJpbihhZ2UpO1xuICAgIGNvbnN0IGJtaUlkeCA9IGdldEJtaUJpbihibWkpO1xuICAgIGNvbnN0IHNicElkeCA9IDQgLSBnZXRTYnBCaW4oc2JwKTtcblxuICAgIHJldHVybiBzb3V0aEVhc3RBc2lhQ3ZkUmlza1RhYmxlc1tzZXhJZHhdW3Ntb2tlcklkeF1bYWdlSWR4XVtzYnBJZHhdW1xuICAgICAgYm1pSWR4XG4gICAgXTtcbiAgfVxuXG4gIGlzRW1wdHkodmFsKSB7XG4gICAgaWYgKFxuICAgICAgdmFsID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHZhbCA9PT0gbnVsbCB8fFxuICAgICAgdmFsID09PSAnJyB8fFxuICAgICAgdmFsID09PSAnbnVsbCcgfHxcbiAgICAgIHZhbCA9PT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFycmF5Q29udGFpbnMoYXJyYXksIG1lbWJlcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZW1iZXJzKSkge1xuICAgICAgaWYgKG1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29udGFpbnMgPSB0cnVlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsID0gbWVtYmVyc1tpXTtcbiAgICAgICAgaWYgKGFycmF5LmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YobWVtYmVycykgIT09IC0xO1xuICAgIH1cbiAgfVxuICBleHRyYWN0UmVwZWF0aW5nR3JvdXBWYWx1ZXMoa2V5LCBhcnJheSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW1ba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGZvcm1hdERhdGUodmFsdWUsIGZvcm1hdCwgb2Zmc2V0KSB7XG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICd5eXl5LU1NLWRkJztcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgJyswMzAwJztcblxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRlRm9ybWF0RXhjZXB0aW9uOiB2YWx1ZSBwYXNzZWQgaXMgbm90IGEgdmFsaWQgZGF0ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBtb21lbnQodmFsdWUpO1xuICAgIGlmICghZGF0ZS5pc1ZhbGlkKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0ZUZvcm1hdEV4Y2VwdGlvbjogdmFsdWUgcGFzc2VkIGlzIG5vdCBhIHZhbGlkIGRhdGUnKTtcbiAgICB9XG5cbiAgICBpZiAob2Zmc2V0KSB7XG4gICAgICBkYXRlLnV0Y09mZnNldChvZmZzZXQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1vbWVudEZvcm1hdCA9IGZvcm1hdFxuICAgICAgLnJlcGxhY2UoL3l5eXkvZywgJ1lZWVknKVxuICAgICAgLnJlcGxhY2UoL3l5L2csICdZWScpXG4gICAgICAucmVwbGFjZSgvZGQvZywgJ0REJyk7XG4gICAgcmV0dXJuIGRhdGUuZm9ybWF0KG1vbWVudEZvcm1hdCk7XG4gIH1cblxuICBhcnJheUNvbnRhaW5zQW55KGFycmF5LCBtZW1iZXJzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWVtYmVycykpIHtcbiAgICAgIGlmIChtZW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGxldCBjb250YWlucyA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsID0gbWVtYmVyc1tpXTtcbiAgICAgICAgaWYgKGFycmF5LmluZGV4T2YodmFsKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250YWlucyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YobWVtYmVycykgIT09IC0xO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIHRhcmdldCBjb250cm9sLCBhbiBlbmNvdW50ZXIgYW5kIGNvbmNlcHQgdXVpZC4gSWYgdGhlIHRhcmdldCBjb250cm9sIGhhcyBhIHZhbHVlIGl0IHJldHVybnMgaXRcbiAgICogb3RoZXJ3aXNlIGl0IHRyaWVzIHRvIGZpbmQgaXQgaW4gdGhlIGVuY291bnRlci4gRmluYWxseSBpdCByZXR1cm5zIG51bGwgb2YgaXQgY2FuJ3QgZmluZCBlaXRoZXIgb2YgdGhlbS5cbiAgICogQHBhcmFtIHRhcmdldENvbnRyb2xcbiAgICogQHBhcmFtIHJhd0VuY291bnRlclxuICAgKiBAcGFyYW0gdXVpZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZ2V0T2JzRnJvbUNvbnRyb2xPckVuY291bnRlcih0YXJnZXRDb250cm9sLCByYXdFbmNvdW50ZXIsIHV1aWQpOiBhbnkge1xuICAgIGNvbnN0IGZpbmRPYnMgPSAob2JzLCB1dWlkKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgb2JzPy5zb21lKFxuICAgICAgICAobykgPT5cbiAgICAgICAgICAocmVzdWx0ID1cbiAgICAgICAgICAgIG8/LmNvbmNlcHQ/LnV1aWQgPT09IHV1aWQgPyBvIDogZmluZE9icyhvLmdyb3VwTWVtYmVycyB8fCBbXSwgdXVpZCkpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGNvbnN0IG9ic1ZhbHVlID0gZmluZE9icyhyYXdFbmNvdW50ZXI/Lm9icywgdXVpZCk/LnZhbHVlO1xuICAgIHJldHVybiAhIXRhcmdldENvbnRyb2xcbiAgICAgID8gdGFyZ2V0Q29udHJvbFxuICAgICAgOiB0eXBlb2Ygb2JzVmFsdWUgPT09ICdvYmplY3QnXG4gICAgICA/IG9ic1ZhbHVlLnV1aWRcbiAgICAgIDogISFvYnNWYWx1ZVxuICAgICAgPyBvYnNWYWx1ZVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgZG9lc05vdE1hdGNoRXhwcmVzc2lvbihcbiAgICByZWdleFN0cmluZzogc3RyaW5nLFxuICAgIHZhbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbCB8fCBbJ3VuZGVmaW5lZCcsICdudWxsJywgJyddLmluY2x1ZGVzKHZhbC50b1N0cmluZygpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKHJlZ2V4U3RyaW5nKTtcbiAgICBpZiAoIXBhdHRlcm4udGVzdCh2YWwpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2FsY0dyYXZpZGEocGFyaXR5VGVybSwgcGFyaXR5QWJvcnRpb24pIHtcbiAgICBsZXQgZ3JhdmlkYSA9IDA7XG5cbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYXJpdHlUZXJtKSkge1xuICAgICAgZ3JhdmlkYSArPSBwYXJpdHlUZXJtICsgMTtcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihwYXJpdHlBYm9ydGlvbikpIHtcbiAgICAgIGdyYXZpZGEgKz0gcGFyaXR5QWJvcnRpb24gKyAxO1xuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHBhcml0eVRlcm0pICYmIE51bWJlci5pc0ludGVnZXIocGFyaXR5QWJvcnRpb24pKSB7XG4gICAgICBncmF2aWRhID0gcGFyaXR5VGVybSArIHBhcml0eUFib3J0aW9uICsgMTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JhdmlkYTtcbiAgfVxuXG4gIGdldCBoZWxwZXJGdW5jdGlvbnMoKSB7XG4gICAgY29uc3QgaGVscGVyID0gdGhpcztcbiAgICByZXR1cm4ge1xuICAgICAgYXJyYXlDb250YWluc0FueTogaGVscGVyLmFycmF5Q29udGFpbnNBbnksXG4gICAgICBjYWxjQk1JOiBoZWxwZXIuY2FsY0JNSSxcbiAgICAgIGNhbGNCTUlGb3JBZ2Vac2NvcmU6IGhlbHBlci5jYWxjQk1JRm9yQWdlWnNjb3JlLFxuICAgICAgY2FsY1dlaWdodEZvckhlaWdodFpzY29yZTogaGVscGVyLmNhbGNXZWlnaHRGb3JIZWlnaHRac2NvcmUsXG4gICAgICBjYWxjSGVpZ2h0Rm9yQWdlWnNjb3JlOiBoZWxwZXIuY2FsY0hlaWdodEZvckFnZVpzY29yZSxcbiAgICAgIGNhbGNTb3V0aEVhc3RBc2lhTm9uTGFiQ1ZEUmlzazogaGVscGVyLmNhbGNTb3V0aEVhc3RBc2lhTm9uTGFiQ1ZEUmlzayxcbiAgICAgIGlzRW1wdHk6IGhlbHBlci5pc0VtcHR5LFxuICAgICAgYXJyYXlDb250YWluczogaGVscGVyLmFycmF5Q29udGFpbnMsXG4gICAgICBleHRyYWN0UmVwZWF0aW5nR3JvdXBWYWx1ZXM6IGhlbHBlci5leHRyYWN0UmVwZWF0aW5nR3JvdXBWYWx1ZXMsXG4gICAgICBnZXRPYnNGcm9tQ29udHJvbE9yRW5jb3VudGVyOiBoZWxwZXIuZ2V0T2JzRnJvbUNvbnRyb2xPckVuY291bnRlcixcbiAgICAgIGRvZXNOb3RNYXRjaEV4cHJlc3Npb246IGhlbHBlci5kb2VzTm90TWF0Y2hFeHByZXNzaW9uLFxuICAgICAgY2FsY0dyYXZpZGE6IGhlbHBlci5jYWxjR3JhdmlkYVxuICAgIH07XG4gIH1cbn1cbiJdfQ==