monkey-front-components 0.0.180 → 0.0.181

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 (81) hide show
  1. package/esm2020/lib/components/base/base-component.mjs +297 -0
  2. package/esm2020/lib/components/base/base-dynamic-array.mjs +221 -0
  3. package/esm2020/lib/components/base/base-dynamic.mjs +99 -0
  4. package/{esm2015/lib/components/base/base-validators.js → esm2020/lib/components/base/base-validators.mjs} +1 -1
  5. package/{esm2015/lib/components/base/index.js → esm2020/lib/components/base/index.mjs} +0 -0
  6. package/esm2020/lib/components/dynamic/button/button.component.mjs +52 -0
  7. package/{esm2015/lib/components/dynamic/button/index.js → esm2020/lib/components/dynamic/button/index.mjs} +0 -0
  8. package/esm2020/lib/components/dynamic/dynamic-directive.mjs +95 -0
  9. package/{esm2015/lib/components/dynamic/dynamic.module.js → esm2020/lib/components/dynamic/dynamic.module.mjs} +5 -5
  10. package/esm2020/lib/components/dynamic/file-upload/file-upload.component.mjs +52 -0
  11. package/{esm2015/lib/components/dynamic/file-upload/index.js → esm2020/lib/components/dynamic/file-upload/index.mjs} +0 -0
  12. package/esm2020/lib/components/dynamic/form/dynamic-form-array.component.mjs +72 -0
  13. package/esm2020/lib/components/dynamic/form/dynamic-form.component.mjs +46 -0
  14. package/{esm2015/lib/components/dynamic/form/index.js → esm2020/lib/components/dynamic/form/index.mjs} +0 -0
  15. package/{esm2015/lib/components/dynamic/index.js → esm2020/lib/components/dynamic/index.mjs} +0 -0
  16. package/{esm2015/lib/components/dynamic/input/index.js → esm2020/lib/components/dynamic/input/index.mjs} +0 -0
  17. package/esm2020/lib/components/dynamic/input/input.component.mjs +65 -0
  18. package/{esm2015/lib/components/dynamic/input-phone/index.js → esm2020/lib/components/dynamic/input-phone/index.mjs} +0 -0
  19. package/esm2020/lib/components/dynamic/input-phone/input-phone.component.mjs +65 -0
  20. package/{esm2015/lib/components/dynamic/radio/index.js → esm2020/lib/components/dynamic/radio/index.mjs} +0 -0
  21. package/esm2020/lib/components/dynamic/radio/radio.component.mjs +33 -0
  22. package/{esm2015/lib/components/dynamic/select/index.js → esm2020/lib/components/dynamic/select/index.mjs} +0 -0
  23. package/esm2020/lib/components/dynamic/select/select.component.mjs +80 -0
  24. package/{esm2015/lib/components/dynamic/select-search/index.js → esm2020/lib/components/dynamic/select-search/index.mjs} +0 -0
  25. package/esm2020/lib/components/dynamic/select-search/select-search.component.mjs +80 -0
  26. package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +0 -0
  27. package/{esm2015/lib/components/shared/index.js → esm2020/lib/components/shared/index.mjs} +2 -1
  28. package/{esm2015/lib/components/shared/password-strength/index.js → esm2020/lib/components/shared/password-strength/index.mjs} +0 -0
  29. package/esm2020/lib/components/shared/password-strength/password-strength.component.mjs +83 -0
  30. package/{esm2015/lib/components/shared/password-strength/password-strength.js → esm2020/lib/components/shared/password-strength/password-strength.mjs} +0 -0
  31. package/{esm2015/lib/components/shared/password-strength/password-strength.module.js → esm2020/lib/components/shared/password-strength/password-strength.module.mjs} +5 -5
  32. package/esm2020/lib/components/shared/progress-bar/index.mjs +4 -0
  33. package/esm2020/lib/components/shared/progress-bar/progress-bar.component.mjs +28 -0
  34. package/esm2020/lib/components/shared/progress-bar/progress-bar.module.mjs +18 -0
  35. package/esm2020/lib/components/shared/progress-bar/progress-bar.service.mjs +49 -0
  36. package/{esm2015/lib/interfaces/field-config.js → esm2020/lib/interfaces/field-config.mjs} +0 -0
  37. package/{esm2015/lib/interfaces/index.js → esm2020/lib/interfaces/index.mjs} +0 -0
  38. package/{esm2015/monkey-front-components.js → esm2020/monkey-front-components.mjs} +0 -0
  39. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  40. package/fesm2015/monkey-front-components.mjs +1493 -0
  41. package/fesm2015/monkey-front-components.mjs.map +1 -0
  42. package/fesm2020/monkey-front-components.mjs +1477 -0
  43. package/fesm2020/monkey-front-components.mjs.map +1 -0
  44. package/lib/components/base/base-component.d.ts +1 -1
  45. package/lib/components/base/base-dynamic-array.d.ts +1 -1
  46. package/lib/components/base/base-dynamic.d.ts +1 -1
  47. package/lib/components/base/base-validators.d.ts +1 -14
  48. package/lib/components/dynamic/button/button.component.d.ts +2 -2
  49. package/lib/components/dynamic/dynamic-directive.d.ts +2 -2
  50. package/lib/components/dynamic/input/input.component.d.ts +3 -3
  51. package/lib/components/dynamic/input-phone/input-phone.component.d.ts +3 -3
  52. package/lib/components/dynamic/radio/radio.component.d.ts +2 -2
  53. package/lib/components/dynamic/select/select.component.d.ts +2 -2
  54. package/lib/components/dynamic/select-search/select-search.component.d.ts +2 -2
  55. package/lib/components/shared/index.d.ts +1 -0
  56. package/lib/components/shared/password-strength/password-strength.component.d.ts +2 -2
  57. package/lib/components/shared/progress-bar/index.d.ts +3 -0
  58. package/lib/components/shared/progress-bar/progress-bar.component.d.ts +12 -0
  59. package/lib/components/shared/progress-bar/progress-bar.module.d.ts +8 -0
  60. package/lib/components/shared/progress-bar/progress-bar.service.d.ts +14 -0
  61. package/monkey-front-components-0.0.181.tgz +0 -0
  62. package/package.json +24 -10
  63. package/bundles/monkey-front-components.umd.js +0 -1866
  64. package/bundles/monkey-front-components.umd.js.map +0 -1
  65. package/esm2015/lib/components/base/base-component.js +0 -288
  66. package/esm2015/lib/components/base/base-dynamic-array.js +0 -215
  67. package/esm2015/lib/components/base/base-dynamic.js +0 -98
  68. package/esm2015/lib/components/dynamic/button/button.component.js +0 -57
  69. package/esm2015/lib/components/dynamic/dynamic-directive.js +0 -95
  70. package/esm2015/lib/components/dynamic/file-upload/file-upload.component.js +0 -57
  71. package/esm2015/lib/components/dynamic/form/dynamic-form-array.component.js +0 -77
  72. package/esm2015/lib/components/dynamic/form/dynamic-form.component.js +0 -51
  73. package/esm2015/lib/components/dynamic/input/input.component.js +0 -66
  74. package/esm2015/lib/components/dynamic/input-phone/input-phone.component.js +0 -66
  75. package/esm2015/lib/components/dynamic/radio/radio.component.js +0 -36
  76. package/esm2015/lib/components/dynamic/select/select.component.js +0 -81
  77. package/esm2015/lib/components/dynamic/select-search/select-search.component.js +0 -81
  78. package/esm2015/lib/components/shared/password-strength/password-strength.component.js +0 -89
  79. package/fesm2015/monkey-front-components.js +0 -1414
  80. package/fesm2015/monkey-front-components.js.map +0 -1
  81. package/monkey-front-components-0.0.180.tgz +0 -0
@@ -0,0 +1,297 @@
1
+ import { Subject } from 'rxjs';
2
+ import { Directive } from '@angular/core';
3
+ import { takeUntil } from 'rxjs/operators';
4
+ import { MonkeyUtils } from 'monkey-style-guide';
5
+ import { MonkeyEcxCommonsService, ValidateUtils } from 'monkey-front-core';
6
+ import * as i0 from "@angular/core";
7
+ export class BaseComponent {
8
+ constructor() {
9
+ this.__paginationOptions = null;
10
+ this.__isMobile = this.isMobile();
11
+ this.__locales = ['pt-BR', 'es-CL'];
12
+ this.__unsubscribeAll = new Subject();
13
+ }
14
+ isMobile() {
15
+ const isMobileWidth = (window.screen.width <= 640) ||
16
+ (window.matchMedia &&
17
+ window.matchMedia('only screen and (max-width: 640px)').matches);
18
+ return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|Mobile/i.test(navigator.userAgent)) || isMobileWidth;
19
+ }
20
+ handlePagination(create = true) {
21
+ const { __paginationOptions } = this;
22
+ if (__paginationOptions) {
23
+ const { mainElement, service } = __paginationOptions;
24
+ setTimeout(() => {
25
+ const element = document.getElementById(mainElement);
26
+ if (element) {
27
+ element.scroll = null;
28
+ element.onscroll = null;
29
+ if (create) {
30
+ this.paginationFunc = () => {
31
+ const { scrollTop, scrollHeight, offsetHeight } = element;
32
+ const contentHeight = scrollHeight - offsetHeight;
33
+ if (contentHeight <= scrollTop) {
34
+ service.__onDoPagination$.next(null);
35
+ }
36
+ };
37
+ element.addEventListener('scroll', this.paginationFunc);
38
+ }
39
+ else {
40
+ element.removeEventListener('scroll', this.paginationFunc);
41
+ }
42
+ }
43
+ }, 200);
44
+ }
45
+ }
46
+ handleSupport(supportControls) {
47
+ const { service, show } = supportControls;
48
+ const method = show ? 'show' : 'hide';
49
+ service[method.toLowerCase()]();
50
+ }
51
+ handleTranslate(translateOptions) {
52
+ const { service } = translateOptions;
53
+ service.__oni18nDataChanged$
54
+ .pipe(takeUntil(this.__unsubscribeAll))
55
+ .subscribe(() => {
56
+ const data = service.__i18n;
57
+ if (data) {
58
+ this.__i18n = data;
59
+ }
60
+ });
61
+ }
62
+ getErrorFirstMessageTranslated(formControl = null) {
63
+ if (formControl?.hasError('required'))
64
+ return 'FIELD-REQUIRED';
65
+ if (formControl?.hasError('invalid'))
66
+ return 'FIELD-INVALID';
67
+ if (formControl?.hasError('email'))
68
+ return 'INVALID-EMAIL';
69
+ if (formControl?.hasError('minlength'))
70
+ return 'MIN-LENGTH';
71
+ if (formControl?.hasError('maxlength'))
72
+ return 'MAX-LENGTH';
73
+ if (formControl?.hasError('max'))
74
+ return 'MAX';
75
+ if (formControl?.hasError('min'))
76
+ return 'MIN';
77
+ if (formControl?.hasError('passwordsNotMatching'))
78
+ return 'MATCH-PASSWORD';
79
+ if (formControl?.hasError('invalidDate'))
80
+ return 'INVALID-DATE';
81
+ if (formControl?.hasError('invalidTrue'))
82
+ return 'INVALID-TRUE';
83
+ if (formControl?.hasError('invalidCpfCnpj'))
84
+ return 'INVALID-DOCUMENT';
85
+ if (formControl?.hasError('invalidZipCode'))
86
+ return 'INVALID-ZIPCODE';
87
+ if (formControl?.hasError('invalidCombo'))
88
+ return 'INVALID-COMBO';
89
+ if (formControl?.hasError('invalidUrl'))
90
+ return 'INVALID-URL';
91
+ if (formControl?.hasError('invalidUnlockRegister')) {
92
+ return 'INVALID-UNLOCK-REGISTER';
93
+ }
94
+ if (formControl?.hasError('dateStartMustBeLessThanAnd')) {
95
+ return 'DATE-START-MUST-BE-LESS-THAN-AND';
96
+ }
97
+ if (formControl?.hasError('dateEndMustBeGreaterThanStart')) {
98
+ return 'DATE-END-MUST-BE-GREATER-THAN-SART';
99
+ }
100
+ if (formControl?.hasError('phone'))
101
+ return 'INVALID-PHONE';
102
+ return 'FIELD-INVALID';
103
+ }
104
+ getErrorLastMessageNotTranslated(formControl = null) {
105
+ if (formControl?.hasError('minlength')) {
106
+ return `${formControl?.getError('minlength').requiredLength} caracteres.`;
107
+ }
108
+ if (formControl?.hasError('maxlength')) {
109
+ return `${formControl?.getError('maxlength').requiredLength} caracteres.`;
110
+ }
111
+ if (formControl?.hasError('max')) {
112
+ return `${formControl?.getError('max').max}`;
113
+ }
114
+ if (formControl?.hasError('min')) {
115
+ return `${formControl?.getError('min').min}`;
116
+ }
117
+ return '';
118
+ }
119
+ validateFormWithTranslate(f, index) {
120
+ const formErrors = f.value;
121
+ if (f.status === 'VALID')
122
+ return true;
123
+ if (!formErrors)
124
+ return true;
125
+ Object.entries(formErrors).forEach(([key, value]) => {
126
+ const control = f.get(key);
127
+ formErrors[key] = '';
128
+ if (control && !control.valid) {
129
+ const msg = {
130
+ first: `ERRORS.${this.getErrorFirstMessageTranslated(f.get(key))}`,
131
+ last: this.getErrorLastMessageNotTranslated(f.get(key))
132
+ };
133
+ formErrors[key] = msg;
134
+ }
135
+ });
136
+ if (MonkeyUtils.persistNullEmptyUndefined(index)) {
137
+ this.__monkeyecxFormErrors[index || 0] = formErrors;
138
+ }
139
+ else {
140
+ this.__monkeyecxFormErrors = formErrors;
141
+ }
142
+ return false;
143
+ }
144
+ copyToClipboard(val) {
145
+ const selBox = document.createElement('textarea');
146
+ selBox.style.position = 'fixed';
147
+ selBox.style.left = '0';
148
+ selBox.style.top = '0';
149
+ selBox.style.opacity = '0';
150
+ selBox.value = val;
151
+ document.body.appendChild(selBox);
152
+ selBox.focus();
153
+ selBox.select();
154
+ document.execCommand('copy');
155
+ document.body.removeChild(selBox);
156
+ }
157
+ validateForm(f, index, alias) {
158
+ const formErrors = f.value;
159
+ if (f.status === 'VALID')
160
+ return true;
161
+ if (!formErrors)
162
+ return true;
163
+ Object.entries(formErrors).forEach(([key, value]) => {
164
+ const control = f.get(key);
165
+ formErrors[key] = '';
166
+ if (control && !control.valid) {
167
+ const msg = {
168
+ firstMessage: `ERRORS.${this.getErrorFirstMessageTranslated(f.get(key))}`,
169
+ lastMessage: this.getErrorLastMessageNotTranslated(f.get(key))
170
+ };
171
+ formErrors[key] = msg;
172
+ }
173
+ });
174
+ if (MonkeyUtils.persistNullEmptyUndefined(index)) {
175
+ this.__monkeyecxFormErrors[index || 0] = formErrors;
176
+ }
177
+ else {
178
+ let obj;
179
+ if (alias) {
180
+ obj = {
181
+ [alias]: {
182
+ ...formErrors
183
+ }
184
+ };
185
+ }
186
+ else {
187
+ obj = formErrors;
188
+ }
189
+ this.__monkeyecxFormErrors = {
190
+ ...this.__monkeyecxFormErrors,
191
+ ...obj
192
+ };
193
+ }
194
+ f.markAllAsTouched();
195
+ return false;
196
+ }
197
+ clearAllServiceData(clearData) {
198
+ const context = this;
199
+ Object.values(context).forEach((ctx) => {
200
+ if (ctx instanceof MonkeyEcxCommonsService) {
201
+ ctx.clear(clearData);
202
+ }
203
+ });
204
+ }
205
+ ngOnInit(args) {
206
+ if (args?.paginationOptions) {
207
+ this.__paginationOptions = args?.paginationOptions;
208
+ this.handlePagination();
209
+ }
210
+ if (args?.supportControls) {
211
+ this.handleSupport(args?.supportControls);
212
+ }
213
+ if (args?.translateOptions) {
214
+ this.handleTranslate(args?.translateOptions);
215
+ }
216
+ }
217
+ ngOnDestroy(clearData = true) {
218
+ this.__unsubscribeAll.next();
219
+ this.__unsubscribeAll.complete();
220
+ this.clearAllServiceData(clearData);
221
+ this.handlePagination(false);
222
+ }
223
+ handleErrorFromServices(error, f) {
224
+ this.__monkeyecxFormErrors = null;
225
+ if (error.type === 'Parameter_Error') {
226
+ Object.entries(f.value).forEach(([key, value]) => {
227
+ error.notifications.forEach((_) => {
228
+ const field = _.split(':')[0];
229
+ const description = _.split(':')[1];
230
+ if (field === key) {
231
+ const msg = {
232
+ firstMessage: '',
233
+ lastMessage: description
234
+ };
235
+ this.__monkeyecxFormErrors = {
236
+ ...this.__monkeyecxFormErrors,
237
+ [key]: msg
238
+ };
239
+ f.controls[key].setErrors({
240
+ incorrect: true
241
+ });
242
+ }
243
+ });
244
+ });
245
+ }
246
+ f.markAllAsTouched();
247
+ }
248
+ goBack() {
249
+ window.history.back();
250
+ }
251
+ goScroll(id) {
252
+ const element = document.getElementById(id);
253
+ if (element)
254
+ element.scrollIntoView();
255
+ }
256
+ getEmbeddedData(data, field) {
257
+ const { _embedded } = data;
258
+ return _embedded ? _embedded[field] : null;
259
+ }
260
+ openWindow(url) {
261
+ window.open(`${url}`, '_blank');
262
+ }
263
+ fillI18n(data) {
264
+ this.__i18n = data;
265
+ }
266
+ getCountryPrefix(country) {
267
+ return {
268
+ br: 55,
269
+ cl: 56
270
+ }[country];
271
+ }
272
+ getCountryCurrencyChartFormat(country) {
273
+ return {
274
+ br: 'R$ #,###,##0.00',
275
+ cl: 'CLP #,###,##0'
276
+ }[country];
277
+ }
278
+ getCountryValidators(country) {
279
+ return {
280
+ br: {
281
+ governmentId: ValidateUtils.DocumentValidator
282
+ },
283
+ cl: {
284
+ governmentId: ValidateUtils.DocumentRutValidator
285
+ }
286
+ }[country];
287
+ }
288
+ }
289
+ BaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
290
+ BaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseComponent, selector: "[baseComponent]", ngImport: i0 });
291
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseComponent, decorators: [{
292
+ type: Directive,
293
+ args: [{
294
+ selector: '[baseComponent]'
295
+ }]
296
+ }], ctorParameters: function () { return []; } });
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tb25rZXktZnJvbnQtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS9iYXNlLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsdUJBQXVCLEVBS3ZCLGFBQWEsRUFDZCxNQUFNLG1CQUFtQixDQUFDOztBQUszQixNQUFNLE9BQWdCLGFBQWE7SUFlakM7UUFWQSx3QkFBbUIsR0FBc0MsSUFBSSxDQUFDO1FBSTlELGVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFN0IsY0FBUyxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFTyxRQUFRO1FBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUM7WUFDaEQsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDaEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLE9BQU8sQ0FDaEUsQ0FBQztRQUNKLE9BQU8sQ0FBQyxtREFBbUQsQ0FBQyxJQUFJLENBQzlELFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUMsSUFBSSxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxJQUFJO1FBQ3BD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b3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPbkRlc3Ryb3ksIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTW9ua2V5VXRpbHMgfSBmcm9tICdtb25rZXktc3R5bGUtZ3VpZGUnO1xuaW1wb3J0IHtcbiAgTW9ua2V5RWN4Q29tbW9uc1NlcnZpY2UsXG4gIE1vbmtleUVjeEVycm9yUmVzcG9uc2UsXG4gIE1vbmtleUVjeFBhZ2luYXRpb25PcHRpb25zLFxuICBNb25rZXlFY3hTdXBwb3J0T3B0aW9ucyxcbiAgTW9ua2V5RWN4VHJhbnNsYXRlT3B0aW9ucyxcbiAgVmFsaWRhdGVVdGlsc1xufSBmcm9tICdtb25rZXktZnJvbnQtY29yZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tiYXNlQ29tcG9uZW50XSdcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIF9fbW9ua2V5ZWN4Rm9ybUVycm9yczogYW55IHwgYW55W107XG5cbiAgX191bnN1YnNjcmliZUFsbDogU3ViamVjdDxhbnk+O1xuXG4gIF9fcGFnaW5hdGlvbk9wdGlvbnM6IE1vbmtleUVjeFBhZ2luYXRpb25PcHRpb25zIHwgbnVsbCA9IG51bGw7XG5cbiAgX19pMThuOiBhbnk7XG5cbiAgX19pc01vYmlsZSA9IHRoaXMuaXNNb2JpbGUoKTtcblxuICBfX2xvY2FsZXMgPSBbJ3B0LUJSJywgJ2VzLUNMJ107XG5cbiAgcHJpdmF0ZSBwYWdpbmF0aW9uRnVuYzogYW55O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9fdW5zdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc01vYmlsZSgpIHtcbiAgICBjb25zdCBpc01vYmlsZVdpZHRoID0gKHdpbmRvdy5zY3JlZW4ud2lkdGggPD0gNjQwKSB8fFxuICAgICAgKHdpbmRvdy5tYXRjaE1lZGlhICYmXG4gICAgICAgIHdpbmRvdy5tYXRjaE1lZGlhKCdvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjQwcHgpJykubWF0Y2hlc1xuICAgICAgKTtcbiAgICByZXR1cm4gKC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxNb2JpbGUvaS50ZXN0KFxuICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudFxuICAgICkpIHx8IGlzTW9iaWxlV2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVBhZ2luYXRpb24oY3JlYXRlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHsgX19wYWdpbmF0aW9uT3B0aW9ucyB9ID0gdGhpcztcbiAgICBpZiAoX19wYWdpbmF0aW9uT3B0aW9ucykge1xuICAgICAgY29uc3QgeyBtYWluRWxlbWVudCwgc2VydmljZSB9ID0gX19wYWdpbmF0aW9uT3B0aW9ucztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtYWluRWxlbWVudCBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsID0gbnVsbDtcbiAgICAgICAgICBlbGVtZW50Lm9uc2Nyb2xsID0gbnVsbDtcbiAgICAgICAgICBpZiAoY3JlYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25GdW5jID0gKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBvZmZzZXRIZWlnaHQgfSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBzY3JvbGxIZWlnaHQgLSBvZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgIGlmIChjb250ZW50SGVpZ2h0IDw9IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgICAgIHNlcnZpY2UuX19vbkRvUGFnaW5hdGlvbiQubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wYWdpbmF0aW9uRnVuYyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wYWdpbmF0aW9uRnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VwcG9ydChzdXBwb3J0Q29udHJvbHM6IE1vbmtleUVjeFN1cHBvcnRPcHRpb25zKSB7XG4gICAgY29uc3QgeyBzZXJ2aWNlLCBzaG93IH0gPSBzdXBwb3J0Q29udHJvbHM7XG4gICAgY29uc3QgbWV0aG9kID0gc2hvdyA/ICdzaG93JyA6ICdoaWRlJztcbiAgICBzZXJ2aWNlW21ldGhvZC50b0xvd2VyQ2FzZSgpXSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUcmFuc2xhdGUodHJhbnNsYXRlT3B0aW9uczogTW9ua2V5RWN4VHJhbnNsYXRlT3B0aW9ucykge1xuICAgIGNvbnN0IHsgc2VydmljZSB9ID0gdHJhbnNsYXRlT3B0aW9ucztcbiAgICBzZXJ2aWNlLl9fb25pMThuRGF0YUNoYW5nZWQkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fX3Vuc3Vic2NyaWJlQWxsKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gc2VydmljZS5fX2kxOG47XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5fX2kxOG4gPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXJyb3JGaXJzdE1lc3NhZ2VUcmFuc2xhdGVkKGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsID0gbnVsbCkge1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ3JlcXVpcmVkJykpIHJldHVybiAnRklFTEQtUkVRVUlSRUQnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWQnKSkgcmV0dXJuICdGSUVMRC1JTlZBTElEJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdlbWFpbCcpKSByZXR1cm4gJ0lOVkFMSUQtRU1BSUwnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21pbmxlbmd0aCcpKSByZXR1cm4gJ01JTi1MRU5HVEgnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21heGxlbmd0aCcpKSByZXR1cm4gJ01BWC1MRU5HVEgnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21heCcpKSByZXR1cm4gJ01BWCc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignbWluJykpIHJldHVybiAnTUlOJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdwYXNzd29yZHNOb3RNYXRjaGluZycpKSByZXR1cm4gJ01BVENILVBBU1NXT1JEJztcbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdpbnZhbGlkRGF0ZScpKSByZXR1cm4gJ0lOVkFMSUQtREFURSc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignaW52YWxpZFRydWUnKSkgcmV0dXJuICdJTlZBTElELVRSVUUnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRDcGZDbnBqJykpIHJldHVybiAnSU5WQUxJRC1ET0NVTUVOVCc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignaW52YWxpZFppcENvZGUnKSkgcmV0dXJuICdJTlZBTElELVpJUENPREUnO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRDb21ibycpKSByZXR1cm4gJ0lOVkFMSUQtQ09NQk8nO1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ2ludmFsaWRVcmwnKSkgcmV0dXJuICdJTlZBTElELVVSTCc7XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignaW52YWxpZFVubG9ja1JlZ2lzdGVyJykpIHsgcmV0dXJuICdJTlZBTElELVVOTE9DSy1SRUdJU1RFUic7IH1cbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdkYXRlU3RhcnRNdXN0QmVMZXNzVGhhbkFuZCcpKSB7XG4gICAgICByZXR1cm4gJ0RBVEUtU1RBUlQtTVVTVC1CRS1MRVNTLVRIQU4tQU5EJztcbiAgICB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignZGF0ZUVuZE11c3RCZUdyZWF0ZXJUaGFuU3RhcnQnKSkge1xuICAgICAgcmV0dXJuICdEQVRFLUVORC1NVVNULUJFLUdSRUFURVItVEhBTi1TQVJUJztcbiAgICB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcigncGhvbmUnKSkgcmV0dXJuICdJTlZBTElELVBIT05FJztcblxuICAgIHJldHVybiAnRklFTEQtSU5WQUxJRCc7XG4gIH1cblxuICBwcml2YXRlIGdldEVycm9yTGFzdE1lc3NhZ2VOb3RUcmFuc2xhdGVkKGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsID0gbnVsbCkge1xuICAgIGlmIChmb3JtQ29udHJvbD8uaGFzRXJyb3IoJ21pbmxlbmd0aCcpKSB7XG4gICAgICByZXR1cm4gYCR7Zm9ybUNvbnRyb2w/LmdldEVycm9yKCdtaW5sZW5ndGgnKS5yZXF1aXJlZExlbmd0aH0gY2FyYWN0ZXJlcy5gO1xuICAgIH1cbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgICAgcmV0dXJuIGAke2Zvcm1Db250cm9sPy5nZXRFcnJvcignbWF4bGVuZ3RoJykucmVxdWlyZWRMZW5ndGh9IGNhcmFjdGVyZXMuYDtcbiAgICB9XG4gICAgaWYgKGZvcm1Db250cm9sPy5oYXNFcnJvcignbWF4JykpIHsgcmV0dXJuIGAke2Zvcm1Db250cm9sPy5nZXRFcnJvcignbWF4JykubWF4fWA7IH1cbiAgICBpZiAoZm9ybUNvbnRyb2w/Lmhhc0Vycm9yKCdtaW4nKSkgeyByZXR1cm4gYCR7Zm9ybUNvbnRyb2w/LmdldEVycm9yKCdtaW4nKS5taW59YDsgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlRm9ybVdpdGhUcmFuc2xhdGUoZjogRm9ybUdyb3VwLCBpbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGZvcm1FcnJvcnM6IGFueSA9IGYudmFsdWU7XG5cbiAgICBpZiAoZi5zdGF0dXMgPT09ICdWQUxJRCcpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKCFmb3JtRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICBPYmplY3QuZW50cmllcyhmb3JtRXJyb3JzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmLmdldChrZXkpO1xuICAgICAgZm9ybUVycm9yc1trZXldID0gJyc7XG4gICAgICBpZiAoY29udHJvbCAmJiAhY29udHJvbC52YWxpZCkge1xuICAgICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgICAgZmlyc3Q6IGBFUlJPUlMuJHt0aGlzLmdldEVycm9yRmlyc3RNZXNzYWdlVHJhbnNsYXRlZChmLmdldChrZXkpKX1gLFxuICAgICAgICAgIGxhc3Q6IHRoaXMuZ2V0RXJyb3JMYXN0TWVzc2FnZU5vdFRyYW5zbGF0ZWQoZi5nZXQoa2V5KSlcbiAgICAgICAgfTtcbiAgICAgICAgZm9ybUVycm9yc1trZXldID0gbXNnO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKE1vbmtleVV0aWxzLnBlcnNpc3ROdWxsRW1wdHlVbmRlZmluZWQoaW5kZXgpKSB7IHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzW2luZGV4IHx8IDBdID0gZm9ybUVycm9yczsgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0gZm9ybUVycm9ycztcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgY29weVRvQ2xpcGJvYXJkKHZhbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2VsQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICBzZWxCb3guc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgIHNlbEJveC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgIHNlbEJveC5zdHlsZS50b3AgPSAnMCc7XG4gICAgc2VsQm94LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgc2VsQm94LnZhbHVlID0gdmFsO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2VsQm94KTtcbiAgICBzZWxCb3guZm9jdXMoKTtcbiAgICBzZWxCb3guc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNlbEJveCk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGVGb3JtKGY6IEZvcm1Hcm91cCwgaW5kZXg/OiBudW1iZXIsIGFsaWFzPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZm9ybUVycm9yczogYW55ID0gZi52YWx1ZTtcbiAgICBpZiAoZi5zdGF0dXMgPT09ICdWQUxJRCcpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKCFmb3JtRXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICBPYmplY3QuZW50cmllcyhmb3JtRXJyb3JzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmLmdldChrZXkpO1xuICAgICAgZm9ybUVycm9yc1trZXldID0gJyc7XG4gICAgICBpZiAoY29udHJvbCAmJiAhY29udHJvbC52YWxpZCkge1xuICAgICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgICAgZmlyc3RNZXNzYWdlOiBgRVJST1JTLiR7dGhpcy5nZXRFcnJvckZpcnN0TWVzc2FnZVRyYW5zbGF0ZWQoXG4gICAgICAgICAgICBmLmdldChrZXkpXG4gICAgICAgICAgKX1gLFxuICAgICAgICAgIGxhc3RNZXNzYWdlOiB0aGlzLmdldEVycm9yTGFzdE1lc3NhZ2VOb3RUcmFuc2xhdGVkKGYuZ2V0KGtleSkpXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1FcnJvcnNba2V5XSA9IG1zZztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChNb25rZXlVdGlscy5wZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKGluZGV4KSkge1xuICAgICAgdGhpcy5fX21vbmtleWVjeEZvcm1FcnJvcnNbaW5kZXggfHwgMF0gPSBmb3JtRXJyb3JzO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgb2JqOiBhbnk7XG5cbiAgICAgIGlmIChhbGlhcykge1xuICAgICAgICBvYmogPSB7XG4gICAgICAgICAgW2FsaWFzXToge1xuICAgICAgICAgICAgLi4uZm9ybUVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iaiA9IGZvcm1FcnJvcnM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0ge1xuICAgICAgICAuLi50aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9ycyxcbiAgICAgICAgLi4ub2JqXG4gICAgICB9O1xuICAgIH1cbiAgICBmLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJBbGxTZXJ2aWNlRGF0YShjbGVhckRhdGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcztcbiAgICBPYmplY3QudmFsdWVzKGNvbnRleHQpLmZvckVhY2goKGN0eDogYW55KSA9PiB7XG4gICAgICBpZiAoY3R4IGluc3RhbmNlb2YgTW9ua2V5RWN4Q29tbW9uc1NlcnZpY2UpIHtcbiAgICAgICAgY3R4LmNsZWFyKGNsZWFyRGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoYXJnczoge1xuICAgIHBhZ2luYXRpb25PcHRpb25zPzogTW9ua2V5RWN4UGFnaW5hdGlvbk9wdGlvbnM7XG4gICAgc3VwcG9ydENvbnRyb2xzPzogTW9ua2V5RWN4U3VwcG9ydE9wdGlvbnM7XG4gICAgdHJhbnNsYXRlT3B0aW9ucz86IE1vbmtleUVjeFRyYW5zbGF0ZU9wdGlvbnM7XG4gIH0pIHtcbiAgICBpZiAoYXJncz8ucGFnaW5hdGlvbk9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX19wYWdpbmF0aW9uT3B0aW9ucyA9IGFyZ3M/LnBhZ2luYXRpb25PcHRpb25zO1xuICAgICAgdGhpcy5oYW5kbGVQYWdpbmF0aW9uKCk7XG4gICAgfVxuICAgIGlmIChhcmdzPy5zdXBwb3J0Q29udHJvbHMpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3VwcG9ydChhcmdzPy5zdXBwb3J0Q29udHJvbHMpO1xuICAgIH1cbiAgICBpZiAoYXJncz8udHJhbnNsYXRlT3B0aW9ucykge1xuICAgICAgdGhpcy5oYW5kbGVUcmFuc2xhdGUoYXJncz8udHJhbnNsYXRlT3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KGNsZWFyRGF0YTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLl9fdW5zdWJzY3JpYmVBbGwubmV4dCgpO1xuICAgIHRoaXMuX191bnN1YnNjcmliZUFsbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuY2xlYXJBbGxTZXJ2aWNlRGF0YShjbGVhckRhdGEpO1xuICAgIHRoaXMuaGFuZGxlUGFnaW5hdGlvbihmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRXJyb3JGcm9tU2VydmljZXMoZXJyb3I6IE1vbmtleUVjeEVycm9yUmVzcG9uc2UsIGY6IEZvcm1Hcm91cCkge1xuICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0gbnVsbDtcbiAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ1BhcmFtZXRlcl9FcnJvcicpIHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGYudmFsdWUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBlcnJvci5ub3RpZmljYXRpb25zLmZvckVhY2goKF86IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gXy5zcGxpdCgnOicpWzBdO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXy5zcGxpdCgnOicpWzFdO1xuICAgICAgICAgIGlmIChmaWVsZCA9PT0ga2V5KSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgICAgICAgIGZpcnN0TWVzc2FnZTogJycsXG4gICAgICAgICAgICAgIGxhc3RNZXNzYWdlOiBkZXNjcmlwdGlvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX19tb25rZXllY3hGb3JtRXJyb3JzID0ge1xuICAgICAgICAgICAgICAuLi50aGlzLl9fbW9ua2V5ZWN4Rm9ybUVycm9ycyxcbiAgICAgICAgICAgICAgW2tleV06IG1zZ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGYuY29udHJvbHNba2V5XS5zZXRFcnJvcnMoe1xuICAgICAgICAgICAgICBpbmNvcnJlY3Q6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnb0JhY2soKSB7XG4gICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICB9XG5cbiAgcHVibGljIGdvU2Nyb2xsKGlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChlbGVtZW50KSBlbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RW1iZWRkZWREYXRhKGRhdGE6IGFueSwgZmllbGQ6IHN0cmluZyk6IGFueVtdIHwgYW55IHtcbiAgICBjb25zdCB7IF9lbWJlZGRlZCB9ID0gZGF0YTtcbiAgICByZXR1cm4gX2VtYmVkZGVkID8gX2VtYmVkZGVkW2ZpZWxkXSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3BlbldpbmRvdyh1cmw6IHN0cmluZykge1xuICAgIHdpbmRvdy5vcGVuKGAke3VybH1gLCAnX2JsYW5rJyk7XG4gIH1cblxuICBwdWJsaWMgZmlsbEkxOG4oZGF0YTogYW55KSB7XG4gICAgdGhpcy5fX2kxOG4gPSBkYXRhO1xuICB9XG5cbiAgcHVibGljIGdldENvdW50cnlQcmVmaXgoY291bnRyeTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyOiA1NSxcbiAgICAgIGNsOiA1NlxuICAgIH1bY291bnRyeV07XG4gIH1cblxuICBwdWJsaWMgZ2V0Q291bnRyeUN1cnJlbmN5Q2hhcnRGb3JtYXQoY291bnRyeTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJyOiAnUiQgIywjIyMsIyMwLjAwJyxcbiAgICAgIGNsOiAnQ0xQICMsIyMjLCMjMCdcbiAgICB9W2NvdW50cnldO1xuICB9XG5cbiAgcHVibGljIGdldENvdW50cnlWYWxpZGF0b3JzKGNvdW50cnk6IHN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBicjoge1xuICAgICAgICBnb3Zlcm5tZW50SWQ6IFZhbGlkYXRlVXRpbHMuRG9jdW1lbnRWYWxpZGF0b3JcbiAgICAgIH0sXG4gICAgICBjbDoge1xuICAgICAgICBnb3Zlcm5tZW50SWQ6IFZhbGlkYXRlVXRpbHMuRG9jdW1lbnRSdXRWYWxpZGF0b3JcbiAgICAgIH1cbiAgICB9W2NvdW50cnldO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,221 @@
1
+ import { Directive, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { MonkeyUtils } from 'monkey-style-guide';
4
+ import { Subject } from 'rxjs';
5
+ import { takeUntil } from 'rxjs/operators';
6
+ import { BaseComponent } from './base-component';
7
+ import { validators } from './base-validators';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ export class BaseDynamicArray extends BaseComponent {
11
+ constructor(fb) {
12
+ super();
13
+ this.fb = fb;
14
+ this.onHandleSubmit = new EventEmitter();
15
+ this.onHandleUpdateForm = new EventEmitter();
16
+ this.onHandleSubmitFormReady = new EventEmitter();
17
+ this.fields = [];
18
+ this.qtd = 1;
19
+ this.disabled = false;
20
+ this._form = null;
21
+ // eslint-disable-next-line object-curly-newline
22
+ this._plusValidations = [];
23
+ this.changesUnsubscribe = new Subject();
24
+ this.formBase = () => {
25
+ // return this.fb.group(this.createControl());
26
+ return this.createControl();
27
+ };
28
+ }
29
+ handleInternalPlusValidation(mainField, data) {
30
+ const { operator, field, value } = mainField;
31
+ const validators = {
32
+ e: (val1, val2) => { return val1 === val2; },
33
+ lt: (val1, val2) => { return val1 < val2; },
34
+ gt: (val1, val2) => { return val1 > val2; }
35
+ };
36
+ return validators[operator](data?.[field] || data, value);
37
+ }
38
+ makeInternalPlusValidation(data, sourceField, settings, rowIndex) {
39
+ const changeFields = (show) => {
40
+ const saved = [...this.fields];
41
+ saved.map((val) => {
42
+ const valSaved = {
43
+ ...val
44
+ };
45
+ if (val.name === sourceField) {
46
+ this._plusValidations[rowIndex] = {
47
+ [sourceField]: {
48
+ ...valSaved,
49
+ alwaysShow: show
50
+ }
51
+ };
52
+ this.createOneControl(val.name, this.formValues?.controls[rowIndex], show);
53
+ }
54
+ else {
55
+ this._plusValidations[rowIndex] = {
56
+ ...valSaved
57
+ };
58
+ }
59
+ return null;
60
+ });
61
+ };
62
+ const validated = this.handleInternalPlusValidation(settings, data);
63
+ changeFields(validated);
64
+ }
65
+ createOneControl(fieldName, ctrl, create = true) {
66
+ const { fields } = this;
67
+ if (!fields)
68
+ return;
69
+ fields.forEach((field) => {
70
+ const { fieldType, validations, name, disabled } = field;
71
+ if (name !== fieldName)
72
+ return;
73
+ let { value } = field;
74
+ if (fieldType === 'button')
75
+ return;
76
+ if (fieldType === 'radiobutton' || fieldType === 'checkbox' || fieldType === 'select') {
77
+ value = '';
78
+ }
79
+ if (create) {
80
+ const control = this.fb.control(value, this.bindValidations(validations || []));
81
+ if (disabled || this.disabled)
82
+ control.disable();
83
+ ctrl.addControl(name, control);
84
+ }
85
+ else {
86
+ ctrl.removeControl(name);
87
+ }
88
+ });
89
+ }
90
+ createControl(data) {
91
+ const { fields } = this;
92
+ if (!fields)
93
+ return null;
94
+ // eslint-disable-next-line object-curly-newline
95
+ const group = this.fb.group({});
96
+ fields.forEach((field) => {
97
+ const { fieldType, validations, name, disabled, alwaysShow } = field;
98
+ let { value } = field;
99
+ if (field.alwaysShowPlusValidation) {
100
+ if (!this.handleInternalPlusValidation(field.alwaysShowPlusValidation, data))
101
+ return;
102
+ }
103
+ else if (!alwaysShow)
104
+ return;
105
+ if (fieldType === 'button')
106
+ return;
107
+ if (fieldType === 'radiobutton' || fieldType === 'checkbox' || fieldType === 'select') {
108
+ value = '';
109
+ }
110
+ const control = this.fb.control(value, this.bindValidations(validations || []));
111
+ if (disabled || this.disabled)
112
+ control.disable();
113
+ group.addControl(name, control);
114
+ });
115
+ return group;
116
+ }
117
+ bindValidations(validations) {
118
+ if (validations.length > 0) {
119
+ const validList = [];
120
+ validations.forEach((valid) => {
121
+ const validated = valid.param
122
+ ? validators[valid.name](valid.param)
123
+ : validators[valid.name];
124
+ validList.push(validated);
125
+ });
126
+ return Validators.compose(validList);
127
+ }
128
+ return null;
129
+ }
130
+ buildForm() {
131
+ const form = this.fb.group({
132
+ fields: this.fb.array([])
133
+ });
134
+ form?.controls.fields?.valueChanges.subscribe((_) => {
135
+ this.watchForChanges();
136
+ });
137
+ return form;
138
+ }
139
+ watchForChanges() {
140
+ const { fields, changesUnsubscribe } = this;
141
+ changesUnsubscribe.next();
142
+ this.formValues?.controls?.map((control, index) => {
143
+ fields.forEach((fieldConfig) => {
144
+ const { name, alwaysShowPlusValidation } = fieldConfig;
145
+ if (!alwaysShowPlusValidation)
146
+ return;
147
+ const { field } = alwaysShowPlusValidation;
148
+ if (field) {
149
+ control.controls[field]?.valueChanges.pipe(takeUntil(changesUnsubscribe)).subscribe((_) => {
150
+ this.makeInternalPlusValidation(_, name, alwaysShowPlusValidation, index);
151
+ });
152
+ }
153
+ });
154
+ return null;
155
+ });
156
+ }
157
+ get formValues() {
158
+ return this._form ? this._form.get('fields') : null;
159
+ }
160
+ fillValues() {
161
+ const { data, qtd } = this;
162
+ if ((!this._form) && qtd)
163
+ return;
164
+ if (qtd > 0) {
165
+ Array(qtd)
166
+ .fill(null)
167
+ .map((_, index) => {
168
+ let form = this.createControl();
169
+ if (data && data[index]) {
170
+ form = this.createControl(data[index]);
171
+ const handledData = data[index];
172
+ Object.entries(handledData).forEach(([key, value]) => {
173
+ if (MonkeyUtils.persistNullEmptyUndefined(value) && form?.controls[key]) {
174
+ form?.controls[key].setValue(value);
175
+ }
176
+ });
177
+ }
178
+ this.formValues?.push(form);
179
+ return null;
180
+ });
181
+ }
182
+ }
183
+ ngOnInit() {
184
+ this._form = this.buildForm();
185
+ this.fillValues();
186
+ this.onHandleUpdateForm.subscribe(() => {
187
+ this.fillValues();
188
+ });
189
+ }
190
+ ngOnChanges() {
191
+ if (!this._form) {
192
+ this._form = this.buildForm();
193
+ }
194
+ this.fillValues();
195
+ }
196
+ }
197
+ BaseDynamicArray.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseDynamicArray, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Directive });
198
+ BaseDynamicArray.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: BaseDynamicArray, selector: "[baseDynamicArray]", inputs: { onHandleSubmit: "onHandleSubmit", onHandleUpdateForm: "onHandleUpdateForm", self: "self", fields: "fields", data: "data", qtd: "qtd", disabled: "disabled" }, outputs: { onHandleSubmitFormReady: "onHandleSubmitFormReady" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BaseDynamicArray, decorators: [{
200
+ type: Directive,
201
+ args: [{
202
+ selector: '[baseDynamicArray]'
203
+ }]
204
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { onHandleSubmit: [{
205
+ type: Input
206
+ }], onHandleUpdateForm: [{
207
+ type: Input
208
+ }], onHandleSubmitFormReady: [{
209
+ type: Output
210
+ }], self: [{
211
+ type: Input
212
+ }], fields: [{
213
+ type: Input
214
+ }], data: [{
215
+ type: Input
216
+ }], qtd: [{
217
+ type: Input
218
+ }], disabled: [{
219
+ type: Input
220
+ }] } });
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1keW5hbWljLWFycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9ua2V5LWZyb250LWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UvYmFzZS1keW5hbWljLWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBcUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUsvQyxNQUFNLE9BQWdCLGdCQUFpQixTQUFRLGFBQWE7SUF3QjFELFlBQW9CLEVBQWU7UUFDakMsS0FBSyxFQUFFLENBQUM7UUFEVSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBdkIxQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUU1Qyw0QkFBdUIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUl0RSxXQUFNLEdBQXNCLEVBQUUsQ0FBQztRQUkvQixRQUFHLEdBQVcsQ0FBQyxDQUFDO1FBRWhCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkMsVUFBSyxHQUFxQixJQUFJLENBQUM7UUFFL0IsZ0RBQWdEO1FBQ2hELHFCQUFnQixHQUFVLEVBQUUsQ0FBQztRQUVyQix1QkFBa0IsR0FB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QUFVLEVBQUUsSUFBSSxDQUFDLElBQVcsQ0FBQyxDQUFDO2dCQUVuQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDL0I7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7NkdBM05tQixnQkFBZ0I7aUdBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUhyQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7aUJBQy9CO2tHQUVVLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUVJLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFFRSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTW9ua2V5VXRpbHMgfSBmcm9tICdtb25rZXktc3R5bGUtZ3VpZGUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTUVDWEZpZWxkQ29uZmlnLCBNRUNYRmllbGRDb25maWdWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQgfSBmcm9tICcuL2Jhc2UtY29tcG9uZW50JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL2Jhc2UtdmFsaWRhdG9ycyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tiYXNlRHluYW1pY0FycmF5XSdcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUR5bmFtaWNBcnJheSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIG9uSGFuZGxlU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQElucHV0KCkgb25IYW5kbGVVcGRhdGVGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQE91dHB1dCgpIG9uSGFuZGxlU3VibWl0Rm9ybVJlYWR5OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBJbnB1dCgpIHNlbGY6IGFueTtcblxuICBASW5wdXQoKSBmaWVsZHM6IE1FQ1hGaWVsZENvbmZpZ1tdID0gW107XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuXG4gIEBJbnB1dCgpIHF0ZDogbnVtYmVyID0gMTtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIF9mb3JtOiBGb3JtR3JvdXAgfCBudWxsID0gbnVsbDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JqZWN0LWN1cmx5LW5ld2xpbmVcbiAgX3BsdXNWYWxpZGF0aW9uczogYW55W10gPSBbXTtcblxuICBwcml2YXRlIGNoYW5nZXNVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKFxuICAgIG1haW5GaWVsZDogYW55LFxuICAgIGRhdGE6IGFueVxuICApIHtcbiAgICBjb25zdCB7IG9wZXJhdG9yLCBmaWVsZCwgdmFsdWUgfSA9IG1haW5GaWVsZDtcbiAgICBjb25zdCB2YWxpZGF0b3JzOiBhbnkgPSB7XG4gICAgICBlOiAodmFsMTogYW55LCB2YWwyOiBzdHJpbmcpID0+IHsgcmV0dXJuIHZhbDEgPT09IHZhbDI7IH0sXG4gICAgICBsdDogKHZhbDE6IGFueSwgdmFsMjogc3RyaW5nKSA9PiB7IHJldHVybiB2YWwxIDwgdmFsMjsgfSxcbiAgICAgIGd0OiAodmFsMTogYW55LCB2YWwyOiBzdHJpbmcpID0+IHsgcmV0dXJuIHZhbDEgPiB2YWwyOyB9XG4gICAgfTtcblxuICAgIHJldHVybiB2YWxpZGF0b3JzW29wZXJhdG9yXShkYXRhPy5bZmllbGRdIHx8IGRhdGEsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZUludGVybmFsUGx1c1ZhbGlkYXRpb24oXG4gICAgZGF0YTogYW55LFxuICAgIHNvdXJjZUZpZWxkOiBzdHJpbmcsXG4gICAgc2V0dGluZ3M6IGFueSxcbiAgICByb3dJbmRleDogbnVtYmVyXG4gICkge1xuICAgIGNvbnN0IGNoYW5nZUZpZWxkcyA9IChzaG93OiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBzYXZlZCA9IFsuLi50aGlzLmZpZWxkc107XG5cbiAgICAgIHNhdmVkLm1hcCgodmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbFNhdmVkID0ge1xuICAgICAgICAgIC4uLnZhbFxuICAgICAgICB9O1xuICAgICAgICBpZiAodmFsLm5hbWUgPT09IHNvdXJjZUZpZWxkKSB7XG4gICAgICAgICAgdGhpcy5fcGx1c1ZhbGlkYXRpb25zW3Jvd0luZGV4XSA9IHtcbiAgICAgICAgICAgIFtzb3VyY2VGaWVsZF06IHtcbiAgICAgICAgICAgICAgLi4udmFsU2F2ZWQsXG4gICAgICAgICAgICAgIGFsd2F5c1Nob3c6IHNob3dcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuY3JlYXRlT25lQ29udHJvbCh2YWwubmFtZSwgdGhpcy5mb3JtVmFsdWVzPy5jb250cm9sc1tyb3dJbmRleF0sIHNob3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BsdXNWYWxpZGF0aW9uc1tyb3dJbmRleF0gPSB7XG4gICAgICAgICAgICAuLi52YWxTYXZlZFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgdmFsaWRhdGVkID0gdGhpcy5oYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKHNldHRpbmdzLCBkYXRhKTtcbiAgICBjaGFuZ2VGaWVsZHModmFsaWRhdGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT25lQ29udHJvbChmaWVsZE5hbWU6IHN0cmluZywgY3RybDogYW55LCBjcmVhdGUgPSB0cnVlKSB7XG4gICAgY29uc3QgeyBmaWVsZHMgfSA9IHRoaXM7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybjtcblxuICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZDogTUVDWEZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICBjb25zdCB7IGZpZWxkVHlwZSwgdmFsaWRhdGlvbnMsIG5hbWUsIGRpc2FibGVkIH0gPSBmaWVsZDtcbiAgICAgIGlmIChuYW1lICE9PSBmaWVsZE5hbWUpIHJldHVybjtcbiAgICAgIGxldCB7IHZhbHVlIH0gPSBmaWVsZDtcbiAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdidXR0b24nKSByZXR1cm47XG4gICAgICBpZiAoZmllbGRUeXBlID09PSAncmFkaW9idXR0b24nIHx8IGZpZWxkVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBmaWVsZFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBpZiAoY3JlYXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2wodmFsdWUsIHRoaXMuYmluZFZhbGlkYXRpb25zKHZhbGlkYXRpb25zIHx8IFtdKSk7XG4gICAgICAgIGlmIChkaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkKSBjb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgY3RybC5hZGRDb250cm9sKG5hbWUsIGNvbnRyb2wpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3RybC5yZW1vdmVDb250cm9sKG5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250cm9sKGRhdGE/OiBhbnkpIHtcbiAgICBjb25zdCB7IGZpZWxkcyB9ID0gdGhpcztcbiAgICBpZiAoIWZpZWxkcykgcmV0dXJuIG51bGw7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9iamVjdC1jdXJseS1uZXdsaW5lXG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZiLmdyb3VwKHt9KTtcbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQ6IE1FQ1hGaWVsZENvbmZpZykgPT4ge1xuICAgICAgY29uc3QgeyBmaWVsZFR5cGUsIHZhbGlkYXRpb25zLCBuYW1lLCBkaXNhYmxlZCwgYWx3YXlzU2hvdyB9ID0gZmllbGQ7XG4gICAgICBsZXQgeyB2YWx1ZSB9ID0gZmllbGQ7XG4gICAgICBpZiAoZmllbGQuYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVJbnRlcm5hbFBsdXNWYWxpZGF0aW9uKGZpZWxkLmFsd2F5c1Nob3dQbHVzVmFsaWRhdGlvbiwgZGF0YSkpIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoIWFsd2F5c1Nob3cpIHJldHVybjtcbiAgICAgIGlmIChmaWVsZFR5cGUgPT09ICdidXR0b24nKSByZXR1cm47XG4gICAgICBpZiAoZmllbGRUeXBlID09PSAncmFkaW9idXR0b24nIHx8IGZpZWxkVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBmaWVsZFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgIHZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5mYi5jb250cm9sKHZhbHVlLCB0aGlzLmJpbmRWYWxpZGF0aW9ucyh2YWxpZGF0aW9ucyB8fCBbXSkpO1xuICAgICAgaWYgKGRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQpIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgZ3JvdXAuYWRkQ29udHJvbChuYW1lIGFzIHN0cmluZywgY29udHJvbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGJpbmRWYWxpZGF0aW9ucyh2YWxpZGF0aW9uczogTUVDWEZpZWxkQ29uZmlnVmFsaWRhdG9yW10pIHtcbiAgICBpZiAodmFsaWRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgdmFsaWRMaXN0OiBhbnlbXSA9IFtdO1xuICAgICAgdmFsaWRhdGlvbnMuZm9yRWFjaCgodmFsaWQ6IE1FQ1hGaWVsZENvbmZpZ1ZhbGlkYXRvcikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZC5wYXJhbVxuICAgICAgICAgID8gdmFsaWRhdG9yc1t2YWxpZC5uYW1lXSh2YWxpZC5wYXJhbSlcbiAgICAgICAgICA6IHZhbGlkYXRvcnNbdmFsaWQubmFtZV07XG4gICAgICAgIHZhbGlkTGlzdC5wdXNoKHZhbGlkYXRlZCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRMaXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybSgpOiBGb3JtR3JvdXAge1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGZpZWxkczogdGhpcy5mYi5hcnJheShbXSlcbiAgICB9KTtcblxuICAgIGZvcm0/LmNvbnRyb2xzLmZpZWxkcz8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5nZXMoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmb3JtO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5nZXMoKSB7XG4gICAgY29uc3QgeyBmaWVsZHMsIGNoYW5nZXNVbnN1YnNjcmliZSB9ID0gdGhpcztcbiAgICBjaGFuZ2VzVW5zdWJzY3JpYmUubmV4dCgpO1xuXG4gICAgdGhpcy5mb3JtVmFsdWVzPy5jb250cm9scz8ubWFwKChjb250cm9sOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZENvbmZpZzogTUVDWEZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uIH0gPSBmaWVsZENvbmZpZztcbiAgICAgICAgaWYgKCFhbHdheXNTaG93UGx1c1ZhbGlkYXRpb24pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBmaWVsZCB9ID0gYWx3YXlzU2hvd1BsdXNWYWxpZGF0aW9uO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBjb250cm9sLmNvbnRyb2xzW2ZpZWxkXT8udmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWwoY2hhbmdlc1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWFrZUludGVybmFsUGx1c1ZhbGlkYXRpb24oXG4gICAgICAgICAgICAgIF8sXG4gICAgICAgICAgICAgIG5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBhbHdheXNTaG93UGx1c1ZhbGlkYXRpb24sXG4gICAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvcm1CYXNlID0gKCkgPT4ge1xuICAgIC8vIHJldHVybiB0aGlzLmZiLmdyb3VwKHRoaXMuY3JlYXRlQ29udHJvbCgpKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDb250cm9sKCk7XG4gIH07XG5cbiAgcHVibGljIGdldCBmb3JtVmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtID8gKHRoaXMuX2Zvcm0uZ2V0KCdmaWVsZHMnKSBhcyBGb3JtQXJyYXkpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBmaWxsVmFsdWVzKCkge1xuICAgIGNvbnN0IHsgZGF0YSwgcXRkIH0gPSB0aGlzO1xuICAgIGlmICgoIXRoaXMuX2Zvcm0pICYmIHF0ZCkgcmV0dXJuO1xuICAgIGlmIChxdGQgPiAwKSB7XG4gICAgICBBcnJheTxhbnk+KHF0ZClcbiAgICAgICAgLmZpbGwobnVsbClcbiAgICAgICAgLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgZm9ybSA9IHRoaXMuY3JlYXRlQ29udHJvbCgpO1xuICAgICAgICAgIGlmIChkYXRhICYmIGRhdGFbaW5kZXhdKSB7XG4gICAgICAgICAgICBmb3JtID0gdGhpcy5jcmVhdGVDb250cm9sKGRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZWREYXRhID0gZGF0YVtpbmRleF07XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhoYW5kbGVkRGF0YSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChNb25rZXlVdGlscy5wZXJzaXN0TnVsbEVtcHR5VW5kZWZpbmVkKHZhbHVlKSAmJiBmb3JtPy5jb250cm9sc1trZXldKSB7XG4gICAgICAgICAgICAgICAgZm9ybT8uY29udHJvbHNba2V5XS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1WYWx1ZXM/LnB1c2goZm9ybSBhcyBhbnkpO1xuXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2Zvcm0gPSB0aGlzLmJ1aWxkRm9ybSgpO1xuICAgIHRoaXMuZmlsbFZhbHVlcygpO1xuXG4gICAgdGhpcy5vbkhhbmRsZVVwZGF0ZUZvcm0uc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZmlsbFZhbHVlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgaWYgKCF0aGlzLl9mb3JtKSB7XG4gICAgICB0aGlzLl9mb3JtID0gdGhpcy5idWlsZEZvcm0oKTtcbiAgICB9XG4gICAgdGhpcy5maWxsVmFsdWVzKCk7XG4gIH1cbn1cbiJdfQ==