@snabcentr/client-ui 4.14.6 → 4.14.8

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 (106) hide show
  1. package/auth/sign-up-form/sc-sign-up-form.component.d.ts +6 -0
  2. package/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.d.ts +8 -0
  3. package/catalog/price-history/sc-price-history.component.d.ts +4 -0
  4. package/catalog/sc-catalog.module.d.ts +1 -1
  5. package/configurators/sandwich/sc-sandwich.component.d.ts +4 -0
  6. package/configurators/sandwich_m2/sc-sandwich-m2.component.d.ts +8 -0
  7. package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +4 -0
  8. package/contragents/sc-contragents.module.d.ts +4 -3
  9. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +13 -6
  10. package/directives/address-quality/sc-address-quality.directive.d.ts +23 -0
  11. package/directives/address-quality/sc-address-quality.service.d.ts +122 -0
  12. package/directives/address-quality/sc-i-address-quality-state.d.ts +14 -0
  13. package/directives/index.d.ts +2 -0
  14. package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +1 -1
  15. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +14 -4
  16. package/esm2022/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.mjs +22 -18
  17. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +7 -6
  18. package/esm2022/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.mjs +2 -2
  19. package/esm2022/catalog/price-history/sc-price-history.component.mjs +9 -5
  20. package/esm2022/catalog/sc-catalog.module.mjs +5 -3
  21. package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +11 -6
  22. package/esm2022/configurators/sandwich_m2/sc-sandwich-m2.component.mjs +19 -11
  23. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +1 -1
  24. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +1 -1
  25. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +26 -20
  26. package/esm2022/contragents/sc-contragents.module.mjs +4 -1
  27. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +30 -17
  28. package/esm2022/directives/address-quality/sc-address-quality.directive.mjs +40 -0
  29. package/esm2022/directives/address-quality/sc-address-quality.service.mjs +214 -0
  30. package/esm2022/directives/address-quality/sc-i-address-quality-state.mjs +2 -0
  31. package/esm2022/directives/index.mjs +3 -1
  32. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +11 -21
  33. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +4 -5
  34. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +76 -16
  35. package/esm2022/order/draft/sc-draft.component.mjs +12 -15
  36. package/esm2022/order/index.mjs +3 -4
  37. package/esm2022/order/new-order-items/sc-new-order-items.component.mjs +39 -0
  38. package/esm2022/order/order-form/sc-order-form.component.mjs +6 -18
  39. package/esm2022/order/order-item/sc-order-item.component.mjs +8 -4
  40. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +9 -6
  41. package/esm2022/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.mjs +53 -0
  42. package/esm2022/providers/index.mjs +2 -2
  43. package/esm2022/providers/sc-block-incomplete-address.mjs +8 -0
  44. package/esm2022/public-api.mjs +2 -1
  45. package/esm2022/samples/sc-sample.module.mjs +3 -10
  46. package/esm2022/services/index.mjs +2 -1
  47. package/esm2022/services/sc-scripts.service.mjs +106 -0
  48. package/esm2022/smart-captcha/index.mjs +5 -0
  49. package/esm2022/smart-captcha/interfaces/index.mjs +6 -0
  50. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-api.mjs +2 -0
  51. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-event.mjs +2 -0
  52. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-language.mjs +2 -0
  53. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-render-params.mjs +2 -0
  54. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-settings.mjs +2 -0
  55. package/esm2022/smart-captcha/interfaces/sc-smart-captcha-window.mjs +2 -0
  56. package/esm2022/smart-captcha/sc-smart-captcha.component.mjs +167 -0
  57. package/esm2022/smart-captcha/services/index.mjs +2 -0
  58. package/esm2022/smart-captcha/services/sc-smart-captcha-loader.service.mjs +87 -0
  59. package/esm2022/smart-captcha/tokens/index.mjs +3 -0
  60. package/esm2022/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.mjs +8 -0
  61. package/esm2022/smart-captcha/tokens/sc-smart-captcha-settings.token.mjs +6 -0
  62. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +3 -3
  63. package/esm2022/validators/step-validator.mjs +4 -4
  64. package/feedback/feedback-form/sc-feedback-form.component.d.ts +1 -1
  65. package/fesm2022/snabcentr-client-ui.mjs +882 -268
  66. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  67. package/form-fields/addresses-selection-field/sc-addresses-selection-field.component.d.ts +2 -0
  68. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +36 -2
  69. package/order/draft/sc-draft.component.d.ts +5 -8
  70. package/order/index.d.ts +2 -3
  71. package/order/{order-direction-items/sc-order-direction-items.component.d.ts → new-order-items/sc-new-order-items.component.d.ts} +5 -5
  72. package/order/order-form/sc-order-form.component.d.ts +2 -11
  73. package/order/order-item/sc-order-item.component.d.ts +4 -0
  74. package/order/order-items-list/sc-order-items-list.component.d.ts +4 -1
  75. package/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.d.ts +37 -0
  76. package/package.json +2 -3
  77. package/providers/index.d.ts +1 -1
  78. package/providers/sc-block-incomplete-address.d.ts +5 -0
  79. package/public-api.d.ts +1 -0
  80. package/release_notes.tmp +2 -4
  81. package/samples/sc-sample.module.d.ts +1 -2
  82. package/services/index.d.ts +1 -0
  83. package/services/sc-scripts.service.d.ts +51 -0
  84. package/smart-captcha/index.d.ts +4 -0
  85. package/smart-captcha/interfaces/index.d.ts +5 -0
  86. package/smart-captcha/interfaces/sc-smart-captcha-api.d.ts +36 -0
  87. package/smart-captcha/interfaces/sc-smart-captcha-event.d.ts +4 -0
  88. package/smart-captcha/interfaces/sc-smart-captcha-language.d.ts +4 -0
  89. package/smart-captcha/interfaces/sc-smart-captcha-render-params.d.ts +16 -0
  90. package/smart-captcha/interfaces/sc-smart-captcha-settings.d.ts +16 -0
  91. package/smart-captcha/interfaces/sc-smart-captcha-window.d.ts +14 -0
  92. package/smart-captcha/sc-smart-captcha.component.d.ts +92 -0
  93. package/smart-captcha/services/index.d.ts +1 -0
  94. package/smart-captcha/services/sc-smart-captcha-loader.service.d.ts +50 -0
  95. package/smart-captcha/tokens/index.d.ts +2 -0
  96. package/smart-captcha/tokens/sc-smart-captcha-load-timeout.token.d.ts +5 -0
  97. package/smart-captcha/tokens/sc-smart-captcha-settings.token.d.ts +6 -0
  98. package/styles/tailwind/tailwind.scss +48 -2
  99. package/validators/step-validator.d.ts +1 -2
  100. package/esm2022/order/models/sc-i-cart-items-by-direction.mjs +0 -22
  101. package/esm2022/order/order-direction-items/sc-order-direction-items.component.mjs +0 -39
  102. package/esm2022/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.mjs +0 -75
  103. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +0 -30
  104. package/order/models/sc-i-cart-items-by-direction.d.ts +0 -25
  105. package/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.d.ts +0 -58
  106. package/providers/cleanup-recaptcha-artifacts.d.ts +0 -7
@@ -0,0 +1,214 @@
1
+ import { inject, Injectable, signal, untracked } from '@angular/core';
2
+ import { ScSuggestionAddressQuality } from '@snabcentr/client-core';
3
+ import { TuiValidationError } from '@taiga-ui/cdk';
4
+ import { isNil } from 'lodash-es';
5
+ import { SC_BLOCK_INCOMPLETE_ADDRESS } from '../../providers/sc-block-incomplete-address';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * Сервис-реестр качества адресов, выбранных из подсказок.
9
+ *
10
+ * Хранит качество последнего выбранного адреса для каждого контрола. Качество полного адреса
11
+ * действует, пока значение контрола не изменилось после выбора: ручная правка возвращает адрес
12
+ * в разряд непроверяемых. Качество неполного адреса и адреса с неопределённой полнотой сохраняется
13
+ * и при ручной правке текста: его заменяет только выбор другой подсказки по этому полю.
14
+ * Полная очистка поля сбрасывает качество: адрес, введённый после неё, считается ручным.
15
+ */
16
+ export class ScAddressQualityService {
17
+ constructor() {
18
+ /**
19
+ * Валидатор, запрещающий отправку формы с неполным адресом, пока блокировка включена токеном {@link SC_BLOCK_INCOMPLETE_ADDRESS}.
20
+ * Подключается к контролу адреса при его создании; директива качества адреса только показывает предупреждение.
21
+ *
22
+ * @param control Контрол адреса.
23
+ */
24
+ this.validator = (control) => this.validate(control);
25
+ /**
26
+ * Признак, что отправка форм с неполным адресом заблокирована.
27
+ */
28
+ this.blockIncompleteAddress = inject(SC_BLOCK_INCOMPLETE_ADDRESS);
29
+ /**
30
+ * Ошибка валидации неполного адреса.
31
+ */
32
+ this.incompleteAddressError = new TuiValidationError('Адрес неполный, выберите более точный вариант из подсказок');
33
+ /**
34
+ * Реестр состояний качества по контролам адресов.
35
+ */
36
+ this.states = new WeakMap();
37
+ /**
38
+ * Реестр признаков включённого контроля качества по контролам адресов.
39
+ */
40
+ this.checkEnabledStates = new WeakMap();
41
+ }
42
+ /**
43
+ * Возвращает признак, что значение поля адреса пустое без учёта пробелов.
44
+ *
45
+ * @param value Значение поля адреса.
46
+ */
47
+ static isEmptyAddress(value) {
48
+ return isNil(value) || (typeof value === 'string' && !value.trim());
49
+ }
50
+ /**
51
+ * Задаёт качество адреса, выбранного в контроле, и пересчитывает валидность контрола
52
+ * без рассылки событий, чтобы не нарушать подавление valueChanges при выборе подсказки.
53
+ * Контрол адреса, требующего внимания пользователя, помечается затронутым, чтобы сообщения показались сразу.
54
+ *
55
+ * @param control Контрол адреса.
56
+ * @param quality Качество (полнота) адреса или null, если качество неизвестно.
57
+ */
58
+ setQuality(control, quality) {
59
+ this.stateOf(control).set(quality === null ? null : { quality, value: control.value });
60
+ if (quality === ScSuggestionAddressQuality.incomplete || quality === ScSuggestionAddressQuality.undetermined) {
61
+ control.markAsTouched();
62
+ }
63
+ control.updateValueAndValidity({ emitEvent: false });
64
+ }
65
+ /**
66
+ * Возвращает качество адреса, выбранного в контроле, либо null, если адрес из подсказок
67
+ * не выбирался или поле пустое. Качество полного адреса действует, только пока значение контрола не изменилось
68
+ * после выбора; качество неполного адреса и адреса с неопределённой полнотой действует
69
+ * до выбора другой подсказки или полной очистки поля, в том числе после ручной правки текста.
70
+ *
71
+ * @param control Контрол адреса.
72
+ */
73
+ getQuality(control) {
74
+ const state = this.stateOf(control)();
75
+ if (!state || ScAddressQualityService.isEmptyAddress(control.value)) {
76
+ return null;
77
+ }
78
+ if (state.quality === ScSuggestionAddressQuality.complete) {
79
+ return state.value === control.value ? ScSuggestionAddressQuality.complete : null;
80
+ }
81
+ return state.quality;
82
+ }
83
+ /**
84
+ * Задаёт качество адресов организации контролам группы на основе выбранной подсказки.
85
+ * Качество применяется только к заполненным адресам подсказки: для пустого адреса
86
+ * оно сбрасывается, даже если сервис подсказок прислал для него значение.
87
+ *
88
+ * @param group Группа с контролами адресов организации.
89
+ * @param suggestion Объект подсказки по организации.
90
+ */
91
+ setOrganizationAddressQualities(group, suggestion) {
92
+ const qualities = [
93
+ ['legalAddress', suggestion.legalAddress, suggestion.legalAddressQuality],
94
+ ['postalAddress', suggestion.postalAddress, suggestion.postalAddressQuality],
95
+ ['actualAddress', suggestion.actualAddress, suggestion.actualAddressQuality],
96
+ ];
97
+ qualities.forEach(([controlName, address, quality]) => {
98
+ const control = group.get(controlName);
99
+ if (control) {
100
+ this.setQuality(control, address ? (quality ?? null) : null);
101
+ }
102
+ });
103
+ }
104
+ /**
105
+ * Включает или отключает контроль качества адреса для контрола и пересчитывает его валидность без рассылки событий.
106
+ * Сохранённое качество при отключении не теряется и снова учитывается после включения.
107
+ * Вызывать при смене значения формы, а не из хуков проверки изменений (ngOnChanges и т.п.),
108
+ * чтобы родительские шаблоны сразу видели актуальную валидность.
109
+ *
110
+ * @param control Контрол адреса.
111
+ * @param enabled Признак, что контроль качества адреса включён.
112
+ */
113
+ setQualityCheckEnabled(control, enabled) {
114
+ const checkEnabled = this.checkEnabledOf(control);
115
+ if (untracked(checkEnabled) === enabled) {
116
+ return;
117
+ }
118
+ // Вызов возможен во время отрисовки шаблона (первая подписка async pipe), где запись сигналов запрещена.
119
+ untracked(() => {
120
+ checkEnabled.set(enabled);
121
+ });
122
+ control.updateValueAndValidity({ emitEvent: false });
123
+ }
124
+ /**
125
+ * Возвращает признак, что контроль качества адреса для контрола включён.
126
+ *
127
+ * @param control Контрол адреса.
128
+ */
129
+ isQualityCheckEnabled(control) {
130
+ return this.checkEnabledOf(control)();
131
+ }
132
+ /**
133
+ * Возвращает ошибку неполного адреса либо null, если контрол можно отправлять: контроль качества отключён,
134
+ * блокировка выключена токеном {@link SC_BLOCK_INCOMPLETE_ADDRESS} или адрес не неполный.
135
+ * Для очищенного поля сбрасывает сохранённое качество адреса.
136
+ *
137
+ * @param control Контрол адреса.
138
+ */
139
+ validate(control) {
140
+ this.resetQualityOfEmptyAddress(control);
141
+ return this.blockIncompleteAddress && this.isQualityCheckEnabled(control) && this.getQuality(control) === ScSuggestionAddressQuality.incomplete
142
+ ? { incompleteAddress: this.incompleteAddressError }
143
+ : null;
144
+ }
145
+ /**
146
+ * Возвращает текст предупреждения о необходимости проверить выбранный адрес либо null, когда предупреждение не требуется,
147
+ * в том числе для пустого поля. Для неполного адреса при включённой блокировке отправки вместо предупреждения
148
+ * показывается ошибка валидатора {@link validator}, если он подключён к контролу.
149
+ *
150
+ * @param control Контрол адреса.
151
+ */
152
+ getWarningMessage(control) {
153
+ if (!this.isQualityCheckEnabled(control)) {
154
+ return null;
155
+ }
156
+ switch (this.getQuality(control)) {
157
+ case ScSuggestionAddressQuality.undetermined:
158
+ return 'Не удалось определить полноту адреса, проверьте его';
159
+ case ScSuggestionAddressQuality.incomplete:
160
+ return this.blockIncompleteAddress && control.hasValidator(this.validator) ? null : 'Адрес неполный, проверьте его';
161
+ default:
162
+ return null;
163
+ }
164
+ }
165
+ /**
166
+ * Возвращает сигнал состояния качества для контрола, создавая его при первом обращении.
167
+ *
168
+ * @param control Контрол адреса.
169
+ */
170
+ stateOf(control) {
171
+ let state = this.states.get(control);
172
+ if (!state) {
173
+ state = signal(null);
174
+ this.states.set(control, state);
175
+ }
176
+ return state;
177
+ }
178
+ /**
179
+ * Возвращает сигнал признака включённого контроля качества для контрола, создавая его при первом обращении.
180
+ *
181
+ * @param control Контрол адреса.
182
+ */
183
+ checkEnabledOf(control) {
184
+ let checkEnabled = this.checkEnabledStates.get(control);
185
+ if (!checkEnabled) {
186
+ checkEnabled = signal(true);
187
+ this.checkEnabledStates.set(control, checkEnabled);
188
+ }
189
+ return checkEnabled;
190
+ }
191
+ /**
192
+ * Сбрасывает сохранённое качество адреса, если поле очищено.
193
+ *
194
+ * @param control Контрол адреса.
195
+ */
196
+ resetQualityOfEmptyAddress(control) {
197
+ const state = this.states.get(control);
198
+ if (state && untracked(state) && ScAddressQualityService.isEmptyAddress(control.value)) {
199
+ // Проверка возможна во время отрисовки шаблона, где запись сигналов запрещена.
200
+ untracked(() => {
201
+ state.set(null);
202
+ });
203
+ }
204
+ }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScAddressQualityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
206
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScAddressQualityService, providedIn: 'root' }); }
207
+ }
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScAddressQualityService, decorators: [{
209
+ type: Injectable,
210
+ args: [{
211
+ providedIn: 'root',
212
+ }]
213
+ }] });
214
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYWRkcmVzcy1xdWFsaXR5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZGlyZWN0aXZlcy9hZGRyZXNzLXF1YWxpdHkvc2MtYWRkcmVzcy1xdWFsaXR5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFdEYsT0FBTyxFQUE2QiwwQkFBMEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDOztBQUcxRjs7Ozs7Ozs7R0FRRztBQUlILE1BQU0sT0FBTyx1QkFBdUI7SUFIcEM7UUFhSTs7Ozs7V0FLRztRQUNhLGNBQVMsR0FBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFN0U7O1dBRUc7UUFDYywyQkFBc0IsR0FBWSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUV2Rjs7V0FFRztRQUNjLDJCQUFzQixHQUFHLElBQUksa0JBQWtCLENBQUMsNERBQTRELENBQUMsQ0FBQztRQUUvSDs7V0FFRztRQUNjLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBa0UsQ0FBQztRQUV4Rzs7V0FFRztRQUNjLHVCQUFrQixHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO0tBc0xqRztJQXpORzs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFjO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLEtB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QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsLCB1bnRyYWNrZWQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2NJU3VnZ2VzdGlvbk9yZ2FuaXphdGlvbiwgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IFR1aVZhbGlkYXRpb25FcnJvciB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBTQ19CTE9DS19JTkNPTVBMRVRFX0FERFJFU1MgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvc2MtYmxvY2staW5jb21wbGV0ZS1hZGRyZXNzJztcbmltcG9ydCB7IFNjSUFkZHJlc3NRdWFsaXR5U3RhdGUgfSBmcm9tICcuL3NjLWktYWRkcmVzcy1xdWFsaXR5LXN0YXRlJztcblxuLyoqXG4gKiDQodC10YDQstC40YEt0YDQtdC10YHRgtGAINC60LDRh9C10YHRgtCy0LAg0LDQtNGA0LXRgdC+0LIsINCy0YvQsdGA0LDQvdC90YvRhSDQuNC3INC/0L7QtNGB0LrQsNC30L7Qui5cbiAqXG4gKiDQpdGA0LDQvdC40YIg0LrQsNGH0LXRgdGC0LLQviDQv9C+0YHQu9C10LTQvdC10LPQviDQstGL0LHRgNCw0L3QvdC+0LPQviDQsNC00YDQtdGB0LAg0LTQu9GPINC60LDQttC00L7Qs9C+INC60L7QvdGC0YDQvtC70LAuINCa0LDRh9C10YHRgtCy0L4g0L/QvtC70L3QvtCz0L4g0LDQtNGA0LXRgdCwXG4gKiDQtNC10LnRgdGC0LLRg9C10YIsINC/0L7QutCwINC30L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDQvdC1INC40LfQvNC10L3QuNC70L7RgdGMINC/0L7RgdC70LUg0LLRi9Cx0L7RgNCwOiDRgNGD0YfQvdCw0Y8g0L/RgNCw0LLQutCwINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINCw0LTRgNC10YFcbiAqINCyINGA0LDQt9GA0Y/QtCDQvdC10L/RgNC+0LLQtdGA0Y/QtdC80YvRhS4g0JrQsNGH0LXRgdGC0LLQviDQvdC10L/QvtC70L3QvtCz0L4g0LDQtNGA0LXRgdCwINC4INCw0LTRgNC10YHQsCDRgSDQvdC10L7Qv9GA0LXQtNC10LvRkdC90L3QvtC5INC/0L7Qu9C90L7RgtC+0Lkg0YHQvtGF0YDQsNC90Y/QtdGC0YHRj1xuICog0Lgg0L/RgNC4INGA0YPRh9C90L7QuSDQv9GA0LDQstC60LUg0YLQtdC60YHRgtCwOiDQtdCz0L4g0LfQsNC80LXQvdGP0LXRgiDRgtC+0LvRjNC60L4g0LLRi9Cx0L7RgCDQtNGA0YPQs9C+0Lkg0L/QvtC00YHQutCw0LfQutC4INC/0L4g0Y3RgtC+0LzRgyDQv9C+0LvRji5cbiAqINCf0L7Qu9C90LDRjyDQvtGH0LjRgdGC0LrQsCDQv9C+0LvRjyDRgdCx0YDQsNGB0YvQstCw0LXRgiDQutCw0YfQtdGB0YLQstC+OiDQsNC00YDQtdGBLCDQstCy0LXQtNGR0L3QvdGL0Lkg0L/QvtGB0LvQtSDQvdC10ZEsINGB0YfQuNGC0LDQtdGC0YHRjyDRgNGD0YfQvdGL0LwuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNjQWRkcmVzc1F1YWxpdHlTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQv9GA0LjQt9C90LDQuiwg0YfRgtC+INC30L3QsNGH0LXQvdC40LUg0L/QvtC70Y8g0LDQtNGA0LXRgdCwINC/0YPRgdGC0L7QtSDQsdC10Lcg0YPRh9GR0YLQsCDQv9GA0L7QsdC10LvQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlINCX0L3QsNGH0LXQvdC40LUg0L/QvtC70Y8g0LDQtNGA0LXRgdCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGlzRW1wdHlBZGRyZXNzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc05pbCh2YWx1ZSkgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIXZhbHVlLnRyaW0oKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQsNC70LjQtNCw0YLQvtGALCDQt9Cw0L/RgNC10YnQsNGO0YnQuNC5INC+0YLQv9GA0LDQstC60YMg0YTQvtGA0LzRiyDRgSDQvdC10L/QvtC70L3Ri9C8INCw0LTRgNC10YHQvtC8LCDQv9C+0LrQsCDQsdC70L7QutC40YDQvtCy0LrQsCDQstC60LvRjtGH0LXQvdCwINGC0L7QutC10L3QvtC8IHtAbGluayBTQ19CTE9DS19JTkNPTVBMRVRFX0FERFJFU1N9LlxuICAgICAqINCf0L7QtNC60LvRjtGH0LDQtdGC0YHRjyDQuiDQutC+0L3RgtGA0L7Qu9GDINCw0LTRgNC10YHQsCDQv9GA0Lgg0LXQs9C+INGB0L7Qt9C00LDQvdC40Lg7INC00LjRgNC10LrRgtC40LLQsCDQutCw0YfQtdGB0YLQstCwINCw0LTRgNC10YHQsCDRgtC+0LvRjNC60L4g0L/QvtC60LDQt9GL0LLQsNC10YIg0L/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cm9sINCa0L7QvdGC0YDQvtC7INCw0LTRgNC10YHQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sKSA9PiB0aGlzLnZhbGlkYXRlKGNvbnRyb2wpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQvtGC0L/RgNCw0LLQutCwINGE0L7RgNC8INGBINC90LXQv9C+0LvQvdGL0Lwg0LDQtNGA0LXRgdC+0Lwg0LfQsNCx0LvQvtC60LjRgNC+0LLQsNC90LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBibG9ja0luY29tcGxldGVBZGRyZXNzOiBib29sZWFuID0gaW5qZWN0KFNDX0JMT0NLX0lOQ09NUExFVEVfQUREUkVTUyk7XG5cbiAgICAvKipcbiAgICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC90LXQv9C+0LvQvdC+0LPQviDQsNC00YDQtdGB0LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmNvbXBsZXRlQWRkcmVzc0Vycm9yID0gbmV3IFR1aVZhbGlkYXRpb25FcnJvcign0JDQtNGA0LXRgSDQvdC10L/QvtC70L3Ri9C5LCDQstGL0LHQtdGA0LjRgtC1INCx0L7Qu9C10LUg0YLQvtGH0L3Ri9C5INCy0LDRgNC40LDQvdGCINC40Lcg0L/QvtC00YHQutCw0LfQvtC6Jyk7XG5cbiAgICAvKipcbiAgICAgKiDQoNC10LXRgdGC0YAg0YHQvtGB0YLQvtGP0L3QuNC5INC60LDRh9C10YHRgtCy0LAg0L/QviDQutC+0L3RgtGA0L7Qu9Cw0Lwg0LDQtNGA0LXRgdC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZXMgPSBuZXcgV2Vha01hcDxBYnN0cmFjdENvbnRyb2wsIFdyaXRhYmxlU2lnbmFsPFNjSUFkZHJlc3NRdWFsaXR5U3RhdGUgfCBudWxsPj4oKTtcblxuICAgIC8qKlxuICAgICAqINCg0LXQtdGB0YLRgCDQv9GA0LjQt9C90LDQutC+0LIg0LLQutC70Y7Rh9GR0L3QvdC+0LPQviDQutC+0L3RgtGA0L7Qu9GPINC60LDRh9C10YHRgtCy0LAg0L/QviDQutC+0L3RgtGA0L7Qu9Cw0Lwg0LDQtNGA0LXRgdC+0LIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjaGVja0VuYWJsZWRTdGF0ZXMgPSBuZXcgV2Vha01hcDxBYnN0cmFjdENvbnRyb2wsIFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+PigpO1xuXG4gICAgLyoqXG4gICAgICog0JfQsNC00LDRkdGCINC60LDRh9C10YHRgtCy0L4g0LDQtNGA0LXRgdCwLCDQstGL0LHRgNCw0L3QvdC+0LPQviDQsiDQutC+0L3RgtGA0L7Qu9C1LCDQuCDQv9C10YDQtdGB0YfQuNGC0YvQstCw0LXRgiDQstCw0LvQuNC00L3QvtGB0YLRjCDQutC+0L3RgtGA0L7Qu9CwXG4gICAgICog0LHQtdC3INGA0LDRgdGB0YvQu9C60Lgg0YHQvtCx0YvRgtC40LksINGH0YLQvtCx0Ysg0L3QtSDQvdCw0YDRg9GI0LDRgtGMINC/0L7QtNCw0LLQu9C10L3QuNC1IHZhbHVlQ2hhbmdlcyDQv9GA0Lgg0LLRi9Cx0L7RgNC1INC/0L7QtNGB0LrQsNC30LrQuC5cbiAgICAgKiDQmtC+0L3RgtGA0L7QuyDQsNC00YDQtdGB0LAsINGC0YDQtdCx0YPRjtGJ0LXQs9C+INCy0L3QuNC80LDQvdC40Y8g0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GPLCDQv9C+0LzQtdGH0LDQtdGC0YHRjyDQt9Cw0YLRgNC+0L3Rg9GC0YvQvCwg0YfRgtC+0LHRiyDRgdC+0L7QsdGJ0LXQvdC40Y8g0L/QvtC60LDQt9Cw0LvQuNGB0Ywg0YHRgNCw0LfRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cm9sINCa0L7QvdGC0YDQvtC7INCw0LTRgNC10YHQsC5cbiAgICAgKiBAcGFyYW0gcXVhbGl0eSDQmtCw0YfQtdGB0YLQstC+ICjQv9C+0LvQvdC+0YLQsCkg0LDQtNGA0LXRgdCwINC40LvQuCBudWxsLCDQtdGB0LvQuCDQutCw0YfQtdGB0YLQstC+INC90LXQuNC30LLQtdGB0YLQvdC+LlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRRdWFsaXR5KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcXVhbGl0eTogU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGVPZihjb250cm9sKS5zZXQocXVhbGl0eSA9PT0gbnVsbCA/IG51bGwgOiB7IHF1YWxpdHksIHZhbHVlOiBjb250cm9sLnZhbHVlIH0pO1xuXG4gICAgICAgIGlmIChxdWFsaXR5ID09PSBTY1N1Z2dlc3Rpb25BZGRyZXNzUXVhbGl0eS5pbmNvbXBsZXRlIHx8IHF1YWxpdHkgPT09IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5LnVuZGV0ZXJtaW5lZCkge1xuICAgICAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60LDRh9C10YHRgtCy0L4g0LDQtNGA0LXRgdCwLCDQstGL0LHRgNCw0L3QvdC+0LPQviDQsiDQutC+0L3RgtGA0L7Qu9C1LCDQu9C40LHQviBudWxsLCDQtdGB0LvQuCDQsNC00YDQtdGBINC40Lcg0L/QvtC00YHQutCw0LfQvtC6XG4gICAgICog0L3QtSDQstGL0LHQuNGA0LDQu9GB0Y8g0LjQu9C4INC/0L7Qu9C1INC/0YPRgdGC0L7QtS4g0JrQsNGH0LXRgdGC0LLQviDQv9C+0LvQvdC+0LPQviDQsNC00YDQtdGB0LAg0LTQtdC50YHRgtCy0YPQtdGCLCDRgtC+0LvRjNC60L4g0L/QvtC60LAg0LfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINC90LUg0LjQt9C80LXQvdC40LvQvtGB0YxcbiAgICAgKiDQv9C+0YHQu9C1INCy0YvQsdC+0YDQsDsg0LrQsNGH0LXRgdGC0LLQviDQvdC10L/QvtC70L3QvtCz0L4g0LDQtNGA0LXRgdCwINC4INCw0LTRgNC10YHQsCDRgSDQvdC10L7Qv9GA0LXQtNC10LvRkdC90L3QvtC5INC/0L7Qu9C90L7RgtC+0Lkg0LTQtdC50YHRgtCy0YPQtdGCXG4gICAgICog0LTQviDQstGL0LHQvtGA0LAg0LTRgNGD0LPQvtC5INC/0L7QtNGB0LrQsNC30LrQuCDQuNC70Lgg0L/QvtC70L3QvtC5INC+0YfQuNGB0YLQutC4INC/0L7Qu9GPLCDQsiDRgtC+0Lwg0YfQuNGB0LvQtSDQv9C+0YHQu9C1INGA0YPRh9C90L7QuSDQv9GA0LDQstC60Lgg0YLQtdC60YHRgtCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyb2wg0JrQvtC90YLRgNC+0Lsg0LDQtNGA0LXRgdCwLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRRdWFsaXR5KGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZU9mKGNvbnRyb2wpKCk7XG5cbiAgICAgICAgaWYgKCFzdGF0ZSB8fCBTY0FkZHJlc3NRdWFsaXR5U2VydmljZS5pc0VtcHR5QWRkcmVzcyhjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUucXVhbGl0eSA9PT0gU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkuY29tcGxldGUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGF0ZS52YWx1ZSA9PT0gY29udHJvbC52YWx1ZSA/IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5LmNvbXBsZXRlIDogbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGF0ZS5xdWFsaXR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQtNCw0ZHRgiDQutCw0YfQtdGB0YLQstC+INCw0LTRgNC10YHQvtCyINC+0YDQs9Cw0L3QuNC30LDRhtC40Lgg0LrQvtC90YLRgNC+0LvQsNC8INCz0YDRg9C/0L/RiyDQvdCwINC+0YHQvdC+0LLQtSDQstGL0LHRgNCw0L3QvdC+0Lkg0L/QvtC00YHQutCw0LfQutC4LlxuICAgICAqINCa0LDRh9C10YHRgtCy0L4g0L/RgNC40LzQtdC90Y/QtdGC0YHRjyDRgtC+0LvRjNC60L4g0Log0LfQsNC/0L7Qu9C90LXQvdC90YvQvCDQsNC00YDQtdGB0LDQvCDQv9C+0LTRgdC60LDQt9C60Lg6INC00LvRjyDQv9GD0YHRgtC+0LPQviDQsNC00YDQtdGB0LBcbiAgICAgKiDQvtC90L4g0YHQsdGA0LDRgdGL0LLQsNC10YLRgdGPLCDQtNCw0LbQtSDQtdGB0LvQuCDRgdC10YDQstC40YEg0L/QvtC00YHQutCw0LfQvtC6INC/0YDQuNGB0LvQsNC7INC00LvRjyDQvdC10LPQviDQt9C90LDRh9C10L3QuNC1LlxuICAgICAqXG4gICAgICogQHBhcmFtIGdyb3VwINCT0YDRg9C/0L/QsCDRgSDQutC+0L3RgtGA0L7Qu9Cw0LzQuCDQsNC00YDQtdGB0L7QsiDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4LlxuICAgICAqIEBwYXJhbSBzdWdnZXN0aW9uINCe0LHRitC10LrRgiDQv9C+0LTRgdC60LDQt9C60Lgg0L/QviDQvtGA0LPQsNC90LjQt9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRPcmdhbml6YXRpb25BZGRyZXNzUXVhbGl0aWVzKGdyb3VwOiBBYnN0cmFjdENvbnRyb2wsIHN1Z2dlc3Rpb246IFNjSVN1Z2dlc3Rpb25Pcmdhbml6YXRpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcXVhbGl0aWVzOiBSZWFkb25seUFycmF5PFtzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZCwgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkgfCB1bmRlZmluZWRdPiA9IFtcbiAgICAgICAgICAgIFsnbGVnYWxBZGRyZXNzJywgc3VnZ2VzdGlvbi5sZWdhbEFkZHJlc3MsIHN1Z2dlc3Rpb24ubGVnYWxBZGRyZXNzUXVhbGl0eV0sXG4gICAgICAgICAgICBbJ3Bvc3RhbEFkZHJlc3MnLCBzdWdnZXN0aW9uLnBvc3RhbEFkZHJlc3MsIHN1Z2dlc3Rpb24ucG9zdGFsQWRkcmVzc1F1YWxpdHldLFxuICAgICAgICAgICAgWydhY3R1YWxBZGRyZXNzJywgc3VnZ2VzdGlvbi5hY3R1YWxBZGRyZXNzLCBzdWdnZXN0aW9uLmFjdHVhbEFkZHJlc3NRdWFsaXR5XSxcbiAgICAgICAgXTtcblxuICAgICAgICBxdWFsaXRpZXMuZm9yRWFjaCgoW2NvbnRyb2xOYW1lLCBhZGRyZXNzLCBxdWFsaXR5XSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IGdyb3VwLmdldChjb250cm9sTmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRRdWFsaXR5KGNvbnRyb2wsIGFkZHJlc3MgPyAocXVhbGl0eSA/PyBudWxsKSA6IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC60LvRjtGH0LDQtdGCINC40LvQuCDQvtGC0LrQu9GO0YfQsNC10YIg0LrQvtC90YLRgNC+0LvRjCDQutCw0YfQtdGB0YLQstCwINCw0LTRgNC10YHQsCDQtNC70Y8g0LrQvtC90YLRgNC+0LvQsCDQuCDQv9C10YDQtdGB0YfQuNGC0YvQstCw0LXRgiDQtdCz0L4g0LLQsNC70LjQtNC90L7RgdGC0Ywg0LHQtdC3INGA0LDRgdGB0YvQu9C60Lgg0YHQvtCx0YvRgtC40LkuXG4gICAgICog0KHQvtGF0YDQsNC90ZHQvdC90L7QtSDQutCw0YfQtdGB0YLQstC+INC/0YDQuCDQvtGC0LrQu9GO0YfQtdC90LjQuCDQvdC1INGC0LXRgNGP0LXRgtGB0Y8g0Lgg0YHQvdC+0LLQsCDRg9GH0LjRgtGL0LLQsNC10YLRgdGPINC/0L7RgdC70LUg0LLQutC70Y7Rh9C10L3QuNGPLlxuICAgICAqINCS0YvQt9GL0LLQsNGC0Ywg0L/RgNC4INGB0LzQtdC90LUg0LfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLLCDQsCDQvdC1INC40Lcg0YXRg9C60L7QsiDQv9GA0L7QstC10YDQutC4INC40LfQvNC10L3QtdC90LjQuSAobmdPbkNoYW5nZXMg0Lgg0YIu0L8uKSxcbiAgICAgKiDRh9GC0L7QsdGLINGA0L7QtNC40YLQtdC70YzRgdC60LjQtSDRiNCw0LHQu9C+0L3RiyDRgdGA0LDQt9GDINCy0LjQtNC10LvQuCDQsNC60YLRg9Cw0LvRjNC90YPRjiDQstCw0LvQuNC00L3QvtGB0YLRjC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cm9sINCa0L7QvdGC0YDQvtC7INCw0LTRgNC10YHQsC5cbiAgICAgKiBAcGFyYW0gZW5hYmxlZCDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INC60L7QvdGC0YDQvtC70Ywg0LrQsNGH0LXRgdGC0LLQsCDQsNC00YDQtdGB0LAg0LLQutC70Y7Rh9GR0L0uXG4gICAgICovXG4gICAgcHVibGljIHNldFF1YWxpdHlDaGVja0VuYWJsZWQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNoZWNrRW5hYmxlZCA9IHRoaXMuY2hlY2tFbmFibGVkT2YoY29udHJvbCk7XG5cbiAgICAgICAgaWYgKHVudHJhY2tlZChjaGVja0VuYWJsZWQpID09PSBlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyDQktGL0LfQvtCyINCy0L7Qt9C80L7QttC10L0g0LLQviDQstGA0LXQvNGPINC+0YLRgNC40YHQvtCy0LrQuCDRiNCw0LHQu9C+0L3QsCAo0L/QtdGA0LLQsNGPINC/0L7QtNC/0LjRgdC60LAgYXN5bmMgcGlwZSksINCz0LTQtSDQt9Cw0L/QuNGB0Ywg0YHQuNCz0L3QsNC70L7QsiDQt9Cw0L/RgNC10YnQtdC90LAuXG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgICBjaGVja0VuYWJsZWQuc2V0KGVuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQv9GA0LjQt9C90LDQuiwg0YfRgtC+INC60L7QvdGC0YDQvtC70Ywg0LrQsNGH0LXRgdGC0LLQsCDQsNC00YDQtdGB0LAg0LTQu9GPINC60L7QvdGC0YDQvtC70LAg0LLQutC70Y7Rh9GR0L0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJvbCDQmtC+0L3RgtGA0L7QuyDQsNC00YDQtdGB0LAuXG4gICAgICovXG4gICAgcHVibGljIGlzUXVhbGl0eUNoZWNrRW5hYmxlZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tFbmFibGVkT2YoY29udHJvbCkoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQvtGI0LjQsdC60YMg0L3QtdC/0L7Qu9C90L7Qs9C+INCw0LTRgNC10YHQsCDQu9C40LHQviBudWxsLCDQtdGB0LvQuCDQutC+0L3RgtGA0L7QuyDQvNC+0LbQvdC+INC+0YLQv9GA0LDQstC70Y/RgtGMOiDQutC+0L3RgtGA0L7Qu9GMINC60LDRh9C10YHRgtCy0LAg0L7RgtC60LvRjtGH0ZHQvSxcbiAgICAgKiDQsdC70L7QutC40YDQvtCy0LrQsCDQstGL0LrQu9GO0YfQtdC90LAg0YLQvtC60LXQvdC+0Lwge0BsaW5rIFNDX0JMT0NLX0lOQ09NUExFVEVfQUREUkVTU30g0LjQu9C4INCw0LTRgNC10YEg0L3QtSDQvdC10L/QvtC70L3Ri9C5LlxuICAgICAqINCU0LvRjyDQvtGH0LjRidC10L3QvdC+0LPQviDQv9C+0LvRjyDRgdCx0YDQsNGB0YvQstCw0LXRgiDRgdC+0YXRgNCw0L3RkdC90L3QvtC1INC60LDRh9C10YHRgtCy0L4g0LDQtNGA0LXRgdCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyb2wg0JrQvtC90YLRgNC+0Lsg0LDQtNGA0LXRgdCwLlxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIHRoaXMucmVzZXRRdWFsaXR5T2ZFbXB0eUFkZHJlc3MoY29udHJvbCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tJbmNvbXBsZXRlQWRkcmVzcyAmJiB0aGlzLmlzUXVhbGl0eUNoZWNrRW5hYmxlZChjb250cm9sKSAmJiB0aGlzLmdldFF1YWxpdHkoY29udHJvbCkgPT09IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5LmluY29tcGxldGVcbiAgICAgICAgICAgID8geyBpbmNvbXBsZXRlQWRkcmVzczogdGhpcy5pbmNvbXBsZXRlQWRkcmVzc0Vycm9yIH1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgtC10LrRgdGCINC/0YDQtdC00YPQv9GA0LXQttC00LXQvdC40Y8g0L4g0L3QtdC+0LHRhdC+0LTQuNC80L7RgdGC0Lgg0L/RgNC+0LLQtdGA0LjRgtGMINCy0YvQsdGA0LDQvdC90YvQuSDQsNC00YDQtdGBINC70LjQsdC+IG51bGwsINC60L7Qs9C00LAg0L/RgNC10LTRg9C/0YDQtdC20LTQtdC90LjQtSDQvdC1INGC0YDQtdCx0YPQtdGC0YHRjyxcbiAgICAgKiDQsiDRgtC+0Lwg0YfQuNGB0LvQtSDQtNC70Y8g0L/Rg9GB0YLQvtCz0L4g0L/QvtC70Y8uINCU0LvRjyDQvdC10L/QvtC70L3QvtCz0L4g0LDQtNGA0LXRgdCwINC/0YDQuCDQstC60LvRjtGH0ZHQvdC90L7QuSDQsdC70L7QutC40YDQvtCy0LrQtSDQvtGC0L/RgNCw0LLQutC4INCy0LzQtdGB0YLQviDQv9GA0LXQtNGD0L/RgNC10LbQtNC10L3QuNGPXG4gICAgICog0L/QvtC60LDQt9GL0LLQsNC10YLRgdGPINC+0YjQuNCx0LrQsCDQstCw0LvQuNC00LDRgtC+0YDQsCB7QGxpbmsgdmFsaWRhdG9yfSwg0LXRgdC70Lgg0L7QvSDQv9C+0LTQutC70Y7Rh9GR0L0g0Log0LrQvtC90YLRgNC+0LvRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cm9sINCa0L7QvdGC0YDQvtC7INCw0LTRgNC10YHQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0V2FybmluZ01lc3NhZ2UoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5pc1F1YWxpdHlDaGVja0VuYWJsZWQoY29udHJvbCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmdldFF1YWxpdHkoY29udHJvbCkpIHtcbiAgICAgICAgICAgIGNhc2UgU2NTdWdnZXN0aW9uQWRkcmVzc1F1YWxpdHkudW5kZXRlcm1pbmVkOlxuICAgICAgICAgICAgICAgIHJldHVybiAn0J3QtSDRg9C00LDQu9C+0YHRjCDQvtC/0YDQtdC00LXQu9C40YLRjCDQv9C+0LvQvdC+0YLRgyDQsNC00YDQtdGB0LAsINC/0YDQvtCy0LXRgNGM0YLQtSDQtdCz0L4nO1xuICAgICAgICAgICAgY2FzZSBTY1N1Z2dlc3Rpb25BZGRyZXNzUXVhbGl0eS5pbmNvbXBsZXRlOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJsb2NrSW5jb21wbGV0ZUFkZHJlc3MgJiYgY29udHJvbC5oYXNWYWxpZGF0b3IodGhpcy52YWxpZGF0b3IpID8gbnVsbCA6ICfQkNC00YDQtdGBINC90LXQv9C+0LvQvdGL0LksINC/0YDQvtCy0LXRgNGM0YLQtSDQtdCz0L4nO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LjQs9C90LDQuyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LrQsNGH0LXRgdGC0LLQsCDQtNC70Y8g0LrQvtC90YLRgNC+0LvQsCwg0YHQvtC30LTQsNCy0LDRjyDQtdCz0L4g0L/RgNC4INC/0LXRgNCy0L7QvCDQvtCx0YDQsNGJ0LXQvdC40LguXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udHJvbCDQmtC+0L3RgtGA0L7QuyDQsNC00YDQtdGB0LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzdGF0ZU9mKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFdyaXRhYmxlU2lnbmFsPFNjSUFkZHJlc3NRdWFsaXR5U3RhdGUgfCBudWxsPiB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVzLmdldChjb250cm9sKTtcblxuICAgICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHNpZ25hbDxTY0lBZGRyZXNzUXVhbGl0eVN0YXRlIHwgbnVsbD4obnVsbCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlcy5zZXQoY29udHJvbCwgc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LjQs9C90LDQuyDQv9GA0LjQt9C90LDQutCwINCy0LrQu9GO0YfRkdC90L3QvtCz0L4g0LrQvtC90YLRgNC+0LvRjyDQutCw0YfQtdGB0YLQstCwINC00LvRjyDQutC+0L3RgtGA0L7Qu9CwLCDRgdC+0LfQtNCw0LLQsNGPINC10LPQviDQv9GA0Lgg0L/QtdGA0LLQvtC8INC+0LHRgNCw0YnQtdC90LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb250cm9sINCa0L7QvdGC0YDQvtC7INCw0LTRgNC10YHQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNoZWNrRW5hYmxlZE9mKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IGNoZWNrRW5hYmxlZCA9IHRoaXMuY2hlY2tFbmFibGVkU3RhdGVzLmdldChjb250cm9sKTtcblxuICAgICAgICBpZiAoIWNoZWNrRW5hYmxlZCkge1xuICAgICAgICAgICAgY2hlY2tFbmFibGVkID0gc2lnbmFsKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5jaGVja0VuYWJsZWRTdGF0ZXMuc2V0KGNvbnRyb2wsIGNoZWNrRW5hYmxlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hlY2tFbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LHRgNCw0YHRi9Cy0LDQtdGCINGB0L7RhdGA0LDQvdGR0L3QvdC+0LUg0LrQsNGH0LXRgdGC0LLQviDQsNC00YDQtdGB0LAsINC10YHQu9C4INC/0L7Qu9C1INC+0YfQuNGJ0LXQvdC+LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRyb2wg0JrQvtC90YLRgNC+0Lsg0LDQtNGA0LXRgdCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRRdWFsaXR5T2ZFbXB0eUFkZHJlc3MoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZXMuZ2V0KGNvbnRyb2wpO1xuXG4gICAgICAgIGlmIChzdGF0ZSAmJiB1bnRyYWNrZWQoc3RhdGUpICYmIFNjQWRkcmVzc1F1YWxpdHlTZXJ2aWNlLmlzRW1wdHlBZGRyZXNzKGNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICAvLyDQn9GA0L7QstC10YDQutCwINCy0L7Qt9C80L7QttC90LAg0LLQviDQstGA0LXQvNGPINC+0YLRgNC40YHQvtCy0LrQuCDRiNCw0LHQu9C+0L3QsCwg0LPQtNC1INC30LDQv9C40YHRjCDRgdC40LPQvdCw0LvQvtCyINC30LDQv9GA0LXRidC10L3QsC5cbiAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdGUuc2V0KG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1hZGRyZXNzLXF1YWxpdHktc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZGlyZWN0aXZlcy9hZGRyZXNzLXF1YWxpdHkvc2MtaS1hZGRyZXNzLXF1YWxpdHktc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5IH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5cbi8qKlxuICog0KHQvtGB0YLQvtGP0L3QuNC1INC60LDRh9C10YHRgtCy0LAg0LDQtNGA0LXRgdCwLCDQstGL0LHRgNCw0L3QvdC+0LPQviDQuNC3INC/0L7QtNGB0LrQsNC30L7Qui5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY0lBZGRyZXNzUXVhbGl0eVN0YXRlIHtcbiAgICAvKipcbiAgICAgKiDQmtCw0YfQtdGB0YLQstC+ICjQv9C+0LvQvdC+0YLQsCkg0LDQtNGA0LXRgdCwLlxuICAgICAqL1xuICAgIHF1YWxpdHk6IFNjU3VnZ2VzdGlvbkFkZHJlc3NRdWFsaXR5O1xuXG4gICAgLyoqXG4gICAgICog0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINC90LAg0LzQvtC80LXQvdGCINCy0YvQsdC+0YDQsCDQsNC00YDQtdGB0LAuXG4gICAgICovXG4gICAgdmFsdWU6IHVua25vd247XG59XG4iXX0=
@@ -1,4 +1,6 @@
1
1
  export * from './abstract-price-card/abstract-sc-price-card.directive';
2
+ export * from './address-quality/sc-address-quality.directive';
3
+ export * from './address-quality/sc-address-quality.service';
2
4
  export * from './links';
3
5
  export * from './next-input-focus/sc-next-input-focus.directive';
4
6
  export * from './next-input-focus/sc-next-input-focus.module';
@@ -7,4 +9,4 @@ export * from './sc-date-value-transformer.directive';
7
9
  export * from './sc-focus-first-invalid-field.directive';
8
10
  export * from './select-on-focusin/sc-select-on-focusin.directive';
9
11
  export * from './terminal-link/sc-terminal-link.directive';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZGlyZWN0aXZlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYywwQ0FBMEMsQ0FBQztBQUN6RCxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsNENBQTRDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Fic3RyYWN0LXByaWNlLWNhcmQvYWJzdHJhY3Qtc2MtcHJpY2UtY2FyZC5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saW5rcyc7XG5leHBvcnQgKiBmcm9tICcuL25leHQtaW5wdXQtZm9jdXMvc2MtbmV4dC1pbnB1dC1mb2N1cy5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXh0LWlucHV0LWZvY3VzL3NjLW5leHQtaW5wdXQtZm9jdXMubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpbnQvc2MtcHJpbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZGF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1mb2N1cy1maXJzdC1pbnZhbGlkLWZpZWxkLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlbGVjdC1vbi1mb2N1c2luL3NjLXNlbGVjdC1vbi1mb2N1c2luLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlcm1pbmFsLWxpbmsvc2MtdGVybWluYWwtbGluay5kaXJlY3RpdmUnO1xuIl19
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZGlyZWN0aXZlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyw4Q0FBOEMsQ0FBQztBQUM3RCxjQUFjLFNBQVMsQ0FBQztBQUN4QixjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLHVDQUF1QyxDQUFDO0FBQ3RELGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYyxvREFBb0QsQ0FBQztBQUNuRSxjQUFjLDRDQUE0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdC1wcmljZS1jYXJkL2Fic3RyYWN0LXNjLXByaWNlLWNhcmQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vYWRkcmVzcy1xdWFsaXR5L3NjLWFkZHJlc3MtcXVhbGl0eS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9hZGRyZXNzLXF1YWxpdHkvc2MtYWRkcmVzcy1xdWFsaXR5LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saW5rcyc7XG5leHBvcnQgKiBmcm9tICcuL25leHQtaW5wdXQtZm9jdXMvc2MtbmV4dC1pbnB1dC1mb2N1cy5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXh0LWlucHV0LWZvY3VzL3NjLW5leHQtaW5wdXQtZm9jdXMubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpbnQvc2MtcHJpbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZGF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1mb2N1cy1maXJzdC1pbnZhbGlkLWZpZWxkLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlbGVjdC1vbi1mb2N1c2luL3NjLXNlbGVjdC1vbi1mb2N1c2luLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Rlcm1pbmFsLWxpbmsvc2MtdGVybWluYWwtbGluay5kaXJlY3RpdmUnO1xuIl19