@microsoft/windows-admin-center-sdk 4.123.0 → 4.232.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/angular/assets/strings/cs-CZ/strings.json +1 -1
  2. package/angular/assets/strings/de-DE/strings.json +1 -1
  3. package/angular/assets/strings/es-ES/strings.json +1 -1
  4. package/angular/assets/strings/fr-FR/strings.json +1 -1
  5. package/angular/assets/strings/hu-HU/strings.json +1 -1
  6. package/angular/assets/strings/id-ID/strings.json +1 -1
  7. package/angular/assets/strings/it-IT/strings.json +1 -1
  8. package/angular/assets/strings/ja-JP/strings.json +1 -1
  9. package/angular/assets/strings/ko-KR/strings.json +1 -1
  10. package/angular/assets/strings/nl-NL/strings.json +1 -1
  11. package/angular/assets/strings/pl-PL/strings.json +1 -1
  12. package/angular/assets/strings/pt-BR/strings.json +1 -1
  13. package/angular/assets/strings/pt-PT/strings.json +1 -1
  14. package/angular/assets/strings/ru-RU/strings.json +1 -1
  15. package/angular/assets/strings/strings.json +1 -1
  16. package/angular/assets/strings/sv-SE/strings.json +1 -1
  17. package/angular/assets/strings/tr-TR/strings.json +1 -1
  18. package/angular/assets/strings/zh-CN/strings.json +1 -1
  19. package/angular/assets/strings/zh-TW/strings.json +1 -1
  20. package/angular/esm2020/src/controls/accordion/accordion-panel/accordion-panel.component.mjs +36 -12
  21. package/angular/esm2020/src/controls/actions/containers/action-container.component.mjs +2 -3
  22. package/angular/esm2020/src/controls/alert-bar/alert-bar.component.mjs +2 -2
  23. package/angular/esm2020/src/controls/breadcrumb-header/breadcrumb-header.component.mjs +1 -1
  24. package/angular/esm2020/src/controls/common/base.component.mjs +1 -1
  25. package/angular/esm2020/src/controls/common/spacer-base.component.mjs +25 -1
  26. package/angular/esm2020/src/controls/context-menu/context-menu.component.mjs +2 -3
  27. package/angular/esm2020/src/controls/data-table/data-table.component.mjs +7 -7
  28. package/angular/esm2020/src/controls/dialog/base-dialog.component.mjs +2 -4
  29. package/angular/esm2020/src/controls/dialog/confirmation-list-dialog/confirmation-list-dialog.component.mjs +2 -2
  30. package/angular/esm2020/src/controls/dropdown/dropdown.component.mjs +1 -4
  31. package/angular/esm2020/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.mjs +59 -0
  32. package/angular/esm2020/src/controls/form/form-field/array/array-form-field.component.mjs +24 -35
  33. package/angular/esm2020/src/controls/form/form-field/clock/clock-form-field.component.mjs +10 -7
  34. package/angular/esm2020/src/controls/form/form-field/form-field-accessibility-manager-base.service.mjs +105 -0
  35. package/angular/esm2020/src/controls/form/form-field/form-field.component.mjs +1 -1
  36. package/angular/esm2020/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.mjs +38 -0
  37. package/angular/esm2020/src/controls/form/form-field/list/list-form-field.component.mjs +56 -38
  38. package/angular/esm2020/src/controls/form/form-field/number/number-form-field.component.mjs +22 -4
  39. package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.mjs +54 -0
  40. package/angular/esm2020/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.mjs +67 -67
  41. package/angular/esm2020/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.mjs +5 -5
  42. package/angular/esm2020/src/controls/form/forms.module.mjs +19 -2
  43. package/angular/esm2020/src/controls/icon/icon-text/icon-text.component.mjs +6 -6
  44. package/angular/esm2020/src/controls/icon/layered-icon/status/status-icon.component.mjs +1 -1
  45. package/angular/esm2020/src/controls/layout/editable-layout.component.mjs +2 -3
  46. package/angular/esm2020/src/controls/node-credentials-form/node-credentials-form.component.mjs +2 -2
  47. package/angular/esm2020/src/controls/page-alert-bar/page-alert-bar.component.mjs +4 -4
  48. package/angular/esm2020/src/controls/property-grid/property-grid.component.mjs +33 -13
  49. package/angular/esm2020/src/controls/schema/tabbed-form-loader.component.mjs +2 -2
  50. package/angular/esm2020/src/controls/settings/common-settings/common-settings.component.mjs +5 -5
  51. package/angular/esm2020/src/controls/settings/settings-form.directive.mjs +3 -7
  52. package/angular/esm2020/src/controls/settings/settings-form.service.mjs +2 -4
  53. package/angular/esm2020/src/controls/snap-in-extension/snap-in-extension.component.mjs +1 -1
  54. package/angular/esm2020/src/controls/split-view/split-view.component.mjs +2 -2
  55. package/angular/esm2020/src/controls/wizard/models/wizard-step-snap-in-output.mjs +1 -1
  56. package/angular/esm2020/src/controls/wizard-lite/wizard-navigation-button/wizard-navigation-button.component.mjs +3 -3
  57. package/angular/esm2020/src/data/extension-broker/snap-in-listener.mjs +80 -0
  58. package/angular/esm2020/src/data/index.mjs +2 -1
  59. package/angular/esm2020/src/directives/router/router-link.directive.mjs +2 -2
  60. package/angular/esm2020/src/directives/svg/svg.directive.mjs +2 -3
  61. package/angular/esm2020/src/generated/strings.mjs +1 -1
  62. package/angular/esm2020/src/service/navigation.service.mjs +3 -8
  63. package/angular/esm2020/src/service/user-alive.service.mjs +2 -4
  64. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs +665 -239
  65. package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
  66. package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs +636 -237
  67. package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
  68. package/angular/package.json +1 -1
  69. package/angular/src/controls/accordion/accordion-panel/accordion-panel.component.d.ts +13 -4
  70. package/angular/src/controls/common/spacer-base.component.d.ts +11 -2
  71. package/angular/src/controls/form/form-field/array/array-form-field-accessibility-manager.service.d.ts +38 -0
  72. package/angular/src/controls/form/form-field/array/array-form-field.component.d.ts +3 -1
  73. package/angular/src/controls/form/form-field/form-field-accessibility-manager-base.service.d.ts +37 -0
  74. package/angular/src/controls/form/form-field/list/list-form-field-accessibility-manager.service.d.ts +25 -0
  75. package/angular/src/controls/form/form-field/list/list-form-field.component.d.ts +12 -2
  76. package/angular/src/controls/form/form-field/number/number-form-field.component.d.ts +8 -0
  77. package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field-accessibility-manager.service.d.ts +37 -0
  78. package/angular/src/controls/form/form-field/ordered-list/ordered-list-form-field.component.d.ts +12 -8
  79. package/angular/src/controls/icon/icon-text/icon-text.component.d.ts +1 -1
  80. package/angular/src/controls/property-grid/property-grid.component.d.ts +2 -0
  81. package/angular/src/controls/wizard/models/wizard-step-snap-in-output.d.ts +1 -1
  82. package/{core → angular/src}/data/extension-broker/snap-in-listener.d.ts +49 -46
  83. package/angular/src/data/index.d.ts +1 -0
  84. package/angular/src/directives/svg/svg.directive.d.ts +1 -2
  85. package/angular/src/generated/strings.d.ts +12 -0
  86. package/core/async/cancellation.js +312 -0
  87. package/core/async/index.js +312 -0
  88. package/core/async/progress.js +312 -0
  89. package/core/azure/azure-constants.d.ts +2 -2
  90. package/core/azure/azure-constants.d.ts.map +1 -1
  91. package/core/azure/azure-constants.js +322 -3
  92. package/core/azure/azure-constants.js.map +1 -1
  93. package/core/azure/azure-logging.js +312 -0
  94. package/core/azure/azure-manager.js +312 -0
  95. package/core/azure/models/aadAppConfig-data.js +312 -0
  96. package/core/azure/models/azureArcStatusEnum.js +312 -0
  97. package/core/azure/models/azureTokenResult-data.js +312 -0
  98. package/core/azure/resources/deployment-operation-request-body.js +312 -0
  99. package/core/azure/resources/deployment-operation-response.js +312 -0
  100. package/core/azure/resources/location-data.js +315 -0
  101. package/core/azure/resources/resource-group-data.js +312 -0
  102. package/core/azure/resources/subscription-data.js +312 -0
  103. package/core/base/data-store/browser-storage-data-store.js +315 -0
  104. package/core/base/data-store/cached-data-store.js +312 -0
  105. package/core/base/data-store/data-store.js +312 -0
  106. package/core/base/data-store/local-data-store.js +312 -0
  107. package/core/base/data-store/memory-data-store.js +312 -0
  108. package/core/base/data-store/session-data-store.js +312 -0
  109. package/core/base/date/date-like.js +312 -0
  110. package/core/base/date/date-range.js +312 -0
  111. package/core/base/date/date-time.js +312 -0
  112. package/core/base/date/date-type.js +312 -0
  113. package/core/base/date/time-unit.js +312 -0
  114. package/core/base/decorators/base.js +312 -0
  115. package/core/base/decorators/debounce.decorators.js +312 -0
  116. package/core/base/decorators/delay.decorator.js +315 -0
  117. package/core/base/decorators/yield.decorator.js +312 -0
  118. package/core/base/environment.js +312 -0
  119. package/core/base/json.js +312 -0
  120. package/core/base/msft-sme.mock.js +316 -0
  121. package/core/base/polyfills/array.js +315 -0
  122. package/core/base/polyfills/string.js +312 -0
  123. package/core/base/rxjs-lifetime-manager.js +312 -0
  124. package/core/base/utilities.js +312 -0
  125. package/core/base/versioned-object.js +312 -0
  126. package/core/data/accessibility-manager.js +312 -0
  127. package/core/data/active-directory/active-directory.js +312 -0
  128. package/core/data/active-directory/models/account-info.js +312 -0
  129. package/core/data/active-directory/models/active-directory-search-options.js +312 -0
  130. package/core/data/active-directory/models/search-type.js +312 -0
  131. package/core/data/animation.js +312 -0
  132. package/core/data/app-context.js +312 -0
  133. package/core/data/asset-manager.js +315 -0
  134. package/core/data/base64-array-buffer.js +312 -0
  135. package/core/data/batch-connection.js +312 -0
  136. package/core/data/cim-connection.js +312 -0
  137. package/core/data/cim-stream.js +312 -0
  138. package/core/data/cim.js +312 -0
  139. package/core/data/column-picker.js +312 -0
  140. package/core/data/cookie.js +312 -0
  141. package/core/data/core-environment.js +315 -0
  142. package/core/data/crypto.js +312 -0
  143. package/core/data/deployment-share.js +312 -0
  144. package/core/data/disposable.js +312 -0
  145. package/core/data/electron.js +315 -0
  146. package/core/data/error-extended.js +312 -0
  147. package/core/data/extension-broker/dialog-listener.js +312 -0
  148. package/core/data/extension-broker/extension-broker.js +312 -0
  149. package/core/data/extension-broker/extension-listener.js +312 -0
  150. package/core/data/extension-broker/model/extension-broker-request-payload.js +312 -0
  151. package/core/data/extension-broker/model/extension-broker-response-error.js +312 -0
  152. package/core/data/extension-broker/model/extension-broker-response-payload.js +312 -0
  153. package/core/data/extension-broker/model/extension-entries.js +315 -0
  154. package/core/data/extension-broker/model/extension-instance.js +315 -0
  155. package/core/data/extension-broker/model/extension-rect.js +312 -0
  156. package/core/data/extension-broker/model/extension-search-options.js +312 -0
  157. package/core/data/extension-broker/service-listener.js +312 -0
  158. package/core/data/extension-broker/worker-listener.js +312 -0
  159. package/core/data/extension-broker/worker-set.js +312 -0
  160. package/core/data/file-transfer.js +312 -0
  161. package/core/data/gateway-connection.js +312 -0
  162. package/core/data/gateway-status.js +312 -0
  163. package/core/data/gateway-url-builder.js +312 -0
  164. package/core/data/gateway-url-translator.d.ts +1 -0
  165. package/core/data/gateway-url-translator.d.ts.map +1 -1
  166. package/core/data/gateway-url-translator.js +337 -6
  167. package/core/data/gateway-url-translator.js.map +1 -1
  168. package/core/data/gateway-urls.js +312 -0
  169. package/core/data/globalization.js +315 -0
  170. package/core/data/http-constants.js +315 -0
  171. package/core/data/http.js +312 -0
  172. package/core/data/jobs/jobs-manager.js +312 -0
  173. package/core/data/jobs/models/job-credentials.js +312 -0
  174. package/core/data/jobs/models/job-node.js +312 -0
  175. package/core/data/jobs/models/job-paginated-response.js +315 -0
  176. package/core/data/jobs/models/job-pagination-options.js +315 -0
  177. package/core/data/jobs/models/job.js +312 -0
  178. package/core/data/jobs/models/node-job.js +312 -0
  179. package/core/data/jobs/models/powershell-job.js +312 -0
  180. package/core/data/language.js +315 -0
  181. package/core/data/lifetime-data.js +312 -0
  182. package/core/data/localization-manager.js +312 -0
  183. package/core/data/native-q.js +312 -0
  184. package/core/data/net.d.ts.map +1 -1
  185. package/core/data/net.js +313 -1
  186. package/core/data/net.js.map +1 -1
  187. package/core/data/node-connection.d.ts.map +1 -1
  188. package/core/data/node-connection.js +312 -2
  189. package/core/data/node-connection.js.map +1 -1
  190. package/core/data/node-extension-install.js +312 -0
  191. package/core/data/powershell-alternate.js +312 -0
  192. package/core/data/powershell-batch.js +312 -0
  193. package/core/data/powershell-connection.js +312 -0
  194. package/core/data/powershell-crypto.js +312 -0
  195. package/core/data/powershell-stream.js +312 -0
  196. package/core/data/powershell.js +312 -0
  197. package/core/data/query-cache.js +312 -0
  198. package/core/data/resource-cache.js +312 -0
  199. package/core/data/schedule-reboot.js +312 -0
  200. package/core/data/settings-manager.js +312 -0
  201. package/core/data/settings-manger.mock.js +312 -0
  202. package/core/data/sme-extension.js +312 -0
  203. package/core/data/ssh-stream.js +312 -0
  204. package/core/data/units.js +312 -0
  205. package/core/data/uri-builder.js +315 -0
  206. package/core/data/wdac-operations.js +312 -0
  207. package/core/data/websocket-stream.js +312 -0
  208. package/core/diagnostics/error-monitor.js +312 -0
  209. package/core/diagnostics/log-level.js +312 -0
  210. package/core/diagnostics/log-record.js +312 -0
  211. package/core/diagnostics/logging-constants.js +312 -0
  212. package/core/diagnostics/logging.js +312 -0
  213. package/core/diagnostics/logging.mock.js +312 -0
  214. package/core/diagnostics/sme-web-telemetry-models.js +312 -0
  215. package/core/diagnostics/sme-web-telemetry.d.ts +1 -2
  216. package/core/diagnostics/sme-web-telemetry.d.ts.map +1 -1
  217. package/core/diagnostics/sme-web-telemetry.js +336 -15
  218. package/core/diagnostics/sme-web-telemetry.js.map +1 -1
  219. package/core/diagnostics/telemetry-control-type.js +312 -0
  220. package/core/diagnostics/telemetry-options.js +312 -0
  221. package/core/diagnostics/telemetry-record.js +312 -0
  222. package/core/dom/dom.js +312 -0
  223. package/core/frame/frame-connection.js +312 -0
  224. package/core/frame/frame-connection.mock.js +312 -0
  225. package/core/frame/shell-navigation-connection.js +312 -0
  226. package/core/generated/powershell-scripts.d.ts.map +1 -1
  227. package/core/generated/powershell-scripts.js +313 -1
  228. package/core/generated/powershell-scripts.js.map +1 -1
  229. package/core/generated/strings.js +312 -0
  230. package/core/host/host-core-manager.js +312 -0
  231. package/core/host/host-core-message-type.js +312 -0
  232. package/core/host/host-core-messages.js +312 -0
  233. package/core/index.d.ts +0 -1
  234. package/core/index.d.ts.map +1 -1
  235. package/core/index.js +312 -1
  236. package/core/index.js.map +1 -1
  237. package/core/manifest/environment-modules.js +312 -0
  238. package/core/manifest/manifest-loader.js +312 -0
  239. package/core/notification/client-notification-instance.js +312 -0
  240. package/core/notification/client-notification.js +312 -0
  241. package/core/notification/notification-connection.js +312 -0
  242. package/core/notification/notification-link-type.js +312 -0
  243. package/core/notification/notification-manager.js +312 -0
  244. package/core/notification/notification-message.js +312 -0
  245. package/core/notification/notification-state.js +312 -0
  246. package/core/notification/notification.js +312 -0
  247. package/core/notification/powershell-notification.js +312 -0
  248. package/core/notification/socket-signalr.js +312 -0
  249. package/core/notification/work-item-connection.js +312 -0
  250. package/core/notification/work-item-manager.js +312 -0
  251. package/core/notification/work-item-request.js +312 -0
  252. package/core/performance/performance-profile-data-type.js +312 -0
  253. package/core/performance/performance-profile-data.js +312 -0
  254. package/core/performance/performance-profile-database.js +312 -0
  255. package/core/performance/performance-profile-record.js +312 -0
  256. package/core/performance/performance-profile.d.ts.map +1 -1
  257. package/core/performance/performance-profile.js +321 -9
  258. package/core/performance/performance-profile.js.map +1 -1
  259. package/core/performance/performance-tracker.js +312 -0
  260. package/core/polyfills.js +312 -0
  261. package/core/resources/scripts/public/crypto/Get-DecryptedDataFromNode.ps1 +216 -0
  262. package/core/resources/scripts/public/crypto/Get-EncryptionJWKOnNode.ps1 +216 -0
  263. package/core/resources/scripts/public/inventory/Get-CimWin32LogicalDisk.ps1 +218 -0
  264. package/core/resources/scripts/public/inventory/Get-CimWin32NetworkAdapter.ps1 +216 -0
  265. package/core/resources/scripts/public/inventory/Get-CimWin32PhysicalMemory.ps1 +216 -0
  266. package/core/resources/scripts/public/inventory/Get-CimWin32Processor.ps1 +216 -0
  267. package/core/resources/scripts/public/inventory/Get-ClusterInventory.ps1 +216 -0
  268. package/core/resources/scripts/public/inventory/Get-ClusterNodes.ps1 +216 -0
  269. package/core/resources/scripts/public/inventory/Get-ServerInventory.ps1 +246 -8
  270. package/core/rpc/alive/rpc-alive-client.js +312 -0
  271. package/core/rpc/alive/rpc-alive-handler.js +312 -0
  272. package/core/rpc/alive/rpc-alive-model.js +315 -0
  273. package/core/rpc/alive/rpc-alive-subject-server.js +312 -0
  274. package/core/rpc/alive/rpc-observable-alive-client.js +312 -0
  275. package/core/rpc/alive/rpc-observable-alive-model.js +312 -0
  276. package/core/rpc/alive/rpc-observable-alive-server.js +312 -0
  277. package/core/rpc/azure/rpc-azure-model.js +312 -0
  278. package/core/rpc/azure/rpc-azure-request-client.js +312 -0
  279. package/core/rpc/azure/rpc-azure-request-handler.js +312 -0
  280. package/core/rpc/azure/rpc-azure-request-subject-server.js +312 -0
  281. package/core/rpc/azure/rpc-azure-response-client.js +312 -0
  282. package/core/rpc/azure/rpc-azure-response-handler.js +315 -0
  283. package/core/rpc/credssp/rpc-credssp-model.js +312 -0
  284. package/core/rpc/credssp/rpc-credssp-request-client.js +312 -0
  285. package/core/rpc/credssp/rpc-credssp-request-handler.js +315 -0
  286. package/core/rpc/credssp/rpc-credssp-request-subject-server.js +312 -0
  287. package/core/rpc/credssp/rpc-credssp-response-client.js +312 -0
  288. package/core/rpc/credssp/rpc-credssp-response-handler.js +315 -0
  289. package/core/rpc/dialog/rpc-dialog-client.js +312 -0
  290. package/core/rpc/dialog/rpc-dialog-handler.js +312 -0
  291. package/core/rpc/dialog/rpc-dialog-model.js +312 -0
  292. package/core/rpc/dialog/rpc-dialog-subject-server.js +315 -0
  293. package/core/rpc/electron/rpc-electron-model.js +312 -0
  294. package/core/rpc/electron/rpc-electron-request-client.js +312 -0
  295. package/core/rpc/electron/rpc-electron-request-handler.js +312 -0
  296. package/core/rpc/electron/rpc-electron-request-subject-server.js +312 -0
  297. package/core/rpc/electron/rpc-electron-response-client.js +312 -0
  298. package/core/rpc/electron/rpc-electron-response-handler.js +312 -0
  299. package/core/rpc/elevate/rpc-observable-elevate-client.js +312 -0
  300. package/core/rpc/elevate/rpc-observable-elevate-model.js +312 -0
  301. package/core/rpc/elevate/rpc-observable-elevate-server.js +312 -0
  302. package/core/rpc/error-monitor/rpc-observable-error-monitor-client.js +312 -0
  303. package/core/rpc/error-monitor/rpc-observable-error-monitor-model.js +315 -0
  304. package/core/rpc/error-monitor/rpc-observable-error-monitor-server.js +312 -0
  305. package/core/rpc/extension-broker/rpc-extension-broker-model.js +315 -0
  306. package/core/rpc/extension-broker/rpc-extension-broker-module-request-subject-server.js +315 -0
  307. package/core/rpc/extension-broker/rpc-extension-broker-request-client.js +312 -0
  308. package/core/rpc/extension-broker/rpc-extension-broker-request-handler.js +312 -0
  309. package/core/rpc/extension-broker/rpc-extension-broker-request-subject-server.js +312 -0
  310. package/core/rpc/extension-broker/rpc-extension-broker-response-client.js +312 -0
  311. package/core/rpc/extension-broker/rpc-extension-broker-response-handler.js +312 -0
  312. package/core/rpc/extension-data/rpc-observable-extension-data-client.js +312 -0
  313. package/core/rpc/extension-data/rpc-observable-extension-data-model.js +312 -0
  314. package/core/rpc/extension-data/rpc-observable-extension-data-server.js +312 -0
  315. package/core/rpc/forward/rpc-forward-auto-client.js +312 -0
  316. package/core/rpc/forward/rpc-forward-down-client.js +315 -0
  317. package/core/rpc/forward/rpc-forward-down-handler.js +312 -0
  318. package/core/rpc/forward/rpc-forward-model.js +312 -0
  319. package/core/rpc/forward/rpc-forward-up-client.js +312 -0
  320. package/core/rpc/forward/rpc-forward-up-handler.js +312 -0
  321. package/core/rpc/forward/rpc-forward-up-subject-server.js +312 -0
  322. package/core/rpc/log/rpc-log-client.js +312 -0
  323. package/core/rpc/log/rpc-log-handler.js +312 -0
  324. package/core/rpc/log/rpc-log-model.js +312 -0
  325. package/core/rpc/log/rpc-log-subject-server.js +312 -0
  326. package/core/rpc/notification/rpc-notification-client.js +312 -0
  327. package/core/rpc/notification/rpc-notification-handler.js +312 -0
  328. package/core/rpc/notification/rpc-notification-model.js +312 -0
  329. package/core/rpc/notification/rpc-notification-subject-server.js +312 -0
  330. package/core/rpc/overlay/rpc-overlay-close-client.js +312 -0
  331. package/core/rpc/overlay/rpc-overlay-close-handler.js +312 -0
  332. package/core/rpc/overlay/rpc-overlay-model.js +312 -0
  333. package/core/rpc/overlay/rpc-overlay-open-client.js +315 -0
  334. package/core/rpc/overlay/rpc-overlay-open-handler.js +312 -0
  335. package/core/rpc/overlay/rpc-overlay-open-subject-server.js +312 -0
  336. package/core/rpc/performance/rpc-observable-performance-client.js +312 -0
  337. package/core/rpc/performance/rpc-observable-performance-config-client.js +312 -0
  338. package/core/rpc/performance/rpc-observable-performance-config-server.js +312 -0
  339. package/core/rpc/performance/rpc-observable-performance-model.js +312 -0
  340. package/core/rpc/performance/rpc-observable-performance-server.js +312 -0
  341. package/core/rpc/report/rpc-report-client.js +312 -0
  342. package/core/rpc/report/rpc-report-handler.js +312 -0
  343. package/core/rpc/report/rpc-report-model.js +312 -0
  344. package/core/rpc/report/rpc-report-subject-server.js +315 -0
  345. package/core/rpc/rpc-base.js +312 -0
  346. package/core/rpc/rpc-channel.js +312 -0
  347. package/core/rpc/rpc-forwarder.js +312 -0
  348. package/core/rpc/rpc-inbound-client.js +312 -0
  349. package/core/rpc/rpc-inbound.js +312 -0
  350. package/core/rpc/rpc-manager.js +312 -0
  351. package/core/rpc/rpc-module-subject-server.js +315 -0
  352. package/core/rpc/rpc-observable-client.js +312 -0
  353. package/core/rpc/rpc-observable-request.js +312 -0
  354. package/core/rpc/rpc-observable-result.js +312 -0
  355. package/core/rpc/rpc-observable-server.js +312 -0
  356. package/core/rpc/rpc-outbound-client.js +312 -0
  357. package/core/rpc/rpc-outbound.js +312 -0
  358. package/core/rpc/rpc-subject-server.js +312 -0
  359. package/core/rpc/rpc.js +312 -0
  360. package/core/rpc/seek/rpc-seek-client.js +312 -0
  361. package/core/rpc/seek/rpc-seek-handler.js +315 -0
  362. package/core/rpc/seek/rpc-seek-model.js +312 -0
  363. package/core/rpc/settings/rpc-settings-client.js +315 -0
  364. package/core/rpc/settings/rpc-settings-handler.js +312 -0
  365. package/core/rpc/settings/rpc-settings-model.js +312 -0
  366. package/core/rpc/settings/rpc-settings-subject-server.js +312 -0
  367. package/core/rpc/shell-navigate/rpc-shell-navigate-client.js +312 -0
  368. package/core/rpc/shell-navigate/rpc-shell-navigate-handler.js +312 -0
  369. package/core/rpc/shell-navigate/rpc-shell-navigate-model.js +312 -0
  370. package/core/rpc/shell-navigate/rpc-shell-navigate-subject-server.js +312 -0
  371. package/core/rpc/sme-extension/rpc-sme-extension-model.js +315 -0
  372. package/core/rpc/sme-extension/rpc-sme-extension-request-client.js +312 -0
  373. package/core/rpc/sme-extension/rpc-sme-extension-request-handler.js +312 -0
  374. package/core/rpc/sme-extension/rpc-sme-extension-request-subject-server.js +312 -0
  375. package/core/rpc/sme-extension/rpc-sme-extension-response-client.js +312 -0
  376. package/core/rpc/sme-extension/rpc-sme-extension-response-handler.js +312 -0
  377. package/core/rpc/telemetry/rpc-telemetry-client.js +312 -0
  378. package/core/rpc/telemetry/rpc-telemetry-handler.js +315 -0
  379. package/core/rpc/telemetry/rpc-telemetry-model.js +312 -0
  380. package/core/rpc/telemetry/rpc-telemetry-subject-server.js +312 -0
  381. package/core/rpc/update-data/rpc-update-data-client.js +312 -0
  382. package/core/rpc/update-data/rpc-update-data-handler.js +312 -0
  383. package/core/rpc/update-data/rpc-update-data-model.js +312 -0
  384. package/core/rpc/update-data/rpc-update-data-subject-server.js +312 -0
  385. package/core/rpc/update-theme/rpc-observable-update-theme-client.js +312 -0
  386. package/core/rpc/update-theme/rpc-observable-update-theme-model.js +312 -0
  387. package/core/rpc/update-theme/rpc-observable-update-theme-server.js +312 -0
  388. package/core/rpc/work-item/rpc-work-item-client.js +312 -0
  389. package/core/rpc/work-item/rpc-work-item-handler.js +312 -0
  390. package/core/rpc/work-item/rpc-work-item-model.js +312 -0
  391. package/core/rpc/work-item/rpc-work-item-subject-server.js +312 -0
  392. package/core/rpc/work-item-find/rpc-work-item-find-client.js +312 -0
  393. package/core/rpc/work-item-find/rpc-work-item-find-handler.js +312 -0
  394. package/core/rpc/work-item-find/rpc-work-item-find-model.js +312 -0
  395. package/core/rpc/work-item-find/rpc-work-item-find-subject-server.js +312 -0
  396. package/core/security/active-connection.js +312 -0
  397. package/core/security/authorization-manager.js +312 -0
  398. package/core/security/connection-manager-settings/common-connection-settings.js +315 -0
  399. package/core/security/connection-manager-settings/connection-settings.js +312 -0
  400. package/core/security/connection-manager.js +312 -0
  401. package/core/security/connection-stream.js +312 -0
  402. package/core/security/connection.js +312 -0
  403. package/core/security/credssp-manager.js +312 -0
  404. package/core/security/sign-on-manager.js +312 -0
  405. package/core/security/tag-manager.js +312 -0
  406. package/core/security/tool-condition-validator.js +312 -0
  407. package/core/security/tool-connection-query.js +312 -0
  408. package/core/security/user-principal.js +312 -0
  409. package/core/shared/cluster-inventory/cluster-inventory-cache.js +312 -0
  410. package/core/shared/cluster-inventory/cluster-inventory.js +312 -0
  411. package/core/shared/cluster-inventory/cluster-node-inventory.js +312 -0
  412. package/core/shared/gateway-inventory/gateway-inventory-cache.js +312 -0
  413. package/core/shared/gateway-inventory/gateway-inventory-detail-cache.js +312 -0
  414. package/core/shared/gateway-inventory/gateway-inventory-detail.js +312 -0
  415. package/core/shared/gateway-inventory/gateway-inventory.js +312 -0
  416. package/core/shared/inventory-query-caches.js +312 -0
  417. package/core/shared/server-inventory/server-inventory-cache.js +312 -0
  418. package/core/shared/server-inventory/server-inventory-detail-cache.js +312 -0
  419. package/core/shared/server-inventory/server-inventory-detail.js +315 -0
  420. package/core/shared/server-inventory/server-inventory.js +312 -0
  421. package/core/shared/shared-cache.js +312 -0
  422. package/core/shared/tool-inventory/tool-inventory-cache.js +312 -0
  423. package/core/shared/tool-inventory/tool-inventory.js +312 -0
  424. package/core/special.js +315 -0
  425. package/core/test-utilities/accessibility-tester.js +312 -0
  426. package/core/test-utilities/console.mock.js +312 -0
  427. package/core/test-utilities/jasmine-axe-matcher.js +312 -0
  428. package/core/test-utilities/wait-async.js +312 -0
  429. package/core/test.js +312 -0
  430. package/core/testing.js +312 -0
  431. package/core/workflow/persistent-local-storage.js +312 -0
  432. package/core/workflow/persistent-work-item-apply-state.js +316 -0
  433. package/core/workflow/persistent-work-item-state.js +312 -0
  434. package/core/workflow/persistent-work-item.js +315 -0
  435. package/core/workflow/persistent-workflow-builder.js +312 -0
  436. package/core/workflow/persistent-workflow-context.js +312 -0
  437. package/core/workflow/persistent-workflow-runner.js +312 -0
  438. package/core/workflow/persistent-workflow-snapshot.js +312 -0
  439. package/core/workflow/persistent-workflow-store.js +312 -0
  440. package/core/workflow/persistent-workflow.js +312 -0
  441. package/package.json +11 -9
  442. package/styles/css/main-v2.css +1 -1
  443. package/styles/fonts/SegoeUI/Bold/SegoeUIBold-5.27.woff +0 -0
  444. package/styles/fonts/SegoeUI/Light/SegoeUILight-5.27.woff +0 -0
  445. package/styles/fonts/SegoeUI/Normal/SegoeUI-5.27.woff +0 -0
  446. package/styles/fonts/SegoeUI/SemiBold/SegoeUISemiBold-5.27.woff +0 -0
  447. package/styles/fonts/SegoeUI/SemiLight/SegoeUISemiLight-5.27.woff +0 -0
  448. package/styles/fonts/ServMDL2/ServMDL2-4.66.woff +0 -0
  449. package/tools/build/webpack/index-html.transform.js +312 -0
  450. package/tools/build/webpack/shell.index-html.transform.js +312 -0
  451. package/tools/build/webpack/shell.webpack.config.js +312 -0
  452. package/tools/build/webpack/webpack.config.js +312 -0
  453. package/tools/code-formatter/.eslintrc.base.json +3 -1
  454. package/tools/code-formatter/lint.d.ts.map +1 -1
  455. package/tools/code-formatter/lint.js +319 -1
  456. package/tools/code-formatter/lint.js.map +1 -1
  457. package/tools/code-formatter/utilities.d.ts +7 -0
  458. package/tools/code-formatter/utilities.d.ts.map +1 -0
  459. package/tools/code-formatter/utilities.js +395 -0
  460. package/tools/code-formatter/utilities.js.map +1 -0
  461. package/tools/gulp-doc-generator/index.js +312 -0
  462. package/tools/gulp-manifest-resource/index.js +312 -0
  463. package/tools/gulp-manifest-validator/index.js +312 -0
  464. package/tools/gulp-merge-json-in-folders/index.js +312 -0
  465. package/tools/gulp-merge-json-in-folders/json-merge.js +312 -0
  466. package/tools/gulp-ps-cim/index.js +315 -0
  467. package/tools/gulp-ps-code/index.d.ts.map +1 -1
  468. package/tools/gulp-ps-code/index.js +323 -2
  469. package/tools/gulp-ps-code/index.js.map +1 -1
  470. package/tools/gulp-ps-code/ps-code-convert.js +312 -0
  471. package/tools/gulp-ps-manifest/index.js +312 -0
  472. package/tools/gulp-ps-module/index.d.ts.map +1 -1
  473. package/tools/gulp-ps-module/index.js +327 -3
  474. package/tools/gulp-ps-module/index.js.map +1 -1
  475. package/tools/gulp-ps-resjson/index.js +315 -0
  476. package/tools/gulp-resjson/index.js +315 -0
  477. package/tools/gulp-resjson/resjson-convert.js +312 -0
  478. package/tools/gulp-schema-form/index.js +312 -0
  479. package/tools/gulp-svg-code/index.js +312 -0
  480. package/tools/gulp-svg-code/svg-code-convert.js +312 -0
  481. package/tools/gulp-update-notes-resource/index.d.ts.map +1 -1
  482. package/tools/gulp-update-notes-resource/index.js +316 -4
  483. package/tools/gulp-update-notes-resource/index.js.map +1 -1
  484. package/tools/module-template/.eslintrc.json +3 -0
  485. package/tools/module-template/build/increment-package-version.ps1 +216 -0
  486. package/tools/module-template/build/push-incremented-version.ps1 +216 -1
  487. package/tools/module-template/build/update-powershell-code.ps1 +216 -0
  488. package/tools/module-template/gulpfile.ts/common/clean.ts +2 -0
  489. package/tools/module-template/gulpfile.ts/common/pack.ts +17 -5
  490. package/tools/module-template/gulpfile.ts/common/powershell.ts +40 -2
  491. package/tools/module-template/gulpfile.ts/common/utilities.ts +1 -0
  492. package/tools/pack-nuget/index.d.ts.map +1 -1
  493. package/tools/pack-nuget/index.js +321 -3
  494. package/tools/pack-nuget/index.js.map +1 -1
  495. package/tools/scripts/Invoke-PesterTest.ps1 +216 -0
  496. package/tools/scripts/New-ExtensionPackage.ps1 +373 -6
  497. package/tools/scripts/Search-NonAsciiText.ps1 +216 -0
  498. package/tools/scripts/package-information/README.md +3 -0
  499. package/tools/scripts/package-information/ms-logo.png +0 -0
  500. package/tools/test-runner/index.js +312 -0
  501. package/tools/utilities/index.js +312 -0
  502. package/tools/wac-cli/src/angular15/configs/angular-json-config.js +312 -0
  503. package/tools/wac-cli/src/angular15/configs/ci-build-yml-config.js +315 -0
  504. package/tools/wac-cli/src/angular15/configs/config.js +312 -0
  505. package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts +9 -0
  506. package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts.map +1 -0
  507. package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js +328 -0
  508. package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js.map +1 -0
  509. package/tools/wac-cli/src/angular15/configs/git-ignore-config.js +312 -0
  510. package/tools/wac-cli/src/angular15/configs/jasmine-test-config.js +315 -0
  511. package/tools/wac-cli/src/angular15/configs/package-json-config.js +312 -0
  512. package/tools/wac-cli/src/angular15/configs/replace-config.js +315 -0
  513. package/tools/wac-cli/src/angular15/configs/tsconfig-config.js +312 -0
  514. package/tools/wac-cli/src/angular15/configs/ui-test-automation-lagacy-config.js +312 -0
  515. package/tools/wac-cli/src/angular15/main.d.ts +19 -3
  516. package/tools/wac-cli/src/angular15/main.d.ts.map +1 -1
  517. package/tools/wac-cli/src/angular15/main.js +353 -7
  518. package/tools/wac-cli/src/angular15/main.js.map +1 -1
  519. package/tools/wac-cli/src/angular15/upgrader/angular-json-upgrader.js +316 -0
  520. package/tools/wac-cli/src/angular15/upgrader/audit/ajax-response-updater.js +312 -0
  521. package/tools/wac-cli/src/angular15/upgrader/audit/css-syntax-error-updater.js +312 -0
  522. package/tools/wac-cli/src/angular15/upgrader/audit/declare-override-updater.js +312 -0
  523. package/tools/wac-cli/src/angular15/upgrader/audit/error-updater-angular15.js +312 -0
  524. package/tools/wac-cli/src/angular15/upgrader/audit/form-control-updater.js +312 -0
  525. package/tools/wac-cli/src/angular15/upgrader/audit/iif-updater-util.js +312 -0
  526. package/tools/wac-cli/src/angular15/upgrader/audit/load-children-callback-updater.js +315 -0
  527. package/tools/wac-cli/src/angular15/upgrader/audit/log-parser.js +312 -0
  528. package/tools/wac-cli/src/angular15/upgrader/audit/observable-throw-updater.js +312 -0
  529. package/tools/wac-cli/src/angular15/upgrader/audit/parameter-count-violation-updater.js +312 -0
  530. package/tools/wac-cli/src/angular15/upgrader/audit/string-replace-updater.js +312 -0
  531. package/tools/wac-cli/src/angular15/upgrader/audit/subjuct-next-updater-util.js +312 -0
  532. package/tools/wac-cli/src/angular15/upgrader/ci-build-yml-upgrader.js +312 -0
  533. package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts +18 -0
  534. package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts.map +1 -0
  535. package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js +361 -0
  536. package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js.map +1 -0
  537. package/tools/wac-cli/src/angular15/upgrader/file-replacement-upgrader.js +312 -0
  538. package/tools/wac-cli/src/angular15/upgrader/git-ignore-upgrader.js +312 -0
  539. package/tools/wac-cli/src/angular15/upgrader/jasmine-test-upgrader.js +312 -0
  540. package/tools/wac-cli/src/angular15/upgrader/package-json-upgrader.js +312 -0
  541. package/tools/wac-cli/src/angular15/upgrader/remove-upgrader.js +315 -0
  542. package/tools/wac-cli/src/angular15/upgrader/replace-upgrader.js +312 -0
  543. package/tools/wac-cli/src/angular15/upgrader/tsconfig-upgrader.js +312 -0
  544. package/tools/wac-cli/src/angular15/upgrader/ui-test-automation-legacy-upgrader.js +312 -0
  545. package/tools/wac-cli/src/angular15/upgrader/version-json-upgrader.js +312 -0
  546. package/tools/wac-cli/src/angular15/utils/add-item.js +312 -0
  547. package/tools/wac-cli/src/angular15/utils/command-runner.js +312 -0
  548. package/tools/wac-cli/src/angular15/utils/file-comparison.js +315 -0
  549. package/tools/wac-cli/src/angular15/utils/file-replacement.js +312 -0
  550. package/tools/wac-cli/src/angular15/utils/file-writer.js +312 -0
  551. package/tools/wac-cli/src/angular15/utils/logger.js +312 -0
  552. package/tools/wac-cli/src/angular15/utils/main-debugger.js +312 -0
  553. package/tools/wac-cli/src/angular15/utils/relative-path.js +312 -0
  554. package/tools/wac-cli/src/angular15/utils/remove-item.js +312 -0
  555. package/tools/wac-cli/src/angular15/utils/space-generator.js +312 -0
  556. package/tools/wac-cli/src/angular15/utils/update-shell-references.js +316 -0
  557. package/tools/wac-cli/src/common.js +312 -0
  558. package/tools/wac-cli/src/create/main.js +312 -0
  559. package/tools/wac-cli/src/eslint/main.js +312 -0
  560. package/tools/wac-cli/src/index.js +312 -0
  561. package/tools/wac-cli/src/upgrade/error-updater.js +312 -0
  562. package/tools/wac-cli/src/upgrade/error-updaters/component-selector-updater.js +315 -0
  563. package/tools/wac-cli/src/upgrade/error-updaters/only-arrow-functions-updater.js +315 -0
  564. package/tools/wac-cli/src/upgrade/error-updaters/updater-lookup.js +312 -0
  565. package/tools/wac-cli/src/upgrade/file-updater.js +312 -0
  566. package/tools/wac-cli/src/upgrade/get-files.js +312 -0
  567. package/tools/wac-cli/src/upgrade/main.js +312 -0
  568. package/tools/wac-cli/src/upgrade/models/error-result.js +312 -0
  569. package/tools/wac-cli/src/upgrade/models/updater-interface.js +312 -0
  570. package/tools/wac-cli/src/upgrade/package-updater.js +312 -0
  571. package/tools/wac-cli/templates/wac-template/src/favicon.ico +0 -0
  572. package/tools/wac-cli/templates/wac-template/src/karma.conf.js +312 -0
  573. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Error.ps1 +216 -0
  574. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Exception.ps1 +216 -0
  575. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Process.ps1 +216 -1
  576. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-Service.ps1 +216 -1
  577. package/tools/wac-cli/templates/wac-template/src/resources/scripts/Get-WinRmState.ps1 +216 -1
  578. package/core/data/extension-broker/snap-in-listener.d.ts.map +0 -1
  579. package/core/data/extension-broker/snap-in-listener.js +0 -73
  580. package/core/data/extension-broker/snap-in-listener.js.map +0 -1
  581. package/microsoft-windows-admin-center-sdk-4.123.0.tgz +0 -0
@@ -62,3 +62,315 @@ export var TelemetryEventStates;
62
62
  })(TelemetryEventStates || (TelemetryEventStates = {}));
63
63
 
64
64
  //# sourceMappingURL=sme-web-telemetry-models.js.map
65
+
66
+ // SIG // Begin signature block
67
+ // SIG // MIIn0AYJKoZIhvcNAQcCoIInwTCCJ70CAQExDzANBglg
68
+ // SIG // hkgBZQMEAgEFADB3BgorBgEEAYI3AgEEoGkwZzAyBgor
69
+ // SIG // BgEEAYI3AgEeMCQCAQEEEBDgyQbOONQRoqMAEEvTUJAC
70
+ // SIG // AQACAQACAQACAQACAQAwMTANBglghkgBZQMEAgEFAAQg
71
+ // SIG // g3RuvAGGGtDnIfYgWy0RvCAk1c+0Un+H3SThLo92D7ag
72
+ // SIG // gg2FMIIGAzCCA+ugAwIBAgITMwAAA64tNVHIU49VHQAA
73
+ // SIG // AAADrjANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJV
74
+ // SIG // UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
75
+ // SIG // UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
76
+ // SIG // cmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBT
77
+ // SIG // aWduaW5nIFBDQSAyMDExMB4XDTIzMTExNjE5MDg1OVoX
78
+ // SIG // DTI0MTExNDE5MDg1OVowdDELMAkGA1UEBhMCVVMxEzAR
79
+ // SIG // BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
80
+ // SIG // bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
81
+ // SIG // bjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
82
+ // SIG // MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
83
+ // SIG // 9CD8pjY3wxCoPmMhOkow7ycCltfqYnqk4wGNApzh2dTY
84
+ // SIG // +YqxozWTzJUOB38VxsgFQmXBFhOMdrGYGpvO9kdbNPkw
85
+ // SIG // HpTrW6hZqFuLLiRwGKEx4ZM5zVSqbHJuX2fPfUJ0Xmb+
86
+ // SIG // VrVsGw/BwBV2zz0rVtiSgqj3GeeGOsG7llfWyrSjyJqm
87
+ // SIG // 5DHE3o04BAI/NuhkHOv04euiqJGvHFCL8+fXvyD9OAxq
88
+ // SIG // 4fcJKtoyBb0PBA3oMNQeCsiUyLO+voZqVTOUsAWY0bN5
89
+ // SIG // YjkK4nq5DVaNdVrrowd5AX9gmz6D/TJTssns6pDCG00Y
90
+ // SIG // +Dh3ipWpnVmkhYcByyUSEKX3PLC8DkiAQQIDAQABo4IB
91
+ // SIG // gjCCAX4wHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYB
92
+ // SIG // BQUHAwMwHQYDVR0OBBYEFIcf73Spl4cHOFoll27H9COd
93
+ // SIG // 4fE/MFQGA1UdEQRNMEukSTBHMS0wKwYDVQQLEyRNaWNy
94
+ // SIG // b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
95
+ // SIG // FjAUBgNVBAUTDTIzMDAxMis1MDE4MzYwHwYDVR0jBBgw
96
+ // SIG // FoAUSG5k5VAF04KqFzc3IrVtqMp1ApUwVAYDVR0fBE0w
97
+ // SIG // SzBJoEegRYZDaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
98
+ // SIG // L3BraW9wcy9jcmwvTWljQ29kU2lnUENBMjAxMV8yMDEx
99
+ // SIG // LTA3LTA4LmNybDBhBggrBgEFBQcBAQRVMFMwUQYIKwYB
100
+ // SIG // BQUHMAKGRWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
101
+ // SIG // a2lvcHMvY2VydHMvTWljQ29kU2lnUENBMjAxMV8yMDEx
102
+ // SIG // LTA3LTA4LmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3
103
+ // SIG // DQEBCwUAA4ICAQBqyWA1Eu7PKNMjaaxl0V7gJ0XBysUo
104
+ // SIG // xZluMHJXFE2LEGZIZ2zMLYVjOnAGG/4dluRjSrZZo/8v
105
+ // SIG // wk4Xt8v6NBB9ofo8H1P/XidHytWTv9lg9MYu++6lPmu5
106
+ // SIG // fCozD3cI2NLZPW2BBhGX2D0R8tQBj0FbmZRuIucpiQ7D
107
+ // SIG // K3CHKlfKcc7MP8pPzuMv55Tox8+KFQD1NG6+bfbYA/BN
108
+ // SIG // PBkg4tyOh+exbaHfcNuodDJUIjq9dF6oa+Yjy0u0pUMI
109
+ // SIG // /B1t+8m6rJo0KSoZlrpesYl0jRhpt+hmqx8uENXoGJcY
110
+ // SIG // ZVJ5N2Skq90LViKNRhi9N4U+e8c4y9uXyomUF/6viCPJ
111
+ // SIG // 7huTNEJo75ehIJba+IWd3txUEc0R3y6DT6txC6cW1nR/
112
+ // SIG // LTbo9I/8fQq538G5IvJ+e5iSiOSVVkVk0i5m03Awy5E2
113
+ // SIG // ZSS4PVdQSCcFxmN4tpEfYuR7AAy/GJVtIDFlUpSgdXok
114
+ // SIG // pSui5hYtK1R9enXXvo+U/xGkLRc+qp4De3dZbzu7pOq7
115
+ // SIG // V/jCyhuCw0bEIAU4urCGIip7TI6GBRzD7yPzjFIqeZY7
116
+ // SIG // S4rVW5BRn2oEqpm8Su6yTIQvMIk8x2pwYNUa2339Z4gW
117
+ // SIG // 5xW21eFA5mLpo7NRSKRQms5OgAA18aCgqOU7Ds0h6q/Y
118
+ // SIG // B4BmEAtoTMl/TBiyKaMGAlEcdy+5FIhmzojMGjCCB3ow
119
+ // SIG // ggVioAMCAQICCmEOkNIAAAAAAAMwDQYJKoZIhvcNAQEL
120
+ // SIG // BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
121
+ // SIG // aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
122
+ // SIG // ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT
123
+ // SIG // KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhv
124
+ // SIG // cml0eSAyMDExMB4XDTExMDcwODIwNTkwOVoXDTI2MDcw
125
+ // SIG // ODIxMDkwOVowfjELMAkGA1UEBhMCVVMxEzARBgNVBAgT
126
+ // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
127
+ // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYG
128
+ // SIG // A1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0Eg
129
+ // SIG // MjAxMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
130
+ // SIG // ggIBAKvw+nIQHC6t2G6qghBNNLrytlghn0IbKmvpWlCq
131
+ // SIG // uAY4GgRJun/DDB7dN2vGEtgL8DjCmQawyDnVARQxQtOJ
132
+ // SIG // DXlkh36UYCRsr55JnOloXtLfm1OyCizDr9mpK656Ca/X
133
+ // SIG // llnKYBoF6WZ26DJSJhIv56sIUM+zRLdd2MQuA3WraPPL
134
+ // SIG // bfM6XKEW9Ea64DhkrG5kNXimoGMPLdNAk/jj3gcN1Vx5
135
+ // SIG // pUkp5w2+oBN3vpQ97/vjK1oQH01WKKJ6cuASOrdJXtjt
136
+ // SIG // 7UORg9l7snuGG9k+sYxd6IlPhBryoS9Z5JA7La4zWMW3
137
+ // SIG // Pv4y07MDPbGyr5I4ftKdgCz1TlaRITUlwzluZH9TupwP
138
+ // SIG // rRkjhMv0ugOGjfdf8NBSv4yUh7zAIXQlXxgotswnKDgl
139
+ // SIG // mDlKNs98sZKuHCOnqWbsYR9q4ShJnV+I4iVd0yFLPlLE
140
+ // SIG // tVc/JAPw0XpbL9Uj43BdD1FGd7P4AOG8rAKCX9vAFbO9
141
+ // SIG // G9RVS+c5oQ/pI0m8GLhEfEXkwcNyeuBy5yTfv0aZxe/C
142
+ // SIG // HFfbg43sTUkwp6uO3+xbn6/83bBm4sGXgXvt1u1L50kp
143
+ // SIG // pxMopqd9Z4DmimJ4X7IvhNdXnFy/dygo8e1twyiPLI9A
144
+ // SIG // N0/B4YVEicQJTMXUpUMvdJX3bvh4IFgsE11glZo+TzOE
145
+ // SIG // 2rCIF96eTvSWsLxGoGyY0uDWiIwLAgMBAAGjggHtMIIB
146
+ // SIG // 6TAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUSG5k
147
+ // SIG // 5VAF04KqFzc3IrVtqMp1ApUwGQYJKwYBBAGCNxQCBAwe
148
+ // SIG // CgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB
149
+ // SIG // /wQFMAMBAf8wHwYDVR0jBBgwFoAUci06AjGQQ7kUBU7h
150
+ // SIG // 6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov
151
+ // SIG // L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVj
152
+ // SIG // dHMvTWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNy
153
+ // SIG // bDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0
154
+ // SIG // dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMv
155
+ // SIG // TWljUm9vQ2VyQXV0MjAxMV8yMDExXzAzXzIyLmNydDCB
156
+ // SIG // nwYDVR0gBIGXMIGUMIGRBgkrBgEEAYI3LgMwgYMwPwYI
157
+ // SIG // KwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
158
+ // SIG // bS9wa2lvcHMvZG9jcy9wcmltYXJ5Y3BzLmh0bTBABggr
159
+ // SIG // BgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBwAG8AbABp
160
+ // SIG // AGMAeQBfAHMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkq
161
+ // SIG // hkiG9w0BAQsFAAOCAgEAZ/KGpZjgVHkaLtPYdGcimwuW
162
+ // SIG // EeFjkplCln3SeQyQwWVfLiw++MNy0W2D/r4/6ArKO79H
163
+ // SIG // qaPzadtjvyI1pZddZYSQfYtGUFXYDJJ80hpLHPM8QotS
164
+ // SIG // 0LD9a+M+By4pm+Y9G6XUtR13lDni6WTJRD14eiPzE32m
165
+ // SIG // kHSDjfTLJgJGKsKKELukqQUMm+1o+mgulaAqPyprWElj
166
+ // SIG // HwlpblqYluSD9MCP80Yr3vw70L01724lruWvJ+3Q3fMO
167
+ // SIG // r5kol5hNDj0L8giJ1h/DMhji8MUtzluetEk5CsYKwsat
168
+ // SIG // ruWy2dsViFFFWDgycScaf7H0J/jeLDogaZiyWYlobm+n
169
+ // SIG // t3TDQAUGpgEqKD6CPxNNZgvAs0314Y9/HG8VfUWnduVA
170
+ // SIG // KmWjw11SYobDHWM2l4bf2vP48hahmifhzaWX0O5dY0Hj
171
+ // SIG // Wwechz4GdwbRBrF1HxS+YWG18NzGGwS+30HHDiju3mUv
172
+ // SIG // 7Jf2oVyW2ADWoUa9WfOXpQlLSBCZgB/QACnFsZulP0V3
173
+ // SIG // HjXG0qKin3p6IvpIlR+r+0cjgPWe+L9rt0uX4ut1eBrs
174
+ // SIG // 6jeZeRhL/9azI2h15q/6/IvrC4DqaTuv/DDtBEyO3991
175
+ // SIG // bWORPdGdVk5Pv4BXIqF4ETIheu9BCrE/+6jMpF3BoYib
176
+ // SIG // V3FWTkhFwELJm3ZbCoBIa/15n8G9bW1qyVJzEw16UM0x
177
+ // SIG // ghmjMIIZnwIBATCBlTB+MQswCQYDVQQGEwJVUzETMBEG
178
+ // SIG // A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
179
+ // SIG // ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
180
+ // SIG // MSgwJgYDVQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5n
181
+ // SIG // IFBDQSAyMDExAhMzAAADri01UchTj1UdAAAAAAOuMA0G
182
+ // SIG // CWCGSAFlAwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgor
183
+ // SIG // BgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE
184
+ // SIG // AYI3AgEVMC8GCSqGSIb3DQEJBDEiBCDmkuhYmb0q9MfP
185
+ // SIG // QIUfdPv51STXCZLGRJUBpfTYl8Y03TBCBgorBgEEAYI3
186
+ // SIG // AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBmAHShGoAY
187
+ // SIG // aHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
188
+ // SIG // DQEBAQUABIIBADhywZZNUfW4kSq8lkRRayFXpPTYl9qW
189
+ // SIG // XuYACas03JrV+bkJFrf/kuZx8SLdg0myUje/CWVt7JSS
190
+ // SIG // /ZDI4cNgG8fiVpsEzpwvc/wzDXhCXhofgWGt6oN1Z0dA
191
+ // SIG // 7PZGSMZ/RJRLXHcFSPOCW93dZuQw6k2vCWSQVO6MGzTN
192
+ // SIG // xCHPpZDbRnrameHuMpeflEnpbgFBKC3/Z4LF+R9FyZLk
193
+ // SIG // LLyBXOD8QPOqqcy990koEvqJYdY8IwxcB1FtBrKAy8mN
194
+ // SIG // /JVi+s1J3Efh1AYGETphrxjPMlwAu+SwUFnRmwrFoiAW
195
+ // SIG // keAPdja056SB2s8/Wgl2NGJaIYBmtYBXs1XZgw+SE1oD
196
+ // SIG // juGhghctMIIXKQYKKwYBBAGCNwMDATGCFxkwghcVBgkq
197
+ // SIG // hkiG9w0BBwKgghcGMIIXAgIBAzEPMA0GCWCGSAFlAwQC
198
+ // SIG // AQUAMIIBWQYLKoZIhvcNAQkQAQSgggFIBIIBRDCCAUAC
199
+ // SIG // AQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQg
200
+ // SIG // AjzgAADz0Nq4s3C5YX6/0GhEpdq4egwmyAj/iA4gNTQC
201
+ // SIG // BmZywVbb9RgTMjAyNDA2MjcwNjI0NDIuNzY0WjAEgAIB
202
+ // SIG // 9KCB2KSB1TCB0jELMAkGA1UEBhMCVVMxEzARBgNVBAgT
203
+ // SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
204
+ // SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsG
205
+ // SIG // A1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9u
206
+ // SIG // cyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVT
207
+ // SIG // TjoyQUQ0LTRCOTItRkEwMTElMCMGA1UEAxMcTWljcm9z
208
+ // SIG // b2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEXwwggcnMIIF
209
+ // SIG // D6ADAgECAhMzAAAB3p5InpafKEQ9AAEAAAHeMA0GCSqG
210
+ // SIG // SIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
211
+ // SIG // EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
212
+ // SIG // HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk
213
+ // SIG // BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
214
+ // SIG // MDEwMB4XDTIzMTAxMjE5MDcxMloXDTI1MDExMDE5MDcx
215
+ // SIG // MlowgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
216
+ // SIG // aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
217
+ // SIG // ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsT
218
+ // SIG // JE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGlt
219
+ // SIG // aXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046MkFE
220
+ // SIG // NC00QjkyLUZBMDExJTAjBgNVBAMTHE1pY3Jvc29mdCBU
221
+ // SIG // aW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEB
222
+ // SIG // AQUAA4ICDwAwggIKAoICAQC0gfQchfVCA4QOsRazp4sP
223
+ // SIG // 8bA5fLEovazgjl0kjuFTEI5zRgKOVR8dIoozBDB/S2Nk
224
+ // SIG // lCAZFUEtDJepEfk2oJFD22hKcI4UNZqa4UYCU/45Up4n
225
+ // SIG // ONlQwKNHp+CSOsZ16AKFqCskmPP0TiCnaaYYCOziW+Fx
226
+ // SIG // 5NT97F9qTWd9iw2NZLXIStf4Vsj5W5WlwB0btBN8p78K
227
+ // SIG // 0vP23KKwDTug47srMkvc1Jq/sNx9wBL0oLNkXri49qZA
228
+ // SIG // XH1tVDwhbnS3eyD2dkQuKHUHBD52Ndo8qWD50usmQLNK
229
+ // SIG // S6atCkRVMgdcesejlO97LnYhzjdephNJeiy0/TphqNEv
230
+ // SIG // eAcYNzf92hOn1G51aHplXOxZBS7pvCpGXG0O3Dh0gFhi
231
+ // SIG // cXQr6OTrVLUXUqn/ORZJQlyCJIOLJu5zPU5LVFXztJKe
232
+ // SIG // pMe5srIA9EK8cev+aGqp8Dk1izcyvgQotRu51A9abXrl
233
+ // SIG // 70KfHxNSqU45xv9TiXnocCjTT4xrffFdAZqIGU3t0sQZ
234
+ // SIG // DnjkMiwPvuR8oPy+vKXvg62aGT1yWhlP4gYhZi/rpfzo
235
+ // SIG // t3fN8ywB5R0Jh/1RjQX0cD/osb6ocpPxHm8Ll1SWPq08
236
+ // SIG // n20X7ofZ9AGjIYTccYOrRismUuBABIg8axfZgGRMvHvK
237
+ // SIG // 3+nZSiF+Xd2kC6PXw3WtWUzsPlwHAL49vzdwy1RmZR5x
238
+ // SIG // 5QIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFGswJm8bHmmq
239
+ // SIG // YHccyvDrPp2j0BLIMB8GA1UdIwQYMBaAFJ+nFV0AXmJd
240
+ // SIG // g/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0
241
+ // SIG // dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js
242
+ // SIG // L01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAy
243
+ // SIG // MDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYB
244
+ // SIG // BQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
245
+ // SIG // a2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFt
246
+ // SIG // cCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQC
247
+ // SIG // MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0P
248
+ // SIG // AQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQDilMB7
249
+ // SIG // Fw2nBjr1CILORw4D7NC2dash0ugusHypS2g9+rWX21rd
250
+ // SIG // cfhjIms0rsvhrMYlR85ITFvhaivIK7i0Fjf7Dgl/nxlI
251
+ // SIG // E/S09tXESKXGY+P2RSL8LZAXLAs9VxFLF2DkiVD4rWOx
252
+ // SIG // PG25XZpoWGdvafl0KSHLBv6vmI5KgVvZsNK7tTH8TE0L
253
+ // SIG // PTEw4g9vIAFRqzwNzcpIkgob3aku1V/vy3BM/VG87aP8
254
+ // SIG // NvFgPBzgh6gU2w0R5oj+zCI/kkJiPVSGsmLCBkY73pZj
255
+ // SIG // WtDr21PQiUs/zXzBIH9jRzGVGFvCqlhIyIz3xyCsVpTT
256
+ // SIG // GIbln1kUh2QisiADQNGiS+LKB0Lc82djJzX42GPOdcB2
257
+ // SIG // IxoMFI/4ZS0YEDuUt9Gce/BqgSn8paduWjlif6j4Qvg1
258
+ // SIG // zNoF2oyF25fo6RnFQDcLRRbowiUXWW3h9UfkONRY4AYO
259
+ // SIG // JtzkxQxqLeQ0rlZEII5Lu6TlT7ZXROOkJQ4P9loT6U0M
260
+ // SIG // Vx+uLD9Rn5AMFLbeq62TPzwsERuoIq2Jp00Sy7InAYaG
261
+ // SIG // C4fhBBY1b4lwBk5OqZ7vI8f+Fj1rtI7M+8hc4PNvxTKg
262
+ // SIG // pPcCty78iwMgxzfhcWxwMbYMGne6C0DzNFhhEXQdbpjw
263
+ // SIG // iImLEn/4+/RKh3aDcEGETlZvmV9dEV95+m0ZgJ7JHjYY
264
+ // SIG // tMJ1WnlaICzHRg/p6jCCB3EwggVZoAMCAQICEzMAAAAV
265
+ // SIG // xedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgx
266
+ // SIG // CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
267
+ // SIG // MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
268
+ // SIG // b3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jv
269
+ // SIG // c29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAy
270
+ // SIG // MDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIy
271
+ // SIG // NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
272
+ // SIG // bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT
273
+ // SIG // FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
274
+ // SIG // TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIi
275
+ // SIG // MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM
276
+ // SIG // 57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/
277
+ // SIG // bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1
278
+ // SIG // jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx
279
+ // SIG // XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41
280
+ // SIG // JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP
281
+ // SIG // 1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3j
282
+ // SIG // tIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF
283
+ // SIG // 50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakXW2dg
284
+ // SIG // 3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F
285
+ // SIG // 37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0
286
+ // SIG // lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlM
287
+ // SIG // jgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLX
288
+ // SIG // pyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJ
289
+ // SIG // YfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzF
290
+ // SIG // ER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+e
291
+ // SIG // FnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYB
292
+ // SIG // BAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS
293
+ // SIG // /mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0A
294
+ // SIG // XmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB
295
+ // SIG // BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93
296
+ // SIG // d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBv
297
+ // SIG // c2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZ
298
+ // SIG // BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8E
299
+ // SIG // BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAW
300
+ // SIG // gBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBN
301
+ // SIG // MEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v
302
+ // SIG // cGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAx
303
+ // SIG // MC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
304
+ // SIG // AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
305
+ // SIG // cGtpL2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIz
306
+ // SIG // LmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4Swf
307
+ // SIG // ZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518Jx
308
+ // SIG // Nj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6
309
+ // SIG // th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9I
310
+ // SIG // dQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq
311
+ // SIG // 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBew
312
+ // SIG // VIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7
313
+ // SIG // bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa
314
+ // SIG // 2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzH
315
+ // SIG // VG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJVGTZ
316
+ // SIG // c9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakUR
317
+ // SIG // R6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+Crvs
318
+ // SIG // QWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKi
319
+ // SIG // excdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+AN
320
+ // SIG // uOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/
321
+ // SIG // OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQd
322
+ // SIG // VTNYs6FwZvKhggLYMIICQQIBATCCAQChgdikgdUwgdIx
323
+ // SIG // CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
324
+ // SIG // MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
325
+ // SIG // b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
326
+ // SIG // c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEm
327
+ // SIG // MCQGA1UECxMdVGhhbGVzIFRTUyBFU046MkFENC00Qjky
328
+ // SIG // LUZBMDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0
329
+ // SIG // YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAGigUorM
330
+ // SIG // uMvOqZfF8ttgiWRMRNrzoIGDMIGApH4wfDELMAkGA1UE
331
+ // SIG // BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
332
+ // SIG // BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
333
+ // SIG // b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
334
+ // SIG // bWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQAC
335
+ // SIG // BQDqJyJpMCIYDzIwMjQwNjI3MDcyNzM3WhgPMjAyNDA2
336
+ // SIG // MjgwNzI3MzdaMHgwPgYKKwYBBAGEWQoEATEwMC4wCgIF
337
+ // SIG // AOonImkCAQAwCgIBAAICdUYCAf8wCAIBAAIDARYdMAoC
338
+ // SIG // BQDqKHPpAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisG
339
+ // SIG // AQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAw
340
+ // SIG // DQYJKoZIhvcNAQEFBQADgYEADtxJjVGRAT4DAoepgO2J
341
+ // SIG // 1r0TshF8vTD8MdTNOrXbdquqgS1gaT5jBG5wTTeBEPuc
342
+ // SIG // NJK5BqpDSeI+6d7gbPS+gyLA97dHOh5ZeFWeZ/PN/S/u
343
+ // SIG // JGyYA7bVuf6+eHotBLsUVBOZtgO7FpQG5xYVvJuzIgQN
344
+ // SIG // FH1oXE9+08FzBCbIgYExggQNMIIECQIBATCBkzB8MQsw
345
+ // SIG // CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
346
+ // SIG // MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
347
+ // SIG // b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
348
+ // SIG // ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAd6eSJ6W
349
+ // SIG // nyhEPQABAAAB3jANBglghkgBZQMEAgEFAKCCAUowGgYJ
350
+ // SIG // KoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3
351
+ // SIG // DQEJBDEiBCDsVkwSxdQhMH2b9Qn4rOXr87D+rPlPqnJU
352
+ // SIG // 0t1d4OAZvDCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQw
353
+ // SIG // gb0EII4+I58NwV4QEEkCf+YLcyCtPnD9TbPzUtgPjgdz
354
+ // SIG // fh17MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV
355
+ // SIG // BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
356
+ // SIG // HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
357
+ // SIG // MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
358
+ // SIG // IDIwMTACEzMAAAHenkielp8oRD0AAQAAAd4wIgQgdQKx
359
+ // SIG // a+hrSYmjRmdibL1lLzABNmcOI4f3L84q+00oC0MwDQYJ
360
+ // SIG // KoZIhvcNAQELBQAEggIAsOY7z3Od8QTL0k1P0WvZFcqQ
361
+ // SIG // XMRfO9sNkb85gJT8STmpCRPm5vYpuGCjMcUqPf6Hlusw
362
+ // SIG // 0N//v4v/z4ACMreoIb9rBfKIYvv/f0qfTwVqzR3QuXs9
363
+ // SIG // Q3dAcQuO88AUqrc5cNcS/B+9x8N2vk1ckU4vSjJRlwZD
364
+ // SIG // Qopf6zJroP3Zny7boQMCvsN29/bFH7baahtvN6a/O2C9
365
+ // SIG // B5DjzuivS8EjIfnW9Z/qMlfbM/wICb0YqS1f7A201MIV
366
+ // SIG // rgj2AlBM1MdvRnVQKuUHqHuWj+Qejt7eH+UQTdQ3GDt3
367
+ // SIG // rXVeo6c6MgCK+PiHMRVUKBc5OqrimnozR+mjAeiB59jQ
368
+ // SIG // g1gr+A48YdXZMm5sfHT+2BsyA8d5LPCfuvXddUTKOqz3
369
+ // SIG // BEy6P9EBsQXA+RuJbm0lqeAahl15SzOkhBOsh0cFE0jF
370
+ // SIG // Ek2RoOP+OvpnrPKD2j5Vw+t+vA4TVoIhEgQg8UD+oSO7
371
+ // SIG // Z68Kg5wLo4yq7CWxmv3zCR37h6CC4m1YrxTcbxPZebb/
372
+ // SIG // XZa6dCK2eb/ZaFxK8JDXxkWNdkHt18+u46lRNj6uK5Ls
373
+ // SIG // vqP4kVnfW4RWKgHufNVp4je+2FKp8P3MGsEfttDKCBTe
374
+ // SIG // 0mDGmEhf2Wb4erRr8a4TIO0Z8tAVQJ7GnEcze4NBVIOq
375
+ // SIG // YpZOPJU6U0Ff8ytxmB+rd5JrrggoLcfuilVqDAkbgM8=
376
+ // SIG // End signature block
@@ -16,7 +16,6 @@ export declare class SmeWebTelemetry {
16
16
  private static eventBacklog;
17
17
  private static telemetryHandler;
18
18
  private static testMode;
19
- private static metaService;
20
19
  private static rpcInitAlready;
21
20
  private static metaTags;
22
21
  private static powershellIdMap;
@@ -47,7 +46,7 @@ export declare class SmeWebTelemetry {
47
46
  */
48
47
  private static setMetaInDom;
49
48
  /**
50
- * Update Metatags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.
49
+ * Update Meta-tags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.
51
50
  * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message
52
51
  */
53
52
  static updateFromRpcInit(newMetaTags: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry.ts"],"names":[],"mappings":"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","file":"sme-web-telemetry.d.ts","sourcesContent":["// 1DS documentation found at\r\n// https://1dsdocs.azurewebsites.net/getting-started/javascript-getting_started.html\r\n\r\nimport { Meta } from '@angular/platform-browser';\r\nimport { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, delay, retryWhen, shareReplay, take, tap } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { PowerShellCommand } from '../data/powershell';\r\nimport { NotificationState } from '../notification/notification-state';\r\nimport { RpcNotification } from '../rpc/notification/rpc-notification-model';\r\nimport {\r\n GatewayInstallationType,\r\n GatewayInventory,\r\n GatewayMode,\r\n GatewayOperationalMode\r\n} from '../shared/gateway-inventory/gateway-inventory';\r\nimport { GatewayInventoryCache } from '../shared/gateway-inventory/gateway-inventory-cache';\r\nimport { Logging } from './logging';\r\nimport {\r\n CompleteSmePerformanceData,\r\n IContentUpdateOverrideValues,\r\n IPageActionOverrideValues,\r\n IPageViewOverrideValues,\r\n IPageViewPerformanceOverrideValues,\r\n LighthousePerformanceMetrics,\r\n PowershellDetails,\r\n SmeMetaLabels,\r\n SmePerformanceData,\r\n TelemetryActionTypes,\r\n TelemetryEventBody,\r\n TelemetryEvents,\r\n TelemetryEventStates,\r\n TelemetryEventTypes\r\n} from './sme-web-telemetry-models';\r\n\r\n// placeholder for the oneDS type, introduced when we load script.\r\ndeclare let oneDS: any;\r\n\r\nexport class SmeWebTelemetry {\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'WebTelemetry';\r\n }\r\n /**\r\n * Gets the name of current shell or module.\r\n */\r\n private static get nameOfModule(): string {\r\n return MsftSme.self().Init.moduleName ? MsftSme.self().Init.moduleName : SmeWebTelemetry.testMode;\r\n }\r\n\r\n private static get backlogHasSpace(): boolean {\r\n return this.eventBacklog.length < 50;\r\n }\r\n\r\n private static eventBacklog: [TelemetryEvents, TelemetryEventBody][] = [];\r\n private static telemetryHandler = null;\r\n\r\n private static testMode = 'test';\r\n private static metaService: Meta;\r\n private static rpcInitAlready = false;\r\n private static metaTags: { [tag: string]: string } = {};\r\n private static powershellIdMap: { [id: string]: PowerShellCommand } = {};\r\n private static isProd = true;\r\n\r\n public static get isProduction() {\r\n return this.isProd;\r\n }\r\n\r\n // AppId/Tenant Token provided by MarTech support\r\n // AppId is not used, but it will be mapped to later in the pipeline\r\n // Full keys are JS:WindowsAdminCenter and o:f78e2b7c9ae4461399c360160d82dcfc for\r\n // AppId/Tenant token respectively. In Cosmos, only the initial portion of the tenant token is used.\r\n // private static windowsAdminCenterAppId = 'WindowsAdminCenter';\r\n private static windowsAdminCenterTenantToken = 'f78e2b7c9ae4461399c360160d82dcfc-9371288c-a1b9-4fdc-a196-0340fc5f9880-7071';\r\n\r\n /**\r\n * Map of module versions used in this instance of web telemetry - memoize values here.\r\n */\r\n private static moduleVersions = {};\r\n\r\n /**\r\n * Get the list of module versions for use in telemetry where the event is sent via RPC to shell\r\n * from the actual module the event is called in.\r\n * @returns list of module mappings to versions\r\n */\r\n private static getModuleVersion(moduleName: string): string {\r\n if (this.moduleVersions[moduleName]) {\r\n return this.moduleVersions[moduleName];\r\n }\r\n const environment = MsftSme.self().Environment;\r\n const moduleObject = environment.modules.find((module) => {\r\n return module.name === moduleName;\r\n });\r\n const version = moduleObject ? moduleObject.version : 'N/A';\r\n this.moduleVersions[moduleName] = version;\r\n return version;\r\n }\r\n\r\n /**\r\n * Send any manual events that were triggered prior to telemetry initializing.\r\n */\r\n private static sendBacklogEvents(): void {\r\n this.eventBacklog.forEach(([type, body]: [TelemetryEvents, TelemetryEventBody]) => {\r\n switch (type) {\r\n case TelemetryEvents.Performance: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.tracePerformanceData(body.performance, overrideVals ? overrideVals.content : null);\r\n break;\r\n }\r\n case TelemetryEvents.Lighthouse: {\r\n this.traceLighthouseData(body.lighthouse, body.overrideValues as IContentUpdateOverrideValues);\r\n break;\r\n }\r\n case TelemetryEvents.ModuleOpenPerformance: this.traceModuleOpenPerformance(body.performance); break;\r\n case TelemetryEvents.Action: {\r\n const overrideVals = body.overrideValues as IPageActionOverrideValues;\r\n this.traceAction(body.element, overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.ContentUpdate: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.traceContentUpdate(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.PageView: {\r\n const overrideVals = body.overrideValues as IPageViewOverrideValues;\r\n this.tracePageView(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.Notification: this.traceClientNotification(body.notification); break;\r\n default: return;\r\n }\r\n });\r\n this.eventBacklog = [];\r\n }\r\n\r\n /**\r\n * Helper to combine setting metaTags, initialize handler, and\r\n * send any telemetry events that occurred prior to initialization\r\n */\r\n private static configureAndInitTelemetry(): void {\r\n this.setMetaInDom();\r\n this.initTelemetryHandler().subscribe({\r\n next: () => {\r\n this.sendBacklogEvents();\r\n },\r\n error: (error: Error) => {\r\n Logging.logError(this.logSourceName, '{0}: {1}'.format(error.name, error.message));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Helper function to set metaTags in DOM\r\n */\r\n private static setMetaInDom(): void {\r\n for (const [key, value] of Object.entries(this.metaTags)) {\r\n this.metaService.updateTag({ name: `awa-${key}`, content: value });\r\n }\r\n }\r\n\r\n /**\r\n * Update Metatags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.\r\n * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message\r\n */\r\n public static updateFromRpcInit(newMetaTags: { [tag: string]: string }): void {\r\n // All the fields will be updated at the same time here, checking one (wac-session-id is the main one) is enough for the check\r\n const shouldInitHere = SmeMetaLabels.SessionId in this.metaTags\r\n && this.metaTags[SmeMetaLabels.SessionId] === 'N/A';\r\n\r\n this.rpcInitAlready = true;\r\n MsftSme.deepAssign(this.metaTags, newMetaTags);\r\n\r\n // If metaTags contains session ID but it's N/A (ie initial init was called already), call the init. If not,\r\n // just wait for normal init to be called in app-context. Depending on timing RPC update can happen before or after.\r\n if (shouldInitHere) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }\r\n\r\n /**\r\n * Load 1DS if does not already exist.\r\n * @param appContext App context currently being used\r\n */\r\n public static init(appContext: AppContext): Observable<boolean> {\r\n if (this.telemetryHandler) {\r\n return EMPTY;\r\n }\r\n\r\n this.metaService = new Meta(document);\r\n // Set fields we don't need gateway for, if connection to gateway fails, initialize telemetry with limited fields\r\n this.metaTags[SmeMetaLabels.Language] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.Market] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.IsProduction] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.ExtensionVersion] = MsftSme.self().Environment.version;\r\n this.metaTags[SmeMetaLabels.SessionId] = MsftSme.sessionId();\r\n // Instantiate these initially so they aren't empty values\r\n this.metaTags[SmeMetaLabels.InstallationType] = 'N/A';\r\n this.metaTags[SmeMetaLabels.Build] = 'N/A';\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[MsftSme.self().Init.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = 'N/A';\r\n this.isProd = MsftSme.self().Init.isProduction;\r\n\r\n const gatewayInventoryCache = new GatewayInventoryCache(appContext);\r\n return gatewayInventoryCache.query({})\r\n .pipe(\r\n retryWhen(errors => {\r\n let gatewayRetries = 2;\r\n return errors.pipe(\r\n delay(1000),\r\n tap((error) => {\r\n if (gatewayRetries === 0) {\r\n throw error;\r\n }\r\n Logging.logDebug(this.logSourceName, 'Attempting to query gateway again...');\r\n gatewayRetries--;\r\n })\r\n );\r\n }),\r\n take(1),\r\n tap((status: any) => {\r\n const inventory: GatewayInventory = status.instance;\r\n this.isProd = this.isProd\r\n && inventory.gatewayOperationalMode === GatewayOperationalMode.Production;\r\n\r\n this.metaTags[SmeMetaLabels.InstallationType] = inventory.installationType || GatewayInstallationType.Standard;\r\n this.metaTags[SmeMetaLabels.Build] = inventory.gatewayVersion;\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[inventory.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = GatewayOperationalMode[inventory.gatewayOperationalMode];\r\n this.metaTags[SmeMetaLabels.IsProduction] = this.isProd.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = this.isProd.toString();\r\n // If not shell, handle in RPC handler, because some fields will init after 1DS inits\r\n // If rpc handler has happened already, go ahead with this\r\n if (MsftSme.isShell() || this.rpcInitAlready) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }),\r\n catchError((error) => {\r\n Logging.logWarning(this.logSourceName, 'Telemetry failed to initialized with error {}'.format(error.message));\r\n return of(false);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Set config and initialize telemetry library handler\r\n */\r\n private static initTelemetryHandler(): Observable<any> {\r\n const observable = new Observable(observer => {\r\n const script: HTMLScriptElement = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnLink;\r\n script.integrity = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnIntegrityHash;\r\n script.crossOrigin = 'anonymous';\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n this.telemetryHandler = new oneDS.ApplicationInsights();\r\n const entryType: string = MsftSme.self().Init.entryPointType;\r\n const entryName: string = MsftSme.self().Init.entryPointName;\r\n\r\n const config = {\r\n instrumentationKey: this.windowsAdminCenterTenantToken,\r\n // post channel configuration\r\n channelConfiguration: {\r\n eventsLimitInMem: 50\r\n },\r\n // Properties Plugin configuration\r\n propertyConfiguration: {\r\n userAgent: 'Windows Admin Center',\r\n sessionAsGuid: true\r\n },\r\n // Web Analytics Plugin configuration\r\n webAnalyticsConfiguration: {\r\n autoCapture: {\r\n scroll: false,\r\n pageView: true,\r\n onLoad: false,\r\n onUnload: true,\r\n click: true,\r\n resize: true,\r\n jsError: true,\r\n lineage: true\r\n },\r\n coreData: {\r\n pageName: this.nameOfModule,\r\n // to prevent personal data from being sent in URI\r\n referrerUri: 'windows.admin.center',\r\n requestUri: 'windows.admin.center',\r\n pageTags: {\r\n entryPointName: entryName || '',\r\n entryPointType: entryType || ''\r\n }\r\n },\r\n useShortNameForContentBlob: false\r\n }\r\n };\r\n this.telemetryHandler.initialize(config, []);\r\n this.telemetryHandler.addTelemetryInitializer((event: any) => {\r\n // If we send an event that originates from a different module (eg notifications in shell)\r\n // change the extension version to match module\r\n if (event.baseData.name !== this.nameOfModule) {\r\n event.baseData.properties.pageTags.metaTags[SmeMetaLabels.ExtensionVersion] =\r\n this.getModuleVersion(event.baseData.name);\r\n }\r\n event.baseData.properties.pageTags.screenResolution = {\r\n availableHeight: window.screen.availHeight,\r\n availableWidth: window.screen.availWidth\r\n };\r\n event.baseData.properties.pageTags.frameDetails = { height: window.innerHeight, width: window.innerWidth };\r\n });\r\n observer.next();\r\n observer.complete();\r\n };\r\n script.onerror = () => {\r\n script.remove();\r\n observer.error(new Error('1DS Script could not be loaded'));\r\n };\r\n document.body.appendChild(script);\r\n }).pipe(shareReplay(1));\r\n return observable;\r\n }\r\n\r\n /**\r\n * Send a Page-Action event through Web Telemetry.\r\n * @param element Element action is being executed on\r\n * @param overrideValues Various values to override within default Web Telemetry page action fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceAction(element: Element, overrideValues?: IPageActionOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Action, {\r\n element: element, overrideValues: overrideValues,\r\n customProperties: properties\r\n }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.capturePageAction(element, overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Page-View event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry page view fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static tracePageView(overrideValues: IPageViewOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.PageView, { overrideValues: overrideValues }]);\r\n }\r\n return;\r\n }\r\n this.telemetryHandler.capturePageView(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Content-Update event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry content update fields, see Web Telemetry documentation\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceContentUpdate(overrideValues: IContentUpdateOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ContentUpdate, { overrideValues: overrideValues, customProperties: properties }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.captureContentUpdate(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Add standard fields onto performance data\r\n * @param data SmePerformanceData to be sent\r\n */\r\n private static fillStandardPerformanceData(data: SmePerformanceData): CompleteSmePerformanceData {\r\n const fullDataPayload: CompleteSmePerformanceData = {\r\n extension: MsftSme.self().Environment.name,\r\n entryPointName: MsftSme.self().Init.entryPointName || '',\r\n url: window.location.pathname,\r\n moduleOpened: false,\r\n totalLoadTime: '',\r\n label: data.label,\r\n sme: {},\r\n resources: {},\r\n navigation: {}\r\n };\r\n // Truncate all decimals to 5 places to avoid cosmos stream from redacting any\r\n // Convert PerformanceNavigationTiming to JSON so we can manipulate it via Object.() methods.\r\n fullDataPayload.totalLoadTime = data.totalLoadTime.toFixed(5);\r\n const timingData = {\r\n 'sme': data.sme || {},\r\n 'resources': data.resources || {},\r\n 'navigation': data.navigation ? data.navigation.toJSON() : {}\r\n };\r\n\r\n for (const [sourceKey, sourceVal] of Object.entries(timingData)) {\r\n for (const [resourceKey, resourceVal] of Object.entries(sourceVal)) {\r\n // navigation has some string-string maps, ignore the string values.\r\n // Convert all numbers back into numbers to preserve types in cosmos stream\r\n if (!MsftSme.isEmpty(sourceVal) && typeof resourceVal === 'number') {\r\n fullDataPayload[sourceKey][resourceKey] = parseFloat(resourceVal.toFixed(7));\r\n }\r\n }\r\n }\r\n\r\n // Set this here if need - often the appLoad times happen before Init is populated,\r\n // so check again to make sure if its actually empty.\r\n if (fullDataPayload.navigation) {\r\n fullDataPayload.entryPointName = MsftSme.self().Init.entryPointName || '';\r\n }\r\n return fullDataPayload;\r\n }\r\n\r\n /**\r\n * Send a content update event. This content update contains an updated sme-specific timings structure with relevant\r\n * performance data under the data field. The original timings data is also contained under the navigation field.\r\n * The structure of the event is such:\r\n * data : { ...,\r\n * \"timings\": {\r\n * \"extension\": [extension-name],\r\n * \"entryPointName\": [entryPointName],\r\n * \"url\": [url-endpoint],\r\n * \"moduleOpened\" : [isModuleOpened],\r\n * \"sme\": {\r\n * [sme-mark] : [mark-timestamps],\r\n * ...\r\n * },\r\n * \"resources\": {\r\n * [resource-endpoint] : [resource-load-complete-timestamps],\r\n * ...\r\n * },\r\n * \"navigation\": {\r\n * [performance-navigation-event]: [navigation-event-timestamps]\r\n * }\r\n * }, ...\r\n * }\r\n * Certain fields are set within this class instead of outside modules since they will always be the same.\r\n * @param dataPayload performance data to be sent through telemetry.\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static tracePerformanceData(dataPayload: SmePerformanceData, contentOverrides?: any): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Performance,\r\n {\r\n performance: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n\r\n // A for automatic, performance tracking is done automatically.\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Send a content update event - this event will contain timings for lighthouse calculation in the backend\r\n * This can potentially be sent a couple times with overlapping data for one page load event, depending\r\n * on when the TTI is calculated. In this scenario, it will be handled on the backend.\r\n * @param dataPayload Lighthouse data\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static traceLighthouseData(dataPayload: LighthousePerformanceMetrics, contentOverrides?: any,\r\n properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Lighthouse,\r\n {\r\n lighthouse: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: dataPayload, type: TelemetryEventTypes.Lighthouse };\r\n MsftSme.deepAssign(customProps, properties);\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides\r\n * @param dataPayload performance data to be sent through telemetry.\r\n */\r\n public static traceModuleOpenPerformance(dataPayload: SmePerformanceData): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ModuleOpenPerformance, { performance: dataPayload }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n data.moduleOpened = true;\r\n\r\n const overrideValues: IPageViewPerformanceOverrideValues = {\r\n customTiming: JSON.stringify(data)\r\n };\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n\r\n this.telemetryHandler.capturePageViewPerformance(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for notification\r\n * @param clientNotification Client notification to send event for\r\n */\r\n public static traceClientNotification(clientNotification: RpcNotification): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Notification, { notification: clientNotification }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n content: {\r\n message: clientNotification.message,\r\n title: clientNotification.title,\r\n state: NotificationState[clientNotification.state],\r\n contentType: TelemetryEventTypes.Notification\r\n },\r\n // If source is not shell, replace pagename with proper source.\r\n pageName: clientNotification.sourceName ? clientNotification.sourceName : this.nameOfModule\r\n };\r\n this.traceContentUpdate(overrideValues, { type: TelemetryEventTypes.Notification });\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static addPowershellId(id: string, command: PowerShellCommand) {\r\n this.powershellIdMap[id] = command;\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static removePowershellId(id: string) {\r\n delete this.powershellIdMap[id];\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell event. In the case where command is not available,\r\n * use an ID (usually ps session ID, which may correlate with work item id)\r\n * @param command Powershell Command\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object - see interface for more detail.\r\n */\r\n public static tracePowershellEvent(command: PowerShellCommand, state: TelemetryEventStates, details?: PowershellDetails): void {\r\n const id = details ? details.id : null;\r\n const response = details ? details.response : null;\r\n const psCommand = command ? command : this.powershellIdMap[id];\r\n\r\n // Ignore any events that are either null or un-named PS commands.\r\n if ((psCommand && !psCommand.command) || !psCommand) {\r\n return;\r\n }\r\n\r\n // If state is not started and id is provided, remove the ID from the map to save space.\r\n if (state !== TelemetryEventStates.Started && id) {\r\n this.removePowershellId(id);\r\n }\r\n\r\n const psContent = {\r\n psCommand: psCommand.command, state: state, psModule: psCommand.module,\r\n otherData: details && details.otherData ? details.otherData : {}\r\n };\r\n const sourceName = this.nameOfModule;\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent, pageName: sourceName },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell batch event. Batch doesn't deal with work items, so\r\n * we can ignore the ID and sourceName handling that the above function handles.\r\n * @param commands Powershell Commands List in properties stringified form. PS Batch events places PS command into a\r\n * '{properties: PSCommand }' string structure.\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object contains various optional fields in powershell event.\r\n * @returns\r\n */\r\n public static tracePowershellBatchEvent(commands: string[], state: TelemetryEventStates, details?: PowershellDetails) {\r\n // check that at least one command is valid\r\n if (!commands || commands.length === 0) {\r\n return;\r\n }\r\n\r\n let parsedCommands: string[] = [];\r\n parsedCommands = commands.reduce((commandList, currentCommand) => {\r\n if (currentCommand) {\r\n const parsedCommand = JSON.parse(currentCommand).properties.command;\r\n if (parsedCommand) {\r\n commandList.push(parsedCommand);\r\n }\r\n return commandList;\r\n }\r\n }, parsedCommands);\r\n\r\n const response = details ? details.response : null;\r\n\r\n const psContent = { psCommands: parsedCommands, state: state, otherData: details && details.otherData ? details.otherData : {} };\r\n\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to redactGenericModel function\r\n * Determines whether field should be redacted according to fields provided for redacting and exceptions\r\n * @param key The field in question\r\n * @param keywordsToRedact List of string inclusions to redact - if the field contains any part of this, it will be redacted\r\n * @param exceptions Set of exceptions to the above - if the field matches an exception, it will not be redacted\r\n * @returns True if field should be redacted, false otherwise\r\n */\r\n private static fieldShouldBeRedacted(key: string, keywordsToRedact: string[], exceptions: Set<string>): boolean {\r\n if (exceptions.has(key)) {\r\n return false;\r\n }\r\n\r\n for (const field of keywordsToRedact) {\r\n if (key.toLowerCase().includes(field.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Telemetry utility function to redact a model object. This function will traverse the model in BFS fashion and redact any fields\r\n * that contain any string in the keywordsToRedact array, unless the field is an exception (in the exceptions array).\r\n * This function will not affect keys in StringMaps or Maps - if names exist there, they should be handled separately.\r\n *\r\n * @param model Model to redact\r\n * @param keywordsToRedact List of string inclusions to redact\r\n * @param fieldExceptions List of exceptions to the above\r\n * @returns Redacted model\r\n */\r\n public static redactGenericModel(model: any, keywordsToRedact: string[], fieldExceptions: string[]): any {\r\n const redacted_model: any = JSON.parse(JSON.stringify(model));\r\n const remainingObjects = [redacted_model];\r\n const exceptionSet = new Set(fieldExceptions);\r\n\r\n while (remainingObjects.length > 0) {\r\n const currentTree = remainingObjects[0];\r\n\r\n Object.keys(currentTree).forEach(key => {\r\n if (MsftSme.isPlainObject(currentTree[key])) {\r\n remainingObjects.push(currentTree[key]);\r\n } else if (Array.isArray(currentTree[key]) && currentTree[key].some((field: any) => MsftSme.isPlainObject(field))) {\r\n // If array intermixes objects and non-objects, we will push the objects into the queue and ignore the non-objects.\r\n // The non-objects will avoid redaction, but this should never be a concern in practice.\r\n remainingObjects.push(currentTree[key].filter((field: any) => MsftSme.isPlainObject(field)));\r\n } else if (this.fieldShouldBeRedacted(key, keywordsToRedact, exceptionSet)) {\r\n if (Array.isArray(currentTree[key])) {\r\n for (let i = 0; i < currentTree[key].length; ++i) {\r\n currentTree[key][i] = '***';\r\n }\r\n } else {\r\n currentTree[key] = '***';\r\n }\r\n }\r\n });\r\n remainingObjects.shift();\r\n }\r\n return redacted_model;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"sources":["../../../packages/core/diagnostics/sme-web-telemetry.ts"],"names":[],"mappings":"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","file":"sme-web-telemetry.d.ts","sourcesContent":["// 1DS documentation found at\r\n// https://1dsdocs.azurewebsites.net/getting-started/javascript-getting_started.html\r\n\r\nimport { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, delay, retry, shareReplay, take, tap } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { PowerShellCommand } from '../data/powershell';\r\nimport { NotificationState } from '../notification/notification-state';\r\nimport { RpcNotification } from '../rpc/notification/rpc-notification-model';\r\nimport {\r\n GatewayInstallationType,\r\n GatewayInventory,\r\n GatewayMode,\r\n GatewayOperationalMode\r\n} from '../shared/gateway-inventory/gateway-inventory';\r\nimport { GatewayInventoryCache } from '../shared/gateway-inventory/gateway-inventory-cache';\r\nimport { Logging } from './logging';\r\nimport {\r\n CompleteSmePerformanceData,\r\n IContentUpdateOverrideValues,\r\n IPageActionOverrideValues,\r\n IPageViewOverrideValues,\r\n IPageViewPerformanceOverrideValues,\r\n LighthousePerformanceMetrics,\r\n PowershellDetails,\r\n SmeMetaLabels,\r\n SmePerformanceData,\r\n TelemetryActionTypes,\r\n TelemetryEventBody,\r\n TelemetryEvents,\r\n TelemetryEventStates,\r\n TelemetryEventTypes\r\n} from './sme-web-telemetry-models';\r\n\r\n// placeholder for the oneDS type, introduced when we load script.\r\ndeclare let oneDS: any;\r\n\r\nexport class SmeWebTelemetry {\r\n\r\n /**\r\n * The source name to use when logging about this service.\r\n */\r\n private static get logSourceName() {\r\n return 'WebTelemetry';\r\n }\r\n /**\r\n * Gets the name of current shell or module.\r\n */\r\n private static get nameOfModule(): string {\r\n return MsftSme.self().Init.moduleName ? MsftSme.self().Init.moduleName : SmeWebTelemetry.testMode;\r\n }\r\n\r\n private static get backlogHasSpace(): boolean {\r\n return this.eventBacklog.length < 50;\r\n }\r\n\r\n private static eventBacklog: [TelemetryEvents, TelemetryEventBody][] = [];\r\n private static telemetryHandler = null;\r\n\r\n private static testMode = 'test';\r\n private static rpcInitAlready = false;\r\n private static metaTags: { [tag: string]: string } = {};\r\n private static powershellIdMap: { [id: string]: PowerShellCommand } = {};\r\n private static isProd = true;\r\n\r\n public static get isProduction() {\r\n return this.isProd;\r\n }\r\n\r\n // AppId/Tenant Token provided by MarTech support\r\n // AppId is not used, but it will be mapped to later in the pipeline\r\n // Full keys are JS:WindowsAdminCenter and o:f78e2b7c9ae4461399c360160d82dcfc for\r\n // AppId/Tenant token respectively. In Cosmos, only the initial portion of the tenant token is used.\r\n // private static windowsAdminCenterAppId = 'WindowsAdminCenter';\r\n private static windowsAdminCenterTenantToken = 'f78e2b7c9ae4461399c360160d82dcfc-9371288c-a1b9-4fdc-a196-0340fc5f9880-7071';\r\n\r\n /**\r\n * Map of module versions used in this instance of web telemetry - memoize values here.\r\n */\r\n private static moduleVersions = {};\r\n\r\n /**\r\n * Get the list of module versions for use in telemetry where the event is sent via RPC to shell\r\n * from the actual module the event is called in.\r\n * @returns list of module mappings to versions\r\n */\r\n private static getModuleVersion(moduleName: string): string {\r\n if (this.moduleVersions[moduleName]) {\r\n return this.moduleVersions[moduleName];\r\n }\r\n const environment = MsftSme.self().Environment;\r\n const moduleObject = environment.modules.find((module) => {\r\n return module.name === moduleName;\r\n });\r\n const version = moduleObject ? moduleObject.version : 'N/A';\r\n this.moduleVersions[moduleName] = version;\r\n return version;\r\n }\r\n\r\n /**\r\n * Send any manual events that were triggered prior to telemetry initializing.\r\n */\r\n private static sendBacklogEvents(): void {\r\n this.eventBacklog.forEach(([type, body]: [TelemetryEvents, TelemetryEventBody]) => {\r\n switch (type) {\r\n case TelemetryEvents.Performance: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.tracePerformanceData(body.performance, overrideVals ? overrideVals.content : null);\r\n break;\r\n }\r\n case TelemetryEvents.Lighthouse: {\r\n this.traceLighthouseData(body.lighthouse, body.overrideValues as IContentUpdateOverrideValues);\r\n break;\r\n }\r\n case TelemetryEvents.ModuleOpenPerformance: this.traceModuleOpenPerformance(body.performance); break;\r\n case TelemetryEvents.Action: {\r\n const overrideVals = body.overrideValues as IPageActionOverrideValues;\r\n this.traceAction(body.element, overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.ContentUpdate: {\r\n const overrideVals = body.overrideValues as IContentUpdateOverrideValues;\r\n this.traceContentUpdate(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.PageView: {\r\n const overrideVals = body.overrideValues as IPageViewOverrideValues;\r\n this.tracePageView(overrideVals, body.customProperties);\r\n break;\r\n }\r\n case TelemetryEvents.Notification: this.traceClientNotification(body.notification); break;\r\n default: return;\r\n }\r\n });\r\n this.eventBacklog = [];\r\n }\r\n\r\n /**\r\n * Helper to combine setting metaTags, initialize handler, and\r\n * send any telemetry events that occurred prior to initialization\r\n */\r\n private static configureAndInitTelemetry(): void {\r\n this.setMetaInDom();\r\n this.initTelemetryHandler().subscribe({\r\n next: () => {\r\n this.sendBacklogEvents();\r\n },\r\n error: (error: Error) => {\r\n Logging.logError(this.logSourceName, '{0}: {1}'.format(error.name, error.message));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Helper function to set metaTags in DOM\r\n */\r\n private static setMetaInDom(): void {\r\n // create an indexed table of current meta data.\r\n const metaList = document.head.getElementsByTagName(\"meta\");\r\n const metaIndex = {};\r\n for (let i = 0; i < metaList.length; i++) {\r\n const metaName = metaList[i].getAttribute(\"name\");\r\n if (metaName && metaName.indexOf('awa-') === 0) {\r\n metaIndex[metaName] = metaList[i];\r\n }\r\n }\r\n\r\n // set or replace meta tags in the DOM\r\n for (const [key, value] of Object.entries(this.metaTags)) {\r\n const metaName = `awa-${key}`;\r\n const oldMeta = metaIndex[metaName];\r\n if (oldMeta) {\r\n document.head.removeChild(oldMeta);\r\n }\r\n\r\n const newMeta = document.createElement('meta');\r\n newMeta.name = metaName;\r\n newMeta.content = value;\r\n document.head.appendChild(newMeta);\r\n }\r\n }\r\n\r\n /**\r\n * Update Meta-tags and/or initialize telemetry, depending on whether rpc message came before or after app-context init.\r\n * @param newMetaTags Primarily contains WAC-Session-Id & extension-version, received from RPC message\r\n */\r\n public static updateFromRpcInit(newMetaTags: { [tag: string]: string }): void {\r\n // All the fields will be updated at the same time here, checking one (wac-session-id is the main one) is enough for the check\r\n const shouldInitHere = SmeMetaLabels.SessionId in this.metaTags\r\n && this.metaTags[SmeMetaLabels.SessionId] === 'N/A';\r\n\r\n this.rpcInitAlready = true;\r\n MsftSme.deepAssign(this.metaTags, newMetaTags);\r\n\r\n // If metaTags contains session ID but it's N/A (ie initial init was called already), call the init. If not,\r\n // just wait for normal init to be called in app-context. Depending on timing RPC update can happen before or after.\r\n if (shouldInitHere) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }\r\n\r\n /**\r\n * Load 1DS if does not already exist.\r\n * @param appContext App context currently being used\r\n */\r\n public static init(appContext: AppContext): Observable<boolean> {\r\n if (this.telemetryHandler) {\r\n return EMPTY;\r\n }\r\n\r\n // Set fields we don't need gateway for, if connection to gateway fails, initialize telemetry with limited fields\r\n this.metaTags[SmeMetaLabels.Language] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.Market] = MsftSme.self().Resources.localeId;\r\n this.metaTags[SmeMetaLabels.IsProduction] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = MsftSme.self().Init.isProduction.toString();\r\n this.metaTags[SmeMetaLabels.ExtensionVersion] = MsftSme.self().Environment.version;\r\n this.metaTags[SmeMetaLabels.SessionId] = MsftSme.sessionId();\r\n // Instantiate these initially so they aren't empty values\r\n this.metaTags[SmeMetaLabels.InstallationType] = 'N/A';\r\n this.metaTags[SmeMetaLabels.Build] = 'N/A';\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[MsftSme.self().Init.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = 'N/A';\r\n this.isProd = MsftSme.self().Init.isProduction;\r\n\r\n const gatewayInventoryCache = new GatewayInventoryCache(appContext);\r\n return gatewayInventoryCache.query({})\r\n .pipe(\r\n retry({\r\n count: 2,\r\n delay: error => error.pipe(\r\n delay(1000),\r\n tap(() => Logging.logDebug(this.logSourceName, 'Attempting to query gateway again...')))\r\n }),\r\n take(1),\r\n tap((status: any) => {\r\n const inventory: GatewayInventory = status.instance;\r\n this.isProd = this.isProd\r\n && inventory.gatewayOperationalMode === GatewayOperationalMode.Production;\r\n\r\n this.metaTags[SmeMetaLabels.InstallationType] = inventory.installationType || GatewayInstallationType.Standard;\r\n this.metaTags[SmeMetaLabels.Build] = inventory.gatewayVersion;\r\n this.metaTags[SmeMetaLabels.GatewayMode] = GatewayMode[inventory.mode];\r\n this.metaTags[SmeMetaLabels.GatewayOperationalMode] = GatewayOperationalMode[inventory.gatewayOperationalMode];\r\n this.metaTags[SmeMetaLabels.IsProduction] = this.isProd.toString();\r\n this.metaTags[SmeMetaLabels.Environment] = this.isProd.toString();\r\n // If not shell, handle in RPC handler, because some fields will init after 1DS inits\r\n // If rpc handler has happened already, go ahead with this\r\n if (MsftSme.isShell() || this.rpcInitAlready) {\r\n this.configureAndInitTelemetry();\r\n }\r\n }),\r\n catchError((error) => {\r\n Logging.logWarning(this.logSourceName, 'Telemetry failed to initialized with error {}'.format(error.message));\r\n return of(false);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Set config and initialize telemetry library handler\r\n */\r\n private static initTelemetryHandler(): Observable<any> {\r\n const observable = new Observable(observer => {\r\n const script: HTMLScriptElement = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnLink;\r\n script.integrity = MsftSme.self().Environment.configuration.telemetry.sourceLibraryCdnIntegrityHash;\r\n script.crossOrigin = 'anonymous';\r\n script.async = true;\r\n\r\n script.onload = () => {\r\n this.telemetryHandler = new oneDS.ApplicationInsights();\r\n const entryType: string = MsftSme.self().Init.entryPointType;\r\n const entryName: string = MsftSme.self().Init.entryPointName;\r\n\r\n const config = {\r\n instrumentationKey: this.windowsAdminCenterTenantToken,\r\n // post channel configuration\r\n channelConfiguration: {\r\n eventsLimitInMem: 50\r\n },\r\n // Properties Plugin configuration\r\n propertyConfiguration: {\r\n userAgent: 'Windows Admin Center',\r\n sessionAsGuid: true\r\n },\r\n // Web Analytics Plugin configuration\r\n webAnalyticsConfiguration: {\r\n autoCapture: {\r\n scroll: false,\r\n pageView: true,\r\n onLoad: false,\r\n onUnload: true,\r\n click: true,\r\n resize: true,\r\n jsError: true,\r\n lineage: true\r\n },\r\n coreData: {\r\n pageName: this.nameOfModule,\r\n // to prevent personal data from being sent in URI\r\n referrerUri: 'windows.admin.center',\r\n requestUri: 'windows.admin.center',\r\n pageTags: {\r\n entryPointName: entryName || '',\r\n entryPointType: entryType || ''\r\n }\r\n },\r\n useShortNameForContentBlob: false\r\n }\r\n };\r\n this.telemetryHandler.initialize(config, []);\r\n this.telemetryHandler.addTelemetryInitializer((event: any) => {\r\n // If we send an event that originates from a different module (eg notifications in shell)\r\n // change the extension version to match module\r\n if (event.baseData.name !== this.nameOfModule) {\r\n event.baseData.properties.pageTags.metaTags[SmeMetaLabels.ExtensionVersion] =\r\n this.getModuleVersion(event.baseData.name);\r\n }\r\n event.baseData.properties.pageTags.screenResolution = {\r\n availableHeight: window.screen.availHeight,\r\n availableWidth: window.screen.availWidth\r\n };\r\n event.baseData.properties.pageTags.frameDetails = { height: window.innerHeight, width: window.innerWidth };\r\n });\r\n observer.next();\r\n observer.complete();\r\n };\r\n script.onerror = () => {\r\n script.remove();\r\n observer.error(new Error('1DS Script could not be loaded'));\r\n };\r\n document.body.appendChild(script);\r\n }).pipe(shareReplay(1));\r\n return observable;\r\n }\r\n\r\n /**\r\n * Send a Page-Action event through Web Telemetry.\r\n * @param element Element action is being executed on\r\n * @param overrideValues Various values to override within default Web Telemetry page action fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceAction(element: Element, overrideValues?: IPageActionOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Action, {\r\n element: element, overrideValues: overrideValues,\r\n customProperties: properties\r\n }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.capturePageAction(element, overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Page-View event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry page view fields, see Web Telemetry documentation.\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static tracePageView(overrideValues: IPageViewOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.PageView, { overrideValues: overrideValues }]);\r\n }\r\n return;\r\n }\r\n this.telemetryHandler.capturePageView(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Send a Content-Update event through Web Telemetry.\r\n * @param overrideValues Various values to override within default Web Telemetry content update fields, see Web Telemetry documentation\r\n * @param properties Extra properties in an index signature. These are placed under the data field in partC data.\r\n */\r\n public static traceContentUpdate(overrideValues: IContentUpdateOverrideValues, properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ContentUpdate, { overrideValues: overrideValues, customProperties: properties }]);\r\n }\r\n return;\r\n }\r\n if (!overrideValues.actionType) {\r\n overrideValues.actionType = TelemetryActionTypes.Automatic;\r\n }\r\n this.telemetryHandler.captureContentUpdate(overrideValues, properties);\r\n }\r\n\r\n /**\r\n * Add standard fields onto performance data\r\n * @param data SmePerformanceData to be sent\r\n */\r\n private static fillStandardPerformanceData(data: SmePerformanceData): CompleteSmePerformanceData {\r\n const fullDataPayload: CompleteSmePerformanceData = {\r\n extension: MsftSme.self().Environment.name,\r\n entryPointName: MsftSme.self().Init.entryPointName || '',\r\n url: window.location.pathname,\r\n moduleOpened: false,\r\n totalLoadTime: '',\r\n label: data.label,\r\n sme: {},\r\n resources: {},\r\n navigation: {}\r\n };\r\n // Truncate all decimals to 5 places to avoid cosmos stream from redacting any\r\n // Convert PerformanceNavigationTiming to JSON so we can manipulate it via Object.() methods.\r\n fullDataPayload.totalLoadTime = data.totalLoadTime.toFixed(5);\r\n const timingData = {\r\n 'sme': data.sme || {},\r\n 'resources': data.resources || {},\r\n 'navigation': data.navigation ? data.navigation.toJSON() : {}\r\n };\r\n\r\n for (const [sourceKey, sourceVal] of Object.entries(timingData)) {\r\n for (const [resourceKey, resourceVal] of Object.entries(sourceVal)) {\r\n // navigation has some string-string maps, ignore the string values.\r\n // Convert all numbers back into numbers to preserve types in cosmos stream\r\n if (!MsftSme.isEmpty(sourceVal) && typeof resourceVal === 'number') {\r\n fullDataPayload[sourceKey][resourceKey] = parseFloat(resourceVal.toFixed(7));\r\n }\r\n }\r\n }\r\n\r\n // Set this here if need - often the appLoad times happen before Init is populated,\r\n // so check again to make sure if its actually empty.\r\n if (fullDataPayload.navigation) {\r\n fullDataPayload.entryPointName = MsftSme.self().Init.entryPointName || '';\r\n }\r\n return fullDataPayload;\r\n }\r\n\r\n /**\r\n * Send a content update event. This content update contains an updated sme-specific timings structure with relevant\r\n * performance data under the data field. The original timings data is also contained under the navigation field.\r\n * The structure of the event is such:\r\n * data : { ...,\r\n * \"timings\": {\r\n * \"extension\": [extension-name],\r\n * \"entryPointName\": [entryPointName],\r\n * \"url\": [url-endpoint],\r\n * \"moduleOpened\" : [isModuleOpened],\r\n * \"sme\": {\r\n * [sme-mark] : [mark-timestamps],\r\n * ...\r\n * },\r\n * \"resources\": {\r\n * [resource-endpoint] : [resource-load-complete-timestamps],\r\n * ...\r\n * },\r\n * \"navigation\": {\r\n * [performance-navigation-event]: [navigation-event-timestamps]\r\n * }\r\n * }, ...\r\n * }\r\n * Certain fields are set within this class instead of outside modules since they will always be the same.\r\n * @param dataPayload performance data to be sent through telemetry.\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static tracePerformanceData(dataPayload: SmePerformanceData, contentOverrides?: any): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Performance,\r\n {\r\n performance: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n\r\n // A for automatic, performance tracking is done automatically.\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Send a content update event - this event will contain timings for lighthouse calculation in the backend\r\n * This can potentially be sent a couple times with overlapping data for one page load event, depending\r\n * on when the TTI is calculated. In this scenario, it will be handled on the backend.\r\n * @param dataPayload Lighthouse data\r\n * @param contentOverrides any content overriding behavior wanted in the performance event\r\n */\r\n public static traceLighthouseData(dataPayload: LighthousePerformanceMetrics, contentOverrides?: any,\r\n properties?: { [name: string]: any }): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Lighthouse,\r\n {\r\n lighthouse: dataPayload,\r\n overrideValues: { content: contentOverrides } as IContentUpdateOverrideValues\r\n }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n actionType: TelemetryActionTypes.Automatic,\r\n content: contentOverrides || dataPayload\r\n };\r\n\r\n const customProps = { timings: dataPayload, type: TelemetryEventTypes.Lighthouse };\r\n MsftSme.deepAssign(customProps, properties);\r\n this.telemetryHandler.captureContentUpdate(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * See tracePerformanceData comments, only difference is moduleOpened is true and the contentOverrides\r\n * @param dataPayload performance data to be sent through telemetry.\r\n */\r\n public static traceModuleOpenPerformance(dataPayload: SmePerformanceData): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.ModuleOpenPerformance, { performance: dataPayload }]);\r\n }\r\n return;\r\n }\r\n const data = SmeWebTelemetry.fillStandardPerformanceData(dataPayload);\r\n data.moduleOpened = true;\r\n\r\n const overrideValues: IPageViewPerformanceOverrideValues = {\r\n customTiming: JSON.stringify(data)\r\n };\r\n const customProps = { timings: data, type: TelemetryEventTypes.Performance };\r\n\r\n this.telemetryHandler.capturePageViewPerformance(overrideValues, customProps);\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for notification\r\n * @param clientNotification Client notification to send event for\r\n */\r\n public static traceClientNotification(clientNotification: RpcNotification): void {\r\n if (!this.telemetryHandler) {\r\n if (this.backlogHasSpace) {\r\n this.eventBacklog.push([TelemetryEvents.Notification, { notification: clientNotification }]);\r\n }\r\n return;\r\n }\r\n const overrideValues: IContentUpdateOverrideValues = {\r\n content: {\r\n message: clientNotification.message,\r\n title: clientNotification.title,\r\n state: NotificationState[clientNotification.state],\r\n contentType: TelemetryEventTypes.Notification\r\n },\r\n // If source is not shell, replace pagename with proper source.\r\n pageName: clientNotification.sourceName ? clientNotification.sourceName : this.nameOfModule\r\n };\r\n this.traceContentUpdate(overrideValues, { type: TelemetryEventTypes.Notification });\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static addPowershellId(id: string, command: PowerShellCommand) {\r\n this.powershellIdMap[id] = command;\r\n }\r\n\r\n /**\r\n * Helper function to assign a command to an id in a multi-step workitem process\r\n * @param id The ID of the powershell session to assign\r\n * @param command The command to assign to the session ID\r\n */\r\n public static removePowershellId(id: string) {\r\n delete this.powershellIdMap[id];\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell event. In the case where command is not available,\r\n * use an ID (usually ps session ID, which may correlate with work item id)\r\n * @param command Powershell Command\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object - see interface for more detail.\r\n */\r\n public static tracePowershellEvent(command: PowerShellCommand, state: TelemetryEventStates, details?: PowershellDetails): void {\r\n const id = details ? details.id : null;\r\n const response = details ? details.response : null;\r\n const psCommand = command ? command : this.powershellIdMap[id];\r\n\r\n // Ignore any events that are either null or un-named PS commands.\r\n if ((psCommand && !psCommand.command) || !psCommand) {\r\n return;\r\n }\r\n\r\n // If state is not started and id is provided, remove the ID from the map to save space.\r\n if (state !== TelemetryEventStates.Started && id) {\r\n this.removePowershellId(id);\r\n }\r\n\r\n const psContent = {\r\n psCommand: psCommand.command, state: state, psModule: psCommand.module,\r\n otherData: details && details.otherData ? details.otherData : {}\r\n };\r\n const sourceName = this.nameOfModule;\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent, pageName: sourceName },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to create event boilerplate for powershell batch event. Batch doesn't deal with work items, so\r\n * we can ignore the ID and sourceName handling that the above function handles.\r\n * @param commands Powershell Commands List in properties stringified form. PS Batch events places PS command into a\r\n * '{properties: PSCommand }' string structure.\r\n * @param state State of powershell event (start/end/etc)\r\n * @param details Optional details object contains various optional fields in powershell event.\r\n * @returns\r\n */\r\n public static tracePowershellBatchEvent(commands: string[], state: TelemetryEventStates, details?: PowershellDetails) {\r\n // check that at least one command is valid\r\n if (!commands || commands.length === 0) {\r\n return;\r\n }\r\n\r\n let parsedCommands: string[] = [];\r\n parsedCommands = commands.reduce((commandList, currentCommand) => {\r\n if (currentCommand) {\r\n const parsedCommand = JSON.parse(currentCommand).properties.command;\r\n if (parsedCommand) {\r\n commandList.push(parsedCommand);\r\n }\r\n return commandList;\r\n }\r\n }, parsedCommands);\r\n\r\n const response = details ? details.response : null;\r\n\r\n const psContent = { psCommands: parsedCommands, state: state, otherData: details && details.otherData ? details.otherData : {} };\r\n\r\n if (response && response.error) {\r\n psContent['errorCodes'] = [response.error.code];\r\n } else if (response && response.errors) {\r\n psContent['errorCodes'] = response.errors.map((e) => e.errorType);\r\n psContent.otherData['hResult'] = response.errors.map((e) => e.detailRecord && e.detailRecord.hResult);\r\n }\r\n SmeWebTelemetry.traceAction(null, { content: psContent },\r\n { type: TelemetryEventTypes.Powershell });\r\n }\r\n\r\n /**\r\n * Helper to redactGenericModel function\r\n * Determines whether field should be redacted according to fields provided for redacting and exceptions\r\n * @param key The field in question\r\n * @param keywordsToRedact List of string inclusions to redact - if the field contains any part of this, it will be redacted\r\n * @param exceptions Set of exceptions to the above - if the field matches an exception, it will not be redacted\r\n * @returns True if field should be redacted, false otherwise\r\n */\r\n private static fieldShouldBeRedacted(key: string, keywordsToRedact: string[], exceptions: Set<string>): boolean {\r\n if (exceptions.has(key)) {\r\n return false;\r\n }\r\n\r\n for (const field of keywordsToRedact) {\r\n if (key.toLowerCase().includes(field.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Telemetry utility function to redact a model object. This function will traverse the model in BFS fashion and redact any fields\r\n * that contain any string in the keywordsToRedact array, unless the field is an exception (in the exceptions array).\r\n * This function will not affect keys in StringMaps or Maps - if names exist there, they should be handled separately.\r\n *\r\n * @param model Model to redact\r\n * @param keywordsToRedact List of string inclusions to redact\r\n * @param fieldExceptions List of exceptions to the above\r\n * @returns Redacted model\r\n */\r\n public static redactGenericModel(model: any, keywordsToRedact: string[], fieldExceptions: string[]): any {\r\n const redacted_model: any = JSON.parse(JSON.stringify(model));\r\n const remainingObjects = [redacted_model];\r\n const exceptionSet = new Set(fieldExceptions);\r\n\r\n while (remainingObjects.length > 0) {\r\n const currentTree = remainingObjects[0];\r\n\r\n Object.keys(currentTree).forEach(key => {\r\n if (MsftSme.isPlainObject(currentTree[key])) {\r\n remainingObjects.push(currentTree[key]);\r\n } else if (Array.isArray(currentTree[key]) && currentTree[key].some((field: any) => MsftSme.isPlainObject(field))) {\r\n // If array intermixes objects and non-objects, we will push the objects into the queue and ignore the non-objects.\r\n // The non-objects will avoid redaction, but this should never be a concern in practice.\r\n remainingObjects.push(currentTree[key].filter((field: any) => MsftSme.isPlainObject(field)));\r\n } else if (this.fieldShouldBeRedacted(key, keywordsToRedact, exceptionSet)) {\r\n if (Array.isArray(currentTree[key])) {\r\n for (let i = 0; i < currentTree[key].length; ++i) {\r\n currentTree[key][i] = '***';\r\n }\r\n } else {\r\n currentTree[key] = '***';\r\n }\r\n }\r\n });\r\n remainingObjects.shift();\r\n }\r\n return redacted_model;\r\n }\r\n}\r\n"]}