@dssp/dkpi 1.0.0-alpha.8 โ†’ 1.0.0-alpha.81

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 (252) hide show
  1. package/KPI-STATISTICS-SERVICE.md +233 -0
  2. package/_index.html +0 -5
  3. package/assets/favicon.ico +0 -0
  4. package/assets/images/project-image.png +0 -0
  5. package/assets/manifest/apple-1024.png +0 -0
  6. package/assets/manifest/apple-120.png +0 -0
  7. package/assets/manifest/apple-152.png +0 -0
  8. package/assets/manifest/apple-167.png +0 -0
  9. package/assets/manifest/apple-180.png +0 -0
  10. package/assets/manifest/apple-touch-icon.png +0 -0
  11. package/assets/manifest/badge-128x128.png +0 -0
  12. package/assets/manifest/chrome-splashscreen-icon-384x384.png +0 -0
  13. package/assets/manifest/chrome-touch-icon-192x192.png +0 -0
  14. package/assets/manifest/icon-128x128.png +0 -0
  15. package/assets/manifest/icon-192x192.png +0 -0
  16. package/assets/manifest/icon-512x512.png +0 -0
  17. package/assets/manifest/icon-72x72.png +0 -0
  18. package/assets/manifest/icon-96x96.png +0 -0
  19. package/assets/manifest/image-metaog.png +0 -0
  20. package/assets/manifest/maskable_icon.png +0 -0
  21. package/assets/manifest/ms-icon-144x144.png +0 -0
  22. package/assets/manifest/ms-touch-icon-144x144-precomposed.png +0 -0
  23. package/assets/videos/intro.mp4 +0 -0
  24. package/config/config.development.js +2 -1
  25. package/config/config.production.js +2 -1
  26. package/dist-client/bootstrap.d.ts +1 -0
  27. package/dist-client/bootstrap.js +75 -4
  28. package/dist-client/bootstrap.js.map +1 -1
  29. package/dist-client/components/kpi-2d-lookup-chart.d.ts +43 -0
  30. package/dist-client/components/kpi-2d-lookup-chart.js +253 -0
  31. package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
  32. package/dist-client/components/kpi-boxplot-chart.d.ts +24 -0
  33. package/dist-client/components/kpi-boxplot-chart.js +291 -0
  34. package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
  35. package/dist-client/components/kpi-lookup-chart.d.ts +53 -0
  36. package/dist-client/components/kpi-lookup-chart.js +430 -0
  37. package/dist-client/components/kpi-lookup-chart.js.map +1 -0
  38. package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
  39. package/dist-client/components/kpi-mini-trend-chart.js +148 -0
  40. package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
  41. package/dist-client/components/kpi-radar-chart.d.ts +17 -0
  42. package/dist-client/components/kpi-radar-chart.js +259 -0
  43. package/dist-client/components/kpi-radar-chart.js.map +1 -0
  44. package/dist-client/components/kpi-single-boxplot-chart.d.ts +25 -0
  45. package/dist-client/components/kpi-single-boxplot-chart.js +398 -0
  46. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -0
  47. package/dist-client/components/kpi-trend-chart.d.ts +25 -0
  48. package/dist-client/components/kpi-trend-chart.js +220 -0
  49. package/dist-client/components/kpi-trend-chart.js.map +1 -0
  50. package/dist-client/components/sv-pagenation-control.d.ts +18 -0
  51. package/dist-client/components/sv-pagenation-control.js +142 -0
  52. package/dist-client/components/sv-pagenation-control.js.map +1 -0
  53. package/dist-client/entries/auth/checkin.d.ts +38 -0
  54. package/dist-client/entries/auth/checkin.js +546 -0
  55. package/dist-client/entries/auth/checkin.js.map +1 -0
  56. package/dist-client/google-map/common-google-map.d.ts +35 -0
  57. package/dist-client/google-map/common-google-map.js +345 -0
  58. package/dist-client/google-map/common-google-map.js.map +1 -0
  59. package/dist-client/google-map/google-map-loader.d.ts +6 -0
  60. package/dist-client/google-map/google-map-loader.js +23 -0
  61. package/dist-client/google-map/google-map-loader.js.map +1 -0
  62. package/dist-client/icons/menu-icons.d.ts +6 -0
  63. package/dist-client/icons/menu-icons.js +42 -0
  64. package/dist-client/icons/menu-icons.js.map +1 -1
  65. package/dist-client/pages/component/project-update-header.d.ts +1 -0
  66. package/dist-client/pages/component/project-update-header.js +127 -0
  67. package/dist-client/pages/component/project-update-header.js.map +1 -0
  68. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.d.ts +22 -0
  69. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js +57 -0
  70. package/dist-client/pages/kpi-admin/dssp-kpi-list-page.js.map +1 -0
  71. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +46 -0
  72. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +378 -0
  73. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
  74. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.d.ts +20 -0
  75. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js +445 -0
  76. package/dist-client/pages/kpi-admin/kpi-grade-2d-editor.js.map +1 -0
  77. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
  78. package/dist-client/pages/kpi-admin/kpi-system-guide.js +535 -0
  79. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
  80. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +18 -0
  81. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +259 -0
  82. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  83. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +22 -0
  84. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +346 -0
  85. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  86. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +26 -0
  87. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +433 -0
  88. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  89. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  90. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  91. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  92. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +38 -0
  93. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +851 -0
  94. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  95. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +42 -0
  96. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +316 -0
  97. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  98. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +28 -0
  99. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +497 -0
  100. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  101. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  102. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
  103. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  104. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +52 -0
  105. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +798 -0
  106. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  107. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +63 -0
  108. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1089 -0
  109. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  110. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  111. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  112. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  113. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  114. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  115. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  116. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  117. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  118. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  119. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  120. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
  121. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  122. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  123. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  124. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  125. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +57 -0
  126. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +719 -0
  127. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  128. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  129. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +76 -0
  130. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  131. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +68 -0
  132. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +394 -0
  133. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  134. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  135. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +174 -0
  136. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  137. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +40 -0
  138. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +190 -0
  139. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  140. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  141. package/dist-client/pages/kpi-value/kpi-value-importer.js +93 -0
  142. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  143. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +71 -0
  144. package/dist-client/pages/kpi-value/kpi-value-list-page.js +454 -0
  145. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  146. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +61 -0
  147. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +766 -0
  148. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
  149. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +16 -0
  150. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +341 -0
  151. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -0
  152. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +21 -0
  153. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +335 -0
  154. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -0
  155. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +42 -0
  156. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +641 -0
  157. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
  158. package/dist-client/pages/sv-project-complete.d.ts +25 -0
  159. package/dist-client/pages/sv-project-complete.js +263 -0
  160. package/dist-client/pages/sv-project-complete.js.map +1 -0
  161. package/dist-client/pages/sv-project-completed-list.d.ts +27 -0
  162. package/dist-client/pages/sv-project-completed-list.js +416 -0
  163. package/dist-client/pages/sv-project-completed-list.js.map +1 -0
  164. package/dist-client/pages/sv-project-detail.d.ts +58 -0
  165. package/dist-client/pages/sv-project-detail.js +1418 -0
  166. package/dist-client/pages/sv-project-detail.js.map +1 -0
  167. package/dist-client/pages/sv-project-list.d.ts +174 -0
  168. package/dist-client/pages/sv-project-list.js +578 -0
  169. package/dist-client/pages/sv-project-list.js.map +1 -0
  170. package/dist-client/pages/sv-project-update.d.ts +86 -0
  171. package/dist-client/pages/sv-project-update.js +1331 -0
  172. package/dist-client/pages/sv-project-update.js.map +1 -0
  173. package/dist-client/pages/sv-user-management.d.ts +1 -0
  174. package/dist-client/pages/sv-user-management.js +5 -0
  175. package/dist-client/pages/sv-user-management.js.map +1 -1
  176. package/dist-client/route.d.ts +1 -1
  177. package/dist-client/route.js +50 -2
  178. package/dist-client/route.js.map +1 -1
  179. package/dist-client/shared/complete-api.d.ts +37 -0
  180. package/dist-client/shared/complete-api.js +224 -0
  181. package/dist-client/shared/complete-api.js.map +1 -0
  182. package/dist-client/shared/func.d.ts +2 -0
  183. package/dist-client/shared/func.js +22 -0
  184. package/dist-client/shared/func.js.map +1 -0
  185. package/dist-client/shared/integration-fetch.d.ts +35 -0
  186. package/dist-client/shared/integration-fetch.js +53 -0
  187. package/dist-client/shared/integration-fetch.js.map +1 -0
  188. package/dist-client/themes/dark.css +24 -24
  189. package/dist-client/themes/light.css +23 -23
  190. package/dist-client/tsconfig.tsbuildinfo +1 -1
  191. package/dist-client/viewparts/menu-tools.d.ts +40 -5
  192. package/dist-client/viewparts/menu-tools.js +292 -43
  193. package/dist-client/viewparts/menu-tools.js.map +1 -1
  194. package/dist-server/index.d.ts +2 -0
  195. package/dist-server/index.js +5 -0
  196. package/dist-server/index.js.map +1 -1
  197. package/dist-server/migrations/index.d.ts +1 -0
  198. package/dist-server/migrations/index.js +12 -0
  199. package/dist-server/migrations/index.js.map +1 -0
  200. package/dist-server/scripts/calculate-kpi-scores.d.ts +10 -0
  201. package/dist-server/scripts/calculate-kpi-scores.js +333 -0
  202. package/dist-server/scripts/calculate-kpi-scores.js.map +1 -0
  203. package/dist-server/scripts/load-grade-data-migration.d.ts +14 -0
  204. package/dist-server/scripts/load-grade-data-migration.js +279 -0
  205. package/dist-server/scripts/load-grade-data-migration.js.map +1 -0
  206. package/dist-server/scripts/propagate-parent-kpi-values.d.ts +14 -0
  207. package/dist-server/scripts/propagate-parent-kpi-values.js +786 -0
  208. package/dist-server/scripts/propagate-parent-kpi-values.js.map +1 -0
  209. package/dist-server/scripts/recalculate-by-project-name.d.ts +2 -0
  210. package/dist-server/scripts/recalculate-by-project-name.js +72 -0
  211. package/dist-server/scripts/recalculate-by-project-name.js.map +1 -0
  212. package/dist-server/service/index.d.ts +4 -0
  213. package/dist-server/service/index.js +20 -0
  214. package/dist-server/service/index.js.map +1 -0
  215. package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
  216. package/dist-server/service/kpi-metric-value/index.js +8 -0
  217. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  218. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +166 -0
  219. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +951 -0
  220. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  221. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +7 -0
  222. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +59 -0
  223. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  224. package/dist-server/service/kpi-stat/index.d.ts +4 -0
  225. package/dist-server/service/kpi-stat/index.js +8 -0
  226. package/dist-server/service/kpi-stat/index.js.map +1 -0
  227. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +12 -0
  228. package/dist-server/service/kpi-stat/kpi-stat-query.js +663 -0
  229. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
  230. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
  231. package/dist-server/service/kpi-stat/kpi-stat-types.js +180 -0
  232. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
  233. package/dist-server/service/kpi-value/index.d.ts +3 -0
  234. package/dist-server/service/kpi-value/index.js +7 -0
  235. package/dist-server/service/kpi-value/index.js.map +1 -0
  236. package/dist-server/service/kpi-value/kpi-value-query.d.ts +8 -0
  237. package/dist-server/service/kpi-value/kpi-value-query.js +63 -0
  238. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  239. package/dist-server/tsconfig.tsbuildinfo +1 -1
  240. package/kpi-module-service-tests.md +1286 -0
  241. package/kpi-module-test-report.md +676 -0
  242. package/kpi-module-unit-test-detailed-report.md +925 -0
  243. package/kpi-module-unit-tests-detailed.md +1452 -0
  244. package/package.json +69 -55
  245. package/recalculate-batch.sh +64 -0
  246. package/recalculate-projects-range.sh +98 -0
  247. package/schema.graphql +3423 -462
  248. package/things-factory.config.js +12 -1
  249. package/translations/en.json +5 -1
  250. package/translations/ko.json +5 -1
  251. package/views/auth-page.html +0 -1
  252. package/views/public/home.html +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAyF;AACzF,iDAAmF;AACnF,uEAA8D;AAC9D,qCAA4B;AAC5B,6CAW4B;AAC5B,qEAA6F;AAC7F,2CAAqD;AACrD,8EAAoC;AACpC,kEAAgC;AAChC,oEAA8B;AAC9B,0DAAyB;AACzB,wDAAuB;AAEvB;;;GAGG;AAEH,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;CAyBjC,CAAA;AAvBC;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;;4DAC7C;AAGf;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;;2DAChC;AAGd;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;;wDAC5B;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;;6DACjC;AAahB;IAXC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE;QAC3B,QAAQ,EAAE,IAAI;QACd,WAAW,EACT,wCAAwC;YACxC,yFAAyF;YACzF,sCAAsC;YACtC,8CAA8C;YAC9C,kEAAkE;YAClE,8DAA8D;YAC9D,2CAA2C;KAC9C,CAAC;;0DACQ;AAxBN,4BAA4B;IADjC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC;GAC/D,4BAA4B,CAyBjC;AAGM,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,6HAA6H;IAIvH,AAAN,KAAK,CAAC,+BAA+B,CACY,OAA8B,EACtE,OAAwB;QAE/B,OAAO,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3D,CAAC;IAED,qDAAqD;IAI/C,AAAN,KAAK,CAAC,+BAA+B,CACY,OAA8B,EACtE,OAAwB;QAE/B,OAAO,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,KAAK,CAAC,qBAAqB,CACjC,OAA8B,EAC9B,OAAwB;;QAExB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACnC,yEAAyE;QACzE,MAAM,SAAS,GAAI,OAAO,CAAC,CAAC,CAAS,CAAC,GAAG,CAAA;QACzC,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;QACtF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAA;QACtC,MAAM,eAAe,GAAG,IAAA,qBAAa,EAAC,oBAAc,EAAE,EAAE,CAAC,CAAA;QACzD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,eAAS,EAAE,EAAE,CAAC,CAAA;QAE/C,MAAM,OAAO,GAAqB,EAAE,CAAA;QACpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;YAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;YACxD,CAAC;YACD,wDAAwD;YACxD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;gBAC7C,KAAK,EAAE;oBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;oBACzB,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE;oBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,GAAG,EAAE,KAAK,CAAC,GAAG;iBACR;aACT,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,8BACxC,MAAM,IACH,KAAK,KACR,EAAE,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,EAAE,mCAAI,KAAK,CAAC,EAAE,EAC5B,MAAM,EACN,OAAO,EAAE,IAAI,GACP,CAAC,CAAA;YACT,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,yDAAyD;IAInD,AAAN,KAAK,CAAC,8BAA8B,CACQ,UAAyB,EAC5D,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,WAAW,GAAG,IAAA,qBAAa,EAAC,iBAAO,EAAE,EAAE,CAAC,CAAA;QAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAA;QAClC,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAC,4BAAU,EAAE,EAAE,CAAC,CAAA;QACpD,MAAM,eAAe,GAAG,IAAA,qBAAa,EAAC,oBAAc,EAAE,EAAE,CAAC,CAAA;QACzD,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,eAAS,EAAE,EAAE,CAAC,CAAA;QAE/C,cAAc;QACd,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAA;QACvD,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA;QAE9E,gBAAgB;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,yCAAyC;QACzC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,CAAA;QAC1C,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAA;QACjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAE5D,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,WAAW,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAA;QAEjF,sCAAsC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QAC9F,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,kCAAgB,EAAC,IAAI,EAAE,EAAE,UAAU,kCAAO,UAAU,KAAE,IAAI,EAAE,aAAa,GAAE,EAAE,EAAE,OAAO,CAAC,CAAA;QACtH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAA;QACxE,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAA;QAEzD,2CAA2C;QAC3C,IAAI,WAAW,GAAG,CAAC,CAAA;QACnB,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,IAAI,CAAC;YACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,yCAAyC,CAAA;YAEtG,sBAAsB;YACtB,WAAW,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;YAErH,uBAAuB;YACvB,YAAY,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;QACzH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAA;QACrE,CAAC;QAED,eAAe;QACf,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAC5G,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QAE7G,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,UAAe;QAC5C,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAA;QACvC,MAAM,MAAM,GAAa,EAAE,CAAA;QAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;YACjC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YACxD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,0BAA0B,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAgB;QACnF,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QACtC,OAAO;YACL,QAAQ;YACR,QAAQ;YACR,QAAQ,EAAE,MAAM;YAChB,gBAAgB,EAAE,GAAG,EAAE;gBACrB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;gBAC/B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;gBACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACnB,OAAO,QAAQ,CAAA;YACjB,CAAC;SACF,CAAA;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mCAAmC,CAC/C,OAAe,EACf,WAAmB,EACnB,UAAkB,EAClB,QAAgB;;QAEhB,OAAO,CAAC,GAAG,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAA;QAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAA;QACnC,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAA;QAEtD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,EAAE,CAAA;QAE/B,wBAAwB;QACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAE9C,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE;YACrC,QAAQ;YACR,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAA;QAEF,MAAM,GAAG,GAAG,GAAG,OAAO,YAAY,WAAW,EAAE,CAAA;QAC/C,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAA;QAElC,sBAAsB;QACtB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,OAAO;YACnB,CAAC,CAAC,IAAI,eAAK,CAAC,KAAK,CAAC;gBACd,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,MAAM;gBACf,kBAAkB,EAAE,KAAK;aAC1B,CAAC;YACJ,CAAC,CAAC,IAAI,cAAI,CAAC,KAAK,CAAC;gBACb,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAA;QAEN,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,QAAe;gBACrB,OAAO,kCACF,QAAQ,CAAC,UAAU,EAAE,KACxB,aAAa,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAC5E;gBACD,KAAK;gBACL,OAAO,EAAE,MAAM;aAChB,CAAC,CAAA;YAEF,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;YAElD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACvC,OAAO,CAAC,KAAK,CAAC,WAAW,WAAW,kBAAkB,EAAE,SAAS,CAAC,CAAA;gBAClE,MAAM,IAAI,KAAK,CAAC,WAAW,WAAW,YAAY,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAA;YACrF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,OAAO,CAAC,GAAG,CAAC,WAAW,WAAW,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;YAErE,MAAM,KAAK,GAAG,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,KAAK,MAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,IAAI,CAAC,CAAA;YACrD,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAA;YAExC,OAAO,KAAK,CAAA;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,WAAW,GAAG,EAAE,KAAK,CAAC,CAAA;YACrD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAC3B,eAAoB,EACpB,UAAe,EACf,SAAiB,EACjB,UAAkB,EAClB,KAAa,EACb,MAAW,EACX,IAAS;QAET,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;YAChD,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;SACxD,CAAC,CAAA;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,eAAe,CAAC,IAAI,iCACrB,WAAW,KACd,KAAK,EACL,OAAO,EAAE,IAAI,IACb,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;YAC9E,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,eAAe,CAAC,IAAI,CAAC;oBACzB,MAAM,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE;oBAC/B,IAAI,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE;oBAC7B,GAAG,EAAE,SAAS;oBACd,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,SAAS,EAAE,IAAA,yBAAM,GAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;oBACzD,KAAK;oBACL,MAAM;oBACN,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAKK,AAAN,KAAK,CAAC,mCAAmC,CACrB,SAAiB,EAC5B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,WAAW,GAAG,IAAA,qBAAa,EAAC,iBAAO,EAAE,EAAE,CAAC,CAAA;QAE9C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QAEvE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;QACpD,CAAC;QAED,6CAA6C;QAC7C,iEAAiE;QACjE,yDAAyD;QACzD,yDAAyD;QACzD,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAE3E,MAAM,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QAEjE,WAAW,CAAC,IAAI,iCACX,OAAO,KACV,KAAK,EAAE,sBAAY,CAAC,SAAS,IAC7B,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,qBAAqB,CACP,SAAiB,EAC5B,OAAwB;QAE/B,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,iBAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC3E,MAAM,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QAEjE,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;;;;;;OASG;IAKG,AAAN,KAAK,CAAC,0BAA0B,CACZ,SAAiB,EAC5B,OAAwB;QAE/B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC3E,OAAO,MAAM,IAAI,CAAC,mCAAmC,CAAC,cAAc,CAAC,CAAA;IACvE,CAAC;IAED;;;;;;;;;;;;OAYG;IAMG,AAAN,KAAK,CAAC,uBAAuB,CACT,SAAiB,EACC,OAAe,EAC5C,OAAwB;QAE/B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC3E,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,YAAY,CAAC,iCAAiC,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,iBAAiB,CACjC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,EACvD,cAAc,CACf,CAAA;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACK,KAAK,CAAC,qBAAqB,CACjC,SAAiB,EACjB,OAAwB;QAExB,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,qBAAa,EAAC,iBAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;QACtF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,qBAAqB,SAAS,oDAAoD,CAAC,CAAA;YAChG,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAa,EAAC,cAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC;YAC3D,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAS;SAC9D,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CACV,qBAAqB,SAAS,UAAU,OAAO,CAAC,IAAI,2CAA2C,CAChG,CAAA;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,OAAO,gCACF,OAAO,KACV,KAAK,kCAAO,OAAO,CAAC,KAAK,KAAE,MAAM,EAAE,YAAY,MAC7B,CAAA;IACtB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,OAAwB;QAC9E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,cAAM,EAAE,EAAE,CAAC,CAAA;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAS,EAAE,CAAC,CAAA;QAC1F,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAA;YACtB,QAAQ,CAAC,MAAM,GAAG,IAAI,CACrB;YAAC,QAAgB,CAAC,OAAO,GAAG,IAAI,CAAA;YACjC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC3B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,IAAI,CACb,IAAI,CAAC,MAAM,CAAC;gBACV,IAAI;gBACJ,KAAK;gBACL,MAAM,EAAE,IAAI;gBACZ,MAAM;gBACN,WAAW,EAAE,oDAAoD;gBACjE,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;aACP,CAAC,CACV,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAC7B,CAAkD,EAClD,OAAwB;;QAExB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QACtD,IAAI,CAAC;YACH,MAAM,SAAS,GAAQ,MAAM,IAAA,8BAAW,EAAC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;YAC3E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,0BAA0B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAA;gBAC/E,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC;YACD,IAAI,SAAS,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CACV,cAAc,CAAC,CAAC,IAAI,uBAAuB,MAAM,CAAC,SAAS,MAAM,SAAS,CAAC,OAAO,IAAI,cAAc,EAAE,CACvG,CAAA;gBACD,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC;YAED,IAAI,IAAI,GAAG,MAAA,MAAA,SAAS,CAAC,MAAM,mCAAI,SAAS,CAAC,IAAI,mCAAI,EAAE,CAAA;YACnD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAClC,IACE,QAAQ,CAAC,MAAM,KAAK,CAAC;oBACrB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACrC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EACjC,CAAC;oBACD,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC1B,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,YAAY,MAAM,CAAC,SAAS,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1G,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAC5E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,gBAAgB,MAAM,CAAC,SAAS,MAAM,GAAG,EAAE,CAAC,CAAA;YAC7E,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;QACtE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mCAAmC,CAAC,OAAwB;QACxE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,SAAS,GAA2D;YACxE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;YACvD,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE;YACtD,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;SACrD,CAAA;QAED,MAAM,OAAO,GAAmC,EAAE,CAAA;QAClD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CAAC,OAAwB;QAC7D,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,CAAC,CAAA;IACzD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,2BAA2B,CAAC,SAAiB,EAAE,OAAwB;QACnF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,cAAQ,EAAE,EAAE,CAAC,CAAA;QAChD,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAG,EAAE,EAAE,CAAC,CAAA;QAEtC,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;gBAChD,KAAK,EAAE;oBACL,KAAK,EAAE,SAAS;oBAChB,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;iBAC1B;aACF,CAAC,CAAA;YAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;gBAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,iBAAiB,CAAC,MAAM,oCAAoC,SAAS,EAAE,CAAC,CAAA;YACjG,CAAC;YAED,4BAA4B;YAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjC,SAAS,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;aAClC,CAAC,CAAA;YAEF,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,wBAAwB,CAAC,CAAA;YAE5D,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;YAChG,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YAEhG,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,MAAM,kBAAkB,UAAU,CAAC,MAAM,cAAc,CAAC,CAAA;YAE3F,+BAA+B;YAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;oBAC/D,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;gBAClE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;oBAC7E,iCAAiC;gBACnC,CAAC;YACH,CAAC;YAED,wCAAwC;YACxC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAElE,uCAAuC;YACvC,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;oBAC5E,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;gBACtE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,SAAS,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBACnF,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,SAAS,GAAG,EAAE,KAAK,CAAC,CAAA;YAChF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB,CAAC,QAAkB,EAAE,OAAwB;;QAC5E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,cAAQ,EAAE,EAAE,CAAC,CAAA;QAChD,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAG,EAAE,EAAE,CAAC,CAAA;QACtC,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,eAAS,EAAE,EAAE,CAAC,CAAA;QAC/C,MAAM,eAAe,GAAG,IAAA,qBAAa,EAAC,oBAAc,EAAE,EAAE,CAAC,CAAA;QAEzD,yBAAyB;QACzB,oDAAoD;QACpD,MAAM,GAAG,GACP,QAAQ,CAAC,GAAG;YACZ,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC;gBACrB,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE;gBAC7B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;aAC3B,CAAC,CAAC,CAAA;QACL,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAA;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,yCAAyC,CAAC,CAAA;YACrE,OAAO,QAAQ,CAAA;QACjB,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,mBAAa,CAAC,GAAG,CAAA;QACtD,MAAM,SAAS,GAAG,IAAI,CAAA,CAAC,qBAAqB;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,IAAI,SAAS,CAAA,CAAC,sBAAsB;QAE9D,0CAA0C;QAC1C,IAAI,cAAsB,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACrC,MAAM,QAAQ,GAAG,IAAI,4BAAsB,CAAC;gBAC1C,SAAS;gBACT,GAAG;gBACH,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,EAAE;aACH,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,sBAAgB,EAAE,QAAQ,EAAE,CAAA;YAC7D,cAAc,GAAG,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAExD,IAAI,cAAc,IAAI,IAAI,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAA;YACrF,OAAO,QAAQ,CAAA,CAAC,iBAAiB;QACnC,CAAC;QAED,2BAA2B;QAC3B,QAAQ,CAAC,KAAK,GAAG,cAAc,CAAA;QAC/B,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QACnC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAA;QAEvB,mBAAmB;QACnB,IAAI,CAAC;YACH,sDAAsD;YACtD,IAAI,YAAmD,CAAA;YACvD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAa,CAAA;YACpC,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;gBAChG,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAA;gBACvC,MAAM,WAAW,GAAG,IAAA,qBAAa,EAAC,iBAAO,EAAE,EAAE,CAAC,CAAA;gBAC9C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAA;gBACvE,YAAY,GAAG,EAAE,YAAY,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,mCAAI,EAAE,EAAE,CAAA;gBAC7D,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,kBAAkB,YAAY,CAAC,YAAY,GAAG,CAAC,CAAA;YACtF,CAAC;YAED,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;YAC7D,OAAO,CAAC,GAAG,CAAC,+CAA+C,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,2CAA2C,QAAQ,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;YAC5F,mCAAmC;QACrC,CAAC;QAED,OAAO,MAAM,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,yBAAyB,CAAC,GAAQ,EAAE,KAAa;QAC7D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAC1C,MAAM,QAAQ,GAAG;gBACf,GAAG,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;oBAC1B,IAAI,IAAI,KAAK,OAAO;wBAAE,OAAO,KAAK,CAAA;oBAClC,OAAO,IAAI,CAAA;gBACb,CAAC;aACF,CAAA;YACD,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,sBAAgB,EAAE,QAAQ,EAAE,CAAA;YAC7D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YAEtD,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBAEvC,OAAO;oBACL,KAAK,EAAE,gBAAgB;oBACvB,iBAAiB,EAAE,SAAS;iBAC7B,CAAA;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,YAAY,UAAU,EAAE,KAAK,CAAC,CAAA;QAChG,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAC9B,GAAQ,EACR,KAAa,EACb,OAAmC;QAEnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,0CAA0C;QAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAa,CAAA;QAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YAC1E,OAAO,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,CAAC,CAAA;QAC9E,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;QACjF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,iBAAiB,EAAE,QAAQ;SAC5B,CAAA;IACH,CAAC;IAED;;OAEG;IACK,0BAA0B,CAChC,cAAsB,EACtB,MAAW,EACX,YAAqB;QAErB,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QAE5D,MAAM,QAAQ,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,EAAE,CAAA;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACrE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,aAAa,CAAC,CAAA;QAC1E,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QAErB,IAAI,KAAa,CAAA;QACjB,IAAI,cAAc,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YACtC,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,cAAc,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7C,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,cAAc,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7C,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,IAAI,cAAc,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7C,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,CAAC,CAAA;QACX,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,CAAA;IAClE,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,qBAAqB,CACjC,QAAkB,EAClB,GAAQ,EACR,OAAmC;QAEnC,wBAAwB;QACxB,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;QAE3E,mDAAmD;QACnD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC3E,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,+BAA+B;YAC/B,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAA;YAClC,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,KAAK,YAAY,GAAG,CAAC,IAAI,gBAAgB,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAA;QACvH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iDAAiD,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,uBAAuB,CAAC,GAAQ,EAAE,SAAiB,EAAE,OAAwB;QACzF,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,cAAQ,EAAE,EAAE,CAAC,CAAA;QAEhD,yDAAyD;QACzD,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE;gBACL,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;gBACnB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;aAC1B;SACF,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,iBAAiB;YACjB,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC;gBAC7B,GAAG;gBACH,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC;gBACzB,KAAK,EAAE,SAAS;gBAChB,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAChD,KAAK,EAAE,CAAC;gBACR,KAAK,EAAE,CAAC;gBACR,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;QACJ,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,yBAAyB,CACrC,SAAc,EACd,SAAiB,EACjB,OAAc,EACd,OAAwB;QAExB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAC,cAAQ,EAAE,EAAE,CAAC,CAAA;QAEhD,aAAa;QACb,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAC,OAAA,CAAA,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,MAAK,SAAS,CAAC,EAAE,CAAA,EAAA,CAAC,CAAA;QAExE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,uCAAuC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QAED,mBAAmB;QACnB,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChD,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;YAC7C,KAAK,EAAE;gBACL,GAAG,EAAE,EAAE,EAAE,EAAE,IAAA,YAAE,EAAC,WAAW,CAAC,EAAE;gBAC5B,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;aAC1B;YACD,SAAS,EAAE,CAAC,KAAK,CAAC;SACnB,CAAC,CAAA;QAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,6CAA6C,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;YAC1E,OAAM;QACR,CAAC;QAED,IAAI,eAAuB,CAAA;QAC3B,IAAI,eAAuB,CAAA;QAE3B,8BAA8B;QAC9B,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,SAAS,CAAC,OAAO,CAAC,CAAA;gBAE3C,uCAAuC;gBACvC,MAAM,gBAAgB,GAA2B,EAAE,CAAA;gBACnD,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;;oBAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAC9D,IAAI,QAAQ,EAAE,CAAC;wBACb,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAA,QAAQ,CAAC,KAAK,mCAAI,CAAC,CAAA;oBACvD,CAAC;gBACH,CAAC,CAAC,CAAA;gBAEF,MAAM,QAAQ,GAAG;oBACf,GAAG,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;wBAC1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;wBACpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;4BACxB,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,mCAAmC,CAAC,CAAA;wBACxE,CAAC;wBACD,OAAO,KAAK,CAAA;oBACd,CAAC;iBACF,CAAA;gBAED,MAAM,WAAW,GAAG,EAAE,SAAS,EAAE,sBAAgB,EAAE,QAAQ,EAAE,CAAA;gBAC7D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAe,EAAC,GAAG,EAAE,WAAW,CAAC,CAAA;gBAEtD,eAAe,GAAG,MAAM,CAAA;gBACxB,eAAe,GAAG,MAAM,CAAA;gBAExB,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,IAAI,yBAAyB,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC3G,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,SAAS,CAAC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAA;gBACpF,8BAA8B;gBAC9B,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;gBACjG,eAAe,GAAG,aAAa,CAAA;gBAC/B,eAAe,GAAG,aAAa,CAAA;gBAC/B,OAAO,CAAC,GAAG,CAAC,+CAA+C,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;YAC9E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,wBAAwB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;YACjG,eAAe,GAAG,aAAa,CAAA;YAC/B,eAAe,GAAG,aAAa,CAAA;YAC/B,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,CAAC,IAAI,yBAAyB,CAAC,CAAA;QAC/E,CAAC;QAED,gEAAgE;QAChE,IAAI,cAAc,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;YAC9C,KAAK,EAAE;gBACL,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE;gBACzB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;aAC1B;SACF,CAAC,CAAA;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,sBAAsB;YACtB,cAAc,CAAC,KAAK,GAAG,eAAe,CAAA;YACtC,cAAc,CAAC,KAAK,GAAG,eAAe,CAAA;YACtC,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,CAAA;YAC/C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,SAAS;YACT,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;gBACnC,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,CAAC;gBAC/B,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAChD,KAAK,EAAE,eAAe;gBACtB,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,IAAI;aACd,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,IAAI,WAAW,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC/H,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,UAAiB,EAAE,OAAc;QACvD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;QAE3C,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAU,EAAE;YAC1C,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;YAC/B,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;gBAChB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBACxB,OAAO,CAAC,CAAA;YACV,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAC,OAAA,CAAC,CAAC,EAAE,MAAK,MAAA,GAAG,CAAC,MAAM,0CAAE,EAAE,CAAA,CAAA,EAAA,CAAC,CAAA;YAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;gBACxB,OAAO,CAAC,CAAA;YACV,CAAC;YAED,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAC3C,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAA;YAC5B,OAAO,KAAK,CAAA;QACd,CAAC,CAAA;QAED,sBAAsB;QACtB,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAA;QAE9C,sBAAsB;QACtB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3F,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,WAAkB,EAAE,SAAgB;QACnE,IAAI,kBAAkB,GAAG,CAAC,CAAA;QAC1B,IAAI,kBAAkB,GAAG,CAAC,CAAA;QAC1B,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC/D,MAAM,MAAM,GAAG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,KAAI,CAAC,CAAA;YAEpC,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA,CAAC,iEAAiE;YAC5G,kBAAkB,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;YAC1C,WAAW,IAAI,MAAM,CAAA;QACvB,CAAC;QAED,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAA;QAC/C,CAAC;QAED,OAAO;YACL,aAAa,EAAE,kBAAkB,GAAG,WAAW;YAC/C,aAAa,EAAE,kBAAkB,GAAG,WAAW;SAChD,CAAA;IACH,CAAC;CACF,CAAA;AA//BY,wDAAsB;AAK3B;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAc,CAAC,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;IAE5G,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,yBAAmB,CAAC,CAAC,CAAA;IAC7C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6EAGP;AAMK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,wGAAwG,CAAC;IACnH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,oBAAc,CAAC,EAAE,EAAE,WAAW,EAAE,sDAAsD,EAAE,CAAC;IAE5G,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,yBAAmB,CAAC,CAAC,CAAA;IAC7C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;6EAGP;AA2DK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,uGAAuG,CAAC;IAClH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,4BAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;IAErH,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,+BAAa,CAAC,CAAA;IACxC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CADgD,+BAAa;;4EAqDpE;AAuJK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,sGAAsG,CAAC;IACjH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAEzF,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAChB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;iFA2BP;AAYK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,yGAAyG,CAAC;IACpH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;IAEpG,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAChB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mEAYP;AAgBK;IAJL,IAAA,wBAAS,EAAC,0GAA0G,CAAC;IACrH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAAE;QACnD,WAAW,EAAE,iFAAiF;KAC/F,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAChB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wEAIP;AAoBK;IALL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,wGAAwG,CAAC;IACnH,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,4BAA4B,EAAE;QACjD,WAAW,EAAE,gEAAgE;KAC9E,CAAC;IAEC,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAChB,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAClC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qEAUP;iCA3YU,sBAAsB;IADlC,IAAA,uBAAQ,EAAC,oBAAc,CAAC;GACZ,sBAAsB,CA+/BlC","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive, ObjectType, Field } from 'type-graphql'\nimport { getRepository, ScalarObject, EnvVar, Domain } from '@things-factory/shell'\nimport { runScenario } from '@things-factory/integration-base'\nimport { In } from 'typeorm'\nimport {\n KpiPeriodType,\n KpiMetric,\n KpiMetricValue,\n KpiMetricValuePatch,\n Kpi,\n KpiValue,\n parseFormula,\n evaluateFormula,\n builtinFunctions,\n KpiMetricValueProvider\n} from '@things-factory/kpi'\nimport { Attachment, NewAttachment, createAttachment } from '@things-factory/attachment-base'\nimport { Project, ProjectState } from '@dssp/project'\nimport moment from 'moment-timezone'\nimport FormData from 'form-data'\nimport fetch from 'node-fetch'\nimport https from 'https'\nimport http from 'http'\n\n/**\n * ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๊ฒฐ๊ณผ โ€” ์‹œ์Šคํ…œ๋ณ„ ํ•œ row.\n * UI \"์ž๋™ ์ˆ˜์ง‘\" ๋ฒ„ํŠผ์ด ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜ธ์ถœ ํ›„ ์‹œ์Šคํ…œ๋ณ„ ์„ฑ๊ณตยท์˜ค๋ฅ˜ ํ‘œ์‹œ์— ์‚ฌ์šฉ.\n */\n@ObjectType({ description: '์™ธ๋ถ€ ์‹œ์Šคํ…œ(์„ธ์›€ํ„ฐ/์˜ฌ๋ฐ”๋กœ/ํ‚ค์Šค์ฝ˜) ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜ธ์ถœ ๊ฒฐ๊ณผ' })\nclass ExternalDataCollectionResult {\n @Field({ description: '์†Œ์Šค ํ‚ค: saeumteo | allbaro | kiscon' })\n source!: string\n\n @Field({ description: 'ํ‘œ์‹œ ๋ผ๋ฒจ (์„ธ์›€ํ„ฐ/์˜ฌ๋ฐ”๋กœ/ํ‚ค์Šค์ฝ˜)' })\n label!: string\n\n @Field({ description: '์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ์„ฑ๊ณต ์—ฌ๋ถ€' })\n ok!: boolean\n\n @Field({ description: '์„ฑ๊ณต ์‹œ \"์™„๋ฃŒ\", ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€' })\n message!: string\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n '์‹œ๋‚˜๋ฆฌ์˜ค result ๊ฐ์ฒด โ€” projectKey: value ๋งต. ' +\n '์„ธ์›€ํ„ฐ={area, floorAreaRatio, upperFloorCount, lowerFloorCount, structureType, siteType}, ' +\n '์˜ฌ๋ฐ”๋กœ={totalConstructionWasteAmount}, ' +\n 'ํ‚ค์Šค์ฝ˜={constructionPeriod, constructionCost}. ' +\n 'siteType (๊ฑด์ถ•๋ฌผ ์šฉ๋„, ์˜ˆ APARTMENT_COMPLEX) / structureType (๊ตฌ์กฐํ˜•ํƒœ) ๋Š” ' +\n 'BuildingComplex ์˜ ์‹œ์„ค์œ ํ˜•/๊ตฌ์กฐ์œ ํ˜• ์†์„ฑ ํ›„๋ณด. KISCON ์˜ \"๊ณต์‚ฌ์œ ํ˜•(์‹ ์„ค/์ฆ์ถ•)\" ์€ ' +\n 'DSSP SiteType (์šฉ๋„๋ถ„๋ฅ˜) ์™€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด๋ผ ๋งคํ•‘ ๋Œ€์ƒ ์•„๋‹˜.'\n })\n data?: any\n}\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n /* ํ”„๋กœ์ ํŠธ ์ˆ˜ํ–‰๊ณผ์ • ์ค‘์— (์‹œ๊ฐ„, ๋น„์šฉ, ๋ฐœ์ƒ ๊ฑด์ˆ˜ ๋“ฑ) ๋ˆ„์ ๋œ ๊ฐ’์„ ๋ฐ˜์˜ํ•˜์—ฌ KPI Metric Value ๊ฐ’์„ ์ˆ˜์ • - ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ด ์„ค๊ณ„ ๋ณ€๊ฒฝ ๊ฑด์ˆ˜, ์ด ๊ฑด์„ค ํ๊ธฐ๋ฌผ ๋ฐœ์ƒ๋Ÿ‰, ๊ณต์‚ฌ๋น„, ๊ณต์‚ฌ๊ธฐ๊ฐ„, ์žฌํ•ด ๊ฑด์ˆ˜ ๋“ฑ */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"input\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple cumulative KpiMetricValues' value\" })\n async updateKpiMetricValuesCumulative(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n return await this.upsertKpiMetricValues(patches, context)\n }\n\n /* ์ „๋ฌธ ๊ฐ๋ฆฌ์‚ฌ์— ์˜ํ•ด์„œ ํ‰๊ฐ€๋œ ๋ณ„์ ์„ ๋ฐ˜์˜ํ•˜์—ฌ KPI Metric Value ๊ฐ’์„ ์ˆ˜์ • */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"assessment\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple assessment KpiMetricValues' value\" })\n async updateKpiMetricValuesAssessment(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n return await this.upsertKpiMetricValues(patches, context)\n }\n\n /**\n * KpiMetricValue ์˜ unique ์กฐํ•ฉ (domain, metric, valueDate, org) ๊ธฐ์ค€ ์ง„์งœ upsert.\n *\n * ๊ธฐ์กด mutation ์˜ `repo.save({...patch})` ๋Š” patch.id ๋งŒ ๋ณด๊ณ  update/insert ๊ฒฐ์ •ํ•ด\n * ๊ฐ™์€ metric ร— ๊ฐ™์€ valueDate ร— ๊ฐ™์€ org ์ธ๋ฐ patch.id ๊ฐ€ ์ƒˆ UUID ์ธ ๊ฒฝ์šฐ unique\n * ์ธ๋ฑ์Šค (ix_kpi_metric_value_latest) ์œ„๋ฐ˜ ์—๋Ÿฌ ๋˜๋Š” row ๋ˆ„์  ์œ„ํ—˜. ์ •ํ™•ํ•œ upsert\n * ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์กฐํ•ฉ lookup โ†’ ๊ธฐ์กด id ์‚ฌ์šฉ โ†’ save.\n *\n * ์›”๋ณ„ metric (periodType=MONTH, valueDate=YYYY-MM-01) ์˜ ๋‹จ์ผ row ์ •์ฑ…์„ ์ž์—ฐ ์ถฉ์กฑ.\n *\n * **๋„๋ฉ”์ธ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜**: caller (์šด์˜์ž) ๊ฐ€ system ๋„๋ฉ”์ธ์ผ ์ˆ˜ ์žˆ์–ด patch.org\n * (= projectId) ๋กœ ํ”„๋กœ์ ํŠธ ํ…Œ๋„ŒํŠธ ๋„๋ฉ”์ธ์„ lookup ํ•ด ๊ทธ ์ปจํ…์ŠคํŠธ๋กœ ์ €์žฅ. ๋ชจ๋“ \n * patch ๊ฐ€ ๊ฐ™์€ projectId ๋ผ ๊ฐ€์ • (ํ•œ ๋ฒˆ์˜ mutation = ํ•œ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ’๋“ค).\n */\n private async upsertKpiMetricValues(\n patches: KpiMetricValuePatch[],\n context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n if (patches.length === 0) return []\n // ์ฒซ patch.org ์˜ projectId ๋กœ ๋„๋ฉ”์ธ ์Šค์œ„์น˜. patch.org ๊ฐ€ ์—†์œผ๋ฉด caller context ๊ทธ๋Œ€๋กœ.\n const projectId = (patches[0] as any).org\n const ctx = projectId ? await this.switchToProjectDomain(projectId, context) : context\n const { domain, user, tx } = ctx.state\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n const results: KpiMetricValue[] = []\n for (const patch of patches) {\n const metric = await metricRepo.findOne({ where: { id: patch.metricId } })\n if (!metric) {\n throw new Error(`Metric not found: ${patch.metricId}`)\n }\n // unique ์กฐํ•ฉ ๊ธฐ์ค€ ๊ธฐ์กด row lookup. ์žˆ์œผ๋ฉด ๊ทธ id ๋กœ save โ†’ update.\n const existing = await metricValueRepo.findOne({\n where: {\n domain: { id: domain.id },\n metric: { id: patch.metricId },\n valueDate: patch.valueDate,\n org: patch.org\n } as any\n })\n const result = await metricValueRepo.save({\n domain,\n ...patch,\n id: existing?.id ?? patch.id,\n metric,\n updater: user\n } as any)\n results.push(result)\n }\n return results\n }\n\n /* ์ „๋ฌธ ๊ฐ๋ฆฌ์‚ฌ์— ์˜ ๊ฐ๋ฆฌ ์ตœ์ข… ํ‰๊ฐ€์„œ์˜ ๊ธ๋ถ€์ •์„ ํ…์ŠคํŠธ ๋ถ„์„ํ•˜๋Š” ๊ฐ์ • ๋ถ„์„ ๊ธฐ๋ฐ˜ ํ‰๊ฐ€๊ฐ’์„ ์ˆ˜์ • */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"sentiment\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Attachment, { nullable: true, description: \"To modify multiple sentiment KpiMetricValues' value\" })\n async updateKpiMetricValuesSentiment(\n @Arg('attachment', type => NewAttachment) attachment: NewAttachment,\n @Ctx() context: ResolverContext\n ): Promise<Attachment | null> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n const projectId = attachment.refBy\n const attachmentRepo = getRepository(Attachment, tx)\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n // 1. ๊ธฐ์กด ํŒŒ์ผ ์‚ญ์ œ\n projectRepo.update(projectId, { completeReport: null })\n await attachmentRepo.delete({ refBy: projectId, refType: attachment.refType })\n\n // 2. ์ƒˆ ํŒŒ์ผ ์—†์œผ๋ฉด ๋\n if (!attachment.file) {\n return null\n }\n\n // 3. ๋จผ์ € ํŒŒ์ผ์„ ๋ฒ„ํผ๋กœ ์ฝ๊ธฐ (์ŠคํŠธ๋ฆผ์€ ํ•œ ๋ฒˆ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ)\n const uploadedFile = await attachment.file\n const { filename } = uploadedFile\n const fileBuffer = await this.readFileToBuffer(uploadedFile)\n\n console.log(`Processing PDF file: ${filename}, size: ${fileBuffer.length} bytes`)\n\n // 4. ์ƒˆ ํŒŒ์ผ ์ €์žฅ (๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ attachment ์ƒ์„ฑ)\n const recreatedFile = this.createFileUploadFromBuffer(fileBuffer, filename, 'application/pdf')\n const { id: resultId } = await createAttachment(null, { attachment: { ...attachment, file: recreatedFile } }, context)\n const result = await attachmentRepo.findOne({ where: { id: resultId } })\n projectRepo.update(projectId, { completeReport: result })\n\n // 5. pdf ํŒŒ์ผ์„ operator-runner ์„œ๋น„์Šค์— ์—…๋กœ๋“œํ•˜์—ฌ ๋ถ„์„\n let safetyScore = 0\n let qualityScore = 0\n\n try {\n const operatorRunnerUrl = process.env.OPERATOR_RUNNER_URL || 'https://hatiolab-korea-uni.ettisoft.com'\n\n // sl-pa-safety ์„œ๋น„์Šค ํ˜ธ์ถœ\n safetyScore = await this.callOperatorRunnerServiceWithBuffer(operatorRunnerUrl, 'sl-pa-safety', fileBuffer, filename)\n\n // sl-pa-quality ์„œ๋น„์Šค ํ˜ธ์ถœ\n qualityScore = await this.callOperatorRunnerServiceWithBuffer(operatorRunnerUrl, 'sl-pa-quality', fileBuffer, filename)\n } catch (error) {\n console.error('Failed to analyze PDF with operator-runner:', error)\n }\n\n // 5. ๋ฉ”ํŠธ๋ฆญ ์ ์ˆ˜ ์ €์žฅ\n await this.saveMetricValue(metricValueRepo, metricRepo, projectId, 'SL-PA ์•ˆ์ „ ํ‰๊ฐ€', safetyScore, domain, user)\n await this.saveMetricValue(metricValueRepo, metricRepo, projectId, 'SL-PA ํ’ˆ์งˆ ํ‰๊ฐ€', qualityScore, domain, user)\n\n return result\n }\n\n /**\n * FileUpload ์ŠคํŠธ๋ฆผ์„ ๋ฒ„ํผ๋กœ ์ฝ๊ธฐ\n */\n private async readFileToBuffer(fileUpload: any): Promise<Buffer> {\n const { createReadStream } = fileUpload\n const chunks: Buffer[] = []\n\n return new Promise((resolve, reject) => {\n const stream = createReadStream()\n stream.on('data', (chunk: Buffer) => chunks.push(chunk))\n stream.on('end', () => resolve(Buffer.concat(chunks)))\n stream.on('error', (error: Error) => reject(error))\n })\n }\n\n /**\n * Buffer๋กœ๋ถ€ํ„ฐ FileUpload ๊ฐ์ฒด ์ƒ์„ฑ\n */\n private createFileUploadFromBuffer(buffer: Buffer, filename: string, mimetype: string): any {\n const { Readable } = require('stream')\n return {\n filename,\n mimetype,\n encoding: '7bit',\n createReadStream: () => {\n const readable = new Readable()\n readable.push(buffer)\n readable.push(null)\n return readable\n }\n }\n }\n\n /**\n * operator-runner ์„œ๋น„์Šค ํ˜ธ์ถœ (Buffer ์‚ฌ์šฉ)\n */\n private async callOperatorRunnerServiceWithBuffer(\n baseUrl: string,\n serviceName: string,\n fileBuffer: Buffer,\n filename: string\n ): Promise<number> {\n console.log(`Calling operator-runner service: ${serviceName}`)\n console.log(`Base URL: ${baseUrl}`)\n console.log(`Filename: ${filename}`)\n console.log(`Buffer size: ${fileBuffer.length} bytes`)\n\n const formData = new FormData()\n\n // Buffer๋ฅผ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ถ”๊ฐ€\n const { Readable } = require('stream')\n const bufferStream = Readable.from(fileBuffer)\n\n formData.append('files', bufferStream, {\n filename,\n contentType: 'application/pdf'\n })\n\n const url = `${baseUrl}/api/run/${serviceName}`\n console.log(`Request URL: ${url}`)\n\n // HTTP/HTTPS agent ์„ค์ •\n const isHttps = url.startsWith('https')\n const agent = isHttps\n ? new https.Agent({\n keepAlive: false,\n timeout: 120000,\n rejectUnauthorized: false\n })\n : new http.Agent({\n keepAlive: false,\n timeout: 120000\n })\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n body: formData as any,\n headers: {\n ...formData.getHeaders(),\n Authorization: `Basic ${Buffer.from('admin:admin1234').toString('base64')}`\n },\n agent,\n timeout: 120000\n })\n\n console.log(`Response status: ${response.status}`)\n\n if (!response.ok) {\n const errorText = await response.text()\n console.error(`Service ${serviceName} error response:`, errorText)\n throw new Error(`Service ${serviceName} failed (${response.status}): ${errorText}`)\n }\n\n const data = await response.json()\n console.log(`Service ${serviceName} response:`, JSON.stringify(data))\n\n const score = data?.result?.score || data?.score || 0\n console.log(`Extracted score: ${score}`)\n\n return score\n } catch (error) {\n console.error(`Error calling ${serviceName}:`, error)\n throw error\n }\n }\n\n /**\n * ๋ฉ”ํŠธ๋ฆญ ๊ฐ’ ์ €์žฅ\n */\n private async saveMetricValue(\n metricValueRepo: any,\n metricRepo: any,\n projectId: string,\n metricName: string,\n value: number,\n domain: any,\n user: any\n ): Promise<void> {\n const metricValue = await metricValueRepo.findOne({\n where: { org: projectId, metric: { name: metricName } }\n })\n\n if (metricValue) {\n await metricValueRepo.save({\n ...metricValue,\n value,\n updater: user\n })\n } else {\n const originMetric = await metricRepo.findOne({ where: { name: metricName } })\n if (originMetric) {\n await metricValueRepo.save({\n metric: { id: originMetric.id },\n unit: originMetric.unit || '',\n org: projectId,\n periodType: originMetric.periodType,\n valueDate: moment().tz('Asia/Seoul').format('YYYY-MM-DD'),\n value,\n domain,\n updater: user\n })\n }\n }\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"finalize\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To finalize project with KPI recalculation' })\n async finalizeProjectWithKpiRecalculation(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n\n const project = await projectRepo.findOne({ where: { id: projectId } })\n\n console.log('project :', project)\n\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n\n // KPI value ๊ณ„์‚ฐ์€ ํ”„๋กœ์ ํŠธ(ํ…Œ๋„ŒํŠธ) ๋„๋ฉ”์ธ ๊ธฐ์ค€์ด๋ผ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜.\n // ์™ธ๋ถ€ ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์€ ๋ณ„๋„ mutation (collectProjectExternalData) ๋กœ ๋ถ„๋ฆฌ โ€”\n // ์‚ฌ์šฉ์ž๊ฐ€ UI \"์ž๋™ ์ˆ˜์ง‘\" ๋ฒ„ํŠผ์œผ๋กœ ๋ช…์‹œ ์‹คํ–‰. finalize/recalculate ํ๋ฆ„์—์„œ๋Š”\n // ์™ธ๋ถ€ ์—ฐ๋™์„ ๋Œ์–ด๋“ค์ด์ง€ ์•Š์Œ (DB ์— ์ด๋ฏธ ์ €์žฅ๋œ KpiMetricValue ๋งŒ ๊ฐ€์ง€๊ณ  ๊ณ„์‚ฐ).\n const projectContext = await this.switchToProjectDomain(projectId, context)\n\n await this.recalculateProjectKpiValues(projectId, projectContext)\n\n projectRepo.save({\n ...project,\n state: ProjectState.COMPLETED\n })\n\n return true\n }\n\n /**\n * ์™„๊ณต ์ฒ˜๋ฆฌ ์—†์ด KPI ๋งŒ ์žฌ๊ณ„์‚ฐ โ€” ์ง„ํ–‰ ์ค‘ ํ”„๋กœ์ ํŠธ์˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ ์‚ฐ์ • ์šฉ๋„.\n * DB ์— ์ด๋ฏธ ์ €์žฅ๋œ KpiMetricValue ๋งŒ ๊ฐ€์ง€๊ณ  formula ํ‰๊ฐ€. ์™ธ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค (juso/\n * allbaro/kiscon) ์ž๋™ ์ˆ˜์ง‘์€ ์˜๋„์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ โ€” ์™ธ๋ถ€ ์ˆ˜์ง‘์€ ์‚ฌ์šฉ์ž๊ฐ€\n * \"์ž๋™ ์ˆ˜์ง‘\" ๋ฒ„ํŠผ (`collectProjectExternalData`) ์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ํ๋ฆ„.\n * ๊ถŒํ•œ์€ `kpi:recalculate` ๋กœ ๋ถ„๋ฆฌํ•ด finalize ๋ณด๋‹ค ๊ฐ€๋ณ๊ฒŒ ๋ถ€์—ฌ ๊ฐ€๋Šฅ.\n */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"recalculate\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Recalculate project KPI without finalizing (interim).' })\n async recalculateProjectKpi(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { tx } = context.state\n const project = await getRepository(Project, tx).findOne({ where: { id: projectId } })\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n\n const projectContext = await this.switchToProjectDomain(projectId, context)\n await this.recalculateProjectKpiValues(projectId, projectContext)\n\n return true\n }\n\n /**\n * UI \"์ž๋™ ์ˆ˜์ง‘\" ๋ฒ„ํŠผ ์ „์šฉ mutation. ์™ธ๋ถ€ ์‹œ์Šคํ…œ 3์ข… ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ˆœ์ฐจ ํ˜ธ์ถœํ•˜๊ณ \n * ์‹œ์Šคํ…œ๋ณ„ ์„ฑ๊ณต/์‹คํŒจ + ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜. UI ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์นด๋“œ๋ณ„ ์ƒํƒœ (์„ฑ๊ณตยท์˜ค๋ฅ˜) ๋ฅผ ํ‘œ์‹œ.\n *\n * ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋„๋ฉ”์ธ EnvVar (์ฃผ์†Œยท์ž๊ฒฉ์ฆ๋ช…ยท์„œ๋น„์Šคํ‚ค ๋“ฑ) ๋งŒ์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ X.\n * ํ•œ ์‹œ์Šคํ…œ ์‹คํŒจ๊ฐ€ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ์ˆ˜์ง‘์„ ๋ง‰์ง€ ์•Š๋„๋ก try/catch ๋กœ ๊ฒฉ๋ฆฌ.\n *\n * ์šด์˜ ํ˜„์‹ค: ํ‚ค์Šค์ฝ˜ยท์˜ฌ๋ฐ”๋กœ๋Š” ์‹œ๊ณต์‚ฌ ID/PW ๊ฐ€ ์ž์ฃผ ๋ฏธํ™•๋ณด โ†’ ์˜ค๋ฅ˜ ํ”ํ•จ. ์„ธ์›€ํ„ฐ๋Š” ๊ณต๊ณต\n * ๋ฐ์ดํ„ฐ ์„œ๋น„์Šคํ‚ค๋งŒ์œผ๋กœ ๋™์ž‘ ๊ฐ€๋Šฅ. UI ๋Š” ์‹œ์Šคํ…œ๋ณ„๋กœ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋…ธ์ถœ.\n */\n @Directive('@privilege(category: \"kpi\", privilege: \"auto-collect\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [ExternalDataCollectionResult], {\n description: 'Run external data collection scenarios per system, returning per-system result.'\n })\n async collectProjectExternalData(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<ExternalDataCollectionResult[]> {\n const projectContext = await this.switchToProjectDomain(projectId, context)\n return await this.runExternalDataScenariosWithResults(projectContext)\n }\n\n /**\n * ํ”„๋กœ์ ํŠธ ์ •๋ณด ์ˆ˜์ • ํ™”๋ฉด์˜ \"์ •๋ณด ์—ฐ๋™\" ๋ฒ„ํŠผ ์ „์šฉ โ€” ์„ธ์›€ํ„ฐ ๋‹จ์ผ ์‹œ๋‚˜๋ฆฌ์˜ค๋งŒ ํ˜ธ์ถœ.\n * BuildingComplex ๊ธฐ๋ณธ ์†์„ฑ (area / floorAreaRatio / siteType / structureType /\n * coverageRatio / householdCount ๋“ฑ) ์ž๋™ ์ฑ„์›€ ๋ชฉ์ .\n *\n * address ์ธ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰ ์ „์— EnvVar `Step::๊ฑด์ถ•๋ฌผ๊ด€๋ฆฌ๋Œ€์žฅ์กฐํšŒ::address::query`\n * ๋ฅผ ๊ทธ ๊ฐ’์œผ๋กœ upsert โ€” ์šด์˜์ž๊ฐ€ ํผ์—์„œ ๋ฐฉ๊ธˆ ์ž…๋ ฅํ•œ ์ฃผ์†Œ๋ฅผ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๊ณง๋ฐ”๋กœ ์‚ฌ์šฉ.\n * (๋„๋ฉ”์ธ์˜ ๊ธฐ์กด EnvVar ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด ๋ช…์‹œ์  ๊ฐฑ์‹ .)\n *\n * **๋„๋ฉ”์ธ ์Šค์œ„์น˜**: mutation ํ˜ธ์ถœ์€ system / ์šด์˜์ž ๋„๋ฉ”์ธ์—์„œ ์ผ์–ด๋‚˜์ง€๋งŒ ์‹œ๋‚˜๋ฆฌ์˜คยท\n * EnvVar ๋Š” **ํ”„๋กœ์ ํŠธ๊ฐ€ ์†ํ•œ ๋„๋ฉ”์ธ** ์— ์žˆ์–ด์•ผ ์ž์—ฐ. project.domain ์œผ๋กœ ์ปจํ…์ŠคํŠธ\n * ์Šค์œ„์น˜ ํ›„ ๊ทธ ๋„๋ฉ”์ธ์—์„œ EnvVar upsert + ์‹œ๋‚˜๋ฆฌ์˜ค ์‹คํ–‰.\n */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"basic-info\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => ExternalDataCollectionResult, {\n description: 'Run only ๊ฑด์ถ•๋ฌผ๊ด€๋ฆฌ๋Œ€์žฅ์กฐํšŒ scenario for project basic info collection.'\n })\n async collectProjectBasicInfo(\n @Arg('projectId') projectId: string,\n @Arg('address', { nullable: true }) address: string,\n @Ctx() context: ResolverContext\n ): Promise<ExternalDataCollectionResult> {\n const projectContext = await this.switchToProjectDomain(projectId, context)\n if (address && address.trim()) {\n await this.upsertEnvVar('Step::๊ฑด์ถ•๋ฌผ๊ด€๋ฆฌ๋Œ€์žฅ์กฐํšŒ::address::query', address.trim(), projectContext)\n }\n return await this.runSingleScenario(\n { source: 'saeumteo', label: '์„ธ์›€ํ„ฐ', name: '๊ฑด์ถ•๋ฌผ๊ด€๋ฆฌ๋Œ€์žฅ์กฐํšŒ' },\n projectContext\n )\n }\n\n /**\n * mutation ํ˜ธ์ถœ์ด system / ์šด์˜์ž ๋„๋ฉ”์ธ์—์„œ ์ผ์–ด๋‚˜๋„ ์‹œ๋‚˜๋ฆฌ์˜คยทEnvVar ๋Š” **ํ”„๋กœ์ ํŠธ\n * ํ…Œ๋„ŒํŠธ ๋„๋ฉ”์ธ** ์—์„œ ๋™์ž‘ํ•ด์•ผ ์ž์—ฐ. project.code ๋กœ ์ž์‹ (ํ…Œ๋„ŒํŠธ) ๋„๋ฉ”์ธ์„ ์ฐพ์•„\n * ์ปจํ…์ŠคํŠธ ์‚ฌ๋ณธ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜.\n *\n * ํ…Œ๋„ŒํŠธ ๋„๋ฉ”์ธ ๋งคํ•‘: Domain.subdomain = project.code AND Domain.extType = 'project'\n * (promoteProjectToTenant mutation ์ด ๊ทธ๋ ‡๊ฒŒ ์ƒ์„ฑ). project.domain ์ž์ฒด๋Š” ๋ถ€๋ชจ\n * ๋„๋ฉ”์ธ์ด๋ผ ์™ธ๋ถ€ ์—ฐ๋™ EnvVar ๊ฐ€ ๊ฑฐ๊ธฐ ์žˆ์„ ์ผ์ด ์—†์–ด ์‚ฌ์šฉ ๋ถ€์ ํ•ฉ.\n *\n * ํ…Œ๋„ŒํŠธ ๋„๋ฉ”์ธ์ด ์—†๊ฑฐ๋‚˜ (= ์•„์ง ์Šน๊ฒฉ ์•ˆ ๋จ) project.code ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ์›๋ณธ\n * ์ปจํ…์ŠคํŠธ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ (๋ฐฉ์–ด). project ์ž์ฒด๊ฐ€ ์—†์œผ๋ฉด throw.\n */\n private async switchToProjectDomain(\n projectId: string,\n context: ResolverContext\n ): Promise<ResolverContext> {\n const { tx } = context.state\n const project = await getRepository(Project, tx).findOne({ where: { id: projectId } })\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n if (!project.code) {\n console.warn(`[collect] project ${projectId} ๋Š” ์•„์ง ํ…Œ๋„ŒํŠธ ์Šน๊ฒฉ๋˜์ง€ ์•Š์Œ (no code) โ€” caller domain ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ`)\n return context\n }\n const tenantDomain = await getRepository(Domain, tx).findOne({\n where: { subdomain: project.code, extType: 'project' } as any\n })\n if (!tenantDomain) {\n console.warn(\n `[collect] project ${projectId} (code=${project.code}) ์˜ ํ…Œ๋„ŒํŠธ ๋„๋ฉ”์ธ์„ ์ฐพ์ง€ ๋ชปํ•จ โ€” caller domain ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ`\n )\n return context\n }\n return {\n ...context,\n state: { ...context.state, domain: tenantDomain }\n } as ResolverContext\n }\n\n /**\n * ์ปจํ…์ŠคํŠธ์˜ ๋„๋ฉ”์ธ์— EnvVar 1๊ฐœ upsert. ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋„๋ฉ”์ธ EnvVar ๋ฅผ ์šฐ์„  ์ฐธ์กฐํ•˜๋Š”\n * ์ •์ฑ…์ด๋ผ, ํผ์—์„œ ์ž…๋ ฅํ•œ ์ฃผ์†Œ๋ฅผ ์‹œ๋‚˜๋ฆฌ์˜ค ์ž…๋ ฅ์œผ๋กœ ํ˜๋ฆฌ๋Š” ๋‹ค๋ฆฌ ์—ญํ• .\n */\n private async upsertEnvVar(name: string, value: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const repo = getRepository(EnvVar, tx)\n const existing = await repo.findOne({ where: { domain: { id: domain.id }, name } as any })\n if (existing) {\n existing.value = value\n existing.active = true\n ;(existing as any).updater = user\n await repo.save(existing)\n } else {\n await repo.save(\n repo.create({\n name,\n value,\n active: true,\n domain,\n description: 'Project basic info ์ž๋™ ์—ฐ๋™์šฉ (project-update ์ •๋ณด์—ฐ๋™ ๋ฒ„ํŠผ)',\n creator: user,\n updater: user\n } as any)\n )\n }\n }\n\n /**\n * ๋‹จ์ผ ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜ธ์ถœ + result unwrap + ์‹คํŒจ ํŒ์ • โ€” collectProjectExternalData ์˜\n * loop ๋ณธ์ฒด์™€ ๊ฐ™์€ ๋กœ์ง์„ 1๊ฑด์งœ๋ฆฌ๋กœ ๋ถ„๋ฆฌ.\n */\n private async runSingleScenario(\n s: { source: string; label: string; name: string },\n context: ResolverContext\n ): Promise<ExternalDataCollectionResult> {\n const { domain } = context.state\n const instanceName = `collect-${s.name}-${Date.now()}`\n try {\n const runResult: any = await runScenario(instanceName, s.name, {}, context)\n if (!runResult) {\n console.warn(`[collect] '${s.name}' no result on domain '${domain.subdomain}'`)\n throw new Error('์—…๋ฐ์ดํŠธํ•  ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค')\n }\n if (runResult.state === 'HALTED') {\n console.warn(\n `[collect] '${s.name}' HALTED on domain '${domain.subdomain}': ${runResult.message || '(no message)'}`\n )\n throw new Error('์—…๋ฐ์ดํŠธํ•  ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค')\n }\n\n let data = runResult.result ?? runResult.data ?? {}\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const wrapKeys = Object.keys(data)\n if (\n wrapKeys.length === 1 &&\n data[wrapKeys[0]] &&\n typeof data[wrapKeys[0]] === 'object' &&\n !Array.isArray(data[wrapKeys[0]])\n ) {\n data = data[wrapKeys[0]]\n }\n }\n console.log(`[collect] '${s.name}' OK on '${domain.subdomain}' keys=${Object.keys(data || {}).join(',')}`)\n return { source: s.source, label: s.label, ok: true, message: '์™„๋ฃŒ', data }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n console.warn(`[collect] '${s.name}' failed on '${domain.subdomain}': ${msg}`)\n return { source: s.source, label: s.label, ok: false, message: msg }\n }\n }\n\n /**\n * ์™ธ๋ถ€ ์‹œ์Šคํ…œ 3์ข… ์‹œ๋‚˜๋ฆฌ์˜ค ์ˆœ์ฐจ ์‹คํ–‰ + ์‹œ์Šคํ…œ๋ณ„ ๊ฒฐ๊ณผ ์ˆ˜์ง‘.\n */\n private async runExternalDataScenariosWithResults(context: ResolverContext): Promise<ExternalDataCollectionResult[]> {\n const { domain } = context.state\n const SCENARIOS: Array<{ source: string; label: string; name: string }> = [\n { source: 'saeumteo', label: '์„ธ์›€ํ„ฐ', name: '๊ฑด์ถ•๋ฌผ๊ด€๋ฆฌ๋Œ€์žฅ์กฐํšŒ' },\n { source: 'allbaro', label: '์˜ฌ๋ฐ”๋กœ', name: '๊ฑด์„คํ๊ธฐ๋ฌผ์ •๋ณด์กฐํšŒ' },\n { source: 'kiscon', label: 'ํ‚ค์Šค์ฝ˜', name: '๊ฑด์„ค๊ณต์‚ฌ์ •๋ณด์กฐํšŒ' }\n ]\n\n const results: ExternalDataCollectionResult[] = []\n for (const s of SCENARIOS) {\n results.push(await this.runSingleScenario(s, context))\n }\n return results\n }\n\n /**\n * finalize ํ๋ฆ„์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค ํ˜ธ์ถœ. ๊ฒฐ๊ณผ ํ˜•ํƒœ ์—†์ด ์ง„ํ–‰๋งŒ โ€” finalize ์˜ KPI ์žฌ๊ณ„์‚ฐ์ด ๊ณง\n * ์ด์–ด์ง€๋ฏ€๋กœ ์‹œ์Šคํ…œ๋ณ„ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋Œ๋ ค์ค„ ํ•„์š” ์—†์Œ. ์‹คํŒจ๋Š” warning ๋งŒ.\n */\n private async runExternalDataScenarios(context: ResolverContext): Promise<void> {\n await this.runExternalDataScenariosWithResults(context)\n }\n\n /**\n * ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  KPI Value๋“ค์„ ๊ณ„์ธต์ ์œผ๋กœ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * 1. ๊ธฐ์กด KPI Value ์‚ญ์ œ (์ค‘๋ณต ๋ฐฉ์ง€)\n * 2. Leaf KPIs (์ž์‹์ด ์—†๋Š” KPI): formula ๊ธฐ๋ฐ˜ ๊ณ„์‚ฐ\n * 3. Parent KPIs (์ž์‹์ด ์žˆ๋Š” KPI): ์ž์‹ KPI scores์˜ weighted average ๊ณ„์‚ฐ\n */\n private async recalculateProjectKpiValues(projectId: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n const kpiRepo = getRepository(Kpi, tx)\n\n try {\n // 1. ๊ธฐ์กด KPI Value ์‚ญ์ œ (์žฌ๊ณ„์‚ฐ์œผ๋กœ ์ธํ•œ ์ค‘๋ณต ๋ฐฉ์ง€)\n const existingKpiValues = await kpiValueRepo.find({\n where: {\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (existingKpiValues.length > 0) {\n await kpiValueRepo.remove(existingKpiValues)\n console.log(`Deleted ${existingKpiValues.length} existing KPI values for project ${projectId}`)\n }\n\n // 2. ๋ชจ๋“  KPI๋“ค์„ ์กฐํšŒ (๊ณ„์ธต ๊ตฌ์กฐ ํฌํ•จ)\n const allKpis = await kpiRepo.find({\n relations: ['parent', 'children']\n })\n\n console.log(`Found ${allKpis.length} KPIs total for domain`)\n\n // 3. Leaf KPIs (์ž์‹์ด ์—†๋Š” KPI)์™€ Parent KPIs ๊ตฌ๋ถ„\n const leafKpis = allKpis.filter(kpi => kpi.isLeaf || !kpi.children || kpi.children.length === 0)\n const parentKpis = allKpis.filter(kpi => !kpi.isLeaf && kpi.children && kpi.children.length > 0)\n\n console.log(`Processing ${leafKpis.length} leaf KPIs and ${parentKpis.length} parent KPIs`)\n\n // 4. ๋จผ์ € Leaf KPIs๋ฅผ formula๋กœ ๊ณ„์‚ฐ\n for (const leafKpi of leafKpis) {\n try {\n await this.recalculateLeafKpiValue(leafKpi, projectId, context)\n console.log(`Successfully calculated leaf KPI: ${leafKpi.name}`)\n } catch (error) {\n console.error(`Failed to calculate leaf KPI ${leafKpi.name}:`, error.message)\n // ๊ฐœ๋ณ„ KPI ๊ณ„์‚ฐ ์‹คํŒจ๋Š” ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š์Œ\n }\n }\n\n // 5. Parent KPIs๋ฅผ ๊ณ„์ธต ๋ ˆ๋ฒจ์ˆœ์œผ๋กœ ์ •๋ ฌ (๊นŠ์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ)\n const sortedParentKpis = this.sortKpisByLevel(parentKpis, allKpis)\n\n // 6. Parent KPIs๋ฅผ weighted average๋กœ ๊ณ„์‚ฐ\n for (const parentKpi of sortedParentKpis) {\n try {\n await this.recalculateParentKpiValue(parentKpi, projectId, allKpis, context)\n console.log(`Successfully calculated parent KPI: ${parentKpi.name}`)\n } catch (error) {\n console.error(`Failed to calculate parent KPI ${parentKpi.name}:`, error.message)\n }\n }\n } catch (error) {\n console.error(`Error recalculating KPI values for project ${projectId}:`, error)\n throw error\n }\n }\n\n /**\n * ๊ฐœ๋ณ„ KPI Value๋ฅผ ์žฌ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์˜ KPI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n */\n private async recalculateKpiValue(kpiValue: KpiValue, context: ResolverContext): Promise<KpiValue> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n const kpiRepo = getRepository(Kpi, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n // ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์˜ KPI๋ฅผ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ\n // kpiValue.kpi๊ฐ€ ์ด๋ฏธ ๋กœ๋“œ๋˜์–ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜๊ณ , ์—†์œผ๋ฉด DB์—์„œ ์ตœ์‹  ๋ฒ„์ „ ์กฐํšŒ\n const kpi =\n kpiValue.kpi ||\n (await kpiRepo.findOne({\n where: { id: kpiValue.kpiId },\n order: { version: 'DESC' }\n }))\n if (!kpi) throw new Error('KPI ์ •๋ณด ์—†์Œ')\n if (!kpi.formula) {\n console.log(`KPI ${kpi.name} has no formula, skipping recalculation`)\n return kpiValue\n }\n\n const periodType = kpi.periodType || KpiPeriodType.DAY\n const valueDate = null // kpiValue.valueDate\n const org = kpiValue.group || 'unknown' // project ID๋ฅผ org๋กœ ์‚ฌ์šฉ\n\n // things-factory calculator ๊ธฐ๋ฐ˜ formula ๊ณ„์‚ฐ\n let kpiValueResult: number\n try {\n const ast = parseFormula(kpi.formula)\n const provider = new KpiMetricValueProvider({\n valueDate,\n org,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n kpiValueResult = await evaluateFormula(ast, evalContext)\n\n if (kpiValueResult == null || isNaN(kpiValueResult)) {\n throw new Error('KPI formula ๊ฒฐ๊ณผ๊ฐ’ ์—†์Œ')\n }\n } catch (error) {\n console.error(`Formula evaluation failed for KPI ${kpi.name}: ${kpi.formula}`, error)\n return kpiValue // ๊ณ„์‚ฐ ์‹คํŒจ์‹œ ๊ธฐ์กด ๊ฐ’ ์œ ์ง€\n }\n\n // KPI Value ์—…๋ฐ์ดํŠธ (์ตœ์‹  ๋ฒ„์ „์œผ๋กœ)\n kpiValue.value = kpiValueResult\n kpiValue.version = kpi.version || 1\n kpiValue.updater = user\n\n // ์„ฑ๊ณผ ์ ์ˆ˜ ์ž๋™ ๊ณ„์‚ฐ ๋ฐ ์ €์žฅ\n try {\n // 2D lookup KPI (X13 ๋“ฑ)์ธ ๊ฒฝ์šฐ project์˜ totalProgress ์กฐํšŒ\n let scoreContext: { progressRate?: number } | undefined\n const gradesData = kpi.grades as any\n if (gradesData && !Array.isArray(gradesData) && gradesData.type === 'PROGRESS_DEVIATION_LOOKUP') {\n const projectId = kpiValue.group || org\n const projectRepo = getRepository(Project, tx)\n const project = await projectRepo.findOne({ where: { id: projectId } })\n scoreContext = { progressRate: project?.totalProgress ?? 50 }\n console.log(`2D lookup KPI ${kpi.name}: progressRate=${scoreContext.progressRate}%`)\n }\n\n await this.calculateAndSaveScore(kpiValue, kpi, scoreContext)\n console.log(`Successfully calculated score for KPI value ${kpiValue.id}`)\n } catch (scoreError) {\n console.error(`Failed to calculate score for KPI value ${kpiValue.id}:`, scoreError.message)\n // ์„ฑ๊ณผ ์ ์ˆ˜ ๊ณ„์‚ฐ ์‹คํŒจ๋Š” KPI Value ์ €์žฅ์„ ๋ง‰์ง€ ์•Š์Œ\n }\n\n return await kpiValueRepo.save(kpiValue)\n }\n\n /**\n * scoreFormula๋ฅผ ์‚ฌ์šฉํ•œ ์„ฑ๊ณผ ์ ์ˆ˜ ๊ณ„์‚ฐ\n */\n private async calculateScoreFromFormula(kpi: Kpi, value: number): Promise<{ score: number; calculationMethod: string } | null> {\n if (!kpi.scoreFormula) {\n return null\n }\n\n try {\n const ast = parseFormula(kpi.scoreFormula)\n const provider = {\n get: async (name: string) => {\n if (name === 'value') return value\n return null\n }\n }\n const evalContext = { functions: builtinFunctions, provider }\n const result = await evaluateFormula(ast, evalContext)\n\n if (result !== null && result !== undefined && !isNaN(result)) {\n const performanceScore = Number(result)\n\n return {\n score: performanceScore,\n calculationMethod: 'formula'\n }\n }\n } catch (error) {\n console.error(`Score formula evaluation for '${kpi.name}: ${kpi.scoreFormula}' error:`, error)\n }\n\n return null\n }\n\n /**\n * KPI์˜ grades lookup table์„ ์ด์šฉํ•œ ์„ฑ๊ณผ ์ ์ˆ˜ ๋ณ€ํ™˜\n * 1D (๊ธฐ์กด ๋ฐฐ์—ด) ๋ฐ 2D (X13 ๊ณต์ •๋ฅ ร—ํŽธ์ฐจ) lookup ๋ชจ๋‘ ์ง€์›\n */\n private calculateScoreFromLookup(\n kpi: Kpi,\n value: number,\n context?: { progressRate?: number }\n ): { score: number; calculationMethod: string } | null {\n if (!kpi.grades) {\n return null\n }\n\n // 2D lookup table ์ฒ˜๋ฆฌ (X13: ๊ณต์ •๋ฅ  ร— ํŽธ์ฐจ โ†’ ์ ์ˆ˜)\n const grades = kpi.grades as any\n if (!Array.isArray(grades) && grades.type === 'PROGRESS_DEVIATION_LOOKUP') {\n return this.calculateScoreFrom2DLookup(value, grades, context?.progressRate)\n }\n\n // 1D lookup table ์ฒ˜๋ฆฌ (๊ธฐ์กด)\n if (!Array.isArray(grades) || grades.length === 0) {\n return null\n }\n\n const grade = grades.find((g: any) => value >= g.minValue && value <= g.maxValue)\n if (!grade) {\n return null\n }\n\n return {\n score: grade.score,\n calculationMethod: 'lookup'\n }\n }\n\n /**\n * 2D lookup table์—์„œ ์ ์ˆ˜ ๊ณ„์‚ฐ (X13: ๊ณต์ •๋ฅ  ร— ํŽธ์ฐจ โ†’ ์ ์ˆ˜ 1~5)\n */\n private calculateScoreFrom2DLookup(\n deviationValue: number,\n grades: any,\n progressRate?: number\n ): { score: number; calculationMethod: string } | null {\n if (!grades.rows || !Array.isArray(grades.rows)) return null\n\n const progress = progressRate ?? 50\n const progressIndex = Math.min(99, Math.max(0, Math.floor(progress)))\n const row = grades.rows.find((r: any) => r.progressRate === progressIndex)\n if (!row) return null\n\n let score: number\n if (deviationValue < row.boundary5to4) {\n score = 5\n } else if (deviationValue < row.boundary4to3) {\n score = 4\n } else if (deviationValue < row.boundary3to2) {\n score = 3\n } else if (deviationValue < row.boundary2to1) {\n score = 2\n } else {\n score = 1\n }\n\n return { score, calculationMethod: 'PROGRESS_DEVIATION_LOOKUP' }\n }\n\n /**\n * KpiValue์˜ ์„ฑ๊ณผ ์ ์ˆ˜ ๊ณ„์‚ฐ ๋ฐ ์ €์žฅ\n * @param context.progressRate X13 ๋“ฑ 2D lookup KPI์— ํ•„์š”ํ•œ ๊ณต์ •๋ฅ  (0~100)\n */\n private async calculateAndSaveScore(\n kpiValue: KpiValue,\n kpi: Kpi,\n context?: { progressRate?: number }\n ): Promise<void> {\n // 1. scoreFormula ์šฐ์„  ์‹œ๋„\n let scoreResult = await this.calculateScoreFromFormula(kpi, kpiValue.value)\n\n // 2. scoreFormula๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‹คํŒจํ•˜๋ฉด grades lookup table ์‚ฌ์šฉ\n if (!scoreResult) {\n scoreResult = this.calculateScoreFromLookup(kpi, kpiValue.value, context)\n }\n\n if (scoreResult) {\n // KpiValue์˜ score ํ•„๋“œ์— ์„ฑ๊ณผ ์ ์ˆ˜ ์ €์žฅ\n kpiValue.score = scoreResult.score\n console.log(`Calculated score ${scoreResult.score} for KPI ${kpi.name} with method ${scoreResult.calculationMethod}`)\n } else {\n console.log(`No score calculation method available for KPI ${kpi.name}`)\n }\n }\n\n /**\n * Leaf KPI Value๋ฅผ formula๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * ์ฐธ๊ณ : recalculateProjectKpiValues์—์„œ ํ˜ธ์ถœ ์‹œ ๊ธฐ์กด ๊ฐ’์ด ์ด๋ฏธ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์ƒˆ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.\n */\n private async recalculateLeafKpiValue(kpi: Kpi, projectId: string, context: ResolverContext): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n\n // ๊ธฐ์กด KPI Value ์กฐํšŒ ๋˜๋Š” ์ƒ์„ฑ (ํ”„๋กœ์ ํŠธ ์žฌ๊ณ„์‚ฐ ์‹œ์—๋Š” ์ด๋ฏธ ์‚ญ์ œ๋˜์–ด ํ•ญ์ƒ ์ƒˆ๋กœ ์ƒ์„ฑ๋จ)\n let kpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: kpi.id },\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (!kpiValue) {\n // ์ƒˆ KPI Value ์ƒ์„ฑ\n kpiValue = kpiValueRepo.create({\n kpi,\n version: kpi.version || 1,\n group: projectId,\n domain,\n valueDate: new Date().toISOString().slice(0, 10),\n value: 0,\n score: 0,\n updater: user\n })\n }\n\n // formula ๊ธฐ๋ฐ˜ ๊ณ„์‚ฐ\n await this.recalculateKpiValue(kpiValue, context)\n }\n\n /**\n * Parent KPI Value๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * 1. formula๊ฐ€ ์žˆ์œผ๋ฉด ์ž์‹ KPI ๊ฐ’๋“ค์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ formula ๊ณ„์‚ฐ\n * 2. formula๊ฐ€ ์—†์œผ๋ฉด ์ž์‹ KPI scores์˜ weighted average๋กœ ๊ณ„์‚ฐ\n * ์ฐธ๊ณ : recalculateProjectKpiValues์—์„œ ํ˜ธ์ถœ ์‹œ ๊ธฐ์กด ๊ฐ’์ด ์ด๋ฏธ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ์ƒˆ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.\n */\n private async recalculateParentKpiValue(\n parentKpi: Kpi,\n projectId: string,\n allKpis: Kpi[],\n context: ResolverContext\n ): Promise<void> {\n const { domain, user, tx } = context.state\n const kpiValueRepo = getRepository(KpiValue, tx)\n\n // ์ž์‹ KPIs ์กฐํšŒ\n const childKpis = allKpis.filter(kpi => kpi.parent?.id === parentKpi.id)\n\n if (childKpis.length === 0) {\n console.log(`No child KPIs found for parent KPI: ${parentKpi.name}`)\n return\n }\n\n // ์ž์‹ KPI Values ์กฐํšŒ\n const childKpiIds = childKpis.map(kpi => kpi.id)\n const childKpiValues = await kpiValueRepo.find({\n where: {\n kpi: { id: In(childKpiIds) },\n group: projectId,\n domain: { id: domain.id }\n },\n relations: ['kpi']\n })\n\n if (childKpiValues.length === 0) {\n console.log(`No child KPI values found for parent KPI: ${parentKpi.name}`)\n return\n }\n\n let calculatedValue: number\n let calculatedScore: number\n\n // 1. formula๊ฐ€ ์žˆ์œผ๋ฉด formula๋กœ ๊ณ„์‚ฐ\n if (parentKpi.formula) {\n try {\n const ast = parseFormula(parentKpi.formula)\n\n // ์ž์‹ KPI ์ด๋ฆ„ -> score ๊ฐ’ ๋งคํ•‘์„ ์œ„ํ•œ provider\n const childKpiScoreMap: Record<string, number> = {}\n childKpiValues.forEach(kpiValue => {\n const childKpi = childKpis.find(k => k.id === kpiValue.kpi.id)\n if (childKpi) {\n childKpiScoreMap[childKpi.name] = kpiValue.score ?? 0\n }\n })\n\n const provider = {\n get: async (name: string) => {\n const value = childKpiScoreMap[name]\n if (value === undefined) {\n throw new Error(`Child KPI '${name}' not found in parent KPI formula`)\n }\n return value\n }\n }\n\n const evalContext = { functions: builtinFunctions, provider }\n const result = await evaluateFormula(ast, evalContext)\n\n calculatedValue = result\n calculatedScore = result\n\n console.log(`Calculated parent KPI ${parentKpi.name} using formula: value=${calculatedValue.toFixed(4)}`)\n } catch (error) {\n console.error(`Failed to evaluate formula for parent KPI ${parentKpi.name}:`, error)\n // formula ๊ณ„์‚ฐ ์‹คํŒจ ์‹œ ๊ฐ€์ค‘์น˜ ํ‰๊ท ์œผ๋กœ ๋Œ€์ฒด\n const { weightedValue, weightedScore } = this.calculateWeightedAverage(childKpiValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n console.log(`Fallback to weighted average for parent KPI ${parentKpi.name}`)\n }\n } else {\n // 2. formula๊ฐ€ ์—†์œผ๋ฉด ๊ฐ€์ค‘์น˜ ํ‰๊ท  ๊ณ„์‚ฐ\n const { weightedValue, weightedScore } = this.calculateWeightedAverage(childKpiValues, childKpis)\n calculatedValue = weightedValue\n calculatedScore = weightedScore\n console.log(`Calculated parent KPI ${parentKpi.name} using weighted average`)\n }\n\n // ๊ธฐ์กด Parent KPI Value ์กฐํšŒ ๋˜๋Š” ์ƒ์„ฑ (ํ”„๋กœ์ ํŠธ ์žฌ๊ณ„์‚ฐ ์‹œ์—๋Š” ์ด๋ฏธ ์‚ญ์ œ๋˜์–ด ํ•ญ์ƒ ์ƒˆ๋กœ ์ƒ์„ฑ๋จ)\n let parentKpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: parentKpi.id },\n group: projectId,\n domain: { id: domain.id }\n }\n })\n\n if (parentKpiValue) {\n // ๊ธฐ์กด ๊ฐ’ ์—…๋ฐ์ดํŠธ (์ตœ์‹  ๋ฒ„์ „์œผ๋กœ)\n parentKpiValue.value = calculatedValue\n parentKpiValue.score = calculatedScore\n parentKpiValue.version = parentKpi.version || 1\n parentKpiValue.updater = user\n } else {\n // ์ƒˆ ๊ฐ’ ์ƒ์„ฑ\n parentKpiValue = kpiValueRepo.create({\n kpi: parentKpi,\n group: projectId,\n version: parentKpi.version || 1,\n domain,\n valueDate: new Date().toISOString().slice(0, 10),\n value: calculatedValue,\n score: calculatedScore,\n updater: user\n })\n }\n\n await kpiValueRepo.save(parentKpiValue)\n console.log(`Updated parent KPI ${parentKpi.name}: value=${calculatedValue.toFixed(4)}, score=${calculatedScore.toFixed(4)}`)\n }\n\n /**\n * KPIs๋ฅผ ๊ณ„์ธต ๋ ˆ๋ฒจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค (๊นŠ์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ)\n */\n private sortKpisByLevel(parentKpis: Kpi[], allKpis: Kpi[]): Kpi[] {\n const kpiLevels = new Map<string, number>()\n\n const calculateLevel = (kpi: Kpi): number => {\n if (kpiLevels.has(kpi.id)) {\n return kpiLevels.get(kpi.id)!\n }\n\n if (!kpi.parent) {\n kpiLevels.set(kpi.id, 0)\n return 0\n }\n\n const parentKpi = allKpis.find(k => k.id === kpi.parent?.id)\n if (!parentKpi) {\n kpiLevels.set(kpi.id, 1)\n return 1\n }\n\n const level = calculateLevel(parentKpi) + 1\n kpiLevels.set(kpi.id, level)\n return level\n }\n\n // ๊ฐ parent KPI์˜ ๋ ˆ๋ฒจ ๊ณ„์‚ฐ\n parentKpis.forEach(kpi => calculateLevel(kpi))\n\n // ๋ ˆ๋ฒจ ์ˆœ์œผ๋กœ ์ •๋ ฌ (๊นŠ์€ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ)\n return parentKpis.sort((a, b) => (kpiLevels.get(b.id) || 0) - (kpiLevels.get(a.id) || 0))\n }\n\n /**\n * ์ž์‹ KPI values์˜ weighted average๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n */\n private calculateWeightedAverage(childValues: any[], childKpis: Kpi[]): { weightedValue: number; weightedScore: number } {\n let totalWeightedValue = 0\n let totalWeightedScore = 0\n let totalWeight = 0\n\n for (const value of childValues) {\n const childKpi = childKpis.find(kpi => kpi.id === value.kpi.id)\n const weight = childKpi?.weight || 1\n\n totalWeightedValue += value.score * weight /* value.score ๊ฐ€ value ์—ญํ• ์„ value.value ๊ฐ€ ์•„๋‹ˆ๋ผ value.score ๊ฐ€ ๋งž๋‹ค. */\n totalWeightedScore += value.score * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return { weightedValue: 0, weightedScore: 0 }\n }\n\n return {\n weightedValue: totalWeightedValue / totalWeight,\n weightedScore: totalWeightedScore / totalWeight\n }\n }\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { ListParam } from '@things-factory/shell';
2
+ import { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi';
3
+ import { Project } from '@dssp/project';
4
+ export declare class KpiMetricValueQuery {
5
+ kpiMetricValues(params: ListParam, context: ResolverContext): Promise<KpiMetricValueList>;
6
+ project(kpiMetricValue: KpiMetricValue): Promise<Project | null>;
7
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KpiMetricValueQuery = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const kpi_1 = require("@things-factory/kpi");
8
+ const domain_inheritance_js_1 = require("@things-factory/kpi/dist-server/service/utils/domain-inheritance.js");
9
+ const project_1 = require("@dssp/project");
10
+ let KpiMetricValueQuery = class KpiMetricValueQuery {
11
+ async kpiMetricValues(params, context) {
12
+ const { domain } = context.state;
13
+ // multi-level ๋ถ€๋ชจ ๋„๋ฉ”์ธ๊นŒ์ง€ ํฌํ•จ. things-factory ์˜ KpiMetricValueQuery ์™€ ๋™์ผ ํŒจํ„ด.
14
+ // SYSTEM โ†’ ํ”„๋กœ์ ํŠธ ํ…Œ๋„ŒํŠธ ๊ณ„์ธต์—์„œ ์ •์˜๊ฐ€ ๋ถ€๋ชจ์— ์žˆ๊ณ  ๊ฐ’์ด ์ž์‹์— ์žˆ์–ด๋„ ํ•ฉ์ณ ๋ณด์ž„.
15
+ const domainIds = await (0, domain_inheritance_js_1.getDomainIdsWithAncestors)(domain);
16
+ const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({
17
+ domain: undefined, // ๋„๋ฉ”์ธ ํ•„ํ„ฐ๋Š” ์•„๋ž˜์—์„œ IN ์ ˆ๋กœ ์ง์ ‘ ์ถ”๊ฐ€
18
+ params,
19
+ repository: await (0, shell_1.getRepository)(kpi_1.KpiMetricValue),
20
+ searchables: ['metricId', 'group', 'valueDate', 'org']
21
+ });
22
+ queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {
23
+ ancestorDomainIds: domainIds
24
+ });
25
+ const [items, total] = await queryBuilder.getManyAndCount();
26
+ return { items, total };
27
+ }
28
+ async project(kpiMetricValue) {
29
+ if (!kpiMetricValue.org)
30
+ return null;
31
+ try {
32
+ return await (0, shell_1.getRepository)(project_1.Project).findOneBy({ id: kpiMetricValue.org });
33
+ }
34
+ catch (_a) {
35
+ return null;
36
+ }
37
+ }
38
+ };
39
+ exports.KpiMetricValueQuery = KpiMetricValueQuery;
40
+ tslib_1.__decorate([
41
+ (0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "read", domainOwnerGranted: true, superUserGranted: true)'),
42
+ (0, type_graphql_1.Query)(returns => kpi_1.KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues' }),
43
+ tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
44
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
45
+ tslib_1.__metadata("design:type", Function),
46
+ tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
47
+ tslib_1.__metadata("design:returntype", Promise)
48
+ ], KpiMetricValueQuery.prototype, "kpiMetricValues", null);
49
+ tslib_1.__decorate([
50
+ (0, type_graphql_1.FieldResolver)(type => project_1.Project, { nullable: true }),
51
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
52
+ tslib_1.__metadata("design:type", Function),
53
+ tslib_1.__metadata("design:paramtypes", [kpi_1.KpiMetricValue]),
54
+ tslib_1.__metadata("design:returntype", Promise)
55
+ ], KpiMetricValueQuery.prototype, "project", null);
56
+ exports.KpiMetricValueQuery = KpiMetricValueQuery = tslib_1.__decorate([
57
+ (0, type_graphql_1.Resolver)(kpi_1.KpiMetricValue)
58
+ ], KpiMetricValueQuery);
59
+ //# sourceMappingURL=kpi-metric-value-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpi-metric-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAC9F,iDAAuG;AAEvG,6CAAwE;AACxE,+GAA+G;AAC/G,2CAAuC;AAGhC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGxB,AAAN,KAAK,CAAC,eAAe,CACM,MAAiB,EACnC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,yEAAyE;QACzE,sDAAsD;QACtD,MAAM,SAAS,GAAG,MAAM,IAAA,iDAAyB,EAAC,MAAM,CAAC,CAAA;QAEzD,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM,EAAE,SAAS,EAAE,2BAA2B;YAC9C,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,oBAAc,CAAC;YAC/C,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC;SACvD,CAAC,CAAA;QAEF,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC,KAAK,oCAAoC,EAAE;YAC/E,iBAAiB,EAAE,SAAS;SAC7B,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,cAA8B;QAClD,IAAI,CAAC,cAAc,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,GAAG,EAAE,CAAC,CAAA;QAC3E,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;CACF,CAAA;AArCY,kDAAmB;AAGxB;IAFL,IAAA,wBAAS,EAAC,kGAAkG,CAAC;IAC7G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,wBAAkB,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;IAExF,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IACvB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD2B,iBAAS;;0DAsB3C;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACpC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAiB,oBAAc;;kDAOnD;8BApCU,mBAAmB;IAD/B,IAAA,uBAAQ,EAAC,oBAAc,CAAC;GACZ,mBAAmB,CAqC/B","sourcesContent":["import { Directive, Resolver, Query, Args, Arg, Ctx, FieldResolver, Root } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { KpiMetricValue, KpiMetricValueList } from '@things-factory/kpi'\nimport { getDomainIdsWithAncestors } from '@things-factory/kpi/dist-server/service/utils/domain-inheritance.js'\nimport { Project } from '@dssp/project'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"read\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiMetricValueList, { description: 'To fetch multiple KpiMetricValues' })\n async kpiMetricValues(\n @Args(type => ListParam) params: ListParam,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValueList> {\n const { domain } = context.state\n // multi-level ๋ถ€๋ชจ ๋„๋ฉ”์ธ๊นŒ์ง€ ํฌํ•จ. things-factory ์˜ KpiMetricValueQuery ์™€ ๋™์ผ ํŒจํ„ด.\n // SYSTEM โ†’ ํ”„๋กœ์ ํŠธ ํ…Œ๋„ŒํŠธ ๊ณ„์ธต์—์„œ ์ •์˜๊ฐ€ ๋ถ€๋ชจ์— ์žˆ๊ณ  ๊ฐ’์ด ์ž์‹์— ์žˆ์–ด๋„ ํ•ฉ์ณ ๋ณด์ž„.\n const domainIds = await getDomainIdsWithAncestors(domain)\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain: undefined, // ๋„๋ฉ”์ธ ํ•„ํ„ฐ๋Š” ์•„๋ž˜์—์„œ IN ์ ˆ๋กœ ์ง์ ‘ ์ถ”๊ฐ€\n params,\n repository: await getRepository(KpiMetricValue),\n searchables: ['metricId', 'group', 'valueDate', 'org']\n })\n\n queryBuilder.andWhere(`${queryBuilder.alias}.domain IN (:...ancestorDomainIds)`, {\n ancestorDomainIds: domainIds\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Project, { nullable: true })\n async project(@Root() kpiMetricValue: KpiMetricValue): Promise<Project | null> {\n if (!kpiMetricValue.org) return null\n try {\n return await getRepository(Project).findOneBy({ id: kpiMetricValue.org })\n } catch {\n return null\n }\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { KpiStatQuery } from './kpi-stat-query';
2
+ export declare const entities: any[];
3
+ export declare const resolvers: (typeof KpiStatQuery)[];
4
+ export declare const subscribers: any[];
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.subscribers = exports.resolvers = exports.entities = void 0;
4
+ const kpi_stat_query_1 = require("./kpi-stat-query");
5
+ exports.entities = [];
6
+ exports.resolvers = [kpi_stat_query_1.KpiStatQuery];
7
+ exports.subscribers = [];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/index.ts"],"names":[],"mappings":";;;AAAA,qDAA+C;AAElC,QAAA,QAAQ,GAAG,EAAE,CAAA;AACb,QAAA,SAAS,GAAG,CAAC,6BAAY,CAAC,CAAA;AAC1B,QAAA,WAAW,GAAG,EAAE,CAAA","sourcesContent":["import { KpiStatQuery } from './kpi-stat-query'\n\nexport const entities = []\nexport const resolvers = [KpiStatQuery]\nexport const subscribers = []\n"]}
@@ -0,0 +1,12 @@
1
+ import { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend, KpiProjectStat } from './kpi-stat-types';
2
+ export declare class KpiStatQuery {
3
+ totalKpiZValueComprehensiveStats(startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
4
+ totalKpiYValueComprehensiveStats(startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
5
+ kpiZValueComprehensiveStatsByGeoGroup(geoGroup?: string, kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
6
+ kpiYValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
7
+ kpiZValueMonthlyTrendByGeoGroup(kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiMonthlyTrend[]>;
8
+ kpiProjectStats(sectorType?: string, buildingUsage?: string, kpiNamePattern?: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiProjectStat[]>;
9
+ kpiZValueStatsBySigungu(kpiName?: string, startYearMonth?: string, endYearMonth?: string, sectorType?: string, buildingUsage?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
10
+ kpiYValueStatsByGeoGroup(geoGroup: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
11
+ kpiYValueStatsByMetroArea(metroArea: string, startYearMonth?: string, endYearMonth?: string, context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
12
+ }