@c8y/ngx-components 1006.6.36 → 1006.6.40

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 (105) hide show
  1. package/bundles/c8y-ngx-components-connectivity.umd.js +1 -1
  2. package/bundles/c8y-ngx-components-connectivity.umd.js.map +1 -1
  3. package/bundles/c8y-ngx-components-connectivity.umd.min.js +1 -1
  4. package/bundles/c8y-ngx-components-connectivity.umd.min.js.map +1 -1
  5. package/bundles/c8y-ngx-components-context-dashboard.umd.js +1 -1
  6. package/bundles/c8y-ngx-components-context-dashboard.umd.js.map +1 -1
  7. package/bundles/c8y-ngx-components-context-dashboard.umd.min.js +1 -1
  8. package/bundles/c8y-ngx-components-context-dashboard.umd.min.js.map +1 -1
  9. package/bundles/c8y-ngx-components-repository.umd.js +1 -1
  10. package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
  11. package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
  12. package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
  13. package/bundles/c8y-ngx-components-sensor-phone.umd.js +1 -1
  14. package/bundles/c8y-ngx-components-sensor-phone.umd.js.map +1 -1
  15. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js +1 -1
  16. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js.map +1 -1
  17. package/bundles/c8y-ngx-components.umd.js +400 -131
  18. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  19. package/bundles/c8y-ngx-components.umd.min.js +2 -2
  20. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  21. package/c8y-ngx-components.d.ts +90 -87
  22. package/c8y-ngx-components.metadata.json +1 -1
  23. package/connectivity/c8y-ngx-components-connectivity.metadata.json +1 -1
  24. package/context-dashboard/c8y-ngx-components-context-dashboard.metadata.json +1 -1
  25. package/core/authentication/new-password.component.d.ts +8 -6
  26. package/core/docs/guide-docs.component.d.ts +25 -3
  27. package/core/forms/validation-pattern.d.ts +1 -0
  28. package/core/i18n/force-html-translate.directive.d.ts +32 -0
  29. package/core/login/change-password.component.d.ts +1 -1
  30. package/core/login/login.service.d.ts +15 -2
  31. package/core/login/password-strength-validator.directive.d.ts +9 -0
  32. package/core/login/strength-validator-service.d.ts +7 -0
  33. package/core/user/user-edit.component.d.ts +4 -2
  34. package/esm2015/c8y-ngx-components.js +90 -87
  35. package/esm2015/connectivity/impact/impact-provider-settings.component.js +2 -2
  36. package/esm2015/context-dashboard/legacy-welcome/legacy-welcome.component.js +2 -2
  37. package/esm2015/core/authentication/new-password.component.js +15 -20
  38. package/esm2015/core/dashboard/widgets-dashboard.component.js +2 -2
  39. package/esm2015/core/docs/guide-docs.component.js +69 -4
  40. package/esm2015/core/forms/validation-pattern.js +2 -1
  41. package/esm2015/core/i18n/force-html-translate.directive.js +99 -0
  42. package/esm2015/core/i18n/i18n.module.js +5 -3
  43. package/esm2015/core/i18n/pattern-messages.data.js +2 -2
  44. package/esm2015/core/login/change-password.component.js +5 -5
  45. package/esm2015/core/login/credentials.component.js +2 -2
  46. package/esm2015/core/login/login.module.js +4 -2
  47. package/esm2015/core/login/login.service.js +40 -6
  48. package/esm2015/core/login/password-strength-validator.directive.js +32 -0
  49. package/esm2015/core/login/strength-validator-service.js +28 -0
  50. package/esm2015/core/user/user-edit.component.js +10 -5
  51. package/esm2015/repository/configuration/configuration-list.component.js +2 -2
  52. package/esm2015/sensor-phone/sensor-phone-modal.component.js +2 -2
  53. package/esm5/c8y-ngx-components.js +90 -87
  54. package/esm5/connectivity/impact/impact-provider-settings.component.js +2 -2
  55. package/esm5/context-dashboard/legacy-welcome/legacy-welcome.component.js +2 -2
  56. package/esm5/core/authentication/new-password.component.js +21 -25
  57. package/esm5/core/dashboard/widgets-dashboard.component.js +2 -2
  58. package/esm5/core/docs/guide-docs.component.js +72 -4
  59. package/esm5/core/forms/validation-pattern.js +2 -1
  60. package/esm5/core/i18n/force-html-translate.directive.js +105 -0
  61. package/esm5/core/i18n/i18n.module.js +5 -3
  62. package/esm5/core/i18n/pattern-messages.data.js +2 -2
  63. package/esm5/core/login/change-password.component.js +5 -5
  64. package/esm5/core/login/credentials.component.js +2 -2
  65. package/esm5/core/login/login.module.js +4 -2
  66. package/esm5/core/login/login.service.js +43 -6
  67. package/esm5/core/login/password-strength-validator.directive.js +38 -0
  68. package/esm5/core/login/strength-validator-service.js +29 -0
  69. package/esm5/core/user/user-edit.component.js +19 -9
  70. package/esm5/repository/configuration/configuration-list.component.js +2 -2
  71. package/esm5/sensor-phone/sensor-phone-modal.component.js +2 -2
  72. package/fesm2015/c8y-ngx-components-connectivity.js +1 -1
  73. package/fesm2015/c8y-ngx-components-connectivity.js.map +1 -1
  74. package/fesm2015/c8y-ngx-components-context-dashboard.js +1 -1
  75. package/fesm2015/c8y-ngx-components-context-dashboard.js.map +1 -1
  76. package/fesm2015/c8y-ngx-components-repository.js +1 -1
  77. package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
  78. package/fesm2015/c8y-ngx-components-sensor-phone.js +1 -1
  79. package/fesm2015/c8y-ngx-components-sensor-phone.js.map +1 -1
  80. package/fesm2015/c8y-ngx-components.js +281 -40
  81. package/fesm2015/c8y-ngx-components.js.map +1 -1
  82. package/fesm5/c8y-ngx-components-connectivity.js +1 -1
  83. package/fesm5/c8y-ngx-components-connectivity.js.map +1 -1
  84. package/fesm5/c8y-ngx-components-context-dashboard.js +1 -1
  85. package/fesm5/c8y-ngx-components-context-dashboard.js.map +1 -1
  86. package/fesm5/c8y-ngx-components-repository.js +1 -1
  87. package/fesm5/c8y-ngx-components-repository.js.map +1 -1
  88. package/fesm5/c8y-ngx-components-sensor-phone.js +1 -1
  89. package/fesm5/c8y-ngx-components-sensor-phone.js.map +1 -1
  90. package/fesm5/c8y-ngx-components.js +315 -49
  91. package/fesm5/c8y-ngx-components.js.map +1 -1
  92. package/locales/de.po +71 -60
  93. package/locales/es.po +120 -85
  94. package/locales/fr.po +107 -72
  95. package/locales/ja_JP.po +89 -78
  96. package/locales/ko.po +92 -57
  97. package/locales/locales.pot +9 -9
  98. package/locales/nl.po +95 -60
  99. package/locales/pl.po +88 -53
  100. package/locales/pt_BR.po +174 -138
  101. package/locales/ru.po +120 -85
  102. package/locales/zh_CN.po +87 -52
  103. package/package.json +2 -2
  104. package/repository/c8y-ngx-components-repository.metadata.json +1 -1
  105. package/sensor-phone/c8y-ngx-components-sensor-phone.metadata.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import * as tslib_1 from "tslib";
2
2
  import { Injectable, Optional } from '@angular/core';
3
- import { FetchClient, BasicAuth, ICredentials, Realtime, UserService, TenantService, IAuthentication, CookieAuth, ITenantLoginOption, } from '@c8y/client';
3
+ import { FetchClient, BasicAuth, ICredentials, Realtime, UserService, TenantService, IAuthentication, CookieAuth, ITenantLoginOption } from '@c8y/client';
4
4
  import { AppStateService } from '../common/ui-state.service';
5
5
  import { AlertService } from '../alert/alert.service';
6
6
  import { gettext } from '../i18n/gettext';
@@ -9,7 +9,7 @@ import { switchMap } from 'rxjs/operators';
9
9
  import { EMPTY } from 'rxjs';
10
10
  import { LocationStrategy } from '@angular/common';
11
11
  import { TenantLoginOptionsService } from '@c8y/client';
12
- import { get } from 'lodash-es';
12
+ import { get, isString } from 'lodash-es';
13
13
  /**
14
14
  * Service to manage the login.
15
15
  */
@@ -60,6 +60,7 @@ var LoginService = /** @class */ (function () {
60
60
  };
61
61
  this.passwordStrengthSetting = {
62
62
  enforcePasswordStrength: false,
63
+ passwordStrengthValidity: false,
63
64
  greenMinLength: this.GREEN_MIN_LENGTH_DEFAULT
64
65
  };
65
66
  this.localhostRegExp = new RegExp('localhost');
@@ -154,14 +155,50 @@ var LoginService = /** @class */ (function () {
154
155
  return this.passwordStrengthSetting.greenMinLength;
155
156
  };
156
157
  /**
157
- * Checks if password strength is enforced.
158
- * @return true if enforced.
158
+ * Checks if password strength is enforced for system
159
+ * by retrieving value of `enforceStrength` property from loginOptions response
160
+ * @return boolean value, true if enforced, false otherwise.
159
161
  */
160
162
  LoginService.prototype.getEnforcePasswordStrength = function () {
161
163
  var loginOption = this.getLoginOption();
162
- this.passwordStrengthSetting.enforcePasswordStrength = get(loginOption, 'enforceStrength', 'false') === 'true' ? true : false;
164
+ var enforcePasswordStrength = get(loginOption, 'enforceStrength');
165
+ if (isString(enforcePasswordStrength)) {
166
+ this.passwordStrengthSetting.enforcePasswordStrength = enforcePasswordStrength === 'true' ? true : false;
167
+ }
168
+ else {
169
+ this.passwordStrengthSetting.enforcePasswordStrength = !!enforcePasswordStrength;
170
+ }
163
171
  return this.passwordStrengthSetting.enforcePasswordStrength;
164
172
  };
173
+ /**
174
+ * Checks if password strength is enforced for particular tenant
175
+ * by retrieving value of `strengthValidity` property from loginOptions response
176
+ * @return boolean value, true if enforced, false otherwise.
177
+ */
178
+ LoginService.prototype.getPasswordStrengthValidity = function () {
179
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
180
+ var loginOption, strengthValidity;
181
+ return tslib_1.__generator(this, function (_a) {
182
+ loginOption = this.getLoginOption();
183
+ strengthValidity = get(loginOption, 'strengthValidity');
184
+ if (isString(strengthValidity)) {
185
+ this.passwordStrengthSetting.passwordStrengthValidity = strengthValidity === 'true' ? true : false;
186
+ }
187
+ else {
188
+ this.passwordStrengthSetting.passwordStrengthValidity = !!strengthValidity;
189
+ }
190
+ return [2 /*return*/, this.passwordStrengthSetting.passwordStrengthValidity];
191
+ });
192
+ });
193
+ };
194
+ /**
195
+ * Function determines if enforced strength checks should be enabled for current tenant
196
+ * based on properties retrieved from loginOptions
197
+ * @return boolean value, true if strength is enforced for tenant, false otherwise.
198
+ */
199
+ LoginService.prototype.getPasswordStrengthEnforced = function () {
200
+ return this.getEnforcePasswordStrength() || this.getPasswordStrengthValidity();
201
+ };
165
202
  /**
166
203
  * Clears all backend errors.
167
204
  */
@@ -569,4 +606,4 @@ var LoginService = /** @class */ (function () {
569
606
  return LoginService;
570
607
  }());
571
608
  export { LoginService };
572
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb3JlL2xvZ2luL2xvZ2luLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixlQUFlLEVBQ2YsVUFBVSxFQUNWLGtCQUFrQixHQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEM7O0dBRUc7QUFFSDtJQTZERSxzQkFDVSxNQUFtQixFQUNuQixTQUFvQixFQUNwQixVQUFzQixFQUN0QixFQUFtQixFQUNuQixJQUFpQixFQUNqQixNQUFxQixFQUNyQixRQUFrQixFQUNsQixLQUFtQixFQUNuQixHQUFlLEVBQ2YseUJBQW9ELEVBQ3hDLFFBQTBCO1FBVnRDLFdBQU0sR0FBTixNQUFNLENBQWE7UUFDbkIsY0FBUyxHQUFU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QUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDZCxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNuQixDQUFDO0lBQ0osQ0FBQzs7Z0JBdGJpQixXQUFXO2dCQUNSLFNBQVM7Z0JBQ1IsVUFBVTtnQkFDbEIsZUFBZTtnQkFDYixXQUFXO2dCQUNULGFBQWE7Z0JBQ1gsUUFBUTtnQkFDWCxZQUFZO2dCQUNkLFVBQVU7Z0JBQ1kseUJBQXlCO2dCQUM5QixnQkFBZ0IsdUJBQTdDLFFBQVE7O0lBeEVBLFlBQVk7UUFEeEIsVUFBVSxFQUFFO1FBeUVSLG9CQUFBLFFBQVEsRUFBRSxDQUFBO09BeEVGLFlBQVksQ0FxZnhCO0lBQUQsbUJBQUM7Q0FBQSxBQXJmRCxJQXFmQztTQXJmWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZldGNoQ2xpZW50LFxuICBCYXNpY0F1dGgsXG4gIElDcmVkZW50aWFscyxcbiAgUmVhbHRpbWUsXG4gIFVzZXJTZXJ2aWNlLFxuICBUZW5hbnRTZXJ2aWNlLFxuICBJQXV0aGVudGljYXRpb24sXG4gIENvb2tpZUF1dGgsXG4gIElUZW5hbnRMb2dpbk9wdGlvbixcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VpLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnLi4vaTE4bi9nZXR0ZXh0JztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2FwaSc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFTVBUWSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9jYXRpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBUZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG1hbmFnZSB0aGUgbG9naW4uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2dpblNlcnZpY2Uge1xuICByZW1lbWJlck1lOiBib29sZWFuID0gZmFsc2U7XG4gIFRPS0VOX0tFWTogc3RyaW5nID0gJ190Y3k4JztcbiAgVEZBVE9LRU5fS0VZOiBzdHJpbmcgPSAnVEZBVG9rZW4nO1xuICBPQVVUSDJfSU5URVJOQUxfVFlQRTogc3RyaW5nID0gJ09BVVRIMl9JTlRFUk5BTCc7XG4gIGxvZ2luTW9kZTogYW55O1xuICBvYXV0aE9wdGlvbnM6IGFueTtcbiAgaXNGaXJzdExvZ2luID0gdHJ1ZTtcbiAgR1JFRU5fTUlOX0xFTkdUSF9ERUZBVUxUID0gODtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgRVJST1JfTUVTU0FHRVMgPSB7XG4gICAgbWlubGVuZ3RoOiBnZXR0ZXh0KCdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIuJyksXG4gICAgcGFzc3dvcmRfbWlzc21hdGNoOiBnZXR0ZXh0KCdQYXNzd29yZCBjb25maXJtYXRpb24gZG9lcyBub3QgbWF0Y2guJyksXG4gICAgbWF4bGVuZ3RoOiBnZXR0ZXh0KCdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIuJyksXG4gICAgcGFzc3dvcmRfc3RyZW5ndGg6IGdldHRleHQoXG4gICAgICAnWW91ciBwYXNzd29yZCBpcyBub3Qgc3Ryb25nIGVub3VnaC4gUGxlYXNlIGluY2x1ZGUgbnVtYmVycywgbG93ZXIgYW5kIHVwcGVyIGNhc2UgY2hhcmFjdGVycydcbiAgICApLFxuICAgIHJlbW90ZV9lcnJvcjogZ2V0dGV4dCgnU2VydmVyIGVycm9yIG9jY3VycmVkLicpLFxuICAgIGVtYWlsOiBnZXR0ZXh0KCdJbnZhbGlkIGVtYWlsIGFkZHJlc3MuJyksXG4gICAgcGFzc3dvcmRfY2hhbmdlOiBnZXR0ZXh0KCdZb3VyIHBhc3N3b3JkIGlzIGV4cGlyZWQuIFBsZWFzZSBzZXQgYSBuZXcgcGFzc3dvcmQuJyksXG4gICAgcGFzc3dvcmRfcmVzZXRfdG9rZW5fZXhwaXJlZDogZ2V0dGV4dChcbiAgICAgICdQYXNzd29yZCByZXNldCBsaW5rIGV4cGlyZWQuIFBsZWFzZSBlbnRlciB5b3VyIGVtYWlsIGFkZHJlc3MgdG8gcmVjZWl2ZSBhIG5ldyBvbmUuJ1xuICAgICksXG4gICAgdGZhX3Bpbl9pbnZhbGlkOiBnZXR0ZXh0KCdUaGUgY29kZSB5b3UgZW50ZXJlZCBpcyBpbnZhbGlkLiBQbGVhc2UgdHJ5IGFnYWluLicpLFxuICAgIHBhdHRlcm5fcGhvbmVudW1iZXI6IGdldHRleHQoXG4gICAgICAnSW52YWxpZCBwaG9uZSBudW1iZXIgZm9ybWF0LiBPbmx5IGRpZ2l0cywgc3BhY2VzLCBzbGFzaGVzIChcIi9cIikgYW5kIGRhc2hlcyAoXCItXCIpIGFsbG93ZWQuJ1xuICAgICksXG4gICAgcGF0dGVybl9uZXdQYXNzd29yZDogZ2V0dGV4dChcbiAgICAgICdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIgYW5kIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycyBhbmQgZm9sbG93aW5nIHN5bWJvbHM6IGB+IUAjJCVeJiooKV98Ky09Pzs6XFwnXCIsLjw+e31bXVxcXFwvJ1xuICAgICksXG4gICAgaW50ZXJuYXRpb25hbF9udW1iZXJfcmVxdWlyZWQ6IGdldHRleHQoXG4gICAgICAnSW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXIgcmVxdWlyZWQsIGluIHRoZSBmb3JtYXQgKzQ5IDkgODc2IDU0MyAyMTAuJ1xuICAgICksXG4gICAgcGhvbmVfbnVtYmVyX2Vycm9yOiBnZXR0ZXh0KCdDb3VsZCBub3QgdXBkYXRlIHBob25lIG51bWJlci4nKSxcbiAgICBwaW5BbHJlYWR5U2VudDogZ2V0dGV4dChcbiAgICAgICdUaGUgdmVyaWZpY2F0aW9uIGNvZGUgd2FzIGFscmVhZHkgc2VudC4gRm9yIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLCBwbGVhc2UgY2xpY2sgb24gdGhlIGxpbmsgYWJvdmUuJ1xuICAgICksXG4gICAgcGFzc3dvcmRDb25maXJtOiBnZXR0ZXh0KCdQYXNzd29yZCBjb25maXJtYXRpb24gZG9lcyBub3QgbWF0Y2guJyksXG4gICAgdGZhRXhwaXJlZDogZ2V0dGV4dCgnVHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiB0b2tlbiBleHBpcmVkLicpXG4gIH07XG4gIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgcHJpdmF0ZSBTVUNDRVNTX01FU1NBR0VTID0ge1xuICAgIHBhc3N3b3JkX2NoYW5nZWQ6IGdldHRleHQoJ1Bhc3N3b3JkIGNoYW5nZWQuIFlvdSBjYW4gbm93IGxvZyBpbiB1c2luZyBuZXcgcGFzc3dvcmQuJyksXG4gICAgcGFzc3dvcmRfcmVzZXRfcmVxdWVzdGVkOiBnZXR0ZXh0KFxuICAgICAgJ1Bhc3N3b3JkIHJlc2V0IHJlcXVlc3QgaGFzIGJlZW4gc2VudC4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJ1xuICAgICksXG4gICAgcmVzZW5kX3NtczogZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgU01TIHJlc2VudC4nKSxcbiAgICBzZW5kX3NtczogZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgU01TIHNlbnQuJylcbiAgfTtcblxuICBwcml2YXRlIHBhc3N3b3JkU3RyZW5ndGhTZXR0aW5nID0ge1xuICAgIGVuZm9yY2VQYXNzd29yZFN0cmVuZ3RoOiBmYWxzZSxcbiAgICBncmVlbk1pbkxlbmd0aDogdGhpcy5HUkVFTl9NSU5fTEVOR1RIX0RFRkFVTFRcbiAgfTtcblxuICBwcml2YXRlIGxvY2FsaG9zdFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ2xvY2FsaG9zdCcpO1xuICBwcml2YXRlIGxvY2FsaG9zdElwUmVnRXhwID0gbmV3IFJlZ0V4cCgnMTI3LjAuMC4xJyk7XG4gIHByaXZhdGUgc2hvd1RlbmFudFJlZ0V4cCA9IG5ldyBSZWdFeHAoJ3Nob3dUZW5hbnQnKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNsaWVudDogRmV0Y2hDbGllbnQsXG4gICAgcHJpdmF0ZSBiYXNpY0F1dGg6IEJhc2ljQXV0aCxcbiAgICBwcml2YXRlIGNvb2tpZUF1dGg6IENvb2tpZUF1dGgsXG4gICAgcHJpdmF0ZSB1aTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZW5hbnQ6IFRlbmFudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFsdGltZTogUmVhbHRpbWUsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBpOiBBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50TG9naW5PcHRpb25zU2VydmljZTogVGVuYW50TG9naW5PcHRpb25zU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvblN0cmF0ZWd5XG4gICkge1xuICAgIHRoaXMuYXV0b0xvZ291dCgpO1xuICAgIHRoaXMuaW5pdExvZ2luT3B0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGVuYW50LlxuICAgKiBAcmV0dXJuIFRoZSB0ZW5hbnQgbmFtZS5cbiAgICovXG4gIGdldFRlbmFudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudGVuYW50O1xuICB9XG5cbiAgaW5pdExvZ2luT3B0aW9ucygpIHtcbiAgICBjb25zdCBsb2dpbk9wdGlvbnMgPSB0aGlzLnVpLnN0YXRlLmxvZ2luT3B0aW9ucyB8fCBbXTtcbiAgICBjb25zdCBpc09BdXRoMiA9ICh7IHR5cGUsIGdyYW50VHlwZSB9KSA9PlxuICAgICAgdHlwZSA9PT0gJ09BVVRIMicgJiYgZ3JhbnRUeXBlID09PSAnQVVUSE9SSVpBVElPTl9DT0RFJztcbiAgICB0aGlzLmxvZ2luTW9kZSA9IGxvZ2luT3B0aW9ucy5maW5kKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ09BVVRIMl9JTlRFUk5BTCcpIHx8XG4gICAgICBsb2dpbk9wdGlvbnMuZmluZCgoeyB0eXBlIH0pID0+IHR5cGUgPT09ICdCQVNJQycpIHx8XG4gICAgICBsb2dpbk9wdGlvbnMuZmluZChpc09BdXRoMikgfHwgeyB0eXBlOiAnQkFTSUMnIH07XG4gICAgdGhpcy5vYXV0aE9wdGlvbnMgPSBsb2dpbk9wdGlvbnMuZmluZChpc09BdXRoMikgfHwge307XG4gIH1cblxuICByZWRpcmVjdFRvT2F1dGgoKSB7XG4gICAgY29uc3QgeyBpbml0UmVxdWVzdCB9ID0gdGhpcy5vYXV0aE9wdGlvbnM7XG4gICAgY29uc3QgZnVsbFBhdGggPSAodGhpcy5sb2NhdGlvbiA/ICh0aGlzLmxvY2F0aW9uIGFzIGFueSkuX3BsYXRmb3JtTG9jYXRpb24gOiB3aW5kb3cpLmxvY2F0aW9uXG4gICAgICAuaHJlZjtcbiAgICBjb25zdCByZWRpcmVjdFVybCA9IGVuY29kZVVSSUNvbXBvbmVudChmdWxsUGF0aCk7XG4gICAgY29uc3Qgb3JpZ2luVXJpUGFyYW0gPSBgJHtpbml0UmVxdWVzdC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nfW9yaWdpblVyaT0ke3JlZGlyZWN0VXJsfWA7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgJHtpbml0UmVxdWVzdH0ke29yaWdpblVyaVBhcmFtfWA7XG4gIH1cblxuICBhdXRvTG9nb3V0KCkge1xuICAgIGNvbnN0IGVycm9yUGF0dGVybiA9IC9pbnZhbGlkXFxzY3JlZGVudGlhbHMuKnBpbi4qZ2VuZXJhdGUvaTtcbiAgICBjb25zdCBpc1RmYUV4cGlyZWQgPSBkYXRhID0+XG4gICAgICBkYXRhICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIGVycm9yUGF0dGVybi50ZXN0KGRhdGEubWVzc2FnZSk7XG4gICAgdGhpcy51aS5jdXJyZW50VXNlclxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCh1ID0+XG4gICAgICAgICAgdSA/IHRoaXMuYXBpLmhvb2tSZXNwb25zZSgoeyByZXNwb25zZSB9KSA9PiByZXNwb25zZS5zdGF0dXMgPT09IDQwMSkgOiBFTVBUWVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKGFzeW5jIChhcGlDYWxsOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyByZXNwb25zZSB9ID0gYXBpQ2FsbDtcbiAgICAgICAgbGV0IHdpbGxMb2dvdXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzVGZhRXhwaXJlZChyZXNwb25zZS5kYXRhKSkge1xuICAgICAgICAgIHdpbGxMb2dvdXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2UuanNvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmNsb25lKCkuanNvbigpO1xuICAgICAgICAgICAgaWYgKGlzVGZhRXhwaXJlZChkYXRhKSkge1xuICAgICAgICAgICAgICB3aWxsTG9nb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpbGxMb2dvdXQpIHtcbiAgICAgICAgICB0aGlzLmxvZ291dChmYWxzZSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFsZXJ0LmRhbmdlcih0aGlzLkVSUk9SX01FU1NBR0VTLnRmYUV4cGlyZWQpLCA1MDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBtaW5pbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYSBwYXNzd29yZCBzaG91bGQgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGEg4oCcZ3JlZW7igJ0gc3Ryb25nIG9uZS5cbiAgICogQHJldHVybiBUaGUgbWluIGxlbmd0aCBmb3IgcGFzc3dvcmQgb3IgZGVmYXVsdCB2YWx1ZS5cbiAgICovXG4gIGdldEdyZWVuTWluTGVuZ3RoKCkge1xuICAgIGNvbnN0IGxvZ2luT3B0aW9uID0gdGhpcy5nZXRMb2dpbk9wdGlvbigpO1xuICAgIGNvbnN0IGdyZWVuTWluTGVuZ3RoID0gTnVtYmVyKGdldChsb2dpbk9wdGlvbiwgJ2dyZWVuTWluTGVuZ3RoJykpO1xuICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcuZ3JlZW5NaW5MZW5ndGggPSBpc05hTihncmVlbk1pbkxlbmd0aCkgPyB0aGlzLkdSRUVOX01JTl9MRU5HVEhfREVGQVVMVCA6IGdyZWVuTWluTGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnBhc3N3b3JkU3RyZW5ndGhTZXR0aW5nLmdyZWVuTWluTGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBwYXNzd29yZCBzdHJlbmd0aCBpcyBlbmZvcmNlZC5cbiAgICogQHJldHVybiB0cnVlIGlmIGVuZm9yY2VkLlxuICAgKi9cbiAgZ2V0RW5mb3JjZVBhc3N3b3JkU3RyZW5ndGgoKSB7XG4gICAgY29uc3QgbG9naW5PcHRpb24gPSB0aGlzLmdldExvZ2luT3B0aW9uKCk7XG4gICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoU2V0dGluZy5lbmZvcmNlUGFzc3dvcmRTdHJlbmd0aCA9IGdldChsb2dpbk9wdGlvbiwgJ2VuZm9yY2VTdHJlbmd0aCcsICdmYWxzZScpID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XG4gICAgcmV0dXJuIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcuZW5mb3JjZVBhc3N3b3JkU3RyZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFsbCBiYWNrZW5kIGVycm9ycy5cbiAgICovXG4gIGNsZWFuTWVzc2FnZXMoKSB7XG4gICAgdGhpcy5hbGVydC5jbGVhckFsbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgc3VjY2VzcyBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdWNjZXNzS2V5IFRoZSBrZXkgb2YgdGhlIHN1Y2Nlc3MgbWVzc2FnZSBhcyB1c2VkIGluIFNVQ0NFU1NfTUVTU0FHRVNcbiAgICovXG4gIGFkZFN1Y2Nlc3NNZXNzYWdlKHN1Y2Nlc3NLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHN1Y2Nlc3NNZXNzYWdlID0gdGhpcy5TVUNDRVNTX01FU1NBR0VTW3N1Y2Nlc3NLZXldO1xuICAgIGlmIChzdWNjZXNzTWVzc2FnZSkge1xuICAgICAgdGhpcy5hbGVydC5hZGQoe1xuICAgICAgICB0ZXh0OiBzdWNjZXNzTWVzc2FnZSxcbiAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICB0aW1lb3V0OiAwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdHJhdGVneS4gRGVmYXVsdHMgdG8gY29va2llLCBpZiBhIHRva2VuXG4gICAqIGlzIGZvdW5kIGluIGxvY2FsIG9yIHNlc3Npb24gc3RvcmFnZSB3ZSBzd2l0Y2ggdG8gYmFzaWMgYXV0aC5cbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgYXV0aCBzdHJhdGVneS5cbiAgICovXG4gIGdldEF1dGhTdHJhdGVneSgpOiBJQXV0aGVudGljYXRpb24ge1xuICAgIGxldCBhdXRoU3RyYXRlZ3kgPSB0aGlzLmNvb2tpZUF1dGggYXMgSUF1dGhlbnRpY2F0aW9uO1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRTdG9yZWRUb2tlbigpO1xuICAgIGNvbnN0IHRmYSA9IHRoaXMuZ2V0U3RvcmVkVGZhVG9rZW4oKTtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGF1dGhTdHJhdGVneSA9IHRoaXMuYmFzaWNBdXRoO1xuICAgICAgdGhpcy5zZXRDcmVkZW50aWFscyh7IHRva2VuLCB0ZmEgfSwgdGhpcy5iYXNpY0F1dGgpO1xuICAgIH1cbiAgICByZXR1cm4gYXV0aFN0cmF0ZWd5O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlcyB0aGUgdXNlIG9mIGJhc2ljIGF1dGggYXMgc3RyYXRlZ3kgd2l0aCB0aGlzIGNyZWRlbnRpYWxzLlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgVGhlIGNyZWRlbnRpYWxzIHRvIHVzZS5cbiAgICovXG4gIHVzZUJhc2ljQXV0aChjcmVkZW50aWFsczogSUNyZWRlbnRpYWxzKSB7XG4gICAgdGhpcy5zZXRDcmVkZW50aWFscyhjcmVkZW50aWFscywgdGhpcy5iYXNpY0F1dGgpO1xuICAgIHJldHVybiB0aGlzLmJhc2ljQXV0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byBsb2dpbiBhIHVzZXIgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXG4gICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBjdXJyZW50IHRlbmFudCBhbmQgdXNlciBpcyBzZXQuIElmIG5vdCBhbiBlcnJvclxuICAgKiBpcyB0aHJvd24uIEl0IGFsc28gdmVyaWZpZXMgaWYgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBvcGVuIHRoZVxuICAgKiBjdXJyZW50IGFwcC5cbiAgICogQHBhcmFtIGF1dGggVGhlIGF1dGhlbnRpY2F0aW9uIHN0cmF0ZWd5IHVzZWQuXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyBUaGUgY3JlZGVudGlhbHMgdG8gdHJ5IHRvIGxvZ2luLlxuICAgKi9cbiAgYXN5bmMgbG9naW4oYXV0aDogSUF1dGhlbnRpY2F0aW9uID0gdGhpcy5nZXRBdXRoU3RyYXRlZ3koKSwgY3JlZGVudGlhbHM/OiBJQ3JlZGVudGlhbHMpIHtcbiAgICB0aGlzLmNsaWVudC5zZXRBdXRoKGF1dGgpO1xuXG4gICAgY29uc3QgdGVuYW50UmVzID0gYXdhaXQgdGhpcy50ZW5hbnQuY3VycmVudCgpO1xuICAgIGNvbnN0IHRlbmFudCA9IHRlbmFudFJlcy5kYXRhO1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuc3dpdGNoTG9naW5Nb2RlKGNyZWRlbnRpYWxzKSkge1xuICAgICAgYXV0aCA9IHRoaXMuY29va2llQXV0aDtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyUmVzID0gYXdhaXQgdGhpcy51c2VyLmN1cnJlbnQoKTtcbiAgICBjb25zdCB1c2VyID0gdXNlclJlcy5kYXRhO1xuICAgIGF3YWl0IHRoaXMudmVyaWZ5QXBwQWNjZXNzKCk7XG5cbiAgICBjb25zdCBzdXBwb3J0VXNlck5hbWUgPSB0aGlzLmdldFN1cHBvcnRVc2VyTmFtZShjcmVkZW50aWFscyk7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnNldENyZWRlbnRpYWxzKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudC5uYW1lLFxuICAgICAgICB1c2VyOiAoc3VwcG9ydFVzZXJOYW1lID8gYCR7c3VwcG9ydFVzZXJOYW1lfSRgIDogJycpICsgdXNlci51c2VyTmFtZVxuICAgICAgfSxcbiAgICAgIGF1dGhcbiAgICApO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB0aGlzLnN0b3JlQmFzaWNBdXRoVG9rZW4odG9rZW4pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYXV0aEZ1bGZpbGxlZCh0ZW5hbnQsIHVzZXIsIHN1cHBvcnRVc2VyTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGVuYW50LCB1c2VyIGFuZCBzdXBwb3J0IHVzZXIgaW5mbyB0byB0aGUgYXBwIHN0YXRlLlxuICAgKiBAcGFyYW0gdGVuYW50IFRoZSBjdXJyZW50IHRlbmFudCBvYmplY3QuXG4gICAqIEBwYXJhbSB1c2VyIFRoZSBjdXJyZW50IHVzZXIgb2JqZWN0LlxuICAgKiBAcGFyYW0gc3VwcG9ydFVzZXJOYW1lIFRoZSBjdXJyZW50IHN1cHBvcnQgdXNlciBuYW1lLlxuICAgKi9cbiAgYXN5bmMgYXV0aEZ1bGZpbGxlZCh0ZW5hbnQ/LCB1c2VyPywgc3VwcG9ydFVzZXJOYW1lPykge1xuICAgIGlmICghdGVuYW50KSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMudGVuYW50LmN1cnJlbnQoKTtcbiAgICAgIHRlbmFudCA9IGRhdGE7XG4gICAgICB0aGlzLmNsaWVudC50ZW5hbnQgPSB0ZW5hbnQubmFtZTtcbiAgICB9XG5cbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy51c2VyLmN1cnJlbnQoKTtcbiAgICAgIHVzZXIgPSBkYXRhO1xuICAgIH1cblxuICAgIGlmICghc3VwcG9ydFVzZXJOYW1lKSB7XG4gICAgICBzdXBwb3J0VXNlck5hbWUgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudWkuc2V0VXNlcih7IHVzZXIsIHN1cHBvcnRVc2VyTmFtZSB9KTtcbiAgICB0aGlzLnVpLmN1cnJlbnRUZW5hbnQubmV4dCh0ZW5hbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgbG9naW4gbW9kZSB0byBDb29raWVBdXRoIGlmIHRoZVxuICAgKiB1c2VyIGhhcyBjb25maWd1cmVkIHRvIHVzZSBpdCBpbiBsb2dpbk9wdGlvbnMuXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyBUaGUgY3JlZGVudGlhbHMgZm9yIHRoYXQgbG9naW5cbiAgICovXG4gIGFzeW5jIHN3aXRjaExvZ2luTW9kZShjcmVkZW50aWFscz86IElDcmVkZW50aWFscykge1xuICAgIGNvbnN0IGlzUGFzc3dvcmRHcmFudExvZ2luID0gdGhpcy5pc1Bhc3N3b3JkR3JhbnRMb2dpbihjcmVkZW50aWFscyk7XG4gICAgaWYgKGlzUGFzc3dvcmRHcmFudExvZ2luICYmIGNyZWRlbnRpYWxzKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgZ3JhbnRfdHlwZTogJ1BBU1NXT1JEJyxcbiAgICAgICAgdXNlcm5hbWU6IGNyZWRlbnRpYWxzLnVzZXIsXG4gICAgICAgIHBhc3N3b3JkOiBjcmVkZW50aWFscy5wYXNzd29yZCxcbiAgICAgICAgdGZhX2NvZGU6IGNyZWRlbnRpYWxzLnRmYVxuICAgICAgfSk7XG4gICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMubG9naW5Nb2RlLmluaXRSZXF1ZXN0LnNwbGl0KCc/JykucG9wKCkpO1xuICAgICAgY3JlZGVudGlhbHMudGVuYW50ID0gdXJsUGFyYW1zLmdldCgndGVuYW50X2lkJyk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgdGVuYW50L29hdXRoPyR7dXJsUGFyYW1zLnRvU3RyaW5nKCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogcGFyYW1zLnRvU3RyaW5nKCksXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04J1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghKHJlcyBhcyBSZXNwb25zZSkub2spIHtcbiAgICAgICAgdGhyb3cgeyByZXMgfTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xpZW50LnNldEF1dGgodGhpcy5jb29raWVBdXRoKTtcbiAgICAgIHRoaXMuY2xlYW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICAgIHRoaXMuYmFzaWNBdXRoLmxvZ291dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNQYXNzd29yZEdyYW50TG9naW47XG4gIH1cblxuICBpc1Bhc3N3b3JkR3JhbnRMb2dpbihjcmVkZW50aWFscz86IElDcmVkZW50aWFscykge1xuICAgIGNvbnN0IGlzU3VwcG9ydFVzZXIgPSBjcmVkZW50aWFscyAmJiBjcmVkZW50aWFscy51c2VyLmluY2x1ZGVzKCckJyk7XG4gICAgcmV0dXJuICEhKFxuICAgICAgIWlzU3VwcG9ydFVzZXIgJiZcbiAgICAgIHRoaXMubG9naW5Nb2RlICYmXG4gICAgICB0aGlzLmxvZ2luTW9kZS50eXBlID09PSB0aGlzLk9BVVRIMl9JTlRFUk5BTF9UWVBFXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiB0aGUgdGVuYW50IGlucHV0IGZpZWxkIHNob3VsZCBiZSBzaG93blxuICAgKiBvciBub3QuXG4gICAqIEByZXR1cm5zIElmIHRydWUsIHNob3cgdGhlIHRlbmFudCBpbnB1dC5cbiAgICovXG4gIHNob3dUZW5hbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnVpLnN0YXRlLmxvZ2luT3B0aW9ucyB8fCB0aGlzLmlzTG9jYWwoKSB8fCB0aGlzLmlzU2hvd1RlbmFudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdGhlIHVzZXIgb3V0XG4gICAqIEBwYXJhbSByZWxvYWQgSWYgc2V0IHRvIGZhbHNlLCB0aGUgcGFnZSB3aWxsIG5vdCByZWxvYWRcbiAgICovXG4gIGFzeW5jIGxvZ291dChyZWxvYWQgPSB0cnVlKSB7XG4gICAgbGV0IHJlc0RhdGEgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbYmFzaWNSZXMsIGNvb2tpZVJlc10gPSBhd2FpdCB0aGlzLnJlc2V0KCk7XG4gICAgICByZXNEYXRhID0gYXdhaXQgY29va2llUmVzLmpzb24oKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydC5yZW1vdmVMYXN0RGFuZ2VyKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChyZXNEYXRhICYmIHJlc0RhdGEudXJsKSB7XG4gICAgICAgIHRoaXMucmVkaXJlY3QocmVzRGF0YS51cmwpO1xuICAgICAgfSBlbHNlIGlmIChyZWxvYWQpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlZCBhdXRoLWRhdGFcbiAgICovXG4gIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMuY2xlYW5Mb2NhbFN0b3JhZ2UoKTtcbiAgICB0aGlzLmNsZWFuU2Vzc2lvblN0b3JhZ2UoKTtcbiAgICB0aGlzLnJlYWx0aW1lLmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnVpLmN1cnJlbnRVc2VyLm5leHQobnVsbCk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFt0aGlzLmJhc2ljQXV0aC5sb2dvdXQoKSwgdGhpcy5jb29raWVBdXRoLmxvZ291dCgpXSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIFRGQSB0b2tlbiB0byBsb2NhbCBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB0ZmFUb2tlbiBUaGUgdGZhIHRva2VuIHRvIHNhdmUuXG4gICAqIEBwYXJhbSBzdG9yYWdlIFRoZSBzdG9yYWdlIHRvIHVzZSAobG9jYWwgb3Igc2Vzc2lvbikuXG4gICAqL1xuICBzYXZlVEZBVG9rZW4odGZhVG9rZW46IHN0cmluZywgc3RvcmFnZTogU3RvcmFnZSkge1xuICAgIHN0b3JhZ2Uuc2V0SXRlbSh0aGlzLlRGQVRPS0VOX0tFWSwgdGZhVG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIG1hbmlmZXN0IC0+IG9uIDQwMSB1c2VyIGhhcyBubyBhY2Nlc3MgdG8gdGhhdCBhcHBsaWNhdGlvblxuICAgKiBhbmQgd2UgdGhyb3cgdGhlIGVycm9yIHVwIHRvIHRoZSBsb2dpbiBmb3JtLlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5QXBwQWNjZXNzKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVpLmxvYWRNYW5pZmVzdCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBpZiAoIShleC5yZXMgJiYgZXgucmVzLnN0YXR1cyA9PT0gNDA0ICYmIHRoaXMuaXNMb2NhbCgpKSkge1xuICAgICAgICB0aHJvdyBleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdGVuYW50IHRvIHRoZSBjbGllbnQgYW5kIHVwZGF0ZXMgdGhlIGNyZWRlbnRpYWxzIG9uIHRoZVxuICAgKiBhdXRoIHN0cmF0ZWd5LlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgVGhlIG5hbWUgb2YgdGhlIHRlbmFudC5cbiAgICogQHBhcmFtIGF1dGhTdHJhdGVneSBUaGUgYXV0aGVudGljYXRpb24gc3RyYXRlZ3kgdXNlZC5cbiAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbiBpZiBiYXNpYyBhdXRoLCBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRDcmVkZW50aWFscyhjcmVkZW50aWFsczogSUNyZWRlbnRpYWxzLCBhdXRoU3RyYXRlZ3k6IElBdXRoZW50aWNhdGlvbikge1xuICAgIGlmIChjcmVkZW50aWFscy50ZW5hbnQpIHtcbiAgICAgIHRoaXMuY2xpZW50LnRlbmFudCA9IGNyZWRlbnRpYWxzLnRlbmFudDtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgYSB0b2tlbiBpcyBhbHJlYWR5IHNldCAoY2FzZSBmb3Igc3VwcG9ydCB1c2VyIGxvZ2luKVxuICAgIC8vIGlmIHllcyAtPiB3ZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHRoZSB1c2VyLCBhbmQgcmV1c2UgdGhlIHRva2VuXG4gICAgLy8gb2YgdGhlIHN1cHBvcnQgdXNlci5cbiAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBwYXNzIHVzZXIgYW5kIHRlbmFudCwgdG8gZ2V0XG4gICAgLy8ganVzdCB0aGUgc3RvcmVkIHRva2VuIGFuZCBub3RoaW5nIGVsc2UgKHNlZSBCYXNpY0F1dGgudHM6MzEpLlxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5iYXNpY0F1dGgudXBkYXRlQ3JlZGVudGlhbHMoe1xuICAgICAgdGVuYW50OiBjcmVkZW50aWFscy50ZW5hbnQsXG4gICAgICB1c2VyOiBjcmVkZW50aWFscy51c2VyXG4gICAgfSk7XG4gICAgY29uc3QgbmV3Q3JlZGVudGlhbHMgPSB7IHRva2VuLCAuLi5jcmVkZW50aWFscyB9O1xuXG4gICAgcmV0dXJuIGF1dGhTdHJhdGVneS51cGRhdGVDcmVkZW50aWFscyhuZXdDcmVkZW50aWFscyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaWYgdGhlIGN1cnJlbnQgdXNlciBpcyBhIGRldmVsb3BlciBvciBub3QuXG4gICAqIFJ1bm5pbmcgb24gbG9jYWxob3N0IG1lYW5zIGRldmVsb3BtZW50IG1vZGUuXG4gICAqL1xuICBwcml2YXRlIGlzTG9jYWwoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxob3N0SXBSZWdFeHAudGVzdChob3N0bmFtZSkgfHwgdGhpcy5sb2NhbGhvc3RSZWdFeHAudGVzdChob3N0bmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGUgdG9rZW4gdG8gbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlLlxuICAgKiBAcGFyYW0gdG9rZW4gVGhlIHRva2VuIHRvIHNhdmUuXG4gICAqIEBwYXJhbSBzdG9yYWdlIFRoZSBzdG9yYWdlIHRvIHVzZSAobG9jYWwgb3Igc2Vzc2lvbikuXG4gICAqL1xuICBwcml2YXRlIHNhdmVUb2tlbih0b2tlbjogc3RyaW5nLCBzdG9yYWdlOiBTdG9yYWdlKSB7XG4gICAgc3RvcmFnZS5zZXRJdGVtKHRoaXMuVE9LRU5fS0VZLCB0b2tlbik7XG4gIH1cblxuICBwcml2YXRlIHN0b3JlQmFzaWNBdXRoVG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIHRoaXMuc2F2ZVRva2VuKHRva2VuLCBzZXNzaW9uU3RvcmFnZSk7XG4gICAgaWYgKHRoaXMucmVtZW1iZXJNZSkge1xuICAgICAgdGhpcy5zYXZlVG9rZW4odG9rZW4sIGxvY2FsU3RvcmFnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkxvY2FsU3RvcmFnZSgpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlRPS0VOX0tFWSk7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5URkFUT0tFTl9LRVkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblNlc3Npb25TdG9yYWdlKCkge1xuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5UT0tFTl9LRVkpO1xuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5URkFUT0tFTl9LRVkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Nob3dUZW5hbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd1RlbmFudFJlZ0V4cC50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVkaXJlY3QodXJsOiBzdHJpbmcpIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9naW5PcHRpb24oKTogSVRlbmFudExvZ2luT3B0aW9uIHtcbiAgICBjb25zdCBsb2dpbk9wdGlvbnMgPSB0aGlzLnVpLnN0YXRlLmxvZ2luT3B0aW9ucyB8fCBbXTtcbiAgICBjb25zdCBbbG9naW5PcHRpb25dID0gbG9naW5PcHRpb25zO1xuICAgIHJldHVybiBsb2dpbk9wdGlvbjtcbiAgfVxuICAvKipcbiAgICogR2V0cyBzdXBwb3J0IHVzZXIgbmFtZSBmcm9tIGNyZWRlbnRpYWxzLlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgQ3JlZGVudGlhbHMgb2JqZWN0IChkZWZhdWx0cyB0byB0aGUgc3RvcmVkIG9uZSkuXG4gICAqIEByZXR1cm5zIFN1cHBvcnQgdXNlciBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdXBwb3J0VXNlck5hbWUoY3JlZGVudGlhbHM6IElDcmVkZW50aWFscyA9IHRoaXMuZ2V0U3RvcmVkQ3JlZGVudGlhbHMoKSk6IHN0cmluZyB7XG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHN1cHBvcnRVc2VyTmFtZSA9IGNyZWRlbnRpYWxzLnVzZXIubWF0Y2goL14oLitcXC8pPygoLispXFwkKT8oLispPyQvKVszXTtcbiAgICByZXR1cm4gc3VwcG9ydFVzZXJOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY3JlZGVudGlhbHMgb2JqZWN0IGZyb20gdGhlIHN0b3JlZCB0b2tlbi5cbiAgICogQHJldHVybnMgQ3JlZGVudGlhbHMgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdG9yZWRDcmVkZW50aWFscygpOiBJQ3JlZGVudGlhbHMge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRTdG9yZWRUb2tlbigpO1xuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWNvZGVUb2tlbih0b2tlbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzdG9yZWQgdG9rZW4gZnJvbSBsb2NhbCBzdG9yYWdlIG9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICogQHJldHVybnMgU3RvcmVkIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdG9yZWRUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlRPS0VOX0tFWSkgfHwgc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlRPS0VOX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBzdG9yZWQgVEZBIHRva2VuIGZyb20gbG9jYWwgc3RvcmFnZSBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqIEByZXR1cm5zIFN0b3JlZCBURkEgdG9rZW4uXG4gICAqL1xuICBwcml2YXRlIGdldFN0b3JlZFRmYVRva2VuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuVEZBVE9LRU5fS0VZKSB8fCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuVEZBVE9LRU5fS0VZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIHRva2VuIHRvIGNyZWRlbnRpYWxzIG9iamVjdC5cbiAgICogQHBhcmFtIHRva2VuIFRva2VuIHRvIGRlY29kZS5cbiAgICogQHJldHVybnMgQ3JlZGVudGlhbHMgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVUb2tlbih0b2tlbjogc3RyaW5nKTogSUNyZWRlbnRpYWxzIHtcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZSh3aW5kb3cuYXRvYih0b2tlbikpKTtcbiAgICBjb25zdCBzcGxpdCA9IGRlY29kZWQubWF0Y2goLygoW14vXSopXFwvKT8oW14vOl0rKTooLispLyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50OiBzcGxpdFsyXSxcbiAgICAgIHVzZXI6IHNwbGl0WzNdLFxuICAgICAgcGFzc3dvcmQ6IHNwbGl0WzRdXG4gICAgfTtcbiAgfVxufVxuIl19
609
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb3JlL2xvZ2luL2xvZ2luLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixlQUFlLEVBQ2YsVUFBVSxFQUNWLGtCQUFrQixFQUNuQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFDOztHQUVHO0FBRUg7SUE4REUsc0JBQ1UsTUFBbUIsRUFDbkIsU0FBb0IsRUFDcEIsVUFBc0IsRUFDdEIsRUFBbUIsRUFDbkIsSUFBaUIsRUFDakIsTUFBcUIsRUFDckIsUUFBa0IsRUFDbEIsS0FBbUIsRUFDbkIsR0FBZSxFQUNmLHlCQUFvRCxFQUN4QyxRQUEwQjtRQVZ0QyxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixPQUFFLEdBQUYsRUFBRSxDQUFpQjtRQUNuQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTJCO1FBQ3hDLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBeEVoRCxlQUFVLEdBQVksS0FBSyxDQUFDO1FBQzVCLGNBQVMsR0FBVyxPQUFPLENBQUM7UUFDNUIsaUJBQVksR0FBVyxVQUFVLENBQUM7UUFDbEMseUJBQW9CLEdBQVcsaUJBQWlCLENBQUM7UUFHakQsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsNkJBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLGlDQUFpQztRQUNqQyxtQkFBYyxHQUFHO1lBQ2YsU0FBUyxFQUFFLE9BQU8sQ0FBQywrREFBK0QsQ0FBQztZQUNuRixrQkFBa0IsRUFBRSxPQUFPLENBQUMsdUNBQXVDLENBQUM7WUFDcEUsU0FBUyxFQUFFLE9BQU8sQ0FBQywrREFBK0QsQ0FBQztZQUNuRixpQkFBaUIsRUFBRSxPQUFPLENBQ3hCLDZGQUE2RixDQUM5RjtZQUNELFlBQVksRUFBRSxPQUFPLENBQUMsd0JBQXdCLENBQUM7WUFDL0MsS0FBSyxFQUFFLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztZQUN4QyxlQUFlLEVBQUUsT0FBTyxDQUFDLHNEQUFzRCxDQUFDO1lBQ2hGLDRCQUE0QixFQUFFLE9BQU8sQ0FDbkMsb0ZBQW9GLENBQ3JGO1lBQ0QsZUFBZSxFQUFFLE9BQU8sQ0FBQyxvREFBb0QsQ0FBQztZQUM5RSxtQkFBbUIsRUFBRSxPQUFPLENBQzFCLDJGQUEyRixDQUM1RjtZQUNELG1CQUFtQixFQUFFLE9BQU8sQ0FDMUIsOEpBQThKLENBQy9KO1lBQ0QsNkJBQTZCLEVBQUUsT0FBTyxDQUNwQyx1RUFBdUUsQ0FDeEU7WUFDRCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsZ0NBQWdDLENBQUM7WUFDN0QsY0FBYyxFQUFFLE9BQU8sQ0FDckIsc0dBQXNHLENBQ3ZHO1lBQ0QsZUFBZSxFQUFFLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQztZQUNqRSxVQUFVLEVBQUUsT0FBTyxDQUFDLDBDQUEwQyxDQUFDO1NBQ2hFLENBQUM7UUFDRixnQ0FBZ0M7UUFFeEIscUJBQWdCLEdBQUc7WUFDekIsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLDBEQUEwRCxDQUFDO1lBQ3JGLHdCQUF3QixFQUFFLE9BQU8sQ0FDL0IsZ0VBQWdFLENBQ2pFO1lBQ0QsVUFBVSxFQUFFLE9BQU8sQ0FBQywrQkFBK0IsQ0FBQztZQUNwRCxRQUFRLEVBQUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDO1NBQ2pELENBQUM7UUFFTSw0QkFBdUIsR0FBRztZQUNoQyx1QkFBdUIsRUFBRSxLQUFLO1lBQzlCLHdCQUF3QixFQUFFLEtBQUs7WUFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyx3QkFBd0I7U0FDOUMsQ0FBQztRQUVNLG9CQUFlLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsc0JBQWlCLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUMscUJBQWdCLEdBQUcsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFlbEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQ0FBUyxHQUFUO1FBQ0UsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsdUNBQWdCLEdBQWhCO1FBQ0UsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFNLFFBQVEsR0FBRyxVQUFDLEVBQW1CO2dCQUFqQixjQUFJLEVBQUUsd0JBQVM7WUFDakMsT0FBQSxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsS0FBSyxvQkFBb0I7UUFBdkQsQ0FBdUQsQ0FBQztRQUMxRCxJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBQyxFQUFRO2dCQUFOLGNBQUk7WUFBTyxPQUFBLElBQUksS0FBSyxpQkFBaUI7UUFBMUIsQ0FBMEIsQ0FBQztZQUMxRSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQUMsRUFBUTtvQkFBTixjQUFJO2dCQUFPLE9BQUEsSUFBSSxLQUFLLE9BQU87WUFBaEIsQ0FBZ0IsQ0FBQztZQUNqRCxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVELHNDQUFlLEdBQWY7UUFDVSxJQUFBLDJDQUFXLENBQXVCO1FBQzFDLElBQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLFFBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVE7YUFDMUYsSUFBSSxDQUFDO1FBQ1IsSUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakQsSUFBTSxjQUFjLEdBQUcsQ0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQWEsV0FBYSxDQUFDO1FBQzFGLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEtBQUcsV0FBVyxHQUFHLGNBQWdCLENBQUM7SUFDM0QsQ0FBQztJQUVELGlDQUFVLEdBQVY7UUFBQSxpQkE0QkM7UUEzQkMsSUFBTSxZQUFZLEdBQUcsc0NBQXNDLENBQUM7UUFDNUQsSUFBTSxZQUFZLEdBQUcsVUFBQSxJQUFJO1lBQ3ZCLE9BQUEsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQTNFLENBQTJFLENBQUM7UUFDOUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXO2FBQ2hCLElBQUksQ0FDSCxTQUFTLENBQUMsVUFBQSxDQUFDO1lBQ1QsT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFVBQUMsRUFBWTtvQkFBVixzQkFBUTtnQkFBTyxPQUFBLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRztZQUF2QixDQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7UUFBNUUsQ0FBNEUsQ0FDN0UsQ0FDRjthQUNBLFNBQVMsQ0FBQyxVQUFPLE9BQVk7Ozs7Ozt3QkFDcEIsUUFBUSxHQUFLLE9BQU8sU0FBWixDQUFhO3dCQUN6QixVQUFVLEdBQUcsS0FBSyxDQUFDOzZCQUNuQixZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUEzQix3QkFBMkI7d0JBQzdCLFVBQVUsR0FBRyxJQUFJLENBQUM7Ozs2QkFFZCxDQUFBLE9BQU8sUUFBUSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUEsRUFBbkMsd0JBQW1DO3dCQUN4QixxQkFBTSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFwQyxJQUFJLEdBQUcsU0FBNkI7d0JBQzFDLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUN0QixVQUFVLEdBQUcsSUFBSSxDQUFDO3lCQUNuQjs7O3dCQUdMLElBQUksVUFBVSxFQUFFOzRCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ25CLFVBQVUsQ0FBQyxjQUFNLE9BQUEsS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBakQsQ0FBaUQsRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDMUU7Ozs7YUFDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsd0NBQWlCLEdBQWpCO1FBQ0UsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLElBQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDckgsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0YsaURBQTBCLEdBQTFCO1FBQ0MsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLElBQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3BFLElBQUksUUFBUSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLHVCQUF1QixHQUFHLHVCQUF1QixLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDMUc7YUFBTTtZQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsdUJBQXVCLENBQUM7U0FDbEY7UUFDRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNHLGtEQUEyQixHQUFqQzs7OztnQkFDUSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7Z0JBQzlELElBQUksUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7b0JBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsR0FBRyxnQkFBZ0IsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNwRztxQkFBTTtvQkFDTCxJQUFJLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO2lCQUM1RTtnQkFDRCxzQkFBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLEVBQUM7OztLQUM5RDtJQUVEOzs7O09BSUc7SUFDSCxrREFBMkIsR0FBM0I7UUFDRSxPQUFPLElBQUksQ0FBQywwQkFBMEIsRUFBRSxJQUFLLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO0lBQ2xGLENBQUM7SUFFRDs7T0FFRztJQUNILG9DQUFhLEdBQWI7UUFDRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3Q0FBaUIsR0FBakIsVUFBa0IsVUFBa0I7UUFDbEMsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUNiLElBQUksRUFBRSxjQUFjO2dCQUNwQixJQUFJLEVBQUUsU0FBUztnQkFDZixPQUFPLEVBQUUsQ0FBQzthQUNYLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQ0FBZSxHQUFmO1FBQ0UsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQTZCLENBQUM7UUFDdEQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3BDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3JDLElBQUksS0FBSyxFQUFFO1lBQ1QsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEtBQUssT0FBQSxFQUFFLEdBQUcsS0FBQSxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILG1DQUFZLEdBQVosVUFBYSxXQUF5QjtRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0csNEJBQUssR0FBWCxVQUFZLElBQThDLEVBQUUsV0FBMEI7UUFBMUUscUJBQUEsRUFBQSxPQUF3QixJQUFJLENBQUMsZUFBZSxFQUFFOzs7Ozs7d0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUVSLHFCQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUE7O3dCQUF2QyxTQUFTLEdBQUcsU0FBMkI7d0JBQ3ZDLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO3dCQUUxQixxQkFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFBOzt3QkFBM0MsSUFBSSxTQUF1QyxFQUFFOzRCQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzt5QkFDeEI7d0JBRWUscUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBQTs7d0JBQW5DLE9BQU8sR0FBRyxTQUF5Qjt3QkFDbkMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0JBQzFCLHFCQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBQTs7d0JBQTVCLFNBQTRCLENBQUM7d0JBRXZCLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ3ZELEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUMvQjs0QkFDRSxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUk7NEJBQ25CLElBQUksRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUksZUFBZSxNQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRO3lCQUNyRSxFQUNELElBQUksQ0FDTCxDQUFDO3dCQUVGLElBQUksS0FBSyxFQUFFOzRCQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDakM7d0JBRUQscUJBQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxFQUFBOzt3QkFBdkQsU0FBdUQsQ0FBQzs7Ozs7S0FDekQ7SUFFRDs7Ozs7T0FLRztJQUNHLG9DQUFhLEdBQW5CLFVBQW9CLE1BQU8sRUFBRSxJQUFLLEVBQUUsZUFBZ0I7Ozs7Ozs2QkFDOUMsQ0FBQyxNQUFNLEVBQVAsd0JBQU87d0JBQ1EscUJBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBQTs7d0JBQXBDLElBQUksR0FBSyxDQUFBLFNBQTJCLENBQUEsS0FBaEM7d0JBQ1osTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDOzs7NkJBRy9CLENBQUMsSUFBSSxFQUFMLHdCQUFLO3dCQUNVLHFCQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUE7O3dCQUFsQyxJQUFJLEdBQUssQ0FBQSxTQUF5QixDQUFBLEtBQTlCO3dCQUNaLElBQUksR0FBRyxJQUFJLENBQUM7Ozt3QkFHZCxJQUFJLENBQUMsZUFBZSxFQUFFOzRCQUNwQixlQUFlLEdBQUcsSUFBSSxDQUFDO3lCQUN4Qjt3QkFFRCxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksTUFBQSxFQUFFLGVBQWUsaUJBQUEsRUFBRSxDQUFDLENBQUM7d0JBQzNDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7S0FDcEM7SUFFRDs7OztPQUlHO0lBQ0csc0NBQWUsR0FBckIsVUFBc0IsV0FBMEI7Ozs7Ozt3QkFDeEMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDOzZCQUNoRSxDQUFBLG9CQUFvQixJQUFJLFdBQVcsQ0FBQSxFQUFuQyx3QkFBbUM7d0JBQy9CLE1BQU0sR0FBRyxJQUFJLGVBQWUsQ0FBQzs0QkFDakMsVUFBVSxFQUFFLFVBQVU7NEJBQ3RCLFFBQVEsRUFBRSxXQUFXLENBQUMsSUFBSTs0QkFDMUIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFROzRCQUM5QixRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUc7eUJBQzFCLENBQUMsQ0FBQzt3QkFDRyxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7d0JBQ25GLFdBQVcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDcEMscUJBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWdCLFNBQVMsQ0FBQyxRQUFRLEVBQUksRUFBRTtnQ0FDMUUsTUFBTSxFQUFFLE1BQU07Z0NBQ2QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0NBQ3ZCLE9BQU8sRUFBRTtvQ0FDUCxjQUFjLEVBQUUsaURBQWlEO2lDQUNsRTs2QkFDRixDQUFDLEVBQUE7O3dCQU5JLEdBQUcsR0FBRyxTQU1WO3dCQUNGLElBQUksQ0FBRSxHQUFnQixDQUFDLEVBQUUsRUFBRTs0QkFDekIsTUFBTSxFQUFFLEdBQUcsS0FBQSxFQUFFLENBQUM7eUJBQ2Y7d0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7NEJBRTFCLHNCQUFPLG9CQUFvQixFQUFDOzs7O0tBQzdCO0lBRUQsMkNBQW9CLEdBQXBCLFVBQXFCLFdBQTBCO1FBQzdDLElBQU0sYUFBYSxHQUFHLFdBQVcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxPQUFPLENBQUMsQ0FBQyxDQUNQLENBQUMsYUFBYTtZQUNkLElBQUksQ0FBQyxTQUFTO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLG9CQUFvQixDQUNsRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQ0FBVSxHQUFWO1FBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlFLENBQUM7SUFFRDs7O09BR0c7SUFDRyw2QkFBTSxHQUFaLFVBQWEsTUFBYTtRQUFiLHVCQUFBLEVBQUEsYUFBYTs7Ozs7O3dCQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDOzs7O3dCQUVhLHFCQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBQTs7d0JBQTFDLEtBQUEsOEJBQXdCLFNBQWtCLEtBQUEsRUFBekMsUUFBUSxRQUFBLEVBQUUsU0FBUyxRQUFBO3dCQUNoQixxQkFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUE7O3dCQUFoQyxPQUFPLEdBQUcsU0FBc0IsQ0FBQzs7Ozt3QkFFakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOzs7d0JBRTlCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7NEJBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUM1Qjs2QkFBTSxJQUFJLE1BQU0sRUFBRTs0QkFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQzt5QkFDMUI7Ozs7OztLQUVKO0lBRUQ7O09BRUc7SUFDRyw0QkFBSyxHQUFYOzs7Z0JBQ0UsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLHNCQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDOzs7S0FDekU7SUFFRDs7OztPQUlHO0lBQ0gsbUNBQVksR0FBWixVQUFhLFFBQWdCLEVBQUUsT0FBZ0I7UUFDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDRyxzQ0FBZSxHQUFyQjs7Ozs7Ozt3QkFFSSxxQkFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFBOzt3QkFBNUIsU0FBNEIsQ0FBQzs7Ozt3QkFFN0IsSUFBSSxDQUFDLENBQUMsSUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7NEJBQ3hELE1BQU0sSUFBRSxDQUFDO3lCQUNWOzs7Ozs7S0FFSjtJQUVEOzs7Ozs7T0FNRztJQUNLLHFDQUFjLEdBQXRCLFVBQXVCLFdBQXlCLEVBQUUsWUFBNkI7UUFDN0UsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDekM7UUFDRCxnRUFBZ0U7UUFDaEUsaUVBQWlFO1FBQ2pFLHVCQUF1QjtRQUN2QixvREFBb0Q7UUFDcEQsZ0VBQWdFO1FBQ2hFLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7WUFDN0MsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1lBQzFCLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtTQUN2QixDQUFDLENBQUM7UUFDSCxJQUFNLGNBQWMsc0JBQUssS0FBSyxPQUFBLElBQUssV0FBVyxDQUFFLENBQUM7UUFFakQsT0FBTyxZQUFZLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDhCQUFPLEdBQWY7UUFDRSxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQ0FBUyxHQUFqQixVQUFrQixLQUFhLEVBQUUsT0FBZ0I7UUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTywwQ0FBbUIsR0FBM0IsVUFBNEIsS0FBYTtRQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRU8sd0NBQWlCLEdBQXpCO1FBQ0UsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLDBDQUFtQixHQUEzQjtRQUNFLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFTyxtQ0FBWSxHQUFwQjtRQUNFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTywrQkFBUSxHQUFoQixVQUFpQixHQUFXO1FBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBRU8scUNBQWMsR0FBdEI7UUFDRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ2hELElBQUEsb0NBQTRCLEVBQTNCLG1CQUEyQixDQUFDO1FBQ25DLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0sseUNBQWtCLEdBQTFCLFVBQTJCLFdBQXVEO1FBQXZELDRCQUFBLEVBQUEsY0FBNEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1FBQ2hGLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0UsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDJDQUFvQixHQUE1QjtRQUNFLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUNBQWMsR0FBdEI7UUFDRSxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3Q0FBaUIsR0FBekI7UUFDRSxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0NBQVcsR0FBbkIsVUFBb0IsS0FBYTtRQUMvQixJQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRXpELE9BQU87WUFDTCxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNkLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ25CLENBQUM7SUFDSixDQUFDOztnQkF0ZGlCLFdBQVc7Z0JBQ1IsU0FBUztnQkFDUixVQUFVO2dCQUNsQixlQUFlO2dCQUNiLFdBQVc7Z0JBQ1QsYUFBYTtnQkFDWCxRQUFRO2dCQUNYLFlBQVk7Z0JBQ2QsVUFBVTtnQkFDWSx5QkFBeUI7Z0JBQzlCLGdCQUFnQix1QkFBN0MsUUFBUTs7SUF6RUEsWUFBWTtRQUR4QixVQUFVLEVBQUU7UUEwRVIsb0JBQUEsUUFBUSxFQUFFLENBQUE7T0F6RUYsWUFBWSxDQXNoQnhCO0lBQUQsbUJBQUM7Q0FBQSxBQXRoQkQsSUFzaEJDO1NBdGhCWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEZldGNoQ2xpZW50LFxuICBCYXNpY0F1dGgsXG4gIElDcmVkZW50aWFscyxcbiAgUmVhbHRpbWUsXG4gIFVzZXJTZXJ2aWNlLFxuICBUZW5hbnRTZXJ2aWNlLFxuICBJQXV0aGVudGljYXRpb24sXG4gIENvb2tpZUF1dGgsXG4gIElUZW5hbnRMb2dpbk9wdGlvblxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuL2dldHRleHQnO1xuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvYXBpJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEVNUFRZIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb2NhdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRlbmFudExvZ2luT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXQsIGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG1hbmFnZSB0aGUgbG9naW4uXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2dpblNlcnZpY2Uge1xuICByZW1lbWJlck1lOiBib29sZWFuID0gZmFsc2U7XG4gIFRPS0VOX0tFWTogc3RyaW5nID0gJ190Y3k4JztcbiAgVEZBVE9LRU5fS0VZOiBzdHJpbmcgPSAnVEZBVG9rZW4nO1xuICBPQVVUSDJfSU5URVJOQUxfVFlQRTogc3RyaW5nID0gJ09BVVRIMl9JTlRFUk5BTCc7XG4gIGxvZ2luTW9kZTogYW55O1xuICBvYXV0aE9wdGlvbnM6IGFueTtcbiAgaXNGaXJzdExvZ2luID0gdHJ1ZTtcbiAgR1JFRU5fTUlOX0xFTkdUSF9ERUZBVUxUID0gODtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgRVJST1JfTUVTU0FHRVMgPSB7XG4gICAgbWlubGVuZ3RoOiBnZXR0ZXh0KCdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIuJyksXG4gICAgcGFzc3dvcmRfbWlzc21hdGNoOiBnZXR0ZXh0KCdQYXNzd29yZCBjb25maXJtYXRpb24gZG9lcyBub3QgbWF0Y2guJyksXG4gICAgbWF4bGVuZ3RoOiBnZXR0ZXh0KCdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIuJyksXG4gICAgcGFzc3dvcmRfc3RyZW5ndGg6IGdldHRleHQoXG4gICAgICAnWW91ciBwYXNzd29yZCBpcyBub3Qgc3Ryb25nIGVub3VnaC4gUGxlYXNlIGluY2x1ZGUgbnVtYmVycywgbG93ZXIgYW5kIHVwcGVyIGNhc2UgY2hhcmFjdGVycydcbiAgICApLFxuICAgIHJlbW90ZV9lcnJvcjogZ2V0dGV4dCgnU2VydmVyIGVycm9yIG9jY3VycmVkLicpLFxuICAgIGVtYWlsOiBnZXR0ZXh0KCdJbnZhbGlkIGVtYWlsIGFkZHJlc3MuJyksXG4gICAgcGFzc3dvcmRfY2hhbmdlOiBnZXR0ZXh0KCdZb3VyIHBhc3N3b3JkIGlzIGV4cGlyZWQuIFBsZWFzZSBzZXQgYSBuZXcgcGFzc3dvcmQuJyksXG4gICAgcGFzc3dvcmRfcmVzZXRfdG9rZW5fZXhwaXJlZDogZ2V0dGV4dChcbiAgICAgICdQYXNzd29yZCByZXNldCBsaW5rIGV4cGlyZWQuIFBsZWFzZSBlbnRlciB5b3VyIGVtYWlsIGFkZHJlc3MgdG8gcmVjZWl2ZSBhIG5ldyBvbmUuJ1xuICAgICksXG4gICAgdGZhX3Bpbl9pbnZhbGlkOiBnZXR0ZXh0KCdUaGUgY29kZSB5b3UgZW50ZXJlZCBpcyBpbnZhbGlkLiBQbGVhc2UgdHJ5IGFnYWluLicpLFxuICAgIHBhdHRlcm5fcGhvbmVudW1iZXI6IGdldHRleHQoXG4gICAgICAnSW52YWxpZCBwaG9uZSBudW1iZXIgZm9ybWF0LiBPbmx5IGRpZ2l0cywgc3BhY2VzLCBzbGFzaGVzIChcIi9cIikgYW5kIGRhc2hlcyAoXCItXCIpIGFsbG93ZWQuJ1xuICAgICksXG4gICAgcGF0dGVybl9uZXdQYXNzd29yZDogZ2V0dGV4dChcbiAgICAgICdQYXNzd29yZCBtdXN0IGhhdmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBubyBtb3JlIHRoYW4gMzIgYW5kIGNhbiBvbmx5IGNvbnRhaW4gbGV0dGVycywgbnVtYmVycyBhbmQgZm9sbG93aW5nIHN5bWJvbHM6IGB+IUAjJCVeJiooKV98Ky09Pzs6XFwnXCIsLjw+e31bXVxcXFwvJ1xuICAgICksXG4gICAgaW50ZXJuYXRpb25hbF9udW1iZXJfcmVxdWlyZWQ6IGdldHRleHQoXG4gICAgICAnSW50ZXJuYXRpb25hbCBwaG9uZSBudW1iZXIgcmVxdWlyZWQsIGluIHRoZSBmb3JtYXQgKzQ5IDkgODc2IDU0MyAyMTAuJ1xuICAgICksXG4gICAgcGhvbmVfbnVtYmVyX2Vycm9yOiBnZXR0ZXh0KCdDb3VsZCBub3QgdXBkYXRlIHBob25lIG51bWJlci4nKSxcbiAgICBwaW5BbHJlYWR5U2VudDogZ2V0dGV4dChcbiAgICAgICdUaGUgdmVyaWZpY2F0aW9uIGNvZGUgd2FzIGFscmVhZHkgc2VudC4gRm9yIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLCBwbGVhc2UgY2xpY2sgb24gdGhlIGxpbmsgYWJvdmUuJ1xuICAgICksXG4gICAgcGFzc3dvcmRDb25maXJtOiBnZXR0ZXh0KCdQYXNzd29yZCBjb25maXJtYXRpb24gZG9lcyBub3QgbWF0Y2guJyksXG4gICAgdGZhRXhwaXJlZDogZ2V0dGV4dCgnVHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiB0b2tlbiBleHBpcmVkLicpXG4gIH07XG4gIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgcHJpdmF0ZSBTVUNDRVNTX01FU1NBR0VTID0ge1xuICAgIHBhc3N3b3JkX2NoYW5nZWQ6IGdldHRleHQoJ1Bhc3N3b3JkIGNoYW5nZWQuIFlvdSBjYW4gbm93IGxvZyBpbiB1c2luZyBuZXcgcGFzc3dvcmQuJyksXG4gICAgcGFzc3dvcmRfcmVzZXRfcmVxdWVzdGVkOiBnZXR0ZXh0KFxuICAgICAgJ1Bhc3N3b3JkIHJlc2V0IHJlcXVlc3QgaGFzIGJlZW4gc2VudC4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJ1xuICAgICksXG4gICAgcmVzZW5kX3NtczogZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgU01TIHJlc2VudC4nKSxcbiAgICBzZW5kX3NtczogZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgU01TIHNlbnQuJylcbiAgfTtcblxuICBwcml2YXRlIHBhc3N3b3JkU3RyZW5ndGhTZXR0aW5nID0ge1xuICAgIGVuZm9yY2VQYXNzd29yZFN0cmVuZ3RoOiBmYWxzZSxcbiAgICBwYXNzd29yZFN0cmVuZ3RoVmFsaWRpdHk6IGZhbHNlLFxuICAgIGdyZWVuTWluTGVuZ3RoOiB0aGlzLkdSRUVOX01JTl9MRU5HVEhfREVGQVVMVFxuICB9O1xuXG4gIHByaXZhdGUgbG9jYWxob3N0UmVnRXhwID0gbmV3IFJlZ0V4cCgnbG9jYWxob3N0Jyk7XG4gIHByaXZhdGUgbG9jYWxob3N0SXBSZWdFeHAgPSBuZXcgUmVnRXhwKCcxMjcuMC4wLjEnKTtcbiAgcHJpdmF0ZSBzaG93VGVuYW50UmVnRXhwID0gbmV3IFJlZ0V4cCgnc2hvd1RlbmFudCcpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2xpZW50OiBGZXRjaENsaWVudCxcbiAgICBwcml2YXRlIGJhc2ljQXV0aDogQmFzaWNBdXRoLFxuICAgIHByaXZhdGUgY29va2llQXV0aDogQ29va2llQXV0aCxcbiAgICBwcml2YXRlIHVpOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudDogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWx0aW1lOiBSZWFsdGltZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcGk6IEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlOiBUZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uU3RyYXRlZ3lcbiAgKSB7XG4gICAgdGhpcy5hdXRvTG9nb3V0KCk7XG4gICAgdGhpcy5pbml0TG9naW5PcHRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB0ZW5hbnQuXG4gICAqIEByZXR1cm4gVGhlIHRlbmFudCBuYW1lLlxuICAgKi9cbiAgZ2V0VGVuYW50KCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC50ZW5hbnQ7XG4gIH1cblxuICBpbml0TG9naW5PcHRpb25zKCkge1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHRoaXMudWkuc3RhdGUubG9naW5PcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IGlzT0F1dGgyID0gKHsgdHlwZSwgZ3JhbnRUeXBlIH0pID0+XG4gICAgICB0eXBlID09PSAnT0FVVEgyJyAmJiBncmFudFR5cGUgPT09ICdBVVRIT1JJWkFUSU9OX0NPREUnO1xuICAgIHRoaXMubG9naW5Nb2RlID0gbG9naW5PcHRpb25zLmZpbmQoKHsgdHlwZSB9KSA9PiB0eXBlID09PSAnT0FVVEgyX0lOVEVSTkFMJykgfHxcbiAgICAgIGxvZ2luT3B0aW9ucy5maW5kKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gJ0JBU0lDJykgfHxcbiAgICAgIGxvZ2luT3B0aW9ucy5maW5kKGlzT0F1dGgyKSB8fCB7IHR5cGU6ICdCQVNJQycgfTtcbiAgICB0aGlzLm9hdXRoT3B0aW9ucyA9IGxvZ2luT3B0aW9ucy5maW5kKGlzT0F1dGgyKSB8fCB7fTtcbiAgfVxuXG4gIHJlZGlyZWN0VG9PYXV0aCgpIHtcbiAgICBjb25zdCB7IGluaXRSZXF1ZXN0IH0gPSB0aGlzLm9hdXRoT3B0aW9ucztcbiAgICBjb25zdCBmdWxsUGF0aCA9ICh0aGlzLmxvY2F0aW9uID8gKHRoaXMubG9jYXRpb24gYXMgYW55KS5fcGxhdGZvcm1Mb2NhdGlvbiA6IHdpbmRvdykubG9jYXRpb25cbiAgICAgIC5ocmVmO1xuICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KGZ1bGxQYXRoKTtcbiAgICBjb25zdCBvcmlnaW5VcmlQYXJhbSA9IGAke2luaXRSZXF1ZXN0LmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyd9b3JpZ2luVXJpPSR7cmVkaXJlY3RVcmx9YDtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAke2luaXRSZXF1ZXN0fSR7b3JpZ2luVXJpUGFyYW19YDtcbiAgfVxuXG4gIGF1dG9Mb2dvdXQoKSB7XG4gICAgY29uc3QgZXJyb3JQYXR0ZXJuID0gL2ludmFsaWRcXHNjcmVkZW50aWFscy4qcGluLipnZW5lcmF0ZS9pO1xuICAgIGNvbnN0IGlzVGZhRXhwaXJlZCA9IGRhdGEgPT5cbiAgICAgIGRhdGEgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZXJyb3JQYXR0ZXJuLnRlc3QoZGF0YS5tZXNzYWdlKTtcbiAgICB0aGlzLnVpLmN1cnJlbnRVc2VyXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHUgPT5cbiAgICAgICAgICB1ID8gdGhpcy5hcGkuaG9va1Jlc3BvbnNlKCh7IHJlc3BvbnNlIH0pID0+IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSA6IEVNUFRZXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKGFwaUNhbGw6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlIH0gPSBhcGlDYWxsO1xuICAgICAgICBsZXQgd2lsbExvZ291dCA9IGZhbHNlO1xuICAgICAgICBpZiAoaXNUZmFFeHBpcmVkKHJlc3BvbnNlLmRhdGEpKSB7XG4gICAgICAgICAgd2lsbExvZ291dCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXNwb25zZS5qc29uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuY2xvbmUoKS5qc29uKCk7XG4gICAgICAgICAgICBpZiAoaXNUZmFFeHBpcmVkKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHdpbGxMb2dvdXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2lsbExvZ291dCkge1xuICAgICAgICAgIHRoaXMubG9nb3V0KGZhbHNlKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuYWxlcnQuZGFuZ2VyKHRoaXMuRVJST1JfTUVTU0FHRVMudGZhRXhwaXJlZCksIDUwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1pbmltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBhIHBhc3N3b3JkIHNob3VsZCBoYXZlIHRvIGJlIGNvbnNpZGVyZWQgYSDigJxncmVlbuKAnSBzdHJvbmcgb25lLlxuICAgKiBAcmV0dXJuIFRoZSBtaW4gbGVuZ3RoIGZvciBwYXNzd29yZCBvciBkZWZhdWx0IHZhbHVlLlxuICAgKi9cbiAgZ2V0R3JlZW5NaW5MZW5ndGgoKSB7XG4gICAgY29uc3QgbG9naW5PcHRpb24gPSB0aGlzLmdldExvZ2luT3B0aW9uKCk7XG4gICAgY29uc3QgZ3JlZW5NaW5MZW5ndGggPSBOdW1iZXIoZ2V0KGxvZ2luT3B0aW9uLCAnZ3JlZW5NaW5MZW5ndGgnKSk7XG4gICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoU2V0dGluZy5ncmVlbk1pbkxlbmd0aCA9IGlzTmFOKGdyZWVuTWluTGVuZ3RoKSA/IHRoaXMuR1JFRU5fTUlOX0xFTkdUSF9ERUZBVUxUIDogZ3JlZW5NaW5MZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcuZ3JlZW5NaW5MZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHBhc3N3b3JkIHN0cmVuZ3RoIGlzIGVuZm9yY2VkIGZvciBzeXN0ZW1cbiAgICogYnkgcmV0cmlldmluZyB2YWx1ZSBvZiBgZW5mb3JjZVN0cmVuZ3RoYCBwcm9wZXJ0eSBmcm9tIGxvZ2luT3B0aW9ucyByZXNwb25zZVxuICAgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUsIHRydWUgaWYgZW5mb3JjZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gICBnZXRFbmZvcmNlUGFzc3dvcmRTdHJlbmd0aCgpIHtcbiAgICBjb25zdCBsb2dpbk9wdGlvbiA9IHRoaXMuZ2V0TG9naW5PcHRpb24oKTtcbiAgICBjb25zdCBlbmZvcmNlUGFzc3dvcmRTdHJlbmd0aCA9IGdldChsb2dpbk9wdGlvbiwgJ2VuZm9yY2VTdHJlbmd0aCcpO1xuICAgIGlmIChpc1N0cmluZyhlbmZvcmNlUGFzc3dvcmRTdHJlbmd0aCkpIHtcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcuZW5mb3JjZVBhc3N3b3JkU3RyZW5ndGggPSBlbmZvcmNlUGFzc3dvcmRTdHJlbmd0aCA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhc3N3b3JkU3RyZW5ndGhTZXR0aW5nLmVuZm9yY2VQYXNzd29yZFN0cmVuZ3RoID0gISFlbmZvcmNlUGFzc3dvcmRTdHJlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcuZW5mb3JjZVBhc3N3b3JkU3RyZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHBhc3N3b3JkIHN0cmVuZ3RoIGlzIGVuZm9yY2VkIGZvciBwYXJ0aWN1bGFyIHRlbmFudFxuICAgKiBieSByZXRyaWV2aW5nIHZhbHVlIG9mIGBzdHJlbmd0aFZhbGlkaXR5YCBwcm9wZXJ0eSBmcm9tIGxvZ2luT3B0aW9ucyByZXNwb25zZVxuICAgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUsIHRydWUgaWYgZW5mb3JjZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGFzeW5jIGdldFBhc3N3b3JkU3RyZW5ndGhWYWxpZGl0eSgpIHtcbiAgICBjb25zdCBsb2dpbk9wdGlvbiA9IHRoaXMuZ2V0TG9naW5PcHRpb24oKTtcbiAgICBjb25zdCBzdHJlbmd0aFZhbGlkaXR5ID0gZ2V0KGxvZ2luT3B0aW9uLCAnc3RyZW5ndGhWYWxpZGl0eScpO1xuICAgIGlmIChpc1N0cmluZyhzdHJlbmd0aFZhbGlkaXR5KSkge1xuICAgICAgdGhpcy5wYXNzd29yZFN0cmVuZ3RoU2V0dGluZy5wYXNzd29yZFN0cmVuZ3RoVmFsaWRpdHkgPSBzdHJlbmd0aFZhbGlkaXR5ID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFzc3dvcmRTdHJlbmd0aFNldHRpbmcucGFzc3dvcmRTdHJlbmd0aFZhbGlkaXR5ID0gISFzdHJlbmd0aFZhbGlkaXR5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZFN0cmVuZ3RoU2V0dGluZy5wYXNzd29yZFN0cmVuZ3RoVmFsaWRpdHk7XG4gIH1cblxuICAvKipcbiAgICogRnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBlbmZvcmNlZCBzdHJlbmd0aCBjaGVja3Mgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIGN1cnJlbnQgdGVuYW50XG4gICAqIGJhc2VkIG9uIHByb3BlcnRpZXMgcmV0cmlldmVkIGZyb20gbG9naW5PcHRpb25zXG4gICAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZSwgdHJ1ZSBpZiBzdHJlbmd0aCBpcyBlbmZvcmNlZCBmb3IgdGVuYW50LCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBnZXRQYXNzd29yZFN0cmVuZ3RoRW5mb3JjZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5mb3JjZVBhc3N3b3JkU3RyZW5ndGgoKSB8fCAgdGhpcy5nZXRQYXNzd29yZFN0cmVuZ3RoVmFsaWRpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYWxsIGJhY2tlbmQgZXJyb3JzLlxuICAgKi9cbiAgY2xlYW5NZXNzYWdlcygpIHtcbiAgICB0aGlzLmFsZXJ0LmNsZWFyQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIG5ldyBzdWNjZXNzIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN1Y2Nlc3NLZXkgVGhlIGtleSBvZiB0aGUgc3VjY2VzcyBtZXNzYWdlIGFzIHVzZWQgaW4gU1VDQ0VTU19NRVNTQUdFU1xuICAgKi9cbiAgYWRkU3VjY2Vzc01lc3NhZ2Uoc3VjY2Vzc0tleTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3VjY2Vzc01lc3NhZ2UgPSB0aGlzLlNVQ0NFU1NfTUVTU0FHRVNbc3VjY2Vzc0tleV07XG4gICAgaWYgKHN1Y2Nlc3NNZXNzYWdlKSB7XG4gICAgICB0aGlzLmFsZXJ0LmFkZCh7XG4gICAgICAgIHRleHQ6IHN1Y2Nlc3NNZXNzYWdlLFxuICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgIHRpbWVvdXQ6IDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0cmF0ZWd5LiBEZWZhdWx0cyB0byBjb29raWUsIGlmIGEgdG9rZW5cbiAgICogaXMgZm91bmQgaW4gbG9jYWwgb3Igc2Vzc2lvbiBzdG9yYWdlIHdlIHN3aXRjaCB0byBiYXNpYyBhdXRoLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhdXRoIHN0cmF0ZWd5LlxuICAgKi9cbiAgZ2V0QXV0aFN0cmF0ZWd5KCk6IElBdXRoZW50aWNhdGlvbiB7XG4gICAgbGV0IGF1dGhTdHJhdGVneSA9IHRoaXMuY29va2llQXV0aCBhcyBJQXV0aGVudGljYXRpb247XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmdldFN0b3JlZFRva2VuKCk7XG4gICAgY29uc3QgdGZhID0gdGhpcy5nZXRTdG9yZWRUZmFUb2tlbigpO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgYXV0aFN0cmF0ZWd5ID0gdGhpcy5iYXNpY0F1dGg7XG4gICAgICB0aGlzLnNldENyZWRlbnRpYWxzKHsgdG9rZW4sIHRmYSB9LCB0aGlzLmJhc2ljQXV0aCk7XG4gICAgfVxuICAgIHJldHVybiBhdXRoU3RyYXRlZ3k7XG4gIH1cblxuICAvKipcbiAgICogRm9yY2VzIHRoZSB1c2Ugb2YgYmFzaWMgYXV0aCBhcyBzdHJhdGVneSB3aXRoIHRoaXMgY3JlZGVudGlhbHMuXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyBUaGUgY3JlZGVudGlhbHMgdG8gdXNlLlxuICAgKi9cbiAgdXNlQmFzaWNBdXRoKGNyZWRlbnRpYWxzOiBJQ3JlZGVudGlhbHMpIHtcbiAgICB0aGlzLnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzLCB0aGlzLmJhc2ljQXV0aCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzaWNBdXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIGxvZ2luIGEgdXNlciB3aXRoIHRoZSBnaXZlbiBjcmVkZW50aWFscy5cbiAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIGN1cnJlbnQgdGVuYW50IGFuZCB1c2VyIGlzIHNldC4gSWYgbm90IGFuIGVycm9yXG4gICAqIGlzIHRocm93bi4gSXQgYWxzbyB2ZXJpZmllcyBpZiB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIG9wZW4gdGhlXG4gICAqIGN1cnJlbnQgYXBwLlxuICAgKiBAcGFyYW0gYXV0aCBUaGUgYXV0aGVudGljYXRpb24gc3RyYXRlZ3kgdXNlZC5cbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFRoZSBjcmVkZW50aWFscyB0byB0cnkgdG8gbG9naW4uXG4gICAqL1xuICBhc3luYyBsb2dpbihhdXRoOiBJQXV0aGVudGljYXRpb24gPSB0aGlzLmdldEF1dGhTdHJhdGVneSgpLCBjcmVkZW50aWFscz86IElDcmVkZW50aWFscykge1xuICAgIHRoaXMuY2xpZW50LnNldEF1dGgoYXV0aCk7XG5cbiAgICBjb25zdCB0ZW5hbnRSZXMgPSBhd2FpdCB0aGlzLnRlbmFudC5jdXJyZW50KCk7XG4gICAgY29uc3QgdGVuYW50ID0gdGVuYW50UmVzLmRhdGE7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5zd2l0Y2hMb2dpbk1vZGUoY3JlZGVudGlhbHMpKSB7XG4gICAgICBhdXRoID0gdGhpcy5jb29raWVBdXRoO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJSZXMgPSBhd2FpdCB0aGlzLnVzZXIuY3VycmVudCgpO1xuICAgIGNvbnN0IHVzZXIgPSB1c2VyUmVzLmRhdGE7XG4gICAgYXdhaXQgdGhpcy52ZXJpZnlBcHBBY2Nlc3MoKTtcblxuICAgIGNvbnN0IHN1cHBvcnRVc2VyTmFtZSA9IHRoaXMuZ2V0U3VwcG9ydFVzZXJOYW1lKGNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2V0Q3JlZGVudGlhbHMoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50Lm5hbWUsXG4gICAgICAgIHVzZXI6IChzdXBwb3J0VXNlck5hbWUgPyBgJHtzdXBwb3J0VXNlck5hbWV9JGAgOiAnJykgKyB1c2VyLnVzZXJOYW1lXG4gICAgICB9LFxuICAgICAgYXV0aFxuICAgICk7XG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIHRoaXMuc3RvcmVCYXNpY0F1dGhUb2tlbih0b2tlbik7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hdXRoRnVsZmlsbGVkKHRlbmFudCwgdXNlciwgc3VwcG9ydFVzZXJOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0ZW5hbnQsIHVzZXIgYW5kIHN1cHBvcnQgdXNlciBpbmZvIHRvIHRoZSBhcHAgc3RhdGUuXG4gICAqIEBwYXJhbSB0ZW5hbnQgVGhlIGN1cnJlbnQgdGVuYW50IG9iamVjdC5cbiAgICogQHBhcmFtIHVzZXIgVGhlIGN1cnJlbnQgdXNlciBvYmplY3QuXG4gICAqIEBwYXJhbSBzdXBwb3J0VXNlck5hbWUgVGhlIGN1cnJlbnQgc3VwcG9ydCB1c2VyIG5hbWUuXG4gICAqL1xuICBhc3luYyBhdXRoRnVsZmlsbGVkKHRlbmFudD8sIHVzZXI/LCBzdXBwb3J0VXNlck5hbWU/KSB7XG4gICAgaWYgKCF0ZW5hbnQpIHtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy50ZW5hbnQuY3VycmVudCgpO1xuICAgICAgdGVuYW50ID0gZGF0YTtcbiAgICAgIHRoaXMuY2xpZW50LnRlbmFudCA9IHRlbmFudC5uYW1lO1xuICAgIH1cblxuICAgIGlmICghdXNlcikge1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLnVzZXIuY3VycmVudCgpO1xuICAgICAgdXNlciA9IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKCFzdXBwb3J0VXNlck5hbWUpIHtcbiAgICAgIHN1cHBvcnRVc2VyTmFtZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy51aS5zZXRVc2VyKHsgdXNlciwgc3VwcG9ydFVzZXJOYW1lIH0pO1xuICAgIHRoaXMudWkuY3VycmVudFRlbmFudC5uZXh0KHRlbmFudCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBsb2dpbiBtb2RlIHRvIENvb2tpZUF1dGggaWYgdGhlXG4gICAqIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdG8gdXNlIGl0IGluIGxvZ2luT3B0aW9ucy5cbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIFRoZSBjcmVkZW50aWFscyBmb3IgdGhhdCBsb2dpblxuICAgKi9cbiAgYXN5bmMgc3dpdGNoTG9naW5Nb2RlKGNyZWRlbnRpYWxzPzogSUNyZWRlbnRpYWxzKSB7XG4gICAgY29uc3QgaXNQYXNzd29yZEdyYW50TG9naW4gPSB0aGlzLmlzUGFzc3dvcmRHcmFudExvZ2luKGNyZWRlbnRpYWxzKTtcbiAgICBpZiAoaXNQYXNzd29yZEdyYW50TG9naW4gJiYgY3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBncmFudF90eXBlOiAnUEFTU1dPUkQnLFxuICAgICAgICB1c2VybmFtZTogY3JlZGVudGlhbHMudXNlcixcbiAgICAgICAgcGFzc3dvcmQ6IGNyZWRlbnRpYWxzLnBhc3N3b3JkLFxuICAgICAgICB0ZmFfY29kZTogY3JlZGVudGlhbHMudGZhXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModGhpcy5sb2dpbk1vZGUuaW5pdFJlcXVlc3Quc3BsaXQoJz8nKS5wb3AoKSk7XG4gICAgICBjcmVkZW50aWFscy50ZW5hbnQgPSB1cmxQYXJhbXMuZ2V0KCd0ZW5hbnRfaWQnKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGB0ZW5hbnQvb2F1dGg/JHt1cmxQYXJhbXMudG9TdHJpbmcoKX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBwYXJhbXMudG9TdHJpbmcoKSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLTgnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKCEocmVzIGFzIFJlc3BvbnNlKS5vaykge1xuICAgICAgICB0aHJvdyB7IHJlcyB9O1xuICAgICAgfVxuICAgICAgdGhpcy5jbGllbnQuc2V0QXV0aCh0aGlzLmNvb2tpZUF1dGgpO1xuICAgICAgdGhpcy5jbGVhbkxvY2FsU3RvcmFnZSgpO1xuICAgICAgdGhpcy5iYXNpY0F1dGgubG9nb3V0KCk7XG4gICAgfVxuICAgIHJldHVybiBpc1Bhc3N3b3JkR3JhbnRMb2dpbjtcbiAgfVxuXG4gIGlzUGFzc3dvcmRHcmFudExvZ2luKGNyZWRlbnRpYWxzPzogSUNyZWRlbnRpYWxzKSB7XG4gICAgY29uc3QgaXNTdXBwb3J0VXNlciA9IGNyZWRlbnRpYWxzICYmIGNyZWRlbnRpYWxzLnVzZXIuaW5jbHVkZXMoJyQnKTtcbiAgICByZXR1cm4gISEoXG4gICAgICAhaXNTdXBwb3J0VXNlciAmJlxuICAgICAgdGhpcy5sb2dpbk1vZGUgJiZcbiAgICAgIHRoaXMubG9naW5Nb2RlLnR5cGUgPT09IHRoaXMuT0FVVEgyX0lOVEVSTkFMX1RZUEVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSB0ZW5hbnQgaW5wdXQgZmllbGQgc2hvdWxkIGJlIHNob3duXG4gICAqIG9yIG5vdC5cbiAgICogQHJldHVybnMgSWYgdHJ1ZSwgc2hvdyB0aGUgdGVuYW50IGlucHV0LlxuICAgKi9cbiAgc2hvd1RlbmFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMudWkuc3RhdGUubG9naW5PcHRpb25zIHx8IHRoaXMuaXNMb2NhbCgpIHx8IHRoaXMuaXNTaG93VGVuYW50KCk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyB0aGUgdXNlciBvdXRcbiAgICogQHBhcmFtIHJlbG9hZCBJZiBzZXQgdG8gZmFsc2UsIHRoZSBwYWdlIHdpbGwgbm90IHJlbG9hZFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KHJlbG9hZCA9IHRydWUpIHtcbiAgICBsZXQgcmVzRGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtiYXNpY1JlcywgY29va2llUmVzXSA9IGF3YWl0IHRoaXMucmVzZXQoKTtcbiAgICAgIHJlc0RhdGEgPSBhd2FpdCBjb29raWVSZXMuanNvbigpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LnJlbW92ZUxhc3REYW5nZXIoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHJlc0RhdGEgJiYgcmVzRGF0YS51cmwpIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdChyZXNEYXRhLnVybCk7XG4gICAgICB9IGVsc2UgaWYgKHJlbG9hZCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgc3RvcmVkIGF1dGgtZGF0YVxuICAgKi9cbiAgYXN5bmMgcmVzZXQoKSB7XG4gICAgdGhpcy5jbGVhbkxvY2FsU3RvcmFnZSgpO1xuICAgIHRoaXMuY2xlYW5TZXNzaW9uU3RvcmFnZSgpO1xuICAgIHRoaXMucmVhbHRpbWUuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMudWkuY3VycmVudFVzZXIubmV4dChudWxsKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW3RoaXMuYmFzaWNBdXRoLmxvZ291dCgpLCB0aGlzLmNvb2tpZUF1dGgubG9nb3V0KCldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgVEZBIHRva2VuIHRvIGxvY2FsIG9yIHNlc3Npb24gc3RvcmFnZS5cbiAgICogQHBhcmFtIHRmYVRva2VuIFRoZSB0ZmEgdG9rZW4gdG8gc2F2ZS5cbiAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHN0b3JhZ2UgdG8gdXNlIChsb2NhbCBvciBzZXNzaW9uKS5cbiAgICovXG4gIHNhdmVURkFUb2tlbih0ZmFUb2tlbjogc3RyaW5nLCBzdG9yYWdlOiBTdG9yYWdlKSB7XG4gICAgc3RvcmFnZS5zZXRJdGVtKHRoaXMuVEZBVE9LRU5fS0VZLCB0ZmFUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgbWFuaWZlc3QgLT4gb24gNDAxIHVzZXIgaGFzIG5vIGFjY2VzcyB0byB0aGF0IGFwcGxpY2F0aW9uXG4gICAqIGFuZCB3ZSB0aHJvdyB0aGUgZXJyb3IgdXAgdG8gdGhlIGxvZ2luIGZvcm0uXG4gICAqL1xuICBhc3luYyB2ZXJpZnlBcHBBY2Nlc3MoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudWkubG9hZE1hbmlmZXN0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGlmICghKGV4LnJlcyAmJiBleC5yZXMuc3RhdHVzID09PSA0MDQgJiYgdGhpcy5pc0xvY2FsKCkpKSB7XG4gICAgICAgIHRocm93IGV4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZW5hbnQgdG8gdGhlIGNsaWVudCBhbmQgdXBkYXRlcyB0aGUgY3JlZGVudGlhbHMgb24gdGhlXG4gICAqIGF1dGggc3RyYXRlZ3kuXG4gICAqIEBwYXJhbSBjcmVkZW50aWFscyBUaGUgbmFtZSBvZiB0aGUgdGVuYW50LlxuICAgKiBAcGFyYW0gYXV0aFN0cmF0ZWd5IFRoZSBhdXRoZW50aWNhdGlvbiBzdHJhdGVneSB1c2VkLlxuICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRva2VuIGlmIGJhc2ljIGF1dGgsIG90aGVyd2lzZSB1bmRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzOiBJQ3JlZGVudGlhbHMsIGF1dGhTdHJhdGVneTogSUF1dGhlbnRpY2F0aW9uKSB7XG4gICAgaWYgKGNyZWRlbnRpYWxzLnRlbmFudCkge1xuICAgICAgdGhpcy5jbGllbnQudGVuYW50ID0gY3JlZGVudGlhbHMudGVuYW50O1xuICAgIH1cbiAgICAvLyBDaGVjayBpZiBhIHRva2VuIGlzIGFscmVhZHkgc2V0IChjYXNlIGZvciBzdXBwb3J0IHVzZXIgbG9naW4pXG4gICAgLy8gaWYgeWVzIC0+IHdlIGp1c3QgbmVlZCB0byB1cGRhdGUgdGhlIHVzZXIsIGFuZCByZXVzZSB0aGUgdG9rZW5cbiAgICAvLyBvZiB0aGUgc3VwcG9ydCB1c2VyLlxuICAgIC8vIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHBhc3MgdXNlciBhbmQgdGVuYW50LCB0byBnZXRcbiAgICAvLyBqdXN0IHRoZSBzdG9yZWQgdG9rZW4gYW5kIG5vdGhpbmcgZWxzZSAoc2VlIEJhc2ljQXV0aC50czozMSkuXG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmJhc2ljQXV0aC51cGRhdGVDcmVkZW50aWFscyh7XG4gICAgICB0ZW5hbnQ6IGNyZWRlbnRpYWxzLnRlbmFudCxcbiAgICAgIHVzZXI6IGNyZWRlbnRpYWxzLnVzZXJcbiAgICB9KTtcbiAgICBjb25zdCBuZXdDcmVkZW50aWFscyA9IHsgdG9rZW4sIC4uLmNyZWRlbnRpYWxzIH07XG5cbiAgICByZXR1cm4gYXV0aFN0cmF0ZWd5LnVwZGF0ZUNyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpZiB0aGUgY3VycmVudCB1c2VyIGlzIGEgZGV2ZWxvcGVyIG9yIG5vdC5cbiAgICogUnVubmluZyBvbiBsb2NhbGhvc3QgbWVhbnMgZGV2ZWxvcG1lbnQgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgaXNMb2NhbCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBob3N0bmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcbiAgICByZXR1cm4gdGhpcy5sb2NhbGhvc3RJcFJlZ0V4cC50ZXN0KGhvc3RuYW1lKSB8fCB0aGlzLmxvY2FsaG9zdFJlZ0V4cC50ZXN0KGhvc3RuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSB0b2tlbiB0byBsb2NhbCBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gdG8gc2F2ZS5cbiAgICogQHBhcmFtIHN0b3JhZ2UgVGhlIHN0b3JhZ2UgdG8gdXNlIChsb2NhbCBvciBzZXNzaW9uKS5cbiAgICovXG4gIHByaXZhdGUgc2F2ZVRva2VuKHRva2VuOiBzdHJpbmcsIHN0b3JhZ2U6IFN0b3JhZ2UpIHtcbiAgICBzdG9yYWdlLnNldEl0ZW0odGhpcy5UT0tFTl9LRVksIHRva2VuKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcmVCYXNpY0F1dGhUb2tlbih0b2tlbjogc3RyaW5nKSB7XG4gICAgdGhpcy5zYXZlVG9rZW4odG9rZW4sIHNlc3Npb25TdG9yYWdlKTtcbiAgICBpZiAodGhpcy5yZW1lbWJlck1lKSB7XG4gICAgICB0aGlzLnNhdmVUb2tlbih0b2tlbiwgbG9jYWxTdG9yYWdlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFuTG9jYWxTdG9yYWdlKCkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuVE9LRU5fS0VZKTtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlRGQVRPS0VOX0tFWSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuU2Vzc2lvblN0b3JhZ2UoKSB7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlRPS0VOX0tFWSk7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlRGQVRPS0VOX0tFWSk7XG4gIH1cblxuICBwcml2YXRlIGlzU2hvd1RlbmFudCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93VGVuYW50UmVnRXhwLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdCh1cmw6IHN0cmluZykge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb2dpbk9wdGlvbigpOiBJVGVuYW50TG9naW5PcHRpb24ge1xuICAgIGNvbnN0IGxvZ2luT3B0aW9ucyA9IHRoaXMudWkuc3RhdGUubG9naW5PcHRpb25zIHx8IFtdO1xuICAgIGNvbnN0IFtsb2dpbk9wdGlvbl0gPSBsb2dpbk9wdGlvbnM7XG4gICAgcmV0dXJuIGxvZ2luT3B0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc3VwcG9ydCB1c2VyIG5hbWUgZnJvbSBjcmVkZW50aWFscy5cbiAgICogQHBhcmFtIGNyZWRlbnRpYWxzIENyZWRlbnRpYWxzIG9iamVjdCAoZGVmYXVsdHMgdG8gdGhlIHN0b3JlZCBvbmUpLlxuICAgKiBAcmV0dXJucyBTdXBwb3J0IHVzZXIgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3VwcG9ydFVzZXJOYW1lKGNyZWRlbnRpYWxzOiBJQ3JlZGVudGlhbHMgPSB0aGlzLmdldFN0b3JlZENyZWRlbnRpYWxzKCkpOiBzdHJpbmcge1xuICAgIGlmICghY3JlZGVudGlhbHMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzdXBwb3J0VXNlck5hbWUgPSBjcmVkZW50aWFscy51c2VyLm1hdGNoKC9eKC4rXFwvKT8oKC4rKVxcJCk/KC4rKT8kLylbM107XG4gICAgcmV0dXJuIHN1cHBvcnRVc2VyTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGNyZWRlbnRpYWxzIG9iamVjdCBmcm9tIHRoZSBzdG9yZWQgdG9rZW4uXG4gICAqIEByZXR1cm5zIENyZWRlbnRpYWxzIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3RvcmVkQ3JlZGVudGlhbHMoKTogSUNyZWRlbnRpYWxzIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0U3RvcmVkVG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlVG9rZW4odG9rZW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc3RvcmVkIHRva2VuIGZyb20gbG9jYWwgc3RvcmFnZSBvciBzZXNzaW9uIHN0b3JhZ2UuXG4gICAqIEByZXR1cm5zIFN0b3JlZCB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3RvcmVkVG9rZW4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5UT0tFTl9LRVkpIHx8IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5UT0tFTl9LRVkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgc3RvcmVkIFRGQSB0b2tlbiBmcm9tIGxvY2FsIHN0b3JhZ2Ugb3Igc2Vzc2lvbiBzdG9yYWdlLlxuICAgKiBAcmV0dXJucyBTdG9yZWQgVEZBIHRva2VuLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTdG9yZWRUZmFUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlRGQVRPS0VOX0tFWSkgfHwgc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlRGQVRPS0VOX0tFWSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyB0b2tlbiB0byBjcmVkZW50aWFscyBvYmplY3QuXG4gICAqIEBwYXJhbSB0b2tlbiBUb2tlbiB0byBkZWNvZGUuXG4gICAqIEByZXR1cm5zIENyZWRlbnRpYWxzIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgZGVjb2RlVG9rZW4odG9rZW46IHN0cmluZyk6IElDcmVkZW50aWFscyB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUod2luZG93LmF0b2IodG9rZW4pKSk7XG4gICAgY29uc3Qgc3BsaXQgPSBkZWNvZGVkLm1hdGNoKC8oKFteL10qKVxcLyk/KFteLzpdKyk6KC4rKS8pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudDogc3BsaXRbMl0sXG4gICAgICB1c2VyOiBzcGxpdFszXSxcbiAgICAgIHBhc3N3b3JkOiBzcGxpdFs0XVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,38 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Directive, Input } from '@angular/core';
3
+ import { NG_VALIDATORS } from '@angular/forms';
4
+ import { StrengthValidatorService } from './strength-validator-service';
5
+ var PasswordStrengthValidatorDirective = /** @class */ (function () {
6
+ function PasswordStrengthValidatorDirective(passwordService) {
7
+ this.passwordService = passwordService;
8
+ }
9
+ PasswordStrengthValidatorDirective_1 = PasswordStrengthValidatorDirective;
10
+ Object.defineProperty(PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", {
11
+ set: function (value) {
12
+ this.forced = value;
13
+ },
14
+ enumerable: true,
15
+ configurable: true
16
+ });
17
+ PasswordStrengthValidatorDirective.prototype.validate = function (control) {
18
+ var strengthFulfilled = this.passwordService.isStrong(control.value || '');
19
+ var enforcementForcedAndNotFulfilled = this.forced && !strengthFulfilled;
20
+ return enforcementForcedAndNotFulfilled ? { passwordStrength: true } : null;
21
+ };
22
+ var PasswordStrengthValidatorDirective_1;
23
+ PasswordStrengthValidatorDirective.ctorParameters = function () { return [
24
+ { type: StrengthValidatorService }
25
+ ]; };
26
+ tslib_1.__decorate([
27
+ Input()
28
+ ], PasswordStrengthValidatorDirective.prototype, "passwordStrengthEnforced", null);
29
+ PasswordStrengthValidatorDirective = PasswordStrengthValidatorDirective_1 = tslib_1.__decorate([
30
+ Directive({
31
+ selector: '[passwordStrengthEnforced]',
32
+ providers: [{ provide: NG_VALIDATORS, useExisting: PasswordStrengthValidatorDirective_1, multi: true }]
33
+ })
34
+ ], PasswordStrengthValidatorDirective);
35
+ return PasswordStrengthValidatorDirective;
36
+ }());
37
+ export { PasswordStrengthValidatorDirective };
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQtc3RyZW5ndGgtdmFsaWRhdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb3JlL2xvZ2luL3Bhc3N3b3JkLXN0cmVuZ3RoLXZhbGlkYXRvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsYUFBYSxFQUErQixNQUFNLGdCQUFnQixDQUFDO0FBQzdGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBTXhFO0lBUUUsNENBQ1MsZUFBeUM7UUFBekMsb0JBQWUsR0FBZixlQUFlLENBQTBCO0lBQ2xELENBQUM7MkNBVlUsa0NBQWtDO0lBSXBDLHNCQUFJLHdFQUF3QjthQUE1QixVQUE2QixLQUFLO1lBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7OztPQUFBO0lBTUQscURBQVEsR0FBUixVQUFTLE9BQXdCO1FBQy9CLElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RSxJQUFNLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUMzRSxPQUFPLGdDQUFnQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDOUUsQ0FBQzs7O2dCQVB5Qix3QkFBd0I7O0lBTHpDO1FBQVIsS0FBSyxFQUFFO3NGQUVQO0lBTlUsa0NBQWtDO1FBSjlDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSw0QkFBNEI7WUFDdEMsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxvQ0FBa0MsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdEcsQ0FBQztPQUNXLGtDQUFrQyxDQWtCOUM7SUFBRCx5Q0FBQztDQUFBLEFBbEJELElBa0JDO1NBbEJZLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTkdfVkFMSURBVE9SUywgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3RyZW5ndGhWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi9zdHJlbmd0aC12YWxpZGF0b3Itc2VydmljZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twYXNzd29yZFN0cmVuZ3RoRW5mb3JjZWRdJyxcbiAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogUGFzc3dvcmRTdHJlbmd0aFZhbGlkYXRvckRpcmVjdGl2ZSwgbXVsdGk6IHRydWUgfV1cbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRTdHJlbmd0aFZhbGlkYXRvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIFZhbGlkYXRvciB7XG5cbiAgcHJpdmF0ZSBmb3JjZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgc2V0IHBhc3N3b3JkU3RyZW5ndGhFbmZvcmNlZCh2YWx1ZSkge1xuICAgIHRoaXMuZm9yY2VkID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcGFzc3dvcmRTZXJ2aWNlOiBTdHJlbmd0aFZhbGlkYXRvclNlcnZpY2UpIHtcbiAgfVxuXG4gIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICBjb25zdCBzdHJlbmd0aEZ1bGZpbGxlZCA9IHRoaXMucGFzc3dvcmRTZXJ2aWNlLmlzU3Ryb25nKGNvbnRyb2wudmFsdWUgfHwgJycpO1xuICAgIGNvbnN0IGVuZm9yY2VtZW50Rm9yY2VkQW5kTm90RnVsZmlsbGVkID0gdGhpcy5mb3JjZWQgJiYgIXN0cmVuZ3RoRnVsZmlsbGVkO1xuICAgIHJldHVybiBlbmZvcmNlbWVudEZvcmNlZEFuZE5vdEZ1bGZpbGxlZCA/IHsgcGFzc3dvcmRTdHJlbmd0aDogdHJ1ZSB9IDogbnVsbDtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,29 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Injectable } from '@angular/core';
3
+ import { PasswordService } from '../authentication/password.service';
4
+ import { PasswordStrength } from '@c8y/client';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../authentication/password.service";
7
+ var StrengthValidatorService = /** @class */ (function () {
8
+ function StrengthValidatorService(passwordService) {
9
+ this.passwordService = passwordService;
10
+ }
11
+ StrengthValidatorService.prototype.isStrong = function (password) {
12
+ return this.isPasswordGreen(this.passwordService.getStrengthColor(password).passwordStrength);
13
+ };
14
+ StrengthValidatorService.prototype.isPasswordGreen = function (strength) {
15
+ return strength === PasswordStrength.GREEN;
16
+ };
17
+ StrengthValidatorService.ctorParameters = function () { return [
18
+ { type: PasswordService }
19
+ ]; };
20
+ StrengthValidatorService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function StrengthValidatorService_Factory() { return new StrengthValidatorService(i0.ɵɵinject(i1.PasswordService)); }, token: StrengthValidatorService, providedIn: "root" });
21
+ StrengthValidatorService = tslib_1.__decorate([
22
+ Injectable({
23
+ providedIn: 'root'
24
+ })
25
+ ], StrengthValidatorService);
26
+ return StrengthValidatorService;
27
+ }());
28
+ export { StrengthValidatorService };
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZW5ndGgtdmFsaWRhdG9yLXNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYzh5L25neC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29yZS9sb2dpbi9zdHJlbmd0aC12YWxpZGF0b3Itc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDOzs7QUFLL0M7SUFFRSxrQ0FBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO0lBQ3BELENBQUM7SUFFRCwyQ0FBUSxHQUFSLFVBQVMsUUFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNoRyxDQUFDO0lBRU8sa0RBQWUsR0FBdkIsVUFBd0IsUUFBMEI7UUFDaEQsT0FBTyxRQUE0QixLQUFLLGdCQUFnQixDQUFDLEtBQXlCLENBQUM7SUFDckYsQ0FBQzs7Z0JBVG9DLGVBQWU7OztJQUZ6Qyx3QkFBd0I7UUFIcEMsVUFBVSxDQUFDO1lBQ1YsVUFBVSxFQUFFLE1BQU07U0FDbkIsQ0FBQztPQUNXLHdCQUF3QixDQVlwQzttQ0FuQkQ7Q0FtQkMsQUFaRCxJQVlDO1NBWlksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGFzc3dvcmRTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vcGFzc3dvcmQuc2VydmljZSc7XG5pbXBvcnQgeyBQYXNzd29yZFN0cmVuZ3RoIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdHJlbmd0aFZhbGlkYXRvclNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2UpIHtcbiAgfVxuXG4gIGlzU3Ryb25nKHBhc3N3b3JkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1Bhc3N3b3JkR3JlZW4odGhpcy5wYXNzd29yZFNlcnZpY2UuZ2V0U3RyZW5ndGhDb2xvcihwYXNzd29yZCkucGFzc3dvcmRTdHJlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGlzUGFzc3dvcmRHcmVlbihzdHJlbmd0aDogUGFzc3dvcmRTdHJlbmd0aCkge1xuICAgIHJldHVybiBzdHJlbmd0aCBhcyBQYXNzd29yZFN0cmVuZ3RoID09PSBQYXNzd29yZFN0cmVuZ3RoLkdSRUVOIGFzIFBhc3N3b3JkU3RyZW5ndGg7XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import * as tslib_1 from "tslib";
2
2
  import { Component, Input, Output, EventEmitter } from '@angular/core';
3
- import { IUser, UserService, TenantLoginOptionsService } from '@c8y/client';
3
+ import { IUser, UserService, TenantLoginOptionsService, TenantService } from '@c8y/client';
4
4
  import { clone } from 'lodash-es';
5
5
  import { AppStateService } from '../common/ui-state.service';
6
6
  import { TranslateService } from '../i18n/translate.service';
@@ -10,7 +10,7 @@ import { UserTotpSetupComponent } from './user-totp-setup.component';
10
10
  import { AlertService } from '../alert/alert.service';
11
11
  import { ModalService } from '../modal/modal.service';
12
12
  var UserEditComponent = /** @class */ (function () {
13
- function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService) {
13
+ function UserEditComponent(state, translate, passwordService, modalConfirmService, bsModalService, alert, userService, tenantLoginOptionsService, tenantService) {
14
14
  this.state = state;
15
15
  this.translate = translate;
16
16
  this.passwordService = passwordService;
@@ -19,6 +19,7 @@ var UserEditComponent = /** @class */ (function () {
19
19
  this.alert = alert;
20
20
  this.userService = userService;
21
21
  this.tenantLoginOptionsService = tenantLoginOptionsService;
22
+ this.tenantService = tenantService;
22
23
  this.loading = false;
23
24
  this.onUser = new EventEmitter();
24
25
  this.onLanguage = new EventEmitter();
@@ -37,11 +38,19 @@ var UserEditComponent = /** @class */ (function () {
37
38
  });
38
39
  UserEditComponent.prototype.ngOnInit = function () {
39
40
  return tslib_1.__awaiter(this, void 0, void 0, function () {
40
- return tslib_1.__generator(this, function (_a) {
41
- switch (_a.label) {
42
- case 0: return [4 /*yield*/, this.initializeTotpSettings()];
41
+ var currentTenant, _a, enabledOnSystemLevel, enabledOnTenantLevel;
42
+ return tslib_1.__generator(this, function (_b) {
43
+ switch (_b.label) {
44
+ case 0: return [4 /*yield*/, this.tenantService.current()];
43
45
  case 1:
44
- _a.sent();
46
+ currentTenant = (_b.sent()).data;
47
+ return [4 /*yield*/, this.tenantService.getTfaSettings(currentTenant)];
48
+ case 2:
49
+ _a = _b.sent(), enabledOnSystemLevel = _a.enabledOnSystemLevel, enabledOnTenantLevel = _a.enabledOnTenantLevel;
50
+ this.isTfaEnabled = enabledOnSystemLevel || enabledOnTenantLevel;
51
+ return [4 /*yield*/, this.initializeTotpSettings()];
52
+ case 3:
53
+ _b.sent();
45
54
  return [2 /*return*/];
46
55
  }
47
56
  });
@@ -128,7 +137,8 @@ var UserEditComponent = /** @class */ (function () {
128
137
  { type: BsModalService },
129
138
  { type: AlertService },
130
139
  { type: UserService },
131
- { type: TenantLoginOptionsService }
140
+ { type: TenantLoginOptionsService },
141
+ { type: TenantService }
132
142
  ]; };
133
143
  tslib_1.__decorate([
134
144
  Input()
@@ -151,10 +161,10 @@ var UserEditComponent = /** @class */ (function () {
151
161
  UserEditComponent = tslib_1.__decorate([
152
162
  Component({
153
163
  selector: 'c8y-user-edit',
154
- template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n You cannot edit the user since it is managed via your authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (e.g. email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <c8y-messages>\n <c8y-message *ngIf=\"!user.email\" translate\n >Note that email is required to reset password.</c8y-message\n >\n </c8y-messages>\n </c8y-form-group>\n\n <div class=\"row\" style=\"margin-left:-15px; margin-right:-15px\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n c8yDefaultValidation=\"phoneNumber\"\n [required]=\"user.twoFactorAuthenticationEnabled\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n [disabled]=\"userIsExternal\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">{{\n translate.getNativeLanguage(lang)\n }}</option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <div class=\"form-group\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n translate\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp\"\n >\n Set up two-factor authentication\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </label>\n </c8y-form-group>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading || userIsExternal\"\n translate\n >\n Save\n </button>\n </div>\n</form>\n"
164
+ template: "<form #userForm=\"ngForm\" (ngSubmit)=\"userForm.form.valid && save()\">\n <div class=\"alert alert-warning\" role=\"alert\" *ngIf=\"userIsExternal\" translate>\n You cannot edit the user since it is managed via your authorization server.\n </div>\n <c8y-form-group>\n <label translate for=\"userName\">Username (e.g. email)</label>\n <input\n id=\"userName\"\n class=\"form-control\"\n [(ngModel)]=\"user.userName\"\n name=\"userName\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [disabled]=\"user.id\"\n c8yDefaultValidation=\"user\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"displayName\">Login alias</label>\n <input\n id=\"displayName\"\n class=\"form-control\"\n [(ngModel)]=\"user.displayName\"\n name=\"displayName\"\n autocomplete=\"off\"\n maxlength=\"254\"\n placeholder=\"{{ 'e.g. joe.doe`LOCALIZE`' | translate }}\"\n [disabled]=\"userIsExternal\"\n c8yDefaultValidation=\"loginAlias\"\n />\n </c8y-form-group>\n\n <c8y-form-group [hasWarning]=\"!user.email\">\n <label translate for=\"userEmail\">Email</label>\n <input\n id=\"userEmail\"\n class=\"form-control\"\n type=\"email\"\n name=\"email\"\n [maxlength]=\"254\"\n autocomplete=\"off\"\n placeholder=\"{{ 'e.g. joe.doe@example.com`LOCALIZE`' | translate }}\"\n [(ngModel)]=\"user.email\"\n email\n [required]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <c8y-messages>\n <c8y-message *ngIf=\"!user.email\" translate\n >Note that email is required to reset password.</c8y-message\n >\n </c8y-messages>\n </c8y-form-group>\n\n <div class=\"row\" style=\"margin-left:-15px; margin-right:-15px\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userFirstName\">First name</label>\n <input\n id=\"userFirstName\"\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"firstName\"\n [(ngModel)]=\"user.firstName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate for=\"userLastName\">Last name</label>\n <input\n class=\"form-control\"\n autocomplete=\"off\"\n maxlength=\"50\"\n name=\"lastName\"\n [(ngModel)]=\"user.lastName\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n </div>\n </div>\n\n <c8y-form-group>\n <label translate for=\"userTelephone\">Telephone</label>\n <input\n id=\"userTelephone\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"phone\"\n maxlength=\"254\"\n [(ngModel)]=\"user.phone\"\n placeholder=\"{{ 'e.g. +49 9 876 543 210`LOCALIZE`' | translate }}\"\n c8yPhoneValidation\n c8yDefaultValidation=\"phoneNumber\"\n [required]=\"user.twoFactorAuthenticationEnabled\"\n [disabled]=\"userIsExternal\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate for=\"userLang\">Language</label>\n <div class=\"c8y-select-wrapper\">\n <select\n id=\"userLang\"\n class=\"form-control\"\n #selectLang\n name=\"lang\"\n [(ngModel)]=\"lang\"\n (change)=\"onLanguage.emit(selectLang.value)\"\n [disabled]=\"userIsExternal\"\n >\n <option *ngFor=\"let lang of langs\" [value]=\"lang\">{{\n translate.getNativeLanguage(lang)\n }}</option>\n </select>\n <span></span>\n </div>\n </c8y-form-group>\n\n <div class=\"form-group\" *ngIf=\"!userIsExternal\">\n <label class=\"control-label\">{{ 'Login options' | translate }}</label>\n <c8y-new-password (password)=\"onNewPasswordChanged($event)\"></c8y-new-password>\n <button\n title=\"{{ 'Set up two-factor authentication' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"setupTotp()\"\n translate\n *ngIf=\"userCanSetupTotp && !userHasActiveTotp && isTfaEnabled\"\n >\n Set up two-factor authentication\n </button>\n </div>\n\n <c8y-form-group *ngIf=\"!!(state.state$ | async).newsletter\">\n <label translate>Newsletter</label>\n <label class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n name=\"newsletter\"\n [(ngModel)]=\"user.newsletter\"\n [disabled]=\"userIsExternal\"\n />\n <span></span>\n {{ 'Send me information about outages, maintenance or updates.' | translate }}\n </label>\n </c8y-form-group>\n\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [disabled]=\"!userForm.form.valid || userForm.form.pristine || loading || userIsExternal\"\n translate\n >\n Save\n </button>\n </div>\n</form>\n"
155
165
  })
156
166
  ], UserEditComponent);
157
167
  return UserEditComponent;
158
168
  }());
159
169
  export { UserEditComponent };
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb3JlL3VzZXIvdXNlci1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCx5QkFBeUIsRUFDMUIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBWXREO0lBZ0JFLDJCQUNTLEtBQXNCLEVBQ3RCLFNBQTJCLEVBQzNCLGVBQWdDLEVBQ2hDLG1CQUFpQyxFQUNoQyxjQUE4QixFQUM5QixLQUFtQixFQUNuQixXQUF3QixFQUN4Qix5QkFBb0Q7UUFQckQsVUFBSyxHQUFMLEtBQUssQ0FBaUI7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBYztRQUNoQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsVUFBSyxH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QUFDOzs7O0tBQzNGO0lBRU8seURBQTZCLEdBQXJDO1FBQUEsaUJBTUM7UUFMQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFDLFNBQVM7WUFDekQsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzlCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztnQkE3RGUsZUFBZTtnQkFDWCxnQkFBZ0I7Z0JBQ1YsZUFBZTtnQkFDWCxZQUFZO2dCQUNoQixjQUFjO2dCQUN2QixZQUFZO2dCQUNOLFdBQVc7Z0JBQ0cseUJBQXlCOztJQXZCckQ7UUFBUixLQUFLLEVBQUU7bURBQWM7SUFDYjtRQUFSLEtBQUssRUFBRTtzREFBMEI7SUFDekI7UUFBUixLQUFLLEVBQUU7aURBR1A7SUFFUztRQUFULE1BQU0sRUFBRTtxREFBaUQ7SUFDaEQ7UUFBVCxNQUFNLEVBQUU7eURBQXVEO0lBQ3REO1FBQVQsTUFBTSxFQUFFO3VEQUFtRDtJQVZqRCxpQkFBaUI7UUFKN0IsU0FBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLGVBQWU7WUFDekIseXRLQUF5QztTQUMxQyxDQUFDO09BQ1csaUJBQWlCLENBK0U3QjtJQUFELHdCQUFDO0NBQUEsQUEvRUQsSUErRUM7U0EvRVksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSVVzZXIsXG4gIFVzZXJTZXJ2aWNlLFxuICBUZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9pMThuL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ld1Bhc3N3b3JkIH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vcGFzc3dvcmQubW9kZWwnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFBhc3N3b3JkU2VydmljZSB9IGZyb20gJy4uL2F1dGhlbnRpY2F0aW9uL3Bhc3N3b3JkLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlclRvdHBTZXR1cENvbXBvbmVudCB9IGZyb20gJy4vdXNlci10b3RwLXNldHVwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi9hbGVydC9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBJVXNlciB7XG4gIHBob25lOiBzdHJpbmc7XG4gIHNlbmRQYXNzd29yZFJlc2V0RW1haWw6IGJvb2xlYW47XG4gIG5ld3NsZXR0ZXI/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdXNlci1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZWRpdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVXNlckVkaXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBsYW5nOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IHVzZXIodTogVXNlcikge1xuICAgIHRoaXMuX3VzZXIgPSBjbG9uZSh1KTtcbiAgICB0aGlzLnVzZXJJc0V4dGVybmFsID0gdS5jdXN0b21Qcm9wZXJ0aWVzLnVzZXJPcmlnaW4gPT09ICdPQVVUSDInO1xuICB9XG4gIGdldCB1c2VyKCkgeyByZXR1cm4gdGhpcy5fdXNlcjsgfVxuICBAT3V0cHV0KCkgb25Vc2VyOiBFdmVudEVtaXR0ZXI8VXNlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBvbkxhbmd1YWdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uQ2FuY2VsOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHVzZXJIYXNBY3RpdmVUb3RwID0gZmFsc2U7XG4gIHVzZXJDYW5TZXR1cFRvdHAgPSBmYWxzZTtcbiAgdXNlcklzRXh0ZXJuYWw7XG4gIHByaXZhdGUgX3VzZXI6IFVzZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwdWJsaWMgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2UsXG4gICAgcHVibGljIG1vZGFsQ29uZmlybVNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlOiBUZW5hbnRMb2dpbk9wdGlvbnNTZXJ2aWNlLFxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplVG90cFNldHRpbmdzKCk7XG4gIH1cblxuICBnZXQgbGFuZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuc3RhdGUubGFuZ3M7XG4gIH1cblxuICBzZXR1cFRvdHAoKSB7XG4gICAgdGhpcy5ic01vZGFsU2VydmljZS5zaG93KFVzZXJUb3RwU2V0dXBDb21wb25lbnQsIHsgY2xhc3M6ICdtb2RhbC1zbScgfSk7XG4gICAgdGhpcy5jYW5jZWwoKTsgLy8gdG8gY2xvc2UgdGhlIHVzZXIgZWRpdCBtb2RhbCBhbmQgcHJldmVudCBjb25zb2xlIGVycm9ycyBvbiBsb2dvdXRcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHNhdmUoKSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcpIHtcbiAgICAgIHRoaXMuX3VzZXIucGFzc3dvcmQgPyB0aGlzLnNhdmVBZnRlclBhc3N3b3JkQ29uZmlybWF0aW9uKCkgOiB0aGlzLm9uVXNlci5lbWl0KHRoaXMuX3VzZXIpO1xuICAgIH1cbiAgfVxuXG4gIG9uTmV3UGFzc3dvcmRDaGFuZ2VkKG5ld1Bhc3N3b3JkOiBOZXdQYXNzd29yZCkge1xuICAgIHRoaXMuX3VzZXIucGFzc3dvcmQgPSBuZXdQYXNzd29yZC5wYXNzd29yZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVRvdHBTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy51c2VyQ2FuU2V0dXBUb3RwID0gYXdhaXQgdGhpcy5jYW5Vc2VyU2V0dXBUb3RwKCk7XG4gICAgICBpZiAodGhpcy51c2VyQ2FuU2V0dXBUb3RwKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogdG90cEFjdGl2aXR5IH0gPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmdldEFjdGl2aXR5VG90cCgpO1xuICAgICAgICB0aGlzLnVzZXJIYXNBY3RpdmVUb3RwID0gdG90cEFjdGl2aXR5LmlzQWN0aXZlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LnJlbW92ZUxhc3REYW5nZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNhblVzZXJTZXR1cFRvdHAoKSB7XG4gICAgLy8gd2UgZG9uJ3QgY2hlY2sgZm9yIHRlbmFudCBvcHRpb25zIGhlcmUgZHVlIHRvIHBlcm1pc3Npb24gcmVzdHJpY3Rpb25zIG9uIHRoYXQgZW5kLXBvaW50XG4gICAgY29uc3QgeyBsb2dpbk9wdGlvbnMgfSA9IChhd2FpdCB0aGlzLnRlbmFudExvZ2luT3B0aW9uc1NlcnZpY2UuZGV0YWlsKCkpLmRhdGE7XG4gICAgcmV0dXJuIGxvZ2luT3B0aW9ucy5zb21lKCh7IHRmYVN0cmF0ZWd5ID0gJycgfSkgPT4gIHRmYVN0cmF0ZWd5LnRvTG93ZXJDYXNlKCkgPT09ICd0b3RwJyk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVBZnRlclBhc3N3b3JkQ29uZmlybWF0aW9uKCkge1xuICAgIHRoaXMucGFzc3dvcmRTZXJ2aWNlLmNvbmZpcm1QYXNzd29yZCgpLnN1YnNjcmliZSgoY29uZmlybWVkKSA9PiB7XG4gICAgICBpZiAoY29uZmlybWVkKSB7XG4gICAgICAgIHRoaXMub25Vc2VyLmVtaXQodGhpcy5fdXNlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb3JlL3VzZXIvdXNlci1lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsS0FBSyxFQUNMLFdBQVcsRUFDWCx5QkFBeUIsRUFDekIsYUFBYSxFQUNkLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVl0RDtJQWlCRSwyQkFDUyxLQUFzQixFQUN0QixTQUEyQixFQUMzQixlQUFnQyxFQUNoQyxtQkFBaUMsRUFDaEMsY0FBOEIsRUFDOUIsS0FBbUIsRUFDbkIsV0FBd0IsRUFDeEIseUJBQW9ELEVBQ3BELGFBQTRCO1FBUjdCLFVBQUssR0FBTCxLQUFLLENBQWlCO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQWM7UUFDaEMsbUJBQWMsR0FBZCxj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d0JBQUM7Q0FBQSxBQXJGRCxJQXFGQztTQXJGWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBJVXNlcixcbiAgVXNlclNlcnZpY2UsXG4gIFRlbmFudExvZ2luT3B0aW9uc1NlcnZpY2UsXG4gIFRlbmFudFNlcnZpY2Vcbn0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgY2xvbmUgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VpLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uL2kxOG4vdHJhbnNsYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmV3UGFzc3dvcmQgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9wYXNzd29yZC5tb2RlbCc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgUGFzc3dvcmRTZXJ2aWNlIH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vcGFzc3dvcmQuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyVG90cFNldHVwQ29tcG9uZW50IH0gZnJvbSAnLi91c2VyLXRvdHAtc2V0dXAuY29tcG9uZW50JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJy4uL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kYWwvbW9kYWwuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlciBleHRlbmRzIElVc2VyIHtcbiAgcGhvbmU6IHN0cmluZztcbiAgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbDogYm9vbGVhbjtcbiAgbmV3c2xldHRlcj86IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS11c2VyLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXNlci1lZGl0LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBVc2VyRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGxhbmc6IHN0cmluZztcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzZXQgdXNlcih1OiBVc2VyKSB7XG4gICAgdGhpcy5fdXNlciA9IGNsb25lKHUpO1xuICAgIHRoaXMudXNlcklzRXh0ZXJuYWwgPSB1LmN1c3RvbVByb3BlcnRpZXMudXNlck9yaWdpbiA9PT0gJ09BVVRIMic7XG4gIH1cbiAgZ2V0IHVzZXIoKSB7IHJldHVybiB0aGlzLl91c2VyOyB9XG4gIEBPdXRwdXQoKSBvblVzZXI6IEV2ZW50RW1pdHRlcjxVc2VyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG9uTGFuZ3VhZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgdXNlckhhc0FjdGl2ZVRvdHAgPSBmYWxzZTtcbiAgdXNlckNhblNldHVwVG90cCA9IGZhbHNlO1xuICB1c2VySXNFeHRlcm5hbDtcbiAgaXNUZmFFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIF91c2VyOiBVc2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHVibGljIHBhc3N3b3JkU2VydmljZTogUGFzc3dvcmRTZXJ2aWNlLFxuICAgIHB1YmxpYyBtb2RhbENvbmZpcm1TZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50TG9naW5PcHRpb25zU2VydmljZTogVGVuYW50TG9naW5PcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHRlbmFudFNlcnZpY2U6IFRlbmFudFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSAoYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLmN1cnJlbnQoKSkuZGF0YTtcbiAgICBjb25zdCB7IGVuYWJsZWRPblN5c3RlbUxldmVsLCBlbmFibGVkT25UZW5hbnRMZXZlbCB9ID0gYXdhaXQgdGhpcy50ZW5hbnRTZXJ2aWNlLmdldFRmYVNldHRpbmdzKGN1cnJlbnRUZW5hbnQpO1xuICAgIHRoaXMuaXNUZmFFbmFibGVkID0gZW5hYmxlZE9uU3lzdGVtTGV2ZWwgfHwgZW5hYmxlZE9uVGVuYW50TGV2ZWw7XG5cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVUb3RwU2V0dGluZ3MoKTtcbiAgfVxuXG4gIGdldCBsYW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdGF0ZS5sYW5ncztcbiAgfVxuXG4gIHNldHVwVG90cCgpIHtcbiAgICB0aGlzLmJzTW9kYWxTZXJ2aWNlLnNob3coVXNlclRvdHBTZXR1cENvbXBvbmVudCwgeyBjbGFzczogJ21vZGFsLXNtJyB9KTtcbiAgICB0aGlzLmNhbmNlbCgpOyAvLyB0byBjbG9zZSB0aGUgdXNlciBlZGl0IG1vZGFsIGFuZCBwcmV2ZW50IGNvbnNvbGUgZXJyb3JzIG9uIGxvZ291dFxuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgc2F2ZSgpIHtcbiAgICBpZiAoIXRoaXMubG9hZGluZykge1xuICAgICAgdGhpcy5fdXNlci5wYXNzd29yZCA/IHRoaXMuc2F2ZUFmdGVyUGFzc3dvcmRDb25maXJtYXRpb24oKSA6IHRoaXMub25Vc2VyLmVtaXQodGhpcy5fdXNlcik7XG4gICAgfVxuICB9XG5cbiAgb25OZXdQYXNzd29yZENoYW5nZWQobmV3UGFzc3dvcmQ6IE5ld1Bhc3N3b3JkKSB7XG4gICAgdGhpcy5fdXNlci5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkLnBhc3N3b3JkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplVG90cFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnVzZXJDYW5TZXR1cFRvdHAgPSBhd2FpdCB0aGlzLmNhblVzZXJTZXR1cFRvdHAoKTtcbiAgICAgIGlmICh0aGlzLnVzZXJDYW5TZXR1cFRvdHApIHtcbiAgICAgICAgY29uc3QgeyBkYXRhOiB0b3RwQWN0aXZpdHkgfSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuZ2V0QWN0aXZpdHlUb3RwKCk7XG4gICAgICAgIHRoaXMudXNlckhhc0FjdGl2ZVRvdHAgPSB0b3RwQWN0aXZpdHkuaXNBY3RpdmU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnQucmVtb3ZlTGFzdERhbmdlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FuVXNlclNldHVwVG90cCgpIHtcbiAgICAvLyB3ZSBkb24ndCBjaGVjayBmb3IgdGVuYW50IG9wdGlvbnMgaGVyZSBkdWUgdG8gcGVybWlzc2lvbiByZXN0cmljdGlvbnMgb24gdGhhdCBlbmQtcG9pbnRcbiAgICBjb25zdCB7IGxvZ2luT3B0aW9ucyB9ID0gKGF3YWl0IHRoaXMudGVuYW50TG9naW5PcHRpb25zU2VydmljZS5kZXRhaWwoKSkuZGF0YTtcbiAgICByZXR1cm4gbG9naW5PcHRpb25zLnNvbWUoKHsgdGZhU3RyYXRlZ3kgPSAnJyB9KSA9PiAgdGZhU3RyYXRlZ3kudG9Mb3dlckNhc2UoKSA9PT0gJ3RvdHAnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUFmdGVyUGFzc3dvcmRDb25maXJtYXRpb24oKSB7XG4gICAgdGhpcy5wYXNzd29yZFNlcnZpY2UuY29uZmlybVBhc3N3b3JkKCkuc3Vic2NyaWJlKChjb25maXJtZWQpID0+IHtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgdGhpcy5vblVzZXIuZW1pdCh0aGlzLl91c2VyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -167,10 +167,10 @@ var ConfigurationListComponent = /** @class */ (function () {
167
167
  ConfigurationListComponent = tslib_1.__decorate([
168
168
  Component({
169
169
  selector: 'c8y-configuration-list',
170
- template: "<c8y-title>\n <span translate>Configuration snapshots repository</span>&nbsp;\n <small *ngIf=\"(configurations$ | async)?.paging.totalPages === 1 && !filterTerm\"\n >{{ (configurations$ | async).data.length }} <span translate>snapshots</span></small\n >\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages > 1 && !filterTerm\"\n [tooltip]=\"'More data available. Scroll to the bottom of the list to load it.' | translate\"\n container=\"body\"\n >{{ (configurations$ | async).paging.pageSize }}+ <span translate>snapshots</span></small\n >\n <small *ngIf=\"filterTerm\"\n ><span translate>Search results for</span>&nbsp;\"{{ this.filterTerm }}\"</small\n >\n</c8y-title>\n\n<c8y-action-bar-item itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keyup)=\"filterChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button class=\"btn btn-clean\" (click)=\"filterTerm = ''; setPipe('')\">\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'filter' : 'close'\"></i>\n </button>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" (click)=\"add()\">\n <i c8yIcon=\"plus-square\"></i> {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"!filterTerm && (configurations$ | async)?.data.length === 0\"\n>\n <h1 c8yIcon=\"gears\"></h1>\n <h3 translate>There are no configuration snapshots defined</h3>\n <p translate>Add a configuration snapshot first.</p>\n <div>\n <button (click)=\"add()\" class=\"btn btn-primary\" translate>\n Add configuration snapshot\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate\n >Find out more in the\n <a c8y-guide-href=\"users-guide/device-management/#configuration-repository\"\n >User guide`KEEP_ORIGINAL`</a\n >.</small\n >\n </p>\n</div>\n\n<ng-template #notFound>\n <c8y-li class=\"p-8 text-center\">\n <p>\n <span translate>No more entries found for filter:</span>&nbsp;<strong>{{\n filterTerm\n }}</strong>\n </p>\n <button class=\"btn btn-primary btn-xs m-t-8\" translate (click)=\"filterTerm = ''; setPipe('')\">\n Reset filter\n </button>\n </c8y-li>\n</ng-template>\n<div class=\"p-b-32\">\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"\n let configuration of configurations$;\n pipe: filterPipe;\n notFound: this.filterTerm ? notFound : undefined\n \"\n >\n <c8y-li-icon icon=\"gears\"></c8y-li-icon>\n <div class=\"row flex-row\">\n <div class=\"col-xs-3\">\n <c8y-highlight\n [text]=\"configuration.name || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </div>\n <div class=\"col-xs-3\">\n <span class=\"text-muted text-truncate\" [title]=\"configuration.description\">{{\n configuration.description\n }}</span>\n </div>\n <div class=\"col-xs-3\">\n <small translate class=\"text-muted text-uppercase\">Device type:</small>&nbsp;\n {{ configuration.deviceType || '-' }}\n </div>\n <div class=\"col-xs-3 text-right\">\n <span class=\"label label-primary\" *ngIf=\"configuration.configurationType\">\n <c8y-highlight\n [text]=\"configuration.configurationType\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </span>\n </div>\n </div>\n <c8y-li-action (click)=\"edit(configuration)\" icon=\"pencil\">\n Edit\n </c8y-li-action>\n <c8y-li-action (click)=\"delete(configuration)\" icon=\"trash-o\">\n Delete\n </c8y-li-action>\n </c8y-li>\n </c8y-list-group>\n</div>\n"
170
+ template: "<c8y-title>\n <span translate>Configuration snapshots repository</span>&nbsp;\n <small *ngIf=\"(configurations$ | async)?.paging.totalPages === 1 && !filterTerm\"\n >{{ (configurations$ | async).data.length }} <span translate>snapshots</span></small\n >\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages > 1 && !filterTerm\"\n [tooltip]=\"'More data available. Scroll to the bottom of the list to load it.' | translate\"\n container=\"body\"\n >{{ (configurations$ | async).paging.pageSize }}+ <span translate>snapshots</span></small\n >\n <small *ngIf=\"filterTerm\"\n ><span translate>Search results for</span>&nbsp;\"{{ this.filterTerm }}\"</small\n >\n</c8y-title>\n\n<c8y-action-bar-item itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keyup)=\"filterChange$.next($event)\"\n />\n <span class=\"input-group-btn\">\n <button class=\"btn btn-clean\" (click)=\"filterTerm = ''; setPipe('')\">\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'filter' : 'close'\"></i>\n </button>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" (click)=\"add()\">\n <i c8yIcon=\"plus-square\"></i> {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"!filterTerm && (configurations$ | async)?.data.length === 0\"\n>\n <h1 c8yIcon=\"gears\"></h1>\n <h3 translate>There are no configuration snapshots defined</h3>\n <p translate>Add a configuration snapshot first.</p>\n <div>\n <button (click)=\"add()\" class=\"btn btn-primary\" translate>\n Add configuration snapshot\n </button>\n </div>\n <p c8y-guide-docs>\n <small forceHtmlTranslate ngNonBindable\n >Find out more in the\n <a c8y-guide-href=\"users-guide/device-management/#configuration-repository\"\n >User guide`KEEP_ORIGINAL`</a\n >.</small\n >\n </p>\n</div>\n\n<ng-template #notFound>\n <c8y-li class=\"p-8 text-center\">\n <p>\n <span translate>No more entries found for filter:</span>&nbsp;<strong>{{\n filterTerm\n }}</strong>\n </p>\n <button class=\"btn btn-primary btn-xs m-t-8\" translate (click)=\"filterTerm = ''; setPipe('')\">\n Reset filter\n </button>\n </c8y-li>\n</ng-template>\n<div class=\"p-b-32\">\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"\n let configuration of configurations$;\n pipe: filterPipe;\n notFound: this.filterTerm ? notFound : undefined\n \"\n >\n <c8y-li-icon icon=\"gears\"></c8y-li-icon>\n <div class=\"row flex-row\">\n <div class=\"col-xs-3\">\n <c8y-highlight\n [text]=\"configuration.name || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </div>\n <div class=\"col-xs-3\">\n <span class=\"text-muted text-truncate\" [title]=\"configuration.description\">{{\n configuration.description\n }}</span>\n </div>\n <div class=\"col-xs-3\">\n <small translate class=\"text-muted text-uppercase\">Device type:</small>&nbsp;\n {{ configuration.deviceType || '-' }}\n </div>\n <div class=\"col-xs-3 text-right\">\n <span class=\"label label-primary\" *ngIf=\"configuration.configurationType\">\n <c8y-highlight\n [text]=\"configuration.configurationType\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </span>\n </div>\n </div>\n <c8y-li-action (click)=\"edit(configuration)\" icon=\"pencil\">\n Edit\n </c8y-li-action>\n <c8y-li-action (click)=\"delete(configuration)\" icon=\"trash-o\">\n Delete\n </c8y-li-action>\n </c8y-li>\n </c8y-list-group>\n</div>\n"
171
171
  })
172
172
  ], ConfigurationListComponent);
173
173
  return ConfigurationListComponent;
174
174
  }());
175
175
  export { ConfigurationListComponent };
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS8iLCJzb3VyY2VzIjpbImNvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBYyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFPckY7SUFTRSxvQ0FDVSxLQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsWUFBNEI7UUFGNUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQVR0QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDOUIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNDLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBRyxPQUFPLENBQUM7UUFDL0Isd0JBQW1CLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFNdEUsQ0FBQztJQUVFLDZDQUFRLEdBQWQ7Ozs7OzRCQUNFLHFCQUFNLElBQUksQ0FB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QSxBQXpHRCxJQXlHQztTQXpHWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBwaXBlLCBTdWJqZWN0LCB0aW1lciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9yZXBvc2l0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25OZXdNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJhdGlvbi1uZXctbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9zaXRvcnlNb2RhbCB9IGZyb20gJy4uL3JlcG9zaXRvcnkubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktY29uZmlndXJhdGlvbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25maWd1cmF0aW9ucyQ6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PjtcbiAgZmlsdGVyUGlwZTtcbiAgZmlsdGVyQ2hhbmdlJCA9IG5ldyBTdWJqZWN0KCk7XG4gIGZpbHRlclRlcm0gPSAnJztcbiAgcHJpdmF0ZSByZWFkb25seSBDQVJSSUFHRV9SRVRVUk5fS0VZID0gMTM7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0FSUklBR0VfUkVUVVJOX0NPREUgPSAnRW50ZXInO1xuICBwcml2YXRlIHJlYWRvbmx5IERFTEVURURfU1VDQ0VTU19NU0cgPSBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIGRlbGV0ZWQuJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeVNlcnZpY2U6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2UoKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gdGhpcy5DQVJSSUFHRV9SRVRVUk5fQ09ERSB8fCBldmVudC5rZXlDb2RlID09PSB0aGlzLkNBUlJJQUdFX1JFVFVSTl9LRVlcbiAgICAgICAgICAgID8gdGltZXIoMTApXG4gICAgICAgICAgICA6IHRpbWVyKDMwMClcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChlOiBhbnkpID0+IGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShmaWx0ZXJUZXJtID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJUZXJtID0gZmlsdGVyVGVybTtcbiAgICAgICAgdGhpcy5zZXRQaXBlKGZpbHRlclRlcm0pO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckNoYW5nZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIGFkZCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgICB9KS5jb250ZW50IGFzIENvbmZpZ3VyYXRpb25OZXdNb2RhbENvbXBvbmVudCkucmVzdWx0O1xuICAgICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBpbnRlZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZWRpdChjb25maWd1cmF0aW9uOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RhbCA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgICBzZWxlY3RlZDogeyBpZDogY29uZmlndXJhdGlvbi5pZCwgY29uZmlndXJhdGlvblR5cGU6IGNvbmZpZ3VyYXRpb24uY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgICB2ZXJzaW9uT3JOYW1lOiBjb25maWd1cmF0aW9uLm5hbWUsXG4gICAgICAgICAgZGV2aWNlVHlwZTogY29uZmlndXJhdGlvbi5kZXZpY2VUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWd1cmF0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGJpbmFyeTogeyB1cmw6IGNvbmZpZ3VyYXRpb24udXJsIH1cbiAgICAgICAgfSBhcyBSZXBvc2l0b3J5TW9kYWxcbiAgICAgIH0pLmNvbnRlbnQgYXMgQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50O1xuICAgICAgbW9kYWwubW8gPSBjb25maWd1cmF0aW9uO1xuICAgICAgYXdhaXQgbW9kYWwucmVzdWx0O1xuICAgICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBpbnRlZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGNvbmZpZ3VyYXRpb246IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZGVsZXRlKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgdGhpcy5hbGVydC5zdWNjZXNzKHRoaXMuREVMRVRFRF9TVUNDRVNTX01TRyk7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnQuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGlwZShmaWx0ZXJUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlclBpcGUgPSBwaXBlKFxuICAgICAgbWFwKChkYXRhOiBbXSkgPT5cbiAgICAgICAgZmlsdGVyVGVybS50cmltKCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBkYXRhXG4gICAgICAgICAgOiBkYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKG1vOiBJTWFuYWdlZE9iamVjdCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5TdHJpbmcobW8ubmFtZSwgZmlsdGVyVGVybSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5TdHJpbmcobW8uY29uZmlndXJhdGlvblR5cGUsIGZpbHRlclRlcm0pXG4gICAgICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyQ29udGFpblN0cmluZyhuYW1lOiBzdHJpbmcsIGZpbHRlclRlcm06IHN0cmluZykge1xuICAgIGNvbnN0IHRlcm0gPSBmaWx0ZXJUZXJtLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0pID4gLTE7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMuZmlsdGVyVGVybSA9ICcnO1xuICAgIHRoaXMuY29uZmlndXJhdGlvbnMkID0gb2YoYXdhaXQgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0Q29uZmlndXJhdGlvbnMoKSk7XG4gICAgdGhpcy5zZXRQaXBlKCcnKTtcbiAgfVxufVxuIl19
176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS8iLCJzb3VyY2VzIjpbImNvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBYyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFPckY7SUFTRSxvQ0FDVSxLQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsWUFBNEI7UUFGNUIsVUFBSyxHQUFMLEtBQUssQ0FBYztRQUNuQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGlCQUFZLEdBQVosWUFBWSxDQUFnQjtRQVR0QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFDOUIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNDLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6Qix5QkFBb0IsR0FBRyxPQUFPLENBQUM7UUFDL0Isd0JBQW1CLEdBQUcsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFNdEUsQ0FBQztJQUVFLDZDQUFRLEdBQWQ7Ozs7OzRCQUNFLHFCQUFNLElBQUksQ0FB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QSxBQXpHRCxJQXlHQztTQXpHWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIElSZXN1bHRMaXN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBwaXBlLCBTdWJqZWN0LCB0aW1lciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUmVwb3NpdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9yZXBvc2l0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25OZXdNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vY29uZmlndXJhdGlvbi1uZXctbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IFJlcG9zaXRvcnlNb2RhbCB9IGZyb20gJy4uL3JlcG9zaXRvcnkubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktY29uZmlndXJhdGlvbi1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbmZpZ3VyYXRpb24tbGlzdC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjb25maWd1cmF0aW9ucyQ6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SU1hbmFnZWRPYmplY3Q+PjtcbiAgZmlsdGVyUGlwZTtcbiAgZmlsdGVyQ2hhbmdlJCA9IG5ldyBTdWJqZWN0KCk7XG4gIGZpbHRlclRlcm0gPSAnJztcbiAgcHJpdmF0ZSByZWFkb25seSBDQVJSSUFHRV9SRVRVUk5fS0VZID0gMTM7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0FSUklBR0VfUkVUVVJOX0NPREUgPSAnRW50ZXInO1xuICBwcml2YXRlIHJlYWRvbmx5IERFTEVURURfU1VDQ0VTU19NU0cgPSBnZXR0ZXh0KCdDb25maWd1cmF0aW9uIGRlbGV0ZWQuJyk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGVydDogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeVNlcnZpY2U6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuXG4gICAgdGhpcy5maWx0ZXJDaGFuZ2UkXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2UoKGV2ZW50OiBhbnkpID0+XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gdGhpcy5DQVJSSUFHRV9SRVRVUk5fQ09ERSB8fCBldmVudC5rZXlDb2RlID09PSB0aGlzLkNBUlJJQUdFX1JFVFVSTl9LRVlcbiAgICAgICAgICAgID8gdGltZXIoMTApXG4gICAgICAgICAgICA6IHRpbWVyKDMwMClcbiAgICAgICAgKSxcbiAgICAgICAgbWFwKChlOiBhbnkpID0+IGUudGFyZ2V0LnZhbHVlKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShmaWx0ZXJUZXJtID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJUZXJtID0gZmlsdGVyVGVybTtcbiAgICAgICAgdGhpcy5zZXRQaXBlKGZpbHRlclRlcm0pO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlckNoYW5nZSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIGFzeW5jIGFkZCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlXG4gICAgICB9KS5jb250ZW50IGFzIENvbmZpZ3VyYXRpb25OZXdNb2RhbENvbXBvbmVudCkucmVzdWx0O1xuICAgICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBpbnRlZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZWRpdChjb25maWd1cmF0aW9uOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2RhbCA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3coQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50LCB7XG4gICAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgICBpZ25vcmVCYWNrZHJvcENsaWNrOiB0cnVlLFxuICAgICAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgICBzZWxlY3RlZDogeyBpZDogY29uZmlndXJhdGlvbi5pZCwgY29uZmlndXJhdGlvblR5cGU6IGNvbmZpZ3VyYXRpb24uY29uZmlndXJhdGlvblR5cGUgfSxcbiAgICAgICAgICB2ZXJzaW9uT3JOYW1lOiBjb25maWd1cmF0aW9uLm5hbWUsXG4gICAgICAgICAgZGV2aWNlVHlwZTogY29uZmlndXJhdGlvbi5kZXZpY2VUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWd1cmF0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGJpbmFyeTogeyB1cmw6IGNvbmZpZ3VyYXRpb24udXJsIH1cbiAgICAgICAgfSBhcyBSZXBvc2l0b3J5TW9kYWxcbiAgICAgIH0pLmNvbnRlbnQgYXMgQ29uZmlndXJhdGlvbk5ld01vZGFsQ29tcG9uZW50O1xuICAgICAgbW9kYWwubW8gPSBjb25maWd1cmF0aW9uO1xuICAgICAgYXdhaXQgbW9kYWwucmVzdWx0O1xuICAgICAgYXdhaXQgdGhpcy5yZXNldCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBpbnRlZGVkIGVtcHR5XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGNvbmZpZ3VyYXRpb246IElNYW5hZ2VkT2JqZWN0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeVNlcnZpY2UuZGVsZXRlKGNvbmZpZ3VyYXRpb24pO1xuICAgICAgdGhpcy5hbGVydC5zdWNjZXNzKHRoaXMuREVMRVRFRF9TVUNDRVNTX01TRyk7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnQuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGlwZShmaWx0ZXJUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlclBpcGUgPSBwaXBlKFxuICAgICAgbWFwKChkYXRhOiBbXSkgPT5cbiAgICAgICAgZmlsdGVyVGVybS50cmltKCkubGVuZ3RoID09PSAwXG4gICAgICAgICAgPyBkYXRhXG4gICAgICAgICAgOiBkYXRhLmZpbHRlcihcbiAgICAgICAgICAgICAgKG1vOiBJTWFuYWdlZE9iamVjdCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5TdHJpbmcobW8ubmFtZSwgZmlsdGVyVGVybSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckNvbnRhaW5TdHJpbmcobW8uY29uZmlndXJhdGlvblR5cGUsIGZpbHRlclRlcm0pXG4gICAgICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyQ29udGFpblN0cmluZyhuYW1lOiBzdHJpbmcsIGZpbHRlclRlcm06IHN0cmluZykge1xuICAgIGNvbnN0IHRlcm0gPSBmaWx0ZXJUZXJtLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIHJldHVybiBuYW1lICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0pID4gLTE7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlc2V0KCkge1xuICAgIHRoaXMuZmlsdGVyVGVybSA9ICcnO1xuICAgIHRoaXMuY29uZmlndXJhdGlvbnMkID0gb2YoYXdhaXQgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5saXN0Q29uZmlndXJhdGlvbnMoKSk7XG4gICAgdGhpcy5zZXRQaXBlKCcnKTtcbiAgfVxufVxuIl19