form-aurora-stefanini 0.1.8 → 0.1.11

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 (53) hide show
  1. package/README.md +133 -133
  2. package/bundles/form-aurora-stefanini.umd.js +1073 -973
  3. package/bundles/form-aurora-stefanini.umd.js.map +1 -1
  4. package/bundles/form-aurora-stefanini.umd.min.js +2 -2
  5. package/bundles/form-aurora-stefanini.umd.min.js.map +1 -1
  6. package/esm2015/form-aurora-stefanini.js +4 -4
  7. package/esm2015/lib/Components/from-aurora/form-aurora.component.js +685 -707
  8. package/esm2015/lib/Models/company-parameters.js +7 -7
  9. package/esm2015/lib/Models/company.js +1 -1
  10. package/esm2015/lib/Models/fill.js +3 -3
  11. package/esm2015/lib/Models/state.js +1 -1
  12. package/esm2015/lib/Models/step.js +1 -1
  13. package/esm2015/lib/Models/stepMethod.js +3 -3
  14. package/esm2015/lib/form-aurora.module.js +22 -22
  15. package/esm2015/lib/services/TemplateService.js +85 -85
  16. package/esm2015/lib/services/data.service.js +85 -82
  17. package/esm2015/lib/utils/Offusqued.js +120 -0
  18. package/esm2015/lib/utils/regex.js +52 -52
  19. package/esm2015/public-api.js +10 -10
  20. package/esm5/form-aurora-stefanini.js +4 -4
  21. package/esm5/lib/Components/from-aurora/form-aurora.component.js +732 -751
  22. package/esm5/lib/Models/company-parameters.js +19 -19
  23. package/esm5/lib/Models/company.js +1 -1
  24. package/esm5/lib/Models/fill.js +7 -7
  25. package/esm5/lib/Models/state.js +1 -1
  26. package/esm5/lib/Models/step.js +1 -1
  27. package/esm5/lib/Models/stepMethod.js +7 -7
  28. package/esm5/lib/form-aurora.module.js +25 -25
  29. package/esm5/lib/services/TemplateService.js +97 -97
  30. package/esm5/lib/services/data.service.js +88 -85
  31. package/esm5/lib/utils/Offusqued.js +121 -0
  32. package/esm5/lib/utils/regex.js +52 -52
  33. package/esm5/public-api.js +10 -10
  34. package/fesm2015/form-aurora-stefanini.js +1008 -912
  35. package/fesm2015/form-aurora-stefanini.js.map +1 -1
  36. package/fesm5/form-aurora-stefanini.js +1077 -977
  37. package/fesm5/form-aurora-stefanini.js.map +1 -1
  38. package/form-aurora-stefanini.d.ts +4 -4
  39. package/form-aurora-stefanini.metadata.json +1 -1
  40. package/lib/Components/from-aurora/form-aurora.component.d.ts +108 -118
  41. package/lib/Models/company-parameters.d.ts +14 -14
  42. package/lib/Models/company.d.ts +22 -22
  43. package/lib/Models/fill.d.ts +6 -6
  44. package/lib/Models/state.d.ts +5 -5
  45. package/lib/Models/step.d.ts +14 -14
  46. package/lib/Models/stepMethod.d.ts +8 -8
  47. package/lib/form-aurora.module.d.ts +2 -2
  48. package/lib/services/TemplateService.d.ts +8 -8
  49. package/lib/services/data.service.d.ts +35 -35
  50. package/lib/utils/Offusqued.d.ts +7 -0
  51. package/lib/utils/regex.d.ts +51 -51
  52. package/package.json +1 -1
  53. package/public-api.d.ts +6 -6
@@ -1,707 +1,685 @@
1
- import * as tslib_1 from "tslib";
2
- import { Component, Injectable, Input, ViewChild, Output, EventEmitter } from '@angular/core';
3
- import { FormGroup, FormControl, Validators } from '@angular/forms';
4
- import { HttpClient } from '@angular/common/http';
5
- // import moment from 'moment';
6
- import { NgbDateAdapter, NgbDateParserFormatter, NgbDatepickerI18n } from '@ng-bootstrap/ng-bootstrap';
7
- import * as moment_ from 'moment';
8
- import { regexType } from '../../utils/regex';
9
- import { CommonDataService } from '../../services/data.service';
10
- const moment = moment_;
11
- // import { regexType } from "@app/_shared/_util/regex";
12
- // import { ExternalService } from '@app/_shared/_services/external.service';
13
- // import { AuroraService } from '@app/_shared/_services/aurora.service';
14
- /**
15
- * This Service handles how the date is represented in scripts i.e. ngModel.
16
- */
17
- let CustomAdapter = class CustomAdapter extends NgbDateAdapter {
18
- // import { regexType } from "@app/_shared/_util/regex";
19
- // import { ExternalService } from '@app/_shared/_services/external.service';
20
- // import { AuroraService } from '@app/_shared/_services/aurora.service';
21
- /**
22
- * This Service handles how the date is represented in scripts i.e. ngModel.
23
- */
24
- constructor() {
25
- super(...arguments);
26
- this.DELIMITER = '/';
27
- }
28
- fromModel(value) {
29
- if (value) {
30
- const date = value.split(this.DELIMITER);
31
- return {
32
- day: parseInt(date[0], 10),
33
- month: parseInt(date[1], 10),
34
- year: parseInt(date[2], 10)
35
- };
36
- }
37
- return null;
38
- }
39
- toModel(date) {
40
- //return date ? date.day + this.DELIMITER + date.month + this.DELIMITER + date.year : null;
41
- return date ? (date.day < 10 ? 0 + date.day : date.day) + this.DELIMITER + (date.month < 10 ? 0 + date.month : date.month) + this.DELIMITER + date.year : '';
42
- }
43
- };
44
- CustomAdapter = tslib_1.__decorate([
45
- Injectable()
46
- ], CustomAdapter);
47
- export { CustomAdapter };
48
- /**
49
- * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
50
- */
51
- let CustomDateParserFormatter = class CustomDateParserFormatter extends NgbDateParserFormatter {
52
- /**
53
- * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
54
- */
55
- constructor() {
56
- super(...arguments);
57
- this.DELIMITER = '/';
58
- }
59
- parse(value) {
60
- if (value) {
61
- const date = value.split(this.DELIMITER);
62
- return {
63
- day: parseInt(date[0], 10),
64
- month: parseInt(date[1], 10),
65
- year: parseInt(date[2], 10)
66
- };
67
- }
68
- return null;
69
- }
70
- format(date) {
71
- return date ? (date.day < 10 ? '0' + date.day : date.day) + this.DELIMITER + (date.month < 10 ? '0' + date.month : date.month) + this.DELIMITER + date.year : '';
72
- }
73
- };
74
- CustomDateParserFormatter = tslib_1.__decorate([
75
- Injectable()
76
- ], CustomDateParserFormatter);
77
- export { CustomDateParserFormatter };
78
- const I18N_VALUES = {
79
- 'es': {
80
- weekdays: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],
81
- months: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
82
- weekLabel: 'sem'
83
- }
84
- // other languages you would support
85
- };
86
- let I18n = class I18n {
87
- constructor() {
88
- this.language = 'es';
89
- }
90
- };
91
- I18n = tslib_1.__decorate([
92
- Injectable()
93
- ], I18n);
94
- export { I18n };
95
- // Define custom service providing the months and weekdays translations
96
- let CustomDatepickerI18n = class CustomDatepickerI18n extends NgbDatepickerI18n {
97
- constructor(_i18n) {
98
- super();
99
- this._i18n = _i18n;
100
- }
101
- getWeekdayLabel(weekday) {
102
- return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
103
- }
104
- getWeekLabel() {
105
- return I18N_VALUES[this._i18n.language].weekLabel;
106
- }
107
- getMonthShortName(month) {
108
- return I18N_VALUES[this._i18n.language].months[month - 1];
109
- }
110
- getMonthFullName(month) {
111
- return this.getMonthShortName(month);
112
- }
113
- getDayAriaLabel(date) {
114
- return `${date.day}-${date.month}-${date.year}`;
115
- }
116
- getWeekdayShortName(weekday) {
117
- return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
118
- }
119
- ;
120
- };
121
- CustomDatepickerI18n.ctorParameters = () => [
122
- { type: I18n }
123
- ];
124
- CustomDatepickerI18n = tslib_1.__decorate([
125
- Injectable()
126
- ], CustomDatepickerI18n);
127
- export { CustomDatepickerI18n };
128
- let FormAuroraComponent = class FormAuroraComponent {
129
- constructor(data, http) {
130
- this.data = data;
131
- this.http = http;
132
- this.response = new EventEmitter();
133
- this.summit = new EventEmitter();
134
- this.viewAuthData = new EventEmitter();
135
- this.tipodocNumDoc = false;
136
- this.onSubmitEvent = false;
137
- this.countSubmit = 0;
138
- this.watchValid = false;
139
- this.watchRequired = false;
140
- this.captchaValid = false;
141
- this.displayMonths = 2;
142
- this.navigation = 'select';
143
- this.showWeekNumbers = false;
144
- this.outsideDays = 'visible';
145
- this.respServiceSegmentation = null;
146
- this.base64CheckAuthData = undefined;
147
- //emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
148
- this.today = moment(new Date());
149
- this.maxYear = this.today.year();
150
- this.minYear = this.today.year() - 82;
151
- this.minDate = this.minYear.toString() + '-' + this.today.month().toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.minYear, month: this.today.month(), day: this.today.date()};
152
- this.maxDate = this.maxYear.toString() + '-' + (this.today.month() + 1).toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.maxYear, month: this.today.month() + 1, day: this.today.date()};
153
- //Revisar variables
154
- this.recharge = false;
155
- this.indicativo = "57";
156
- this.defaultDocType = "Cédula de ciudadanía";
157
- this.patternNotValidDcto = false;
158
- this.patternNotValidCel = false;
159
- this.range = new FormGroup({
160
- start: new FormControl(),
161
- end: new FormControl(),
162
- });
163
- }
164
- ngOnInit() {
165
- this.minDate = new Date(this.minDate).toISOString().split('T')[0];
166
- setTimeout(() => {
167
- this.startComponent();
168
- }, 2000);
169
- }
170
- startComponent() {
171
- //ordena los campos
172
- if (this.dataForm != null && this.dataForm.formQuestions != undefined) {
173
- //Same row fields
174
- this.tipodocNumDoc = (this.dataForm.formQuestions.some(question => question.question.value === "tipoDoc") && this.dataForm.formQuestions.some(question => question.question.value === "numeroDoc")) ? true : false;
175
- this.dataForm.formQuestions = this.dataForm.formQuestions.sort(function (a, b) {
176
- return a.order - b.order;
177
- });
178
- let existcaptcha = this.dataForm.formQuestions.filter((item) => item.question.questionType.id == 6);
179
- if (existcaptcha.length == 0) {
180
- this.captchaValid = true;
181
- }
182
- for (const item of this.dataForm.formQuestions) {
183
- if (item.question.maxlength == null || item.question.maxlength == undefined || item.question.maxlength == 0) {
184
- item.question.maxlength = 524288; //defaultvalue
185
- }
186
- if (item.question.minLength == null || item.question.minLength == undefined) {
187
- item.question.minLength = 0;
188
- }
189
- this.dataReloadForm.forEach(element => {
190
- this.filldata = element;
191
- if ((item.question.questionType.id === 2 || item.question.questionType.id === 1 ||
192
- item.question.questionType.id === 3) && (this.filldata.data !== null &&
193
- this.filldata.data !== undefined) && item.question.id === this.filldata.id) {
194
- item.question.registred = this.filldata.data;
195
- }
196
- });
197
- if (item.question.registred == null || item.question.minLength == undefined) {
198
- item.question.registred = '';
199
- }
200
- }
201
- }
202
- }
203
- resolvedCaptcha(captchaResponse) {
204
- this.captchaValid = true;
205
- if (!this.formDynamic.form.value.captcha) {
206
- this.formDynamic.controls.captcha.setValue(captchaResponse);
207
- this.formDynamic.form.value.captcha = captchaResponse;
208
- document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
209
- }
210
- }
211
- //Forms
212
- //Metodo para evitar el render de los items del for
213
- trackByIndex(index, obj) {
214
- return index;
215
- }
216
- onChangeValidPatter(event, question) {
217
- if (question.pattern != undefined) {
218
- let valid = true;
219
- let keyvalid = [8, 32, 37, 38, 39, 40, 46, 9];
220
- //diferente de Backpsace
221
- //se deja catch por error no controlable en otro tiempo de ejecucion
222
- try {
223
- if (!keyvalid.includes(event.keyCode)) {
224
- const regex = new RegExp(question.pattern);
225
- valid = regex.test(event.key);
226
- }
227
- }
228
- catch (error) { }
229
- return valid;
230
- }
231
- if (question.questionType !== undefined) {
232
- if (question.questionType.description === 'Number') {
233
- if (question.value === 'numeroDoc') {
234
- this.validateNumeroDocumento(this.formDynamic.controls["numeroDoc"].value.toString());
235
- }
236
- else if (question.value === 'celular') {
237
- this.validateCelular(this.formDynamic.controls["celular"].value.toString());
238
- }
239
- }
240
- }
241
- document.getElementById("char" + question.value).setAttribute("hidden", "true");
242
- //if temporal mientras se migran todos los tipos de campos al foreach
243
- if (question.questionType.id != 11 && question.questionType.id != 7) {
244
- if (this.validMinLength(this.formDynamic, question)) {
245
- document.getElementById(question.value).style.borderColor = "#FF0000";
246
- document.getElementById("ml" + question.value).removeAttribute("hidden");
247
- }
248
- else {
249
- document.getElementById(question.value).style.borderColor = "#E4E4E4";
250
- document.getElementById("ml" + question.value).setAttribute("hidden", "true");
251
- }
252
- if (this.validMaxLength(this.formDynamic, question)) {
253
- document.getElementById(question.value).style.borderColor = "#FF0000";
254
- document.getElementById("mxl" + question.value).removeAttribute("hidden");
255
- }
256
- else {
257
- document.getElementById(question.value).style.borderColor = "#E4E4E4";
258
- document.getElementById("mxl" + question.value).setAttribute("hidden", "true");
259
- }
260
- }
261
- this.dataForm.formQuestions.forEach(formQuestion => {
262
- switch (formQuestion.question.questionType.id) {
263
- //se valida campo de tipo calendario
264
- case 7:
265
- if (question.questionType.id == 7)
266
- this.calendarRulesValidate(formQuestion);
267
- break;
268
- //se valida campo de tipo email
269
- case 11:
270
- if (question.questionType.id == 11)
271
- this.emailRulesValidate(formQuestion);
272
- break;
273
- }
274
- });
275
- document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
276
- }
277
- validOnlyText(event) {
278
- let regex = /^[a-zA-Z\u00C0-\u017F]+$/g;
279
- if (event.charCode == 32) {
280
- return true;
281
- }
282
- let valid = regex.test(event.key);
283
- return valid;
284
- }
285
- validDate(event) {
286
- /*let pattern = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20)[0-9]{2}/;
287
- const regex = new RegExp(pattern);
288
- valid = regex.test(event.key);
289
- */
290
- const matches = String(event.key).match(regexType.date.exp);
291
- let valid = true;
292
- if (matches === null)
293
- valid = false;
294
- // alert(valid);
295
- return valid;
296
- }
297
- onChangeValidDate(event) {
298
- //let pattern = /(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12][0-9]|3[01])\/(?:19|20)[0-9]{2}/;
299
- let dateN = /[0-9]|\//;
300
- let valid = true;
301
- const regex = new RegExp(dateN);
302
- valid = regex.test(event.key);
303
- return valid;
304
- }
305
- rediretoutside(event, question) {
306
- //se deja catch por error no controlable en otro tiempo de ejecucion
307
- try {
308
- event.preventDefault();
309
- window.open(question.value, "_blank");
310
- }
311
- catch (error) { }
312
- }
313
- /**
314
- * Dispatch submit event for validations exists
315
- * @param change
316
- */
317
- ngOnChanges(change) {
318
- this.countSubmit++;
319
- }
320
- //onSubmit(form: NgForm) {
321
- onSubmit() {
322
- let form = this.formDynamic;
323
- this.watchValid = true;
324
- this.watchRequired = true;
325
- if (form.valid) {
326
- if (!this.validRulesFields(form.controls["numeroDoc"].value.toString(), form.controls["celular"].value.toString(), form.controls["email"].value))
327
- return false;
328
- }
329
- if (this.validMinlenghtAllQuestions(form.value) && this.validMaxLengthAllQuestions(form.value) && form.valid) {
330
- if (this.dataForm.urlSend != "" && this.captchaValid) {
331
- this.http.post(this.dataForm.urlSend, form.value).subscribe((resp) => this.response.emit(resp));
332
- }
333
- else if (form.valid && this.captchaValid) {
334
- this.summit.emit(form.value);
335
- }
336
- }
337
- }
338
- findParamBoolean(params, idParam) {
339
- let showDescriptionParam = params.find((x) => x.id == idParam);
340
- return showDescriptionParam != null && showDescriptionParam.value == "true";
341
- }
342
- validRulesFields(numeroDoc, numeroCel, email) {
343
- // Validaciones para celular en caso de indicativo en Colombia
344
- let cel = document.getElementById("charcelular");
345
- let doc = document.getElementById("charnumeroDoc");
346
- let valOk = true;
347
- if (this.indicativo == "+57" || this.indicativo == "57") {
348
- let stringOrdenado = this.orderString(numeroDoc);
349
- if (this.nameCompany.toUpperCase() !== 'CLARO') { //claro acepta nro consecutivos
350
- if (numeroDoc == stringOrdenado) {
351
- doc.style.borderColor = "#FF0000";
352
- doc.removeAttribute("hidden");
353
- doc.textContent = "El numero documento No debe contener caracteres consecutivos";
354
- valOk = false;
355
- //this.msgErrorCampo = "El numero documento No debe contener caracteres consecutivos";
356
- //return false;
357
- }
358
- }
359
- if (numeroCel.substring(0, 1) != "3") {
360
- cel.style.borderColor = "#FF0000";
361
- cel.removeAttribute("hidden");
362
- cel.textContent = "El primer carácter del celular debe ser 3";
363
- valOk = false;
364
- //this.msgErrorCampo = "El primer carácter del celular debe ser 3";
365
- //return false;
366
- }
367
- /*
368
- if (parseInt(numeroCel.substring(0, 3)) > 350) {
369
- cel.style.borderColor = "#FF0000";
370
- cel.removeAttribute("hidden");
371
- cel.textContent = "El prefijo del celular no debe ser mayor a 350";
372
- valOk = false;
373
- //this.msgErrorCampo = "El prefijo del celular no debe ser mayor a 350";
374
- //return false;
375
- }
376
- */
377
- //En caso de que el número se repita, ejemplo 33333333
378
- let listnumber = numeroDoc.substring(0, 1);
379
- for (let index = 1; index < numeroDoc.length; index++) {
380
- listnumber = listnumber + numeroDoc.substring(0, 1);
381
- }
382
- if (numeroDoc == listnumber) {
383
- doc.style.borderColor = "#FF0000";
384
- doc.removeAttribute("hidden");
385
- doc.textContent = "Caracteres numéricos no se pueden repetirse de manera continua ";
386
- valOk = false;
387
- //this.msgErrorCampo = "Caracteres numéricos no se pueden repetirse de manera continua ";
388
- //return false;
389
- }
390
- if (!this.validateNumeroDocumento(numeroDoc)) {
391
- return false;
392
- }
393
- if (!this.validateCelular(numeroCel)) {
394
- return false;
395
- }
396
- // En caso de que el número se repita, ejemplo 33333333
397
- let arrayPhoneRepeat = Array.from(String(numeroCel), Number);
398
- let arrayPhoneOutRepeat = [...new Set(arrayPhoneRepeat)];
399
- if (arrayPhoneOutRepeat.length == 1) {
400
- cel.style.borderColor = "#FF0000";
401
- cel.removeAttribute("hidden");
402
- cel.textContent = "El número que ingresa no es valido";
403
- valOk = false;
404
- //this.msgErrorCampo = "El número que ingresa no es valido";
405
- //return false;
406
- }
407
- }
408
- else if (this.indicativo == "+593" || this.indicativo == "593") {
409
- if (numeroCel.substring(0, 1) != "9") {
410
- cel.style.borderColor = "#FF0000";
411
- cel.removeAttribute("hidden");
412
- cel.textContent = "El primer carácter del celular debe ser 9";
413
- valOk = false;
414
- //this.msgErrorCampo = "El primer carácter del celular debe ser 9";
415
- //return false;
416
- }
417
- }
418
- //se validan los campos por tipo de campo y no por value
419
- this.dataForm.formQuestions.forEach(formQuestion => {
420
- switch (formQuestion.question.questionType.id) {
421
- //se valida campo de tipo email
422
- case 11:
423
- valOk = this.emailRulesValidate(formQuestion);
424
- break;
425
- }
426
- });
427
- return valOk;
428
- }
429
- orderString(value) {
430
- let arrayNumber = [];
431
- for (let index = 0; index < value.length; index++) {
432
- arrayNumber.push(parseInt(value.substring(index, index + 1)));
433
- }
434
- //ordena el array
435
- arrayNumber.sort(function (a, b) {
436
- return a - b;
437
- });
438
- let numberOrder = "";
439
- numberOrder = arrayNumber[0];
440
- for (let index = 1; index < arrayNumber.length; index++) {
441
- numberOrder = numberOrder + (arrayNumber[0] + index).toString();
442
- }
443
- return numberOrder;
444
- }
445
- validMinlenghtAllQuestions(form) {
446
- for (const item of this.dataForm.formQuestions) {
447
- if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
448
- let minLength = parseInt(item.question.minLength);
449
- let formValueLength = parseInt(form[item.question.value].toString().length);
450
- if (minLength > 0 && formValueLength != minLength && formValueLength < minLength)
451
- return false;
452
- }
453
- }
454
- return true;
455
- }
456
- validMaxLengthAllQuestions(form) {
457
- for (const item of this.dataForm.formQuestions) {
458
- if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
459
- let maxLength = parseInt(item.question.maxLength);
460
- let formValueLength = parseInt(form[item.question.value].toString().length);
461
- if (maxLength > 0 && formValueLength != maxLength && formValueLength > maxLength)
462
- return false;
463
- }
464
- }
465
- return true;
466
- }
467
- validRequired(form, question) {
468
- //se deja catch por error no controlable en otro tiempo de ejecucion
469
- try {
470
- if (question != undefined && question.value != undefined) {
471
- if (form.controls[question.value] != undefined &&
472
- form.controls[question.value].errors != null &&
473
- form.controls[question.value].errors.required) {
474
- return true;
475
- }
476
- }
477
- }
478
- catch (error) { }
479
- return false;
480
- }
481
- validMinLength(form, question) {
482
- //se deja catch por error no controlable en otro tiempo de ejecucion
483
- try {
484
- if (question != undefined && question.value != undefined) {
485
- if (question.minLength > form.controls[question.value].value.toLocaleString().length && question.minLength > 0) {
486
- return true;
487
- }
488
- }
489
- }
490
- catch (error) { }
491
- return false;
492
- }
493
- validMaxLength(form, question) {
494
- //se deja catch por error no controlable en otro tiempo de ejecucion
495
- try {
496
- if (question != undefined && question.value != undefined) {
497
- if (question.maxLength > 0) {
498
- if (question.maxLength + 1 <= form.controls[question.value].value.toString().replace(/\./g, '').length) {
499
- if (!this.formDynamic.controls[question.value].hasError('errorMaxLength')) {
500
- this.formDynamic.controls[question.value].setErrors({ 'errorMaxLength': true });
501
- }
502
- return true;
503
- }
504
- }
505
- }
506
- }
507
- catch (error) { }
508
- return false;
509
- }
510
- tycSelection(event) {
511
- this.viewAuthData.emit(event);
512
- }
513
- openLabelUrl(event, question) {
514
- event.preventDefault();
515
- let tyc = document.getElementById("check" + question.id);
516
- tyc.style.color = "#A3AD32";
517
- window.open(question.urllabel, "_blank");
518
- }
519
- cancellKeypress() {
520
- return false;
521
- }
522
- emailRulesValidate(formQuestion) {
523
- let valOk = true;
524
- try {
525
- let hasError = false;
526
- document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
527
- let eml = document.getElementById(formQuestion.question.id);
528
- let email = formQuestion.question.registred;
529
- if (!hasError) {
530
- if (formQuestion.question.required && (email == "" || email == undefined || email == null)) {
531
- eml.style.borderColor = "#FF0000";
532
- eml.textContent = "El correco eléctronico es requerido";
533
- eml.removeAttribute("hidden");
534
- valOk = false;
535
- hasError = true;
536
- }
537
- }
538
- if (!hasError) {
539
- if (this.validMinLength(undefined, formQuestion.question)) {
540
- eml.style.borderColor = "#FF0000";
541
- eml.textContent = "Debe ser mínimo de " + formQuestion.question.minLength + " caracteres";
542
- document.getElementById(formQuestion.question.id).removeAttribute("hidden");
543
- valOk = false;
544
- hasError = true;
545
- }
546
- }
547
- if (!hasError) {
548
- if (this.validMaxLength(undefined, formQuestion.question)) {
549
- eml.style.borderColor = "#FF0000";
550
- eml.textContent = "Debe ser maximo de " + formQuestion.question.maxLength + " caracteres";
551
- document.getElementById(formQuestion.question.id).removeAttribute("hidden");
552
- valOk = false;
553
- hasError = true;
554
- }
555
- }
556
- if (!hasError) {
557
- const matches = String(email).match(regexType.email.exp);
558
- if (matches == null) {
559
- eml.style.borderColor = "#FF0000";
560
- eml.textContent = "Tu email es invalido";
561
- eml.removeAttribute("hidden");
562
- valOk = false;
563
- hasError = true;
564
- }
565
- }
566
- }
567
- catch (error) {
568
- }
569
- return valOk;
570
- }
571
- calendarRulesValidate(formQuestion) {
572
- let hasError = false;
573
- try {
574
- document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
575
- let ecalendar = document.getElementById(formQuestion.question.id);
576
- //se valida que no sea null si es requerido
577
- let date = formQuestion.question.registred;
578
- if (formQuestion.question.required && (date == "" || date == undefined || date == null)) {
579
- ecalendar.style.borderColor = "#FF0000";
580
- ecalendar.textContent = "La fecha es requerida";
581
- ecalendar.removeAttribute("hidden");
582
- }
583
- }
584
- catch (error) {
585
- }
586
- }
587
- validateNotSpace(event) {
588
- if (event.charCode == 32) {
589
- return false;
590
- }
591
- else {
592
- return true;
593
- }
594
- }
595
- validateNumeroDocumento(numeroDoc) {
596
- if (!numeroDoc.match("^[0-9]*$")) {
597
- this.formDynamic.controls["numeroDoc"].setValidators([Validators.pattern('^[0-9]*$')]);
598
- this.formDynamic.controls["numeroDoc"].markAsDirty();
599
- this.formDynamic.controls["numeroDoc"].updateValueAndValidity();
600
- this.formDynamic.controls["numeroDoc"].markAsTouched();
601
- this.patternNotValidDcto = true;
602
- return false;
603
- }
604
- this.patternNotValidDcto = false;
605
- return true;
606
- }
607
- validateCelular(numeroCel) {
608
- if (!numeroCel.match("^[0-9]*$")) {
609
- this.formDynamic.controls["celular"].setValidators([Validators.pattern('^[0-9]*$')]);
610
- this.formDynamic.controls["celular"].markAsDirty();
611
- this.formDynamic.controls["celular"].updateValueAndValidity();
612
- this.formDynamic.controls["celular"].markAsTouched();
613
- this.patternNotValidCel = true;
614
- return false;
615
- }
616
- this.patternNotValidCel = false;
617
- return true;
618
- }
619
- onkeypress(event) {
620
- return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57;
621
- }
622
- onChangeStep(step, nextStep, value) {
623
- if (nextStep && nextStep.stepOrder != 1) {
624
- this.resetField(step);
625
- nextStep.viewData = [];
626
- nextStep.viewData = nextStep.stepData.filter(x => x.relationalIds.includes(Number(value)));
627
- }
628
- }
629
- resetField(stepIn) {
630
- this.steps.forEach(step => {
631
- if (step.stepOrder > stepIn.stepOrder) {
632
- step.viewData = undefined;
633
- step.value = undefined;
634
- }
635
- });
636
- }
637
- };
638
- FormAuroraComponent.ctorParameters = () => [
639
- { type: CommonDataService },
640
- { type: HttpClient }
641
- ];
642
- tslib_1.__decorate([
643
- Input()
644
- ], FormAuroraComponent.prototype, "dataClassCss", void 0);
645
- tslib_1.__decorate([
646
- Input()
647
- ], FormAuroraComponent.prototype, "dataForm", void 0);
648
- tslib_1.__decorate([
649
- Input()
650
- ], FormAuroraComponent.prototype, "clickSubmit", void 0);
651
- tslib_1.__decorate([
652
- Input()
653
- ], FormAuroraComponent.prototype, "dataReloadForm", void 0);
654
- tslib_1.__decorate([
655
- Input()
656
- ], FormAuroraComponent.prototype, "welcomeTitle", void 0);
657
- tslib_1.__decorate([
658
- Input()
659
- ], FormAuroraComponent.prototype, "welcomeDescription", void 0);
660
- tslib_1.__decorate([
661
- Input()
662
- ], FormAuroraComponent.prototype, "urlPdf", void 0);
663
- tslib_1.__decorate([
664
- Input()
665
- ], FormAuroraComponent.prototype, "nameCompany", void 0);
666
- tslib_1.__decorate([
667
- Input()
668
- ], FormAuroraComponent.prototype, "schedule", void 0);
669
- tslib_1.__decorate([
670
- Input()
671
- ], FormAuroraComponent.prototype, "isSimpleFlow", void 0);
672
- tslib_1.__decorate([
673
- Input()
674
- ], FormAuroraComponent.prototype, "company", void 0);
675
- tslib_1.__decorate([
676
- Input()
677
- ], FormAuroraComponent.prototype, "steps", void 0);
678
- tslib_1.__decorate([
679
- ViewChild('formDynamic', { static: true })
680
- ], FormAuroraComponent.prototype, "formDynamic", void 0);
681
- tslib_1.__decorate([
682
- Output()
683
- ], FormAuroraComponent.prototype, "response", void 0);
684
- tslib_1.__decorate([
685
- Output()
686
- ], FormAuroraComponent.prototype, "summit", void 0);
687
- tslib_1.__decorate([
688
- Output()
689
- ], FormAuroraComponent.prototype, "viewAuthData", void 0);
690
- tslib_1.__decorate([
691
- ViewChild("modalTurns", { static: false })
692
- ], FormAuroraComponent.prototype, "myModal", void 0);
693
- FormAuroraComponent = tslib_1.__decorate([
694
- Component({
695
- selector: 'lib-FormAurora',
696
- template: "<div class=\"card\">\r\n <span class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"!isSimpleFlow\">\r\n <img style=\"width: 115px; height:96px;\" [class]=\"dataClassCss.logo\" id=\"logo\">\r\n </span>\r\n <div class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"isSimpleFlow\" style=\"margin-top: 4%!important;\">\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <ng-container *ngIf=\"schedule\">\r\n <h4 class=\"card-title text-center mb-0\" [class]=\"dataClassCss.bienvenida2\" style=\"color: #EE7E0E;\">\r\n Horarios de atenci\u00F3n\r\n </h4>\r\n <small class=\"text-center d-block\">{{schedule}}</small>\r\n </ng-container>\r\n <form #formDynamic=\"ngForm\">\r\n <div *ngFor=\"let control of dataForm?.formQuestions; let index = index; trackBy: trackByIndex\">\r\n <div\r\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2)) || (index < dataForm.formQuestions.length && dataForm.formQuestions[index].question.questionType.id == 3 && dataForm.formQuestions[index + 1].question.questionType.id == 2); else switchTemp\">\r\n <div class=\"row\"\r\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2))\">\r\n <div class=\"col-lg-6 col-xs-12\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index - 1].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index -\r\n 1].question.label}}</span>\r\n </label>\r\n <div class=\"selectContainer\">\r\n <select [name]=\"dataForm.formQuestions[index - 1].question.value\"\r\n [required]=\"dataForm.formQuestions[index - 1].question.required\"\r\n [class]=\"dataClassCss.formcontrol\"\r\n id=\"{{dataForm.formQuestions[index - 1].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index - 1].question.registred\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container\r\n *ngFor=\"let item of dataForm.formQuestions[index - 1].question.questionAnswers\">\r\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index-1].question.value\"\r\n hidden></span>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-6 col-xs-12\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\"\r\n class=\"col-sm-12 p-sm-0 px-sm-1\" style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keyup)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n onkeypress=\"onkeypress($event)\"\r\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\r\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\r\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\" />\r\n\r\n </div>\r\n\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\r\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\r\n Este campo es obligatorio</span>\r\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser m\u00EDnimo de\r\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser maximo de\r\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\r\n hidden></span>\r\n <span *ngIf=\"patternNotValidDcto === true\" class=\"error\">Formato no valido</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-template #switchTemp>\r\n <div [ngSwitch]=\"dataForm.formQuestions[index].question.questionType.id\">\r\n <div *ngSwitchCase=\"1\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"2\">\r\n\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n onkeypress=\"onkeypress($event)\"\r\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\r\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\r\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\" />\r\n <span *ngIf=\"patternNotValidCel === true\" class=\"error\">Formato no valido</span>\r\n </div>\r\n \r\n </div>\r\n <div *ngSwitchCase=\"3\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left;\">\r\n <span\r\n class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <select [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [class]=\"dataClassCss.formcontrol\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n style=\"margin-top: -1rem !important;\"\r\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index].question.registred\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container\r\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\">\r\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"4\">\r\n <select class=\"{{ dataClassCss.formcontrol }} select-checkbox\"\r\n style=\"overflow: hidden; border-style: hidden;\"\r\n [style.height.px]=\"dataForm.formQuestions[index].question.questionAnswers.length * 24\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\" ngModel multiple>\r\n <option \r\n (mousemove)=\"$event.preventDefault()\"\r\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\"\r\n [value]=\"item.answer.value\">\r\n {{ item.answer.field }}\r\n </option>\r\n </select>\r\n </div>\r\n <div *ngSwitchCase=\"5\">\r\n <a (click)=\"rediretoutside($event,dataForm.formQuestions[index].question)\" href=\"\">\r\n <span>{{ dataForm.formQuestions[index].question.label }}</span>\r\n </a>\r\n </div>\r\n <div *ngSwitchCase=\"6\">\r\n <div [class]=\"dataClassCss.cl12\" [id]=\"'reCaptcha'\">\r\n <div class=\"cnt-captcha\">\r\n <re-captcha (resolved)=\"resolvedCaptcha($event)\"\r\n siteKey=\"6LfQisEZAAAAAARuuKFEAgS-x4qJse5uBA_QCA7v\"></re-captcha>\r\n <input hidden type=\"text\" [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\r\n </div>\r\n <span class=\"error\" *ngIf=\"watchValid && !captchaValid\" style=\"margin-top: 0;\">\r\n Debe resolver la captcha para continuar\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"7\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; margin-bottom: 0 ;\">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input placeholder=\"dd/mm/aaaa\" style=\"margin-top: -0.4rem !important;\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [name]=\"dataForm.formQuestions[index].question.value\" type=\"date\" min=\"{{minDate}}\"\r\n max=\"{{maxDate}}\" [maxlength]=\"10\" (paste)=\"false\"\r\n id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.txtCalendar\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n (keydown)=\"cancellKeypress()\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\">\r\n\r\n <button class=\"btn\" id=\"{{dataForm.formQuestions[index].question.value}}\" type=\"button\"\r\n style=\"width: 46px;\r\n top: 12px;\r\n color: white;\r\n right: 15px;\r\n position: absolute;\r\n background: #D25D42;\r\n pointer-events: none;\">\r\n <i class=\"fa fa-calendar\"></i>\r\n </button>\r\n\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"8\">\r\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\r\n <input style=\"width: 4% !important; height: auto !important; display: inline !important;\" type=\"checkbox\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n [class]=\"dataClassCss.formcontrol\">\r\n <!-- (change)=\"checkTermsAndConditions(dataForm.formQuestions[index].question.registred)\" -->\r\n \r\n <!-- <a href=\"{{urlPdf}}\" target=\"_blank\" style=\"text-decoration: underline;\"\r\n id=\"txtPoliticas\" (click)=\"tycSelection()\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a> -->\r\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\r\n id=\"txtPoliticas\" (click)=\"tycSelection($event)\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"9\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keypress)=\"validOnlyText($event)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"10\">\r\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\r\n <input style=\"width: 4% !important; height: auto !important; display: inline !important;\"\r\n type=\"checkbox\" [name]=\"dataForm.formQuestions[index].question.value\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\r\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\r\n id=\"check{{dataForm.formQuestions[index].question.id}}\"\r\n (click)=\"openLabelUrl($event,dataForm.formQuestions[index].question)\">\r\n {{dataForm.formQuestions[index].question.label}}\r\n </a>\r\n </div>\r\n </div>\r\n <div *ngSwitchCase=\"11\">\r\n <div [class]=\"dataClassCss.cl12\">\r\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\r\n style=\"display: block; text-align: left; \">\r\n <span\r\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\r\n </label>\r\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\r\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\r\n [required]=\"dataForm.formQuestions[index].question.required\"\r\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\r\n [name]=\"dataForm.formQuestions[index].question.value\"\r\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\r\n (keypress)=\"validateNotSpace($event)\"\r\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\r\n style=\"margin-top: -1rem !important;\" />\r\n </div>\r\n </div>\r\n <div *ngSwitchDefault>Tipo de control no detectado</div>\r\n <div style=\"margin-left: 15px;\"\r\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\r\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\r\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\r\n Este campo es obligatorio</span>\r\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser m\u00EDnimo de\r\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\r\n Debe ser maximo de\r\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\r\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\r\n hidden></span>\r\n <span class=\"error\" [id]=\"dataForm.formQuestions[index].question.id\" hidden></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <section *ngIf=\"isSimpleFlow\">\r\n <div *ngFor=\"let step of steps let index = index; trackBy: trackByIndex\">\r\n <div [class]=\"dataClassCss.cl12\" *ngIf=\"step.viewData\">\r\n <label for=\"{{step.id}}\" class=\"col-sm-12\" style=\"display: block; text-align: left;\">\r\n <span class=\"h6 small bg-white text-muted\">{{step.step}}</span>\r\n </label>\r\n <select [name]=\"step.step\" [required]=\"true\" [class]=\"dataClassCss.formcontrol\" id=\"{{step.step}}\"\r\n style=\"margin-top: -1rem !important;\" [(ngModel)]=\"step.value\"\r\n (ngModelChange)=\"onChangeStep(step,steps[index+1],$event)\">\r\n <option value=\"\" selected disabled hidden>Selecciona</option>\r\n <ng-container *ngFor=\"let subitem of step.viewData\">\r\n <option [value]=\"subitem.id\">\r\n {{ subitem.description }}\r\n </option>\r\n </ng-container>\r\n </select>\r\n </div>\r\n </div>\r\n </section>\r\n <div class=\"mt-3 text-center\">\r\n <button type=\"button\" [class]=\"dataClassCss.btn\" (click)=\"onSubmit()\" [disabled]=\"!formDynamic.valid\"\r\n id=\"btnIng\">Ingresar</button>\r\n </div>\r\n </form>\r\n </div>\r\n</div>\r\n",
697
- providers: [
698
- { provide: NgbDateAdapter, useClass: CustomAdapter },
699
- { provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter },
700
- { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
701
- I18n
702
- ],
703
- styles: ["form{font-size:12px;overflow-y:scroll;overflow-x:hidden}form input,form select{border:1px solid #e4e4e4;height:40px;margin-bottom:5px}.selectContainer select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.selectContainer::after{content:\"\\025be\";display:table-cell;text-align:center;padding-top:7px;width:30px;height:30px;position:absolute;top:14px;right:20px;pointer-events:none}form .error{color:red;font-size:12px;text-align:left;margin:-15px 0 15px;padding:0;width:90%}.error:after{content:\" \";display:block}.card{width:90%;margin:2% auto;border-radius:12px}@media (max-width:412px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:575.98px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:880.98px){.cnt-captcha{transform:scale(.82)}}input[type=date]::-webkit-calendar-picker-indicator{background:0 0;bottom:0;color:transparent;cursor:pointer;height:auto;left:0;position:absolute;right:0;top:0;width:auto}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f5f5f5}::-webkit-scrollbar-thumb{background:#e0e0e0}::-webkit-scrollbar-thumb:hover{background:#bdbdbd}"]
704
- })
705
- ], FormAuroraComponent);
706
- export { FormAuroraComponent };
707
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXJvcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZm9ybS1hdXJvcmEtc3RlZmFuaW5pLyIsInNvdXJjZXMiOlsibGliL0NvbXBvbmVudHMvZnJvbS1hdXJvcmEvZm9ybS1hdXJvcmEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQWdCLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFDLGNBQWMsRUFBRSxzQkFBc0IsRUFBaUIsaUJBQWlCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwSCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFNaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZCLHdEQUF3RDtBQUN4RCw2RUFBNkU7QUFDN0UseUVBQXlFO0FBRXpFOztHQUVHO0FBRUgsSUFBYSxhQUFhLEdBQTFCLE1BQWEsYUFBYyxTQUFRLGNBQXNCO0lBUnpELHdEQUF3RDtJQUN4RCw2RUFBNkU7SUFDN0UseUVBQXlFO0lBRXpFOztPQUVHO0lBQ0g7O1FBR1csY0FBUyxHQUFHLEdBQUcsQ0FBQztJQWtCM0IsQ0FBQztJQWhCQyxTQUFTLENBQUMsS0FBb0I7UUFDNUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENB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QUM7WUFDbEQsRUFBQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFDO1lBQ3RFLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxvQkFBb0IsRUFBQztZQUM1RCxJQUFJO1NBQ0w7O0tBQ0YsQ0FBQztHQUNXLG1CQUFtQixDQXFrQi9CO1NBcmtCWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbmplY3RhYmxlLFxyXG4gIElucHV0LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgT25Jbml0LFxyXG4gIFJlbmRlcmVyMixcclxuICBWaWV3Q2hpbGQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlclxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIE5nRm9ybSwgRm9ybSwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0h0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbi8vIGltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHtOZ2JEYXRlQWRhcHRlciwgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgTmdiRGF0ZVN0cnVjdCwgTmdiRGF0ZXBpY2tlckkxOG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBGaWxsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL2ZpbGwnO1xyXG5pbXBvcnQgeyByZWdleFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9yZWdleCc7XHJcbmltcG9ydCB7IENvbXBhbnkgfSBmcm9tICcuLi8uLi9Nb2RlbHMvY29tcGFueSc7XHJcbmltcG9ydCB7IFN0ZXAgfSBmcm9tICcuLi8uLi9Nb2RlbHMvc3RlcCc7XHJcbmltcG9ydCB7IENvbW1vbkRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcclxuXHJcblxyXG5cclxuXHJcblxyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG4vLyBpbXBvcnQgeyByZWdleFR5cGUgfSBmcm9tIFwiQGFwcC9fc2hhcmVkL191dGlsL3JlZ2V4XCI7XHJcbi8vIGltcG9ydCB7IEV4dGVybmFsU2VydmljZSB9IGZyb20gJ0BhcHAvX3NoYXJlZC9fc2VydmljZXMvZXh0ZXJuYWwuc2VydmljZSc7XHJcbi8vIGltcG9ydCB7IEF1cm9yYVNlcnZpY2UgfSBmcm9tICdAYXBwL19zaGFyZWQvX3NlcnZpY2VzL2F1cm9yYS5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIFNlcnZpY2UgaGFuZGxlcyBob3cgdGhlIGRhdGUgaXMgcmVwcmVzZW50ZWQgaW4gc2NyaXB0cyBpLmUuIG5nTW9kZWwuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21BZGFwdGVyIGV4dGVuZHMgTmdiRGF0ZUFkYXB0ZXI8c3RyaW5nPiB7XHJcblxyXG4gIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcclxuXHJcbiAgZnJvbU1vZGVsKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogTmdiRGF0ZVN0cnVjdCB8IG51bGwge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdCh0aGlzLkRFTElNSVRFUik7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgZGF5OiBwYXJzZUludChkYXRlWzBdLCAxMCksXHJcbiAgICAgICAgbW9udGg6IHBhcnNlSW50KGRhdGVbMV0sIDEwKSxcclxuICAgICAgICB5ZWFyOiBwYXJzZUludChkYXRlWzJdLCAxMClcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdG9Nb2RlbChkYXRlOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgLy9yZXR1cm4gZGF0ZSA/IGRhdGUuZGF5ICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLm1vbnRoICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiBudWxsO1xyXG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/IDAgKyBkYXRlLmRheSA6IGRhdGUuZGF5KSArIHRoaXMuREVMSU1JVEVSICsgKGRhdGUubW9udGggPCAxMCA/IDAgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aCkgKyB0aGlzLkRFTElNSVRFUiArIGRhdGUueWVhciA6ICcnO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgU2VydmljZSBoYW5kbGVzIGhvdyB0aGUgZGF0ZSBpcyByZW5kZXJlZCBhbmQgcGFyc2VkIGZyb20ga2V5Ym9hcmQgaS5lLiBpbiB0aGUgYm91bmQgaW5wdXQgZmllbGQuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDdXN0b21EYXRlUGFyc2VyRm9ybWF0dGVyIGV4dGVuZHMgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciB7XHJcblxyXG4gIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcclxuXHJcbiAgcGFyc2UodmFsdWU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQodGhpcy5ERUxJTUlURVIpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRheTogcGFyc2VJbnQoZGF0ZVswXSwgMTApLFxyXG4gICAgICAgIG1vbnRoOiBwYXJzZUludChkYXRlWzFdLCAxMCksXHJcbiAgICAgICAgeWVhcjogcGFyc2VJbnQoZGF0ZVsyXSwgMTApXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGZvcm1hdChkYXRlOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gZGF0ZSA/IChkYXRlLmRheSA8IDEwID8gJzAnICsgZGF0ZS5kYXkgOiBkYXRlLmRheSkgKyB0aGlzLkRFTElNSVRFUiArIChkYXRlLm1vbnRoIDwgMTAgPyAnMCcgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aCkgKyB0aGlzLkRFTElNSVRFUiArIGRhdGUueWVhciA6ICcnO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgSTE4Tl9WQUxVRVMgPSB7XHJcbiAgJ2VzJzoge1xyXG4gICAgd2Vla2RheXM6IFsnTHUnLCAnTWEnLCAnTWknLCAnSnUnLCAnVmknLCAnU2EnLCAnRG8nXSxcclxuICAgIG1vbnRoczogWydFbmUnLCAnRmViJywgJ01hcicsICdBYnInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQWdvJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RpYyddLFxyXG4gICAgd2Vla0xhYmVsOiAnc2VtJ1xyXG4gIH1cclxuICAvLyBvdGhlciBsYW5ndWFnZXMgeW91IHdvdWxkIHN1cHBvcnRcclxufTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEkxOG4ge1xyXG4gIGxhbmd1YWdlID0gJ2VzJztcclxufVxyXG5cclxuLy8gRGVmaW5lIGN1c3RvbSBzZXJ2aWNlIHByb3ZpZGluZyB0aGUgbW9udGhzIGFuZCB3ZWVrZGF5cyB0cmFuc2xhdGlvbnNcclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZXBpY2tlckkxOG4gZXh0ZW5kcyBOZ2JEYXRlcGlja2VySTE4biB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfaTE4bjogSTE4bikge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldFdlZWtkYXlMYWJlbCh3ZWVrZGF5OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtkYXlzW3dlZWtkYXkgLSAxXTtcclxuICB9XHJcblxyXG4gIGdldFdlZWtMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtMYWJlbDtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoU2hvcnROYW1lKG1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLm1vbnRoc1ttb250aCAtIDFdO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9udGhGdWxsTmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmdldE1vbnRoU2hvcnROYW1lKG1vbnRoKTtcclxuICB9XHJcblxyXG4gIGdldERheUFyaWFMYWJlbChkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgJHtkYXRlLmRheX0tJHtkYXRlLm1vbnRofS0ke2RhdGUueWVhcn1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2Vla2RheVNob3J0TmFtZSh3ZWVrZGF5OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtkYXlzW3dlZWtkYXkgLSAxXTtcclxuICB9O1xyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItRm9ybUF1cm9yYScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYXVyb3JhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mb3JtLWF1cm9yYS5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBDdXN0b21BZGFwdGVyfSxcclxuICAgIHtwcm92aWRlOiBOZ2JEYXRlUGFyc2VyRm9ybWF0dGVyLCB1c2VDbGFzczogQ3VzdG9tRGF0ZVBhcnNlckZvcm1hdHRlcn0sXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZXBpY2tlckkxOG4sIHVzZUNsYXNzOiBDdXN0b21EYXRlcGlja2VySTE4bn0sXHJcbiAgICBJMThuXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybUF1cm9yYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICAgXHJcbiAgQElucHV0KCkgZGF0YUNsYXNzQ3NzOiBhbnk7XHJcbiAgQElucHV0KCkgZGF0YUZvcm06IGFueTtcclxuICBASW5wdXQoKSBjbGlja1N1Ym1pdDogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGFSZWxvYWRGb3JtOiBhbnk7XHJcbiAgQElucHV0KCkgd2VsY29tZVRpdGxlOiBhbnk7XHJcbiAgQElucHV0KCkgd2VsY29tZURlc2NyaXB0aW9uOiBhbnk7XHJcbiAgQElucHV0KCkgdXJsUGRmOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbmFtZUNvbXBhbnk6IHN0cmluZztcclxuICBASW5wdXQoKSBzY2hlZHVsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGlzU2ltcGxlRmxvdzogYm9vbGVhbjsgIFxyXG4gIEBJbnB1dCgpIGNvbXBhbnk6IENvbXBhbnk7ICBcclxuICBASW5wdXQoKSBzdGVwczogU3RlcFtdOyAgICBcclxuICBAVmlld0NoaWxkKCdmb3JtRHluYW1pYycsIHsgc3RhdGljOiB0cnVlIH0pIGZvcm1EeW5hbWljOiBOZ0Zvcm07XHJcbiAgQE91dHB1dCgpIHJlc3BvbnNlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHN1bW1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSB2aWV3QXV0aERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgdGlwb2RvY051bURvYzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG9uU3VibWl0RXZlbnQ6IGFueSA9IGZhbHNlO1xyXG4gIGNvdW50U3VibWl0ID0gMDtcclxuICB3YXRjaFZhbGlkID0gZmFsc2U7XHJcbiAgd2F0Y2hSZXF1aXJlZCA9IGZhbHNlO1xyXG4gIGNhcHRjaGFWYWxpZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGRpc3BsYXlNb250aHMgPSAyO1xyXG4gIG5hdmlnYXRpb24gPSAnc2VsZWN0JztcclxuICBzaG93V2Vla051bWJlcnMgPSBmYWxzZTtcclxuICBvdXRzaWRlRGF5cyA9ICd2aXNpYmxlJztcclxuICByZXNwU2VydmljZVNlZ21lbnRhdGlvbjogYW55ID0gbnVsbDtcclxuICBiYXNlNjRDaGVja0F1dGhEYXRhIDogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuXHJcblxyXG5cclxuICAvL2VtYWlsUGF0dGVybiA9IFwiXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSRcIjtcclxuXHJcbiAgdG9kYXkgPSBtb21lbnQobmV3IERhdGUoKSk7XHJcbiAgbWF4WWVhciA9IHRoaXMudG9kYXkueWVhcigpO1xyXG4gIG1pblllYXIgPSB0aGlzLnRvZGF5LnllYXIoKSAtIDgyO1xyXG4gIG1pbkRhdGUgPSB0aGlzLm1pblllYXIudG9TdHJpbmcoKSArICctJyArIHRoaXMudG9kYXkubW9udGgoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWluWWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcbiAgbWF4RGF0ZSA9IHRoaXMubWF4WWVhci50b1N0cmluZygpICsgJy0nICsgKHRoaXMudG9kYXkubW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHRoaXMudG9kYXkuZGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsvLyB7eWVhcjogdGhpcy5tYXhZZWFyLCBtb250aDogdGhpcy50b2RheS5tb250aCgpICsgMSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcblxyXG4gIC8vUmV2aXNhciB2YXJpYWJsZXNcclxuICByZWNoYXJnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluZGljYXRpdm86IHN0cmluZyA9IFwiNTdcIjtcclxuICBAVmlld0NoaWxkKFwibW9kYWxUdXJuc1wiLCB7IHN0YXRpYzogZmFsc2UgfSkgbXlNb2RhbDogRWxlbWVudFJlZjtcclxuICBmaWxsZGF0YTogRmlsbDtcclxuICBkZWZhdWx0RG9jVHlwZTogc3RyaW5nID0gXCJDw6lkdWxhIGRlIGNpdWRhZGFuw61hXCI7XHJcblxyXG4gIHBhdHRlcm5Ob3RWYWxpZERjdG86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwYXR0ZXJuTm90VmFsaWRDZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhOiBDb21tb25EYXRhU2VydmljZSwgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1pbkRhdGUgPSBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXVxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb21wb25lbnQoKTtcclxuICAgIH0sIDIwMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0Q29tcG9uZW50KCkge1xyXG4gICAgLy9vcmRlbmEgbG9zIGNhbXBvc1xyXG4gICAgaWYgKHRoaXMuZGF0YUZvcm0gIT0gbnVsbCAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vU2FtZSByb3cgZmllbGRzXHJcbiAgICAgIHRoaXMudGlwb2RvY051bURvYyA9ICh0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gXCJ0aXBvRG9jXCIpICYmIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5zb21lKHF1ZXN0aW9uID0+IHF1ZXN0aW9uLnF1ZXN0aW9uLnZhbHVlID09PSBcIm51bWVyb0RvY1wiKSkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xyXG4gICAgICAgIHJldHVybiBhLm9yZGVyIC0gYi5vcmRlcjtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBleGlzdGNhcHRjaGEgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSA2KTtcclxuXHJcbiAgICAgIGlmIChleGlzdGNhcHRjaGEubGVuZ3RoID09IDApIHtcclxuICAgICAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1heGxlbmd0aCA9PSB1bmRlZmluZWQgfHwgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPSA1MjQyODg7IC8vZGVmYXVsdHZhbHVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZGF0YVJlbG9hZEZvcm0uZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsbGRhdGEgPSBlbGVtZW50O1xyXG5cclxuICAgICAgICAgIGlmICgoaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDIgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDEgfHxcclxuICAgICAgICAgICAgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDMpICYmICh0aGlzLmZpbGxkYXRhLmRhdGEgIT09IG51bGwgJiZcclxuICAgICAgICAgICAgICB0aGlzLmZpbGxkYXRhLmRhdGEgIT09IHVuZGVmaW5lZCkgJiYgaXRlbS5xdWVzdGlvbi5pZCA9PT0gdGhpcy5maWxsZGF0YS5pZCkge1xyXG4gICAgICAgICAgICBpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9IHRoaXMuZmlsbGRhdGEuZGF0YTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9ICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmFuZ2UgPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcclxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sKCksXHJcbiAgfSk7XHJcblxyXG4gIHJlc29sdmVkQ2FwdGNoYShjYXB0Y2hhUmVzcG9uc2U6IHN0cmluZykge1xyXG4gICAgdGhpcy5jYXB0Y2hhVmFsaWQgPSB0cnVlXHJcbiAgICBpZiAoIXRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhKSB7XHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHMuY2FwdGNoYS5zZXRWYWx1ZShjYXB0Y2hhUmVzcG9uc2UpXHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhID0gY2FwdGNoYVJlc3BvbnNlXHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuSW5nXCIpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/IFwiMC42NVwiIDogXCIxXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0Zvcm1zXHJcbiAgLy9NZXRvZG8gcGFyYSBldml0YXIgZWwgcmVuZGVyIGRlIGxvcyBpdGVtcyBkZWwgZm9yXHJcbiAgcHVibGljIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyLCBvYmo6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gaW5kZXg7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVZhbGlkUGF0dGVyKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgaWYgKHF1ZXN0aW9uLnBhdHRlcm4gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICAgIGxldCBrZXl2YWxpZCA9IFs4LCAzMiwgMzcsIDM4LCAzOSwgNDAsIDQ2LCA5XTtcclxuICAgICAgLy9kaWZlcmVudGUgZGUgQmFja3BzYWNlXHJcbiAgICAgIC8vc2UgZGVqYSBjYXRjaCBwb3IgZXJyb3Igbm8gY29udHJvbGFibGUgZW4gb3RybyB0aWVtcG8gZGUgZWplY3VjaW9uXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKCFrZXl2YWxpZC5pbmNsdWRlcyhldmVudC5rZXlDb2RlKSkge1xyXG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHF1ZXN0aW9uLnBhdHRlcm4pO1xyXG4gICAgICAgICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsaWQ7XHJcbiAgICB9XHJcbiAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5kZXNjcmlwdGlvbiA9PT0gJ051bWJlcicpIHtcclxuICAgICAgICBpZiAocXVlc3Rpb24udmFsdWUgPT09ICdudW1lcm9Eb2MnKSB7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlTnVtZXJvRG9jdW1lbnRvKHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbXCJudW1lcm9Eb2NcIl0udmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfWVsc2UgaWYgKHF1ZXN0aW9uLnZhbHVlID09PSAnY2VsdWxhcicpe1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUNlbHVsYXIodGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0udmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGFyXCIgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuXHJcbiAgICAvL2lmIHRlbXBvcmFsIG1pZW50cmFzIHNlIG1pZ3JhbiB0b2RvcyBsb3MgdGlwb3MgZGUgY2FtcG9zIGFsIGZvcmVhY2hcclxuICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgIT0gMTEgJiYgcXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkICE9IDcpIHtcclxuICAgICAgaWYgKHRoaXMudmFsaWRNaW5MZW5ndGgodGhpcy5mb3JtRHluYW1pYywgcXVlc3Rpb24pKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtbFwiICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNFNEU0RTRcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1sXCIgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52YWxpZE1heExlbmd0aCh0aGlzLmZvcm1EeW5hbWljLCBxdWVzdGlvbikpIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm14bFwiICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNFNEU0RTRcIjtcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm14bFwiICsgcXVlc3Rpb24udmFsdWUpLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCBcInRydWVcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZvckVhY2goZm9ybVF1ZXN0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkKSB7XHJcbiAgICAgICAgLy9zZSB2YWxpZGEgIGNhbXBvIGRlIHRpcG8gY2FsZW5kYXJpb1xyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNylcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMTEpXHJcbiAgICAgICAgICAgIHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidG5JbmdcIikuc3R5bGUub3BhY2l0eSA9ICF0aGlzLmZvcm1EeW5hbWljLnZhbGlkID8gXCIwLjY1XCIgOiBcIjFcIjtcclxuICB9XHJcblxyXG4gIHZhbGlkT25seVRleHQoZXZlbnQpIHtcclxuICAgIGxldCByZWdleCA9IC9eW2EtekEtWlxcdTAwQzAtXFx1MDE3Rl0rJC9nO1xyXG4gICAgaWYgKGV2ZW50LmNoYXJDb2RlID09IDMyKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG5cclxuICAgIHJldHVybiB2YWxpZDtcclxuICB9XHJcblxyXG4gIHZhbGlkRGF0ZShldmVudCkge1xyXG4gICAgLypsZXQgcGF0dGVybiA9IC8oPzowWzEtOV18WzEyXVswLTldfDNbMDFdKVxcLyg/OjBbMS05XXwxWzAtMl0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xyXG4gICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAqL1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhldmVudC5rZXkpLm1hdGNoKHJlZ2V4VHlwZS5kYXRlLmV4cCk7XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlXHJcbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbClcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBhbGVydCh2YWxpZCk7XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWREYXRlKGV2ZW50KSB7XHJcblxyXG4gICAgLy9sZXQgcGF0dGVybiA9IC8oPzowWzEtOV18MVswLTJdKVxcLyg/OjBbMS05XXxbMTJdWzAtOV18M1swMV0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgbGV0IGRhdGVOID0gL1swLTldfFxcLy9cclxuICAgIGxldCB2YWxpZCA9IHRydWVcclxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChkYXRlTik7XHJcbiAgICB2YWxpZCA9IHJlZ2V4LnRlc3QoZXZlbnQua2V5KTtcclxuICAgIHJldHVybiB2YWxpZDtcclxuXHJcbiAgfVxyXG5cclxuICByZWRpcmV0b3V0c2lkZShldmVudCwgcXVlc3Rpb24pIHtcclxuICAgIC8vc2UgZGVqYSBjYXRjaCBwb3IgZXJyb3Igbm8gY29udHJvbGFibGUgZW4gb3RybyB0aWVtcG8gZGUgZWplY3VjaW9uXHJcbiAgICB0cnkge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB3aW5kb3cub3BlbihxdWVzdGlvbi52YWx1ZSwgXCJfYmxhbmtcIik7XHJcbiAgICB9IGNhdGNoIChlcnJvcikgeyB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXRjaCBzdWJtaXQgZXZlbnQgZm9yIHZhbGlkYXRpb25zIGV4aXN0c1xyXG4gICAqIEBwYXJhbSBjaGFuZ2UgXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICB0aGlzLmNvdW50U3VibWl0KytcclxuICB9XHJcbiAgLy9vblN1Ym1pdChmb3JtOiBOZ0Zvcm0pIHtcclxuICBvblN1Ym1pdCgpIHtcclxuICAgIGxldCBmb3JtID0gdGhpcy5mb3JtRHluYW1pYztcclxuICAgIHRoaXMud2F0Y2hWYWxpZCA9IHRydWU7XHJcbiAgICB0aGlzLndhdGNoUmVxdWlyZWQgPSB0cnVlO1xyXG5cclxuICAgIGlmIChmb3JtLnZhbGlkKSB7XHJcbiAgICAgIGlmICghdGhpcy52YWxpZFJ1bGVzRmllbGRzKGZvcm0uY29udHJvbHNbXCJudW1lcm9Eb2NcIl0udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1tcImNlbHVsYXJcIl0udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1tcImVtYWlsXCJdLnZhbHVlKSlcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudmFsaWRNaW5sZW5naHRBbGxRdWVzdGlvbnMoZm9ybS52YWx1ZSkgJiYgdGhpcy52YWxpZE1heExlbmd0aEFsbFF1ZXN0aW9ucyhmb3JtLnZhbHVlKSAmJiBmb3JtLnZhbGlkKSB7XHJcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtLnVybFNlbmQgIT0gXCJcIiAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PGFueT4odGhpcy5kYXRhRm9ybS51cmxTZW5kLCBmb3JtLnZhbHVlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHRoaXMucmVzcG9uc2UuZW1pdChyZXNwKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9ybS52YWxpZCAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3VtbWl0LmVtaXQoZm9ybS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZFBhcmFtQm9vbGVhbihwYXJhbXM6IGFueSwgaWRQYXJhbTogbnVtYmVyKSB7XHJcbiAgICBsZXQgc2hvd0Rlc2NyaXB0aW9uUGFyYW0gPSBwYXJhbXMuZmluZCgoeCkgPT4geC5pZCA9PSBpZFBhcmFtKTtcclxuICAgIHJldHVybiBzaG93RGVzY3JpcHRpb25QYXJhbSAhPSBudWxsICYmIHNob3dEZXNjcmlwdGlvblBhcmFtLnZhbHVlID09IFwidHJ1ZVwiO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRSdWxlc0ZpZWxkcyhudW1lcm9Eb2M6IFN0cmluZywgbnVtZXJvQ2VsOiBTdHJpbmcsIGVtYWlsOiBTdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIFZhbGlkYWNpb25lcyBwYXJhIGNlbHVsYXIgZW4gY2FzbyBkZSBpbmRpY2F0aXZvIGVuIENvbG9tYmlhXHJcbiAgICBsZXQgY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGFyY2VsdWxhclwiKTtcclxuICAgIGxldCBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNoYXJudW1lcm9Eb2NcIik7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSBcIis1N1wiIHx8IHRoaXMuaW5kaWNhdGl2byA9PSBcIjU3XCIpIHtcclxuICAgICAgbGV0IHN0cmluZ09yZGVuYWRvID0gdGhpcy5vcmRlclN0cmluZyhudW1lcm9Eb2MpO1xyXG4gICAgICBpZiAodGhpcy5uYW1lQ29tcGFueS50b1VwcGVyQ2FzZSgpICE9PSAnQ0xBUk8nKSB7Ly9jbGFybyBhY2VwdGEgbnJvIGNvbnNlY3V0aXZvc1xyXG4gICAgICAgIGlmIChudW1lcm9Eb2MgPT0gc3RyaW5nT3JkZW5hZG8pIHtcclxuICAgICAgICAgIGRvYy5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIGRvYy50ZXh0Q29udGVudCA9IFwiRWwgbnVtZXJvIGRvY3VtZW50byBObyBkZWJlIGNvbnRlbmVyIGNhcmFjdGVyZXMgY29uc2VjdXRpdm9zXCI7XHJcbiAgICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBudW1lcm8gZG9jdW1lbnRvIE5vIGRlYmUgY29udGVuZXIgY2FyYWN0ZXJlcyBjb25zZWN1dGl2b3NcIjtcclxuICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSBcIjNcIikge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDNcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLypcclxuICAgICAgaWYgKHBhcnNlSW50KG51bWVyb0NlbC5zdWJzdHJpbmcoMCwgMykpID4gMzUwKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmVmaWpvIGRlbCBjZWx1bGFyIG5vIGRlYmUgc2VyIG1heW9yIGEgMzUwXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgKi9cclxuICAgICAgLy9FbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xyXG4gICAgICBsZXQgbGlzdG51bWJlciA9IG51bWVyb0RvYy5zdWJzdHJpbmcoMCwgMSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBudW1lcm9Eb2MubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgbGlzdG51bWJlciA9IGxpc3RudW1iZXIgKyBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobnVtZXJvRG9jID09IGxpc3RudW1iZXIpIHtcclxuICAgICAgICBkb2Muc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBkb2MucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGRvYy50ZXh0Q29udGVudCA9IFwiQ2FyYWN0ZXJlcyBudW3DqXJpY29zIG5vIHNlIHB1ZWRlbiByZXBldGlyc2UgZGUgbWFuZXJhIGNvbnRpbnVhIFwiO1xyXG4gICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJDYXJhY3RlcmVzIG51bcOpcmljb3Mgbm8gc2UgcHVlZGVuIHJlcGV0aXJzZSBkZSBtYW5lcmEgY29udGludWEgXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlTnVtZXJvRG9jdW1lbnRvKG51bWVyb0RvYykpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlQ2VsdWxhcihudW1lcm9DZWwpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgLy8gRW4gY2FzbyBkZSBxdWUgZWwgbsO6bWVybyBzZSByZXBpdGEsIGVqZW1wbG8gMzMzMzMzMzNcclxuICAgICAgbGV0IGFycmF5UGhvbmVSZXBlYXQgPSBBcnJheS5mcm9tKFN0cmluZyhudW1lcm9DZWwpLCBOdW1iZXIpO1xyXG4gICAgICBsZXQgYXJyYXlQaG9uZU91dFJlcGVhdCA9IFsuLi5uZXcgU2V0KGFycmF5UGhvbmVSZXBlYXQpXTtcclxuICAgICAgaWYgKGFycmF5UGhvbmVPdXRSZXBlYXQubGVuZ3RoID09IDEpIHtcclxuICAgICAgICBjZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcclxuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgIGNlbC50ZXh0Q29udGVudCA9IFwiRWwgbsO6bWVybyBxdWUgaW5ncmVzYSBubyBlcyB2YWxpZG9cIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBuw7ptZXJvIHF1ZSBpbmdyZXNhIG5vIGVzIHZhbGlkb1wiO1xyXG4gICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSBcIis1OTNcIiB8fCB0aGlzLmluZGljYXRpdm8gPT0gXCI1OTNcIikge1xyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSBcIjlcIikge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDlcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDlcIjtcclxuICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy9zZSB2YWxpZGFuIGxvcyBjYW1wb3MgcG9yIHRpcG8gZGUgY2FtcG8geSBubyBwb3IgdmFsdWVcclxuICAgIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5mb3JFYWNoKGZvcm1RdWVzdGlvbiA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCkge1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIHZhbE9rID0gdGhpcy5lbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdmFsT2s7XHJcbiAgfVxyXG5cclxuICBvcmRlclN0cmluZyh2YWx1ZTogU3RyaW5nKSB7XHJcbiAgICBsZXQgYXJyYXlOdW1iZXIgPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgYXJyYXlOdW1iZXIucHVzaChwYXJzZUludCh2YWx1ZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpKTtcclxuICAgIH1cclxuICAgIC8vb3JkZW5hIGVsIGFycmF5XHJcbiAgICBhcnJheU51bWJlci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgIHJldHVybiBhIC0gYjtcclxuICAgIH0pO1xyXG4gICAgbGV0IG51bWJlck9yZGVyID0gXCJcIjtcclxuICAgIG51bWJlck9yZGVyID0gYXJyYXlOdW1iZXJbMF07XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgYXJyYXlOdW1iZXIubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIG51bWJlck9yZGVyID0gbnVtYmVyT3JkZXIgKyAoYXJyYXlOdW1iZXJbMF0gKyBpbmRleCkudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudW1iZXJPcmRlcjtcclxuICB9XHJcblxyXG4gIHZhbGlkTWlubGVuZ2h0QWxsUXVlc3Rpb25zKGZvcm06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucykge1xyXG4gICAgICBpZiAoaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMSB8fCBpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSAyKSB7XHJcbiAgICAgICAgbGV0IG1pbkxlbmd0aCA9IHBhcnNlSW50KGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoKTtcclxuICAgICAgICBsZXQgZm9ybVZhbHVlTGVuZ3RoID0gcGFyc2VJbnQoZm9ybVtpdGVtLnF1ZXN0aW9uLnZhbHVlXS50b1N0cmluZygpLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKG1pbkxlbmd0aCA+IDAgJiYgZm9ybVZhbHVlTGVuZ3RoICE9IG1pbkxlbmd0aCAmJiBmb3JtVmFsdWVMZW5ndGggPCBtaW5MZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1heExlbmd0aEFsbFF1ZXN0aW9ucyhmb3JtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xyXG4gICAgICAgIGxldCBtYXhMZW5ndGggPSBwYXJzZUludChpdGVtLnF1ZXN0aW9uLm1heExlbmd0aCk7XHJcbiAgICAgICAgbGV0IGZvcm1WYWx1ZUxlbmd0aCA9IHBhcnNlSW50KGZvcm1baXRlbS5xdWVzdGlvbi52YWx1ZV0udG9TdHJpbmcoKS5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChtYXhMZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtYXhMZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoID4gbWF4TGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRSZXF1aXJlZChmb3JtOiBOZ0Zvcm0sIHF1ZXN0aW9uKTogQm9vbGVhbiB7XHJcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHF1ZXN0aW9uICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXSAhPSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgIGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLmVycm9ycyAhPSBudWxsICYmXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5lcnJvcnMucmVxdWlyZWRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNaW5MZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1pbkxlbmd0aCA+IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvTG9jYWxlU3RyaW5nKCkubGVuZ3RoICYmIHF1ZXN0aW9uLm1pbkxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5tYXhMZW5ndGggKyAxIDw9IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwuL2csICcnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5oYXNFcnJvcignZXJyb3JNYXhMZW5ndGgnKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnNldEVycm9ycyh7ICdlcnJvck1heExlbmd0aCc6IHRydWUgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7IH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHR5Y1NlbGVjdGlvbihldmVudCkge1xyXG4gICAgIHRoaXMudmlld0F1dGhEYXRhLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb3BlbkxhYmVsVXJsKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgbGV0IHR5YyA9IDxIVE1MSW5wdXRFbGVtZW50PmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hlY2tcIiArIHF1ZXN0aW9uLmlkKTtcclxuICAgIHR5Yy5zdHlsZS5jb2xvciA9IFwiI0EzQUQzMlwiO1xyXG4gICAgd2luZG93Lm9wZW4ocXVlc3Rpb24udXJsbGFiZWwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsbEtleXByZXNzKCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBlbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKFwiaGlkZGVuXCIsIFwidHJ1ZVwiKTtcclxuICAgICAgbGV0IGVtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCk7XHJcbiAgICAgIGxldCBlbWFpbCA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlcXVpcmVkICYmIChlbWFpbCA9PSBcIlwiIHx8IGVtYWlsID09IHVuZGVmaW5lZCB8fCBlbWFpbCA9PSBudWxsKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIkVsIGNvcnJlY28gZWzDqWN0cm9uaWNvIGVzIHJlcXVlcmlkb1wiO1xyXG4gICAgICAgICAgZW1sLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xyXG4gICAgICAgICAgZW1sLnRleHRDb250ZW50ID0gXCJEZWJlIHNlciBtw61uaW1vIGRlIFwiICsgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLm1pbkxlbmd0aCArIFwiIGNhcmFjdGVyZXNcIjtcclxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbGlkTWF4TGVuZ3RoKHVuZGVmaW5lZCwgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIkRlYmUgc2VyIG1heGltbyBkZSBcIiArIGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5tYXhMZW5ndGggKyBcIiBjYXJhY3RlcmVzXCI7XHJcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtUXVlc3Rpb24ucXVlc3Rpb24uaWQpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhlbWFpbCkubWF0Y2gocmVnZXhUeXBlLmVtYWlsLmV4cCk7XHJcbiAgICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIlR1IGVtYWlsIGVzIGludmFsaWRvXCI7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgIH1cclxuICAgIHJldHVybiB2YWxPaztcclxuICB9XHJcblxyXG4gIGNhbGVuZGFyUnVsZXNWYWxpZGF0ZShmb3JtUXVlc3Rpb24pIHtcclxuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKS5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xyXG4gICAgICBsZXQgZWNhbGVuZGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgLy9zZSB2YWxpZGEgcXVlIG5vIHNlYSBudWxsIHNpIGVzIHJlcXVlcmlkb1xyXG4gICAgICBsZXQgZGF0ZSA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGRhdGUgPT0gXCJcIiB8fCBkYXRlID09IHVuZGVmaW5lZCB8fCBkYXRlID09IG51bGwpKSB7XHJcbiAgICAgICAgZWNhbGVuZGFyLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgZWNhbGVuZGFyLnRleHRDb250ZW50ID0gXCJMYSBmZWNoYSBlcyByZXF1ZXJpZGFcIjtcclxuICAgICAgICBlY2FsZW5kYXIucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlTm90U3BhY2UoZXZlbnQpIHtcclxuICAgIGlmIChldmVudC5jaGFyQ29kZSA9PSAzMikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbiAgdmFsaWRhdGVOdW1lcm9Eb2N1bWVudG8obnVtZXJvRG9jOiBTdHJpbmcpIHtcclxuICAgIGlmICghbnVtZXJvRG9jLm1hdGNoKFwiXlswLTldKiRcIikpIHtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSokJyldKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wibnVtZXJvRG9jXCJdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcIm51bWVyb0RvY1wiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMucGF0dGVybk5vdFZhbGlkRGN0byA9IHRydWU7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMucGF0dGVybk5vdFZhbGlkRGN0byA9IGZhbHNlO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIHZhbGlkYXRlQ2VsdWxhcihudW1lcm9DZWw6IFN0cmluZykge1xyXG4gICAgaWYgKCFudW1lcm9DZWwubWF0Y2goXCJeWzAtOV0qJFwiKSkge1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnBhdHRlcm4oJ15bMC05XSokJyldKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIHRoaXMucGF0dGVybk5vdFZhbGlkQ2VsID0gdHJ1ZTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wYXR0ZXJuTm90VmFsaWRDZWwgPSBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gXHJcblxyXG4gIG9ua2V5cHJlc3MoZXZlbnQpXHJcbiAge1xyXG4gICAgcmV0dXJuIChldmVudC5jaGFyQ29kZSA9PSAwKSA/IG51bGwgOiBldmVudC5jaGFyQ29kZSA+PSA0OCAmJiBldmVudC5jaGFyQ29kZSA8PSA1N1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VTdGVwKHN0ZXA6IFN0ZXAsIG5leHRTdGVwOiBTdGVwLCB2YWx1ZSkge1xyXG4gICAgaWYgKG5leHRTdGVwICYmIG5leHRTdGVwLnN0ZXBPcmRlciAhPSAxKSB7XHJcbiAgICAgIHRoaXMucmVzZXRGaWVsZChzdGVwKTtcclxuICAgICAgbmV4dFN0ZXAudmlld0RhdGEgPSBbXTtcclxuICAgICAgbmV4dFN0ZXAudmlld0RhdGEgPSBuZXh0U3RlcC5zdGVwRGF0YS5maWx0ZXIoeCA9PiB4LnJlbGF0aW9uYWxJZHMuaW5jbHVkZXMoTnVtYmVyKHZhbHVlKSkpO1xyXG4gICAgICBcclxuICAgIH1cclxuICB9ICBcclxuICByZXNldEZpZWxkKHN0ZXBJbiA6IFN0ZXApIHtcclxuICAgIHRoaXMuc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcclxuICAgICAgaWYgKHN0ZXAuc3RlcE9yZGVyID4gc3RlcEluLnN0ZXBPcmRlcikge1xyXG4gICAgICAgIHN0ZXAudmlld0RhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgc3RlcC52YWx1ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
1
+ import * as tslib_1 from "tslib";
2
+ import { Component, Injectable, Input, ViewChild, Output, EventEmitter } from '@angular/core';
3
+ import { FormGroup, FormControl, Validators } from '@angular/forms';
4
+ import { HttpClient } from '@angular/common/http';
5
+ // import moment from 'moment';
6
+ import { NgbDateAdapter, NgbDateParserFormatter, NgbDatepickerI18n } from '@ng-bootstrap/ng-bootstrap';
7
+ import * as moment_ from 'moment';
8
+ import { regexType } from '../../utils/regex';
9
+ import { CommonDataService } from '../../services/data.service';
10
+ const moment = moment_;
11
+ /**
12
+ * This Service handles how the date is represented in scripts i.e. ngModel.
13
+ */
14
+ let CustomAdapter = class CustomAdapter extends NgbDateAdapter {
15
+ /**
16
+ * This Service handles how the date is represented in scripts i.e. ngModel.
17
+ */
18
+ constructor() {
19
+ super(...arguments);
20
+ this.DELIMITER = '/';
21
+ }
22
+ fromModel(value) {
23
+ if (value) {
24
+ const date = value.split(this.DELIMITER);
25
+ return {
26
+ day: parseInt(date[0], 10),
27
+ month: parseInt(date[1], 10),
28
+ year: parseInt(date[2], 10)
29
+ };
30
+ }
31
+ return null;
32
+ }
33
+ toModel(date) {
34
+ return date ? (date.day < 10 ? 0 + date.day : date.day) + this.DELIMITER + (date.month < 10 ? 0 + date.month : date.month) + this.DELIMITER + date.year : '';
35
+ }
36
+ };
37
+ CustomAdapter = tslib_1.__decorate([
38
+ Injectable()
39
+ ], CustomAdapter);
40
+ export { CustomAdapter };
41
+ /**
42
+ * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
43
+ */
44
+ let CustomDateParserFormatter = class CustomDateParserFormatter extends NgbDateParserFormatter {
45
+ /**
46
+ * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
47
+ */
48
+ constructor() {
49
+ super(...arguments);
50
+ this.DELIMITER = '/';
51
+ }
52
+ parse(value) {
53
+ if (value) {
54
+ const date = value.split(this.DELIMITER);
55
+ return {
56
+ day: parseInt(date[0], 10),
57
+ month: parseInt(date[1], 10),
58
+ year: parseInt(date[2], 10)
59
+ };
60
+ }
61
+ return null;
62
+ }
63
+ format(date) {
64
+ return date ? (date.day < 10 ? '0' + date.day : date.day) + this.DELIMITER + (date.month < 10 ? '0' + date.month : date.month) + this.DELIMITER + date.year : '';
65
+ }
66
+ };
67
+ CustomDateParserFormatter = tslib_1.__decorate([
68
+ Injectable()
69
+ ], CustomDateParserFormatter);
70
+ export { CustomDateParserFormatter };
71
+ const I18N_VALUES = {
72
+ 'es': {
73
+ weekdays: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],
74
+ months: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
75
+ weekLabel: 'sem'
76
+ }
77
+ // other languages you would support
78
+ };
79
+ let I18n = class I18n {
80
+ constructor() {
81
+ this.language = 'es';
82
+ }
83
+ };
84
+ I18n = tslib_1.__decorate([
85
+ Injectable()
86
+ ], I18n);
87
+ export { I18n };
88
+ // Define custom service providing the months and weekdays translations
89
+ let CustomDatepickerI18n = class CustomDatepickerI18n extends NgbDatepickerI18n {
90
+ constructor(_i18n) {
91
+ super();
92
+ this._i18n = _i18n;
93
+ }
94
+ getWeekdayLabel(weekday) {
95
+ return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
96
+ }
97
+ getWeekLabel() {
98
+ return I18N_VALUES[this._i18n.language].weekLabel;
99
+ }
100
+ getMonthShortName(month) {
101
+ return I18N_VALUES[this._i18n.language].months[month - 1];
102
+ }
103
+ getMonthFullName(month) {
104
+ return this.getMonthShortName(month);
105
+ }
106
+ getDayAriaLabel(date) {
107
+ return `${date.day}-${date.month}-${date.year}`;
108
+ }
109
+ getWeekdayShortName(weekday) {
110
+ return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
111
+ }
112
+ ;
113
+ };
114
+ CustomDatepickerI18n.ctorParameters = () => [
115
+ { type: I18n }
116
+ ];
117
+ CustomDatepickerI18n = tslib_1.__decorate([
118
+ Injectable()
119
+ ], CustomDatepickerI18n);
120
+ export { CustomDatepickerI18n };
121
+ let FormAuroraComponent = class FormAuroraComponent {
122
+ constructor(data, http) {
123
+ this.data = data;
124
+ this.http = http;
125
+ this.response = new EventEmitter();
126
+ this.summit = new EventEmitter();
127
+ this.viewAuthData = new EventEmitter();
128
+ this.tipodocNumDoc = false;
129
+ this.countSubmit = 0;
130
+ this.watchValid = false;
131
+ this.watchRequired = false;
132
+ this.captchaValid = false;
133
+ this.today = moment(new Date());
134
+ this.maxYear = this.today.year();
135
+ this.minYear = this.today.year() - 82;
136
+ this.minDate = this.minYear.toString() + '-' + this.today.month().toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.minYear, month: this.today.month(), day: this.today.date()};
137
+ this.maxDate = this.maxYear.toString() + '-' + (this.today.month() + 1).toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.maxYear, month: this.today.month() + 1, day: this.today.date()};
138
+ this.recharge = false;
139
+ this.indicativo = "57";
140
+ this.defaultDocType = "Cédula de ciudadanía";
141
+ this.patternNotValidDcto = false;
142
+ this.patternNotValidCel = false;
143
+ this.range = new FormGroup({
144
+ start: new FormControl(),
145
+ end: new FormControl(),
146
+ });
147
+ }
148
+ ngOnInit() {
149
+ this.minDate = new Date(this.minDate).toISOString().split('T')[0];
150
+ setTimeout(() => {
151
+ this.startComponent();
152
+ }, 2000);
153
+ }
154
+ startComponent() {
155
+ //ordena los campos
156
+ if (this.dataForm != null && this.dataForm.formQuestions != undefined) {
157
+ //Same row fields
158
+ this.tipodocNumDoc = (this.dataForm.formQuestions.some(question => question.question.value === "tipoDoc") && this.dataForm.formQuestions.some(question => question.question.value === "numeroDoc")) ? true : false;
159
+ this.dataForm.formQuestions = this.dataForm.formQuestions.sort(function (a, b) {
160
+ return a.order - b.order;
161
+ });
162
+ let existcaptcha = this.dataForm.formQuestions.filter((item) => item.question.questionType.id == 6);
163
+ if (existcaptcha.length == 0) {
164
+ this.captchaValid = true;
165
+ }
166
+ for (const item of this.dataForm.formQuestions) {
167
+ if (item.question.maxlength == null || item.question.maxlength == undefined || item.question.maxlength == 0) {
168
+ item.question.maxlength = 524288; //defaultvalue
169
+ }
170
+ if (item.question.minLength == null || item.question.minLength == undefined) {
171
+ item.question.minLength = 0;
172
+ }
173
+ this.dataReloadForm.forEach(element => {
174
+ this.filldata = element;
175
+ if ((item.question.questionType.id === 2 || item.question.questionType.id === 1 ||
176
+ item.question.questionType.id === 3) && (this.filldata.data !== null &&
177
+ this.filldata.data !== undefined) && item.question.id === this.filldata.id) {
178
+ item.question.registred = this.filldata.data;
179
+ }
180
+ });
181
+ if (item.question.registred == null || item.question.minLength == undefined) {
182
+ item.question.registred = '';
183
+ }
184
+ }
185
+ }
186
+ }
187
+ resolvedCaptcha(captchaResponse) {
188
+ this.captchaValid = true;
189
+ if (!this.formDynamic.form.value.captcha) {
190
+ this.formDynamic.controls.captcha.setValue(captchaResponse);
191
+ this.formDynamic.form.value.captcha = captchaResponse;
192
+ document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
193
+ }
194
+ }
195
+ //Forms
196
+ //Metodo para evitar el render de los items del for
197
+ trackByIndex(index, obj) {
198
+ return index;
199
+ }
200
+ onChangeValidPatter(event, question) {
201
+ if (question.pattern != undefined) {
202
+ let valid = true;
203
+ let keyvalid = [8, 32, 37, 38, 39, 40, 46, 9];
204
+ //diferente de Backpsace
205
+ //se deja catch por error no controlable en otro tiempo de ejecucion
206
+ try {
207
+ if (!keyvalid.includes(event.keyCode)) {
208
+ const regex = new RegExp(question.pattern);
209
+ valid = regex.test(event.key);
210
+ }
211
+ }
212
+ catch (error) { }
213
+ return valid;
214
+ }
215
+ if (question.questionType !== undefined) {
216
+ if (question.questionType.description === 'Number') {
217
+ if (question.value === 'numeroDoc') {
218
+ this.validateNumeroDocumento(this.formDynamic.controls["numeroDoc"].value.toString());
219
+ }
220
+ else if (question.value === 'celular') {
221
+ this.validateCelular(this.formDynamic.controls["celular"].value.toString());
222
+ }
223
+ }
224
+ }
225
+ document.getElementById("char" + question.value).setAttribute("hidden", "true");
226
+ //if temporal mientras se migran todos los tipos de campos al foreach
227
+ if (question.questionType.id != 11 && question.questionType.id != 7) {
228
+ if (this.validMinLength(this.formDynamic, question)) {
229
+ document.getElementById(question.value).style.borderColor = "#FF0000";
230
+ document.getElementById("ml" + question.value).removeAttribute("hidden");
231
+ }
232
+ else {
233
+ document.getElementById(question.value).style.borderColor = "#E4E4E4";
234
+ document.getElementById("ml" + question.value).setAttribute("hidden", "true");
235
+ }
236
+ if (this.validMaxLength(this.formDynamic, question)) {
237
+ document.getElementById(question.value).style.borderColor = "#FF0000";
238
+ document.getElementById("mxl" + question.value).removeAttribute("hidden");
239
+ }
240
+ else {
241
+ document.getElementById(question.value).style.borderColor = "#E4E4E4";
242
+ document.getElementById("mxl" + question.value).setAttribute("hidden", "true");
243
+ }
244
+ }
245
+ this.dataForm.formQuestions.forEach(formQuestion => {
246
+ switch (formQuestion.question.questionType.id) {
247
+ //se valida campo de tipo calendario
248
+ case 7:
249
+ if (question.questionType.id == 7)
250
+ this.calendarRulesValidate(formQuestion);
251
+ break;
252
+ //se valida campo de tipo email
253
+ case 11:
254
+ if (question.questionType.id == 11)
255
+ this.emailRulesValidate(formQuestion);
256
+ break;
257
+ }
258
+ });
259
+ document.getElementById("btnIng").style.opacity = !this.formDynamic.valid ? "0.65" : "1";
260
+ }
261
+ validOnlyText(event) {
262
+ let regex = /^[a-zA-Z\u00C0-\u017F]+$/g;
263
+ if (event.charCode == 32) {
264
+ return true;
265
+ }
266
+ let valid = regex.test(event.key);
267
+ return valid;
268
+ }
269
+ validDate(event) {
270
+ /*let pattern = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20)[0-9]{2}/;
271
+ const regex = new RegExp(pattern);
272
+ valid = regex.test(event.key);
273
+ */
274
+ const matches = String(event.key).match(regexType.date.exp);
275
+ let valid = true;
276
+ if (matches === null)
277
+ valid = false;
278
+ // alert(valid);
279
+ return valid;
280
+ }
281
+ onChangeValidDate(event) {
282
+ //let pattern = /(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12][0-9]|3[01])\/(?:19|20)[0-9]{2}/;
283
+ let dateN = /[0-9]|\//;
284
+ let valid = true;
285
+ const regex = new RegExp(dateN);
286
+ valid = regex.test(event.key);
287
+ return valid;
288
+ }
289
+ rediretoutside(event, question) {
290
+ //se deja catch por error no controlable en otro tiempo de ejecucion
291
+ try {
292
+ event.preventDefault();
293
+ window.open(question.value, "_blank");
294
+ }
295
+ catch (error) { }
296
+ }
297
+ /**
298
+ * Dispatch submit event for validations exists
299
+ * @param change
300
+ */
301
+ ngOnChanges(change) {
302
+ this.countSubmit++;
303
+ }
304
+ //onSubmit(form: NgForm) {
305
+ onSubmit() {
306
+ let form = this.formDynamic;
307
+ this.watchValid = true;
308
+ this.watchRequired = true;
309
+ if (form.valid) {
310
+ if (!this.validRulesFields(form.controls["numeroDoc"].value.toString(), form.controls["celular"].value.toString(), form.controls["email"].value))
311
+ return false;
312
+ }
313
+ if (this.validMinlenghtAllQuestions(form.value) && this.validMaxLengthAllQuestions(form.value) && form.valid) {
314
+ if (this.dataForm.urlSend != "" && this.captchaValid) {
315
+ this.http.post(this.dataForm.urlSend, form.value).subscribe((resp) => this.response.emit(resp));
316
+ }
317
+ else if (form.valid && this.captchaValid) {
318
+ this.summit.emit(form.value);
319
+ }
320
+ }
321
+ }
322
+ findParamBoolean(params, idParam) {
323
+ let showDescriptionParam = params.find((x) => x.id == idParam);
324
+ return showDescriptionParam != null && showDescriptionParam.value == "true";
325
+ }
326
+ validRulesFields(numeroDoc, numeroCel, email) {
327
+ // Validaciones para celular en caso de indicativo en Colombia
328
+ let cel = document.getElementById("charcelular");
329
+ let doc = document.getElementById("charnumeroDoc");
330
+ let valOk = true;
331
+ if (this.indicativo == "+57" || this.indicativo == "57") {
332
+ let stringOrdenado = this.orderString(numeroDoc);
333
+ if (this.nameCompany.toUpperCase() !== 'CLARO') { //claro acepta nro consecutivos
334
+ if (numeroDoc == stringOrdenado) {
335
+ doc.style.borderColor = "#FF0000";
336
+ doc.removeAttribute("hidden");
337
+ doc.textContent = "El numero documento No debe contener caracteres consecutivos";
338
+ valOk = false;
339
+ //this.msgErrorCampo = "El numero documento No debe contener caracteres consecutivos";
340
+ //return false;
341
+ }
342
+ }
343
+ if (numeroCel.substring(0, 1) != "3") {
344
+ cel.style.borderColor = "#FF0000";
345
+ cel.removeAttribute("hidden");
346
+ cel.textContent = "El primer carácter del celular debe ser 3";
347
+ valOk = false;
348
+ //this.msgErrorCampo = "El primer carácter del celular debe ser 3";
349
+ //return false;
350
+ }
351
+ /*
352
+ if (parseInt(numeroCel.substring(0, 3)) > 350) {
353
+ cel.style.borderColor = "#FF0000";
354
+ cel.removeAttribute("hidden");
355
+ cel.textContent = "El prefijo del celular no debe ser mayor a 350";
356
+ valOk = false;
357
+ //this.msgErrorCampo = "El prefijo del celular no debe ser mayor a 350";
358
+ //return false;
359
+ }
360
+ */
361
+ //En caso de que el número se repita, ejemplo 33333333
362
+ let listnumber = numeroDoc.substring(0, 1);
363
+ for (let index = 1; index < numeroDoc.length; index++) {
364
+ listnumber = listnumber + numeroDoc.substring(0, 1);
365
+ }
366
+ if (numeroDoc == listnumber) {
367
+ doc.style.borderColor = "#FF0000";
368
+ doc.removeAttribute("hidden");
369
+ doc.textContent = "Caracteres numéricos no se pueden repetirse de manera continua ";
370
+ valOk = false;
371
+ //this.msgErrorCampo = "Caracteres numéricos no se pueden repetirse de manera continua ";
372
+ //return false;
373
+ }
374
+ if (!this.validateNumeroDocumento(numeroDoc)) {
375
+ return false;
376
+ }
377
+ if (!this.validateCelular(numeroCel)) {
378
+ return false;
379
+ }
380
+ // En caso de que el número se repita, ejemplo 33333333
381
+ let arrayPhoneRepeat = Array.from(String(numeroCel), Number);
382
+ let arrayPhoneOutRepeat = [...new Set(arrayPhoneRepeat)];
383
+ if (arrayPhoneOutRepeat.length == 1) {
384
+ cel.style.borderColor = "#FF0000";
385
+ cel.removeAttribute("hidden");
386
+ cel.textContent = "El número que ingresa no es valido";
387
+ valOk = false;
388
+ //this.msgErrorCampo = "El número que ingresa no es valido";
389
+ //return false;
390
+ }
391
+ }
392
+ else if (this.indicativo == "+593" || this.indicativo == "593") {
393
+ if (numeroCel.substring(0, 1) != "9") {
394
+ cel.style.borderColor = "#FF0000";
395
+ cel.removeAttribute("hidden");
396
+ cel.textContent = "El primer carácter del celular debe ser 9";
397
+ valOk = false;
398
+ //this.msgErrorCampo = "El primer carácter del celular debe ser 9";
399
+ //return false;
400
+ }
401
+ }
402
+ //se validan los campos por tipo de campo y no por value
403
+ this.dataForm.formQuestions.forEach(formQuestion => {
404
+ switch (formQuestion.question.questionType.id) {
405
+ //se valida campo de tipo email
406
+ case 11:
407
+ valOk = this.emailRulesValidate(formQuestion);
408
+ break;
409
+ }
410
+ });
411
+ return valOk;
412
+ }
413
+ orderString(value) {
414
+ let arrayNumber = [];
415
+ for (let index = 0; index < value.length; index++) {
416
+ arrayNumber.push(parseInt(value.substring(index, index + 1)));
417
+ }
418
+ //ordena el array
419
+ arrayNumber.sort(function (a, b) {
420
+ return a - b;
421
+ });
422
+ let numberOrder = "";
423
+ numberOrder = arrayNumber[0];
424
+ for (let index = 1; index < arrayNumber.length; index++) {
425
+ numberOrder = numberOrder + (arrayNumber[0] + index).toString();
426
+ }
427
+ return numberOrder;
428
+ }
429
+ validMinlenghtAllQuestions(form) {
430
+ for (const item of this.dataForm.formQuestions) {
431
+ if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
432
+ let minLength = parseInt(item.question.minLength);
433
+ let formValueLength = parseInt(form[item.question.value].toString().length);
434
+ if (minLength > 0 && formValueLength != minLength && formValueLength < minLength)
435
+ return false;
436
+ }
437
+ }
438
+ return true;
439
+ }
440
+ validMaxLengthAllQuestions(form) {
441
+ for (const item of this.dataForm.formQuestions) {
442
+ if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
443
+ let maxLength = parseInt(item.question.maxLength);
444
+ let formValueLength = parseInt(form[item.question.value].toString().length);
445
+ if (maxLength > 0 && formValueLength != maxLength && formValueLength > maxLength)
446
+ return false;
447
+ }
448
+ }
449
+ return true;
450
+ }
451
+ validRequired(form, question) {
452
+ //se deja catch por error no controlable en otro tiempo de ejecucion
453
+ try {
454
+ if (question != undefined && question.value != undefined) {
455
+ if (form.controls[question.value] != undefined &&
456
+ form.controls[question.value].errors != null &&
457
+ form.controls[question.value].errors.required) {
458
+ return true;
459
+ }
460
+ }
461
+ }
462
+ catch (error) { }
463
+ return false;
464
+ }
465
+ validMinLength(form, question) {
466
+ //se deja catch por error no controlable en otro tiempo de ejecucion
467
+ try {
468
+ if (question != undefined && question.value != undefined) {
469
+ if (question.minLength > form.controls[question.value].value.toLocaleString().length && question.minLength > 0) {
470
+ return true;
471
+ }
472
+ }
473
+ }
474
+ catch (error) { }
475
+ return false;
476
+ }
477
+ validMaxLength(form, question) {
478
+ //se deja catch por error no controlable en otro tiempo de ejecucion
479
+ try {
480
+ if (question != undefined && question.value != undefined) {
481
+ if (question.maxLength > 0) {
482
+ if (question.maxLength + 1 <= form.controls[question.value].value.toString().replace(/\./g, '').length) {
483
+ if (!this.formDynamic.controls[question.value].hasError('errorMaxLength')) {
484
+ this.formDynamic.controls[question.value].setErrors({ 'errorMaxLength': true });
485
+ }
486
+ return true;
487
+ }
488
+ }
489
+ }
490
+ }
491
+ catch (error) { }
492
+ return false;
493
+ }
494
+ tycSelection(event) {
495
+ this.viewAuthData.emit(event);
496
+ }
497
+ openLabelUrl(event, question) {
498
+ event.preventDefault();
499
+ let tyc = document.getElementById("check" + question.id);
500
+ tyc.style.color = "#A3AD32";
501
+ window.open(question.urllabel, "_blank");
502
+ }
503
+ cancellKeypress() {
504
+ return false;
505
+ }
506
+ emailRulesValidate(formQuestion) {
507
+ let valOk = true;
508
+ try {
509
+ let hasError = false;
510
+ document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
511
+ let eml = document.getElementById(formQuestion.question.id);
512
+ let email = formQuestion.question.registred;
513
+ if (!hasError) {
514
+ if (formQuestion.question.required && (email == "" || email == undefined || email == null)) {
515
+ eml.style.borderColor = "#FF0000";
516
+ eml.textContent = "El correco eléctronico es requerido";
517
+ eml.removeAttribute("hidden");
518
+ valOk = false;
519
+ hasError = true;
520
+ }
521
+ }
522
+ if (!hasError) {
523
+ if (this.validMinLength(undefined, formQuestion.question)) {
524
+ eml.style.borderColor = "#FF0000";
525
+ eml.textContent = "Debe ser mínimo de " + formQuestion.question.minLength + " caracteres";
526
+ document.getElementById(formQuestion.question.id).removeAttribute("hidden");
527
+ valOk = false;
528
+ hasError = true;
529
+ }
530
+ }
531
+ if (!hasError) {
532
+ if (this.validMaxLength(undefined, formQuestion.question)) {
533
+ eml.style.borderColor = "#FF0000";
534
+ eml.textContent = "Debe ser maximo de " + formQuestion.question.maxLength + " caracteres";
535
+ document.getElementById(formQuestion.question.id).removeAttribute("hidden");
536
+ valOk = false;
537
+ hasError = true;
538
+ }
539
+ }
540
+ if (!hasError) {
541
+ const matches = String(email).match(regexType.email.exp);
542
+ if (matches == null) {
543
+ eml.style.borderColor = "#FF0000";
544
+ eml.textContent = "Tu email es invalido";
545
+ eml.removeAttribute("hidden");
546
+ valOk = false;
547
+ hasError = true;
548
+ }
549
+ }
550
+ }
551
+ catch (error) {
552
+ }
553
+ return valOk;
554
+ }
555
+ calendarRulesValidate(formQuestion) {
556
+ let hasError = false;
557
+ try {
558
+ document.getElementById(formQuestion.question.id).setAttribute("hidden", "true");
559
+ let ecalendar = document.getElementById(formQuestion.question.id);
560
+ //se valida que no sea null si es requerido
561
+ let date = formQuestion.question.registred;
562
+ if (formQuestion.question.required && (date == "" || date == undefined || date == null)) {
563
+ ecalendar.style.borderColor = "#FF0000";
564
+ ecalendar.textContent = "La fecha es requerida";
565
+ ecalendar.removeAttribute("hidden");
566
+ }
567
+ }
568
+ catch (error) {
569
+ }
570
+ }
571
+ validateNotSpace(event) {
572
+ if (event.charCode == 32) {
573
+ return false;
574
+ }
575
+ else {
576
+ return true;
577
+ }
578
+ }
579
+ validateNumeroDocumento(numeroDoc) {
580
+ if (!numeroDoc.match("^[0-9]*$")) {
581
+ this.formDynamic.controls["numeroDoc"].setValidators([Validators.pattern('^[0-9]*$')]);
582
+ this.formDynamic.controls["numeroDoc"].markAsDirty();
583
+ this.formDynamic.controls["numeroDoc"].updateValueAndValidity();
584
+ this.formDynamic.controls["numeroDoc"].markAsTouched();
585
+ this.patternNotValidDcto = true;
586
+ return false;
587
+ }
588
+ this.patternNotValidDcto = false;
589
+ return true;
590
+ }
591
+ validateCelular(numeroCel) {
592
+ if (!numeroCel.match("^[0-9]*$")) {
593
+ this.formDynamic.controls["celular"].setValidators([Validators.pattern('^[0-9]*$')]);
594
+ this.formDynamic.controls["celular"].markAsDirty();
595
+ this.formDynamic.controls["celular"].updateValueAndValidity();
596
+ this.formDynamic.controls["celular"].markAsTouched();
597
+ this.patternNotValidCel = true;
598
+ return false;
599
+ }
600
+ this.patternNotValidCel = false;
601
+ return true;
602
+ }
603
+ onkeypress(event) {
604
+ return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57;
605
+ }
606
+ onChangeStep(step, nextStep, value) {
607
+ if (nextStep && nextStep.stepOrder != 1) {
608
+ this.resetField(step);
609
+ nextStep.viewData = [];
610
+ nextStep.viewData = nextStep.stepData.filter(x => x.relationalIds.includes(Number(value)));
611
+ }
612
+ }
613
+ resetField(stepIn) {
614
+ this.steps.forEach(step => {
615
+ if (step.stepOrder > stepIn.stepOrder) {
616
+ step.viewData = undefined;
617
+ step.value = undefined;
618
+ }
619
+ });
620
+ }
621
+ };
622
+ FormAuroraComponent.ctorParameters = () => [
623
+ { type: CommonDataService },
624
+ { type: HttpClient }
625
+ ];
626
+ tslib_1.__decorate([
627
+ Input()
628
+ ], FormAuroraComponent.prototype, "dataClassCss", void 0);
629
+ tslib_1.__decorate([
630
+ Input()
631
+ ], FormAuroraComponent.prototype, "dataForm", void 0);
632
+ tslib_1.__decorate([
633
+ Input()
634
+ ], FormAuroraComponent.prototype, "clickSubmit", void 0);
635
+ tslib_1.__decorate([
636
+ Input()
637
+ ], FormAuroraComponent.prototype, "dataReloadForm", void 0);
638
+ tslib_1.__decorate([
639
+ Input()
640
+ ], FormAuroraComponent.prototype, "welcomeTitle", void 0);
641
+ tslib_1.__decorate([
642
+ Input()
643
+ ], FormAuroraComponent.prototype, "welcomeDescription", void 0);
644
+ tslib_1.__decorate([
645
+ Input()
646
+ ], FormAuroraComponent.prototype, "urlPdf", void 0);
647
+ tslib_1.__decorate([
648
+ Input()
649
+ ], FormAuroraComponent.prototype, "nameCompany", void 0);
650
+ tslib_1.__decorate([
651
+ Input()
652
+ ], FormAuroraComponent.prototype, "schedule", void 0);
653
+ tslib_1.__decorate([
654
+ Input()
655
+ ], FormAuroraComponent.prototype, "isSimpleFlow", void 0);
656
+ tslib_1.__decorate([
657
+ Input()
658
+ ], FormAuroraComponent.prototype, "steps", void 0);
659
+ tslib_1.__decorate([
660
+ ViewChild('formDynamic', { static: true })
661
+ ], FormAuroraComponent.prototype, "formDynamic", void 0);
662
+ tslib_1.__decorate([
663
+ Output()
664
+ ], FormAuroraComponent.prototype, "response", void 0);
665
+ tslib_1.__decorate([
666
+ Output()
667
+ ], FormAuroraComponent.prototype, "summit", void 0);
668
+ tslib_1.__decorate([
669
+ Output()
670
+ ], FormAuroraComponent.prototype, "viewAuthData", void 0);
671
+ FormAuroraComponent = tslib_1.__decorate([
672
+ Component({
673
+ selector: 'lib-FormAurora',
674
+ template: "<div class=\"card\">\n <span class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"!isSimpleFlow\">\n <img style=\"width: 115px; height:96px;\" [class]=\"dataClassCss.logo\" id=\"logo\">\n </span>\n <div class=\"text-center mt-2 d-none d-sm-block\" *ngIf=\"isSimpleFlow\" style=\"margin-top: 4%!important;\">\n </div>\n <div class=\"card-body pt-0\">\n <ng-container *ngIf=\"schedule\">\n <h4 class=\"card-title text-center mb-0\" [class]=\"dataClassCss.bienvenida2\" style=\"color: #EE7E0E;\">\n Horarios de atenci\u00F3n\n </h4>\n <small class=\"text-center d-block\">{{schedule}}</small>\n </ng-container>\n <form #formDynamic=\"ngForm\">\n <div *ngFor=\"let control of dataForm?.formQuestions; let index = index; trackBy: trackByIndex\">\n <div\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2)) || (index < dataForm.formQuestions.length && dataForm.formQuestions[index].question.questionType.id == 3 && dataForm.formQuestions[index + 1].question.questionType.id == 2); else switchTemp\">\n <div class=\"row\"\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2))\">\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index - 1].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index -\n 1].question.label}}</span>\n </label>\n <div class=\"selectContainer\">\n <select [name]=\"dataForm.formQuestions[index - 1].question.value\"\n [required]=\"dataForm.formQuestions[index - 1].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index - 1].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index - 1].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index - 1].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index-1].question.value\"\n hidden></span>\n </div>\n </div>\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\"\n class=\"col-sm-12 p-sm-0 px-sm-1\" style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keyup)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"onkeypress($event)\" onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\" />\n\n </div>\n\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n <span *ngIf=\"patternNotValidDcto === true\" class=\"error\">Formato no valido</span>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #switchTemp>\n <div [ngSwitch]=\"dataForm.formQuestions[index].question.questionType.id\">\n <div *ngSwitchCase=\"1\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\" />\n </div>\n </div>\n <div *ngSwitchCase=\"2\">\n\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" pattern=\"\\d*\" inputmode=\"numeric\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"onkeypress($event)\" onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\" />\n <span *ngIf=\"patternNotValidCel === true\" class=\"error\">Formato no valido</span>\n </div>\n\n </div>\n <div *ngSwitchCase=\"3\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <select [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div *ngSwitchCase=\"4\">\n <select class=\"{{ dataClassCss.formcontrol }} select-checkbox\"\n style=\"overflow: hidden; border-style: hidden;\"\n [style.height.px]=\"dataForm.formQuestions[index].question.questionAnswers.length * 24\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\" ngModel multiple>\n <option (mousemove)=\"$event.preventDefault()\"\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\"\n [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </select>\n </div>\n <div *ngSwitchCase=\"5\">\n <a (click)=\"rediretoutside($event,dataForm.formQuestions[index].question)\" href=\"\">\n <span>{{ dataForm.formQuestions[index].question.label }}</span>\n </a>\n </div>\n <div *ngSwitchCase=\"6\">\n <div [class]=\"dataClassCss.cl12\" [id]=\"'reCaptcha'\">\n <div class=\"cnt-captcha\">\n <re-captcha (resolved)=\"resolvedCaptcha($event)\"\n siteKey=\"6Lf9DcQfAAAAAI6HCNB5OyKUpOPpfl5ocoBJcigZ\"></re-captcha>\n <input hidden type=\"text\" [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\n </div>\n <span class=\"error\" *ngIf=\"watchValid && !captchaValid\" style=\"margin-top: 0;\">\n Debe resolver la captcha para continuar\n </span>\n </div>\n </div>\n <div *ngSwitchCase=\"7\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; margin-bottom: 0 ;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input placeholder=\"dd/mm/aaaa\" style=\"margin-top: -0.4rem !important;\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [name]=\"dataForm.formQuestions[index].question.value\" type=\"date\" min=\"{{minDate}}\"\n max=\"{{maxDate}}\" [maxlength]=\"10\" (paste)=\"false\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.txtCalendar\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n (keydown)=\"cancellKeypress()\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\">\n\n <button class=\"btn\" id=\"{{dataForm.formQuestions[index].question.value}}\" type=\"button\"\n style=\"width: 46px;\n top: 12px;\n color: white;\n right: 15px;\n position: absolute;\n background: #D25D42;\n pointer-events: none;\">\n <i class=\"fa fa-calendar\"></i>\n </button>\n\n </div>\n </div>\n <div *ngSwitchCase=\"8\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input\n style=\"width: 4% !important; height: auto !important; display: inline !important;\"\n type=\"checkbox\" [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\">\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"txtPoliticas\" (click)=\"tycSelection($event)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"9\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validOnlyText($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\" />\n </div>\n </div>\n <div *ngSwitchCase=\"10\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input\n style=\"width: 4% !important; height: auto !important; display: inline !important;\"\n type=\"checkbox\" [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"check{{dataForm.formQuestions[index].question.id}}\"\n (click)=\"openLabelUrl($event,dataForm.formQuestions[index].question)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"11\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validateNotSpace($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\" />\n </div>\n </div>\n <div *ngSwitchDefault>Tipo de control no detectado</div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n <span class=\"error\" [id]=\"dataForm.formQuestions[index].question.id\" hidden></span>\n </div>\n </div>\n </ng-template>\n </div>\n <section *ngIf=\"isSimpleFlow\">\n <div *ngFor=\"let step of steps let index = index;\">\n <div [class]=\"dataClassCss.cl12\" *ngIf=\"step.viewData\">\n <label for=\"{{step.id}}\" class=\"col-sm-12\" style=\"display: block; text-align: left;\">\n <span class=\"h6 small bg-white text-muted\">{{step.step}}</span>\n </label>\n <select [name]=\"step.step\" [required]=\"true\" [class]=\"dataClassCss.formcontrol\"\n id=\"{{step.step}}\" style=\"margin-top: -1rem !important;\" [(ngModel)]=\"step.value\"\n (ngModelChange)=\"onChangeStep(step,steps[index+1],$event)\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container *ngFor=\"let subitem of step.viewData\">\n <option [value]=\"subitem.id\">\n {{ subitem.description }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n </section>\n <div class=\"mt-3 text-center\">\n <button type=\"button\" [class]=\"dataClassCss.btn\" (click)=\"onSubmit()\" [disabled]=\"!formDynamic.valid\"\n id=\"btnIng\">Ingresar</button>\n </div>\n </form>\n </div>\n</div>",
675
+ providers: [
676
+ { provide: NgbDateAdapter, useClass: CustomAdapter },
677
+ { provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter },
678
+ { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
679
+ I18n
680
+ ],
681
+ styles: ["form{font-size:12px;overflow-y:scroll;overflow-x:hidden}form input,form select{border:1px solid #e4e4e4;height:40px;margin-bottom:5px}.selectContainer select{-webkit-appearance:none;-moz-appearance:none;appearance:none}.selectContainer::after{content:\"\\025be\";display:table-cell;text-align:center;padding-top:7px;width:30px;height:30px;position:absolute;top:14px;right:20px;pointer-events:none}form .error{color:red;font-size:12px;text-align:left;margin:-15px 0 15px;padding:0;width:90%}.error:after{content:\" \";display:block}.card{width:90%;margin:2% auto;border-radius:12px}@media (max-width:412px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:575.98px){.card{width:100%}.cnt-captcha{transform:scale(.77)}}@media (max-width:880.98px){.cnt-captcha{transform:scale(.82)}}input[type=date]::-webkit-calendar-picker-indicator{background:0 0;bottom:0;color:transparent;cursor:pointer;height:auto;left:0;position:absolute;right:0;top:0;width:auto}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:#f5f5f5}::-webkit-scrollbar-thumb{background:#e0e0e0}::-webkit-scrollbar-thumb:hover{background:#bdbdbd}"]
682
+ })
683
+ ], FormAuroraComponent);
684
+ export { FormAuroraComponent };
685
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXJvcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZm9ybS1hdXJvcmEtc3RlZmFuaW5pLyIsInNvdXJjZXMiOlsibGliL0NvbXBvbmVudHMvZnJvbS1hdXJvcmEvZm9ybS1hdXJvcmEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCwrQkFBK0I7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBaUIsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0SCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBRXZCOztHQUVHO0FBRUgsSUFBYSxhQUFhLEdBQTFCLE1BQWEsYUFBYyxTQUFRLGNBQXNCO0lBSnpEOztPQUVHO0lBQ0g7O1FBR1csY0FBUyxHQUFHLEdBQUcsQ0FBQztJQWlCM0IsQ0FBQztJQWZDLFNBQVMsQ0FBQyxLQUFvQjtRQUM1QixJQUFJLEtBQUssRUFBRTtZQUNULE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU87Z0JBQ0wsR0FBRyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFD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UixLQUFLLEVBQUU7MkRBQXFCO0FBQ3BCO0lBQVIsS0FBSyxFQUFFO3lEQUFtQjtBQUNsQjtJQUFSLEtBQUssRUFBRTsrREFBeUI7QUFDeEI7SUFBUixLQUFLLEVBQUU7bURBQWdCO0FBQ2Y7SUFBUixLQUFLLEVBQUU7d0RBQXFCO0FBQ3BCO0lBQVIsS0FBSyxFQUFFO3FEQUFrQjtBQUNqQjtJQUFSLEtBQUssRUFBRTt5REFBdUI7QUFDdEI7SUFBUixLQUFLLEVBQUU7a0RBQWU7QUFDcUI7SUFBM0MsU0FBUyxDQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzt3REFBcUI7QUFDdEQ7SUFBVCxNQUFNLEVBQUU7cURBQW9DO0FBQ25DO0lBQVQsTUFBTSxFQUFFO21EQUFrQztBQUNqQztJQUFULE1BQU0sRUFBRTt5REFBd0M7QUFoQnRDLG1CQUFtQjtJQVgvQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsZ0JBQWdCO1FBQzFCLDA2ekJBQTJDO1FBRTNDLFNBQVMsRUFBRTtZQUNULEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFO1lBQ3BELEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRTtZQUN4RSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUU7WUFDOUQsSUFBSTtTQUNMOztLQUNGLENBQUM7R0FDVyxtQkFBbUIsQ0FrakIvQjtTQWxqQlksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbmplY3RhYmxlLFxuICBJbnB1dCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wsIE5nRm9ybSwgRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbi8vIGltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IE5nYkRhdGVBZGFwdGVyLCBOZ2JEYXRlUGFyc2VyRm9ybWF0dGVyLCBOZ2JEYXRlU3RydWN0LCBOZ2JEYXRlcGlja2VySTE4biB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCAqIGFzIG1vbWVudF8gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEZpbGwgfSBmcm9tICcuLi8uLi9Nb2RlbHMvZmlsbCc7XG5pbXBvcnQgeyByZWdleFR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9yZWdleCc7XG5pbXBvcnQgeyBDb21wYW55IH0gZnJvbSAnLi4vLi4vTW9kZWxzL2NvbXBhbnknO1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJy4uLy4uL01vZGVscy9zdGVwJztcbmltcG9ydCB7IENvbW1vbkRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcbmNvbnN0IG1vbWVudCA9IG1vbWVudF87XG5cbi8qKlxuICogVGhpcyBTZXJ2aWNlIGhhbmRsZXMgaG93IHRoZSBkYXRlIGlzIHJlcHJlc2VudGVkIGluIHNjcmlwdHMgaS5lLiBuZ01vZGVsLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ3VzdG9tQWRhcHRlciBleHRlbmRzIE5nYkRhdGVBZGFwdGVyPHN0cmluZz4ge1xuXG4gIHJlYWRvbmx5IERFTElNSVRFUiA9ICcvJztcblxuICBmcm9tTW9kZWwodmFsdWU6IHN0cmluZyB8IG51bGwpOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQodGhpcy5ERUxJTUlURVIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF5OiBwYXJzZUludChkYXRlWzBdLCAxMCksXG4gICAgICAgIG1vbnRoOiBwYXJzZUludChkYXRlWzFdLCAxMCksXG4gICAgICAgIHllYXI6IHBhcnNlSW50KGRhdGVbMl0sIDEwKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0b01vZGVsKGRhdGU6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/IDAgKyBkYXRlLmRheSA6IGRhdGUuZGF5KSArIHRoaXMuREVMSU1JVEVSICsgKGRhdGUubW9udGggPCAxMCA/IDAgKyBkYXRlLm1vbnRoIDogZGF0ZS5tb250aCkgKyB0aGlzLkRFTElNSVRFUiArIGRhdGUueWVhciA6ICcnO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBTZXJ2aWNlIGhhbmRsZXMgaG93IHRoZSBkYXRlIGlzIHJlbmRlcmVkIGFuZCBwYXJzZWQgZnJvbSBrZXlib2FyZCBpLmUuIGluIHRoZSBib3VuZCBpbnB1dCBmaWVsZC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEN1c3RvbURhdGVQYXJzZXJGb3JtYXR0ZXIgZXh0ZW5kcyBOZ2JEYXRlUGFyc2VyRm9ybWF0dGVyIHtcblxuICByZWFkb25seSBERUxJTUlURVIgPSAnLyc7XG5cbiAgcGFyc2UodmFsdWU6IHN0cmluZyk6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSB2YWx1ZS5zcGxpdCh0aGlzLkRFTElNSVRFUik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXk6IHBhcnNlSW50KGRhdGVbMF0sIDEwKSxcbiAgICAgICAgbW9udGg6IHBhcnNlSW50KGRhdGVbMV0sIDEwKSxcbiAgICAgICAgeWVhcjogcGFyc2VJbnQoZGF0ZVsyXSwgMTApXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvcm1hdChkYXRlOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/ICcwJyArIGRhdGUuZGF5IDogZGF0ZS5kYXkpICsgdGhpcy5ERUxJTUlURVIgKyAoZGF0ZS5tb250aCA8IDEwID8gJzAnICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgpICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiAnJztcbiAgfVxufVxuXG5jb25zdCBJMThOX1ZBTFVFUyA9IHtcbiAgJ2VzJzoge1xuICAgIHdlZWtkYXlzOiBbJ0x1JywgJ01hJywgJ01pJywgJ0p1JywgJ1ZpJywgJ1NhJywgJ0RvJ10sXG4gICAgbW9udGhzOiBbJ0VuZScsICdGZWInLCAnTWFyJywgJ0FicicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBZ28nLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGljJ10sXG4gICAgd2Vla0xhYmVsOiAnc2VtJ1xuICB9XG4gIC8vIG90aGVyIGxhbmd1YWdlcyB5b3Ugd291bGQgc3VwcG9ydFxufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEkxOG4ge1xuICBsYW5ndWFnZSA9ICdlcyc7XG59XG5cbi8vIERlZmluZSBjdXN0b20gc2VydmljZSBwcm92aWRpbmcgdGhlIG1vbnRocyBhbmQgd2Vla2RheXMgdHJhbnNsYXRpb25zXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZXBpY2tlckkxOG4gZXh0ZW5kcyBOZ2JEYXRlcGlja2VySTE4biB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2kxOG46IEkxOG4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgZ2V0V2Vla2RheUxhYmVsKHdlZWtkYXk6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIEkxOE5fVkFMVUVTW3RoaXMuX2kxOG4ubGFuZ3VhZ2VdLndlZWtkYXlzW3dlZWtkYXkgLSAxXTtcbiAgfVxuXG4gIGdldFdlZWtMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrTGFiZWw7XG4gIH1cblxuICBnZXRNb250aFNob3J0TmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSTE4Tl9WQUxVRVNbdGhpcy5faTE4bi5sYW5ndWFnZV0ubW9udGhzW21vbnRoIC0gMV07XG4gIH1cblxuICBnZXRNb250aEZ1bGxOYW1lKG1vbnRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldE1vbnRoU2hvcnROYW1lKG1vbnRoKTtcbiAgfVxuXG4gIGdldERheUFyaWFMYWJlbChkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7ZGF0ZS5kYXl9LSR7ZGF0ZS5tb250aH0tJHtkYXRlLnllYXJ9YDtcbiAgfVxuXG4gIGdldFdlZWtkYXlTaG9ydE5hbWUod2Vla2RheTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gSTE4Tl9WQUxVRVNbdGhpcy5faTE4bi5sYW5ndWFnZV0ud2Vla2RheXNbd2Vla2RheSAtIDFdO1xuICB9O1xufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1Gb3JtQXVyb3JhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tYXVyb3JhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1hdXJvcmEuY29tcG9uZW50LmNzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IE5nYkRhdGVBZGFwdGVyLCB1c2VDbGFzczogQ3VzdG9tQWRhcHRlciB9LFxuICAgIHsgcHJvdmlkZTogTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgdXNlQ2xhc3M6IEN1c3RvbURhdGVQYXJzZXJGb3JtYXR0ZXIgfSxcbiAgICB7IHByb3ZpZGU6IE5nYkRhdGVwaWNrZXJJMThuLCB1c2VDbGFzczogQ3VzdG9tRGF0ZXBpY2tlckkxOG4gfSxcbiAgICBJMThuXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUF1cm9yYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhQ2xhc3NDc3M6IGFueTtcbiAgQElucHV0KCkgZGF0YUZvcm06IGFueTtcbiAgQElucHV0KCkgY2xpY2tTdWJtaXQ6IGFueTtcbiAgQElucHV0KCkgZGF0YVJlbG9hZEZvcm06IGFueTtcbiAgQElucHV0KCkgd2VsY29tZVRpdGxlOiBhbnk7XG4gIEBJbnB1dCgpIHdlbGNvbWVEZXNjcmlwdGlvbjogYW55O1xuICBASW5wdXQoKSB1cmxQZGY6IHN0cmluZztcbiAgQElucHV0KCkgbmFtZUNvbXBhbnk6IHN0cmluZztcbiAgQElucHV0KCkgc2NoZWR1bGU6IHN0cmluZztcbiAgQElucHV0KCkgaXNTaW1wbGVGbG93OiBib29sZWFuO1xuICBASW5wdXQoKSBzdGVwczogU3RlcFtdO1xuICBAVmlld0NoaWxkKCdmb3JtRHluYW1pYycsIHsgc3RhdGljOiB0cnVlIH0pIGZvcm1EeW5hbWljOiBOZ0Zvcm07XG4gIEBPdXRwdXQoKSByZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgc3VtbWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB2aWV3QXV0aERhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgdGlwb2RvY051bURvYzogYm9vbGVhbiA9IGZhbHNlO1xuICBjb3VudFN1Ym1pdCA9IDA7XG4gIHdhdGNoVmFsaWQgPSBmYWxzZTtcbiAgd2F0Y2hSZXF1aXJlZCA9IGZhbHNlO1xuICBjYXB0Y2hhVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdG9kYXkgPSBtb21lbnQobmV3IERhdGUoKSk7XG4gIG1heFllYXIgPSB0aGlzLnRvZGF5LnllYXIoKTtcbiAgbWluWWVhciA9IHRoaXMudG9kYXkueWVhcigpIC0gODI7XG4gIG1pbkRhdGUgPSB0aGlzLm1pblllYXIudG9TdHJpbmcoKSArICctJyArIHRoaXMudG9kYXkubW9udGgoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWluWWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XG4gIG1heERhdGUgPSB0aGlzLm1heFllYXIudG9TdHJpbmcoKSArICctJyArICh0aGlzLnRvZGF5Lm1vbnRoKCkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWF4WWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSArIDEsIGRheTogdGhpcy50b2RheS5kYXRlKCl9O1xuICByZWNoYXJnZTogYm9vbGVhbiA9IGZhbHNlO1xuICBpbmRpY2F0aXZvOiBzdHJpbmcgPSBcIjU3XCI7XG4gIGZpbGxkYXRhOiBGaWxsO1xuICBkZWZhdWx0RG9jVHlwZTogc3RyaW5nID0gXCJDw6lkdWxhIGRlIGNpdWRhZGFuw61hXCI7XG4gIHBhdHRlcm5Ob3RWYWxpZERjdG86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcGF0dGVybk5vdFZhbGlkQ2VsOiBib29sZWFuID0gZmFsc2U7XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGE6IENvbW1vbkRhdGFTZXJ2aWNlLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0Q29tcG9uZW50KCk7XG4gICAgfSwgMjAwMCk7XG4gIH1cblxuXG4gIHN0YXJ0Q29tcG9uZW50KCkge1xuICAgIC8vb3JkZW5hIGxvcyBjYW1wb3NcbiAgICBpZiAodGhpcy5kYXRhRm9ybSAhPSBudWxsICYmIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vU2FtZSByb3cgZmllbGRzXG4gICAgICB0aGlzLnRpcG9kb2NOdW1Eb2MgPSAodGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLnNvbWUocXVlc3Rpb24gPT4gcXVlc3Rpb24ucXVlc3Rpb24udmFsdWUgPT09IFwidGlwb0RvY1wiKSAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gXCJudW1lcm9Eb2NcIikpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XG4gICAgICB9KTtcbiAgICAgIGxldCBleGlzdGNhcHRjaGEgPSB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSA2KTtcblxuICAgICAgaWYgKGV4aXN0Y2FwdGNoYS5sZW5ndGggPT0gMCkge1xuICAgICAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gdW5kZWZpbmVkIHx8IGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IDApIHtcbiAgICAgICAgICBpdGVtLnF1ZXN0aW9uLm1heGxlbmd0aCA9IDUyNDI4ODsgLy9kZWZhdWx0dmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9PSBudWxsIHx8IGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YVJlbG9hZEZvcm0uZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGxkYXRhID0gZWxlbWVudDtcblxuICAgICAgICAgIGlmICgoaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDIgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT09IDEgfHxcbiAgICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAzKSAmJiAodGhpcy5maWxsZGF0YS5kYXRhICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIHRoaXMuZmlsbGRhdGEuZGF0YSAhPT0gdW5kZWZpbmVkKSAmJiBpdGVtLnF1ZXN0aW9uLmlkID09PSB0aGlzLmZpbGxkYXRhLmlkKSB7XG4gICAgICAgICAgICBpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9IHRoaXMuZmlsbGRhdGEuZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpdGVtLnF1ZXN0aW9uLnJlZ2lzdHJlZCA9PSBudWxsIHx8IGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByYW5nZSA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbCgpLFxuICB9KTtcblxuICByZXNvbHZlZENhcHRjaGEoY2FwdGNoYVJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWVcbiAgICBpZiAoIXRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhKSB7XG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzLmNhcHRjaGEuc2V0VmFsdWUoY2FwdGNoYVJlc3BvbnNlKVxuICAgICAgdGhpcy5mb3JtRHluYW1pYy5mb3JtLnZhbHVlLmNhcHRjaGEgPSBjYXB0Y2hhUmVzcG9uc2VcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYnRuSW5nXCIpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/IFwiMC42NVwiIDogXCIxXCI7XG4gICAgfVxuICB9XG5cbiAgLy9Gb3Jtc1xuICAvL01ldG9kbyBwYXJhIGV2aXRhciBlbCByZW5kZXIgZGUgbG9zIGl0ZW1zIGRlbCBmb3JcbiAgcHVibGljIHRyYWNrQnlJbmRleChpbmRleDogbnVtYmVyLCBvYmo6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgb25DaGFuZ2VWYWxpZFBhdHRlcihldmVudCwgcXVlc3Rpb24pIHtcbiAgICBpZiAocXVlc3Rpb24ucGF0dGVybiAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgICBsZXQga2V5dmFsaWQgPSBbOCwgMzIsIDM3LCAzOCwgMzksIDQwLCA0NiwgOV07XG4gICAgICAvL2RpZmVyZW50ZSBkZSBCYWNrcHNhY2VcbiAgICAgIC8vc2UgZGVqYSBjYXRjaCBwb3IgZXJyb3Igbm8gY29udHJvbGFibGUgZW4gb3RybyB0aWVtcG8gZGUgZWplY3VjaW9uXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWtleXZhbGlkLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKSB7XG4gICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHF1ZXN0aW9uLnBhdHRlcm4pO1xuICAgICAgICAgIHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikgeyB9XG5cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlLmRlc2NyaXB0aW9uID09PSAnTnVtYmVyJykge1xuICAgICAgICBpZiAocXVlc3Rpb24udmFsdWUgPT09ICdudW1lcm9Eb2MnKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZU51bWVyb0RvY3VtZW50byh0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wibnVtZXJvRG9jXCJdLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHF1ZXN0aW9uLnZhbHVlID09PSAnY2VsdWxhcicpIHtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlQ2VsdWxhcih0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfVxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhclwiICsgcXVlc3Rpb24udmFsdWUpLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCBcInRydWVcIik7XG5cbiAgICAvL2lmIHRlbXBvcmFsIG1pZW50cmFzIHNlIG1pZ3JhbiB0b2RvcyBsb3MgdGlwb3MgZGUgY2FtcG9zIGFsIGZvcmVhY2hcbiAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkICE9IDExICYmIHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCAhPSA3KSB7XG4gICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh0aGlzLmZvcm1EeW5hbWljLCBxdWVzdGlvbikpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWxcIiArIHF1ZXN0aW9uLnZhbHVlKS5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRTRFNEU0XCI7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWxcIiArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFsaWRNYXhMZW5ndGgodGhpcy5mb3JtRHluYW1pYywgcXVlc3Rpb24pKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm14bFwiICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChxdWVzdGlvbi52YWx1ZSkuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNFNEU0RTRcIjtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJteGxcIiArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZvckVhY2goZm9ybVF1ZXN0aW9uID0+IHtcbiAgICAgIHN3aXRjaCAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCkge1xuICAgICAgICAvL3NlIHZhbGlkYSAgY2FtcG8gZGUgdGlwbyBjYWxlbmRhcmlvXG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDcpXG4gICAgICAgICAgICB0aGlzLmNhbGVuZGFyUnVsZXNWYWxpZGF0ZShmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvL3NlIHZhbGlkYSAgY2FtcG8gZGUgdGlwbyBlbWFpbFxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMTEpXG4gICAgICAgICAgICB0aGlzLmVtYWlsUnVsZXNWYWxpZGF0ZShmb3JtUXVlc3Rpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJidG5JbmdcIikuc3R5bGUub3BhY2l0eSA9ICF0aGlzLmZvcm1EeW5hbWljLnZhbGlkID8gXCIwLjY1XCIgOiBcIjFcIjtcbiAgfVxuXG4gIHZhbGlkT25seVRleHQoZXZlbnQpIHtcbiAgICBsZXQgcmVnZXggPSAvXlthLXpBLVpcXHUwMEMwLVxcdTAxN0ZdKyQvZztcbiAgICBpZiAoZXZlbnQuY2hhckNvZGUgPT0gMzIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XG5cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICB2YWxpZERhdGUoZXZlbnQpIHtcbiAgICAvKmxldCBwYXR0ZXJuID0gLyg/OjBbMS05XXxbMTJdWzAtOV18M1swMV0pXFwvKD86MFsxLTldfDFbMC0yXSlcXC8oPzoxOXwyMClbMC05XXsyfS87XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgIHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xuICAgICovXG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhldmVudC5rZXkpLm1hdGNoKHJlZ2V4VHlwZS5kYXRlLmV4cCk7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZVxuICAgIGlmIChtYXRjaGVzID09PSBudWxsKVxuICAgICAgdmFsaWQgPSBmYWxzZTtcblxuICAgIC8vIGFsZXJ0KHZhbGlkKTtcblxuICAgIHJldHVybiB2YWxpZDtcblxuICB9XG5cbiAgb25DaGFuZ2VWYWxpZERhdGUoZXZlbnQpIHtcblxuICAgIC8vbGV0IHBhdHRlcm4gPSAvKD86MFsxLTldfDFbMC0yXSlcXC8oPzowWzEtOV18WzEyXVswLTldfDNbMDFdKVxcLyg/OjE5fDIwKVswLTldezJ9LztcbiAgICBsZXQgZGF0ZU4gPSAvWzAtOV18XFwvL1xuICAgIGxldCB2YWxpZCA9IHRydWVcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZGF0ZU4pO1xuICAgIHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xuICAgIHJldHVybiB2YWxpZDtcblxuICB9XG5cbiAgcmVkaXJldG91dHNpZGUoZXZlbnQsIHF1ZXN0aW9uKSB7XG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cbiAgICB0cnkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHF1ZXN0aW9uLnZhbHVlLCBcIl9ibGFua1wiKTtcbiAgICB9IGNhdGNoIChlcnJvcikgeyB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggc3VibWl0IGV2ZW50IGZvciB2YWxpZGF0aW9ucyBleGlzdHNcbiAgICogQHBhcmFtIGNoYW5nZSBcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZTogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuY291bnRTdWJtaXQrK1xuICB9XG4gIC8vb25TdWJtaXQoZm9ybTogTmdGb3JtKSB7XG4gIG9uU3VibWl0KCkge1xuICAgIGxldCBmb3JtID0gdGhpcy5mb3JtRHluYW1pYztcbiAgICB0aGlzLndhdGNoVmFsaWQgPSB0cnVlO1xuICAgIHRoaXMud2F0Y2hSZXF1aXJlZCA9IHRydWU7XG5cbiAgICBpZiAoZm9ybS52YWxpZCkge1xuICAgICAgaWYgKCF0aGlzLnZhbGlkUnVsZXNGaWVsZHMoZm9ybS5jb250cm9sc1tcIm51bWVyb0RvY1wiXS52YWx1ZS50b1N0cmluZygpLCBmb3JtLmNvbnRyb2xzW1wiY2VsdWxhclwiXS52YWx1ZS50b1N0cmluZygpLCBmb3JtLmNvbnRyb2xzW1wiZW1haWxcIl0udmFsdWUpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmFsaWRNaW5sZW5naHRBbGxRdWVzdGlvbnMoZm9ybS52YWx1ZSkgJiYgdGhpcy52YWxpZE1heExlbmd0aEFsbFF1ZXN0aW9ucyhmb3JtLnZhbHVlKSAmJiBmb3JtLnZhbGlkKSB7XG4gICAgICBpZiAodGhpcy5kYXRhRm9ybS51cmxTZW5kICE9IFwiXCIgJiYgdGhpcy5jYXB0Y2hhVmFsaWQpIHtcbiAgICAgICAgdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLmRhdGFGb3JtLnVybFNlbmQsIGZvcm0udmFsdWUpLnN1YnNjcmliZSgocmVzcCkgPT4gdGhpcy5yZXNwb25zZS5lbWl0KHJlc3ApKTtcbiAgICAgIH0gZWxzZSBpZiAoZm9ybS52YWxpZCAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xuICAgICAgICB0aGlzLnN1bW1pdC5lbWl0KGZvcm0udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZFBhcmFtQm9vbGVhbihwYXJhbXM6IGFueSwgaWRQYXJhbTogbnVtYmVyKSB7XG4gICAgbGV0IHNob3dEZXNjcmlwdGlvblBhcmFtID0gcGFyYW1zLmZpbmQoKHgpID0+IHguaWQgPT0gaWRQYXJhbSk7XG4gICAgcmV0dXJuIHNob3dEZXNjcmlwdGlvblBhcmFtICE9IG51bGwgJiYgc2hvd0Rlc2NyaXB0aW9uUGFyYW0udmFsdWUgPT0gXCJ0cnVlXCI7XG4gIH1cblxuICB2YWxpZFJ1bGVzRmllbGRzKG51bWVyb0RvYzogU3RyaW5nLCBudW1lcm9DZWw6IFN0cmluZywgZW1haWw6IFN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFZhbGlkYWNpb25lcyBwYXJhIGNlbHVsYXIgZW4gY2FzbyBkZSBpbmRpY2F0aXZvIGVuIENvbG9tYmlhXG4gICAgbGV0IGNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcmNlbHVsYXJcIik7XG4gICAgbGV0IGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY2hhcm51bWVyb0RvY1wiKTtcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xuICAgIGlmICh0aGlzLmluZGljYXRpdm8gPT0gXCIrNTdcIiB8fCB0aGlzLmluZGljYXRpdm8gPT0gXCI1N1wiKSB7XG4gICAgICBsZXQgc3RyaW5nT3JkZW5hZG8gPSB0aGlzLm9yZGVyU3RyaW5nKG51bWVyb0RvYyk7XG4gICAgICBpZiAodGhpcy5uYW1lQ29tcGFueS50b1VwcGVyQ2FzZSgpICE9PSAnQ0xBUk8nKSB7Ly9jbGFybyBhY2VwdGEgbnJvIGNvbnNlY3V0aXZvc1xuICAgICAgICBpZiAobnVtZXJvRG9jID09IHN0cmluZ09yZGVuYWRvKSB7XG4gICAgICAgICAgZG9jLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XG4gICAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICBkb2MudGV4dENvbnRlbnQgPSBcIkVsIG51bWVybyBkb2N1bWVudG8gTm8gZGViZSBjb250ZW5lciBjYXJhY3RlcmVzIGNvbnNlY3V0aXZvc1wiO1xuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XG5cbiAgICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgbnVtZXJvIGRvY3VtZW50byBObyBkZWJlIGNvbnRlbmVyIGNhcmFjdGVyZXMgY29uc2VjdXRpdm9zXCI7XG4gICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChudW1lcm9DZWwuc3Vic3RyaW5nKDAsIDEpICE9IFwiM1wiKSB7XG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByaW1lciBjYXLDoWN0ZXIgZGVsIGNlbHVsYXIgZGViZSBzZXIgM1wiO1xuICAgICAgICB2YWxPayA9IGZhbHNlO1xuXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmltZXIgY2Fyw6FjdGVyIGRlbCBjZWx1bGFyIGRlYmUgc2VyIDNcIjtcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKlxuICAgICAgaWYgKHBhcnNlSW50KG51bWVyb0NlbC5zdWJzdHJpbmcoMCwgMykpID4gMzUwKSB7XG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcbiAgICAgICAgdmFsT2sgPSBmYWxzZTtcbiAgICAgICAgLy90aGlzLm1zZ0Vycm9yQ2FtcG8gPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAqL1xuICAgICAgLy9FbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xuICAgICAgbGV0IGxpc3RudW1iZXIgPSBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IG51bWVyb0RvYy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgbGlzdG51bWJlciA9IGxpc3RudW1iZXIgKyBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAobnVtZXJvRG9jID09IGxpc3RudW1iZXIpIHtcbiAgICAgICAgZG9jLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XG4gICAgICAgIGRvYy5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgIGRvYy50ZXh0Q29udGVudCA9IFwiQ2FyYWN0ZXJlcyBudW3DqXJpY29zIG5vIHNlIHB1ZWRlbiByZXBldGlyc2UgZGUgbWFuZXJhIGNvbnRpbnVhIFwiO1xuICAgICAgICB2YWxPayA9IGZhbHNlO1xuXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJDYXJhY3RlcmVzIG51bcOpcmljb3Mgbm8gc2UgcHVlZGVuIHJlcGV0aXJzZSBkZSBtYW5lcmEgY29udGludWEgXCI7XG4gICAgICAgIC8vcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlTnVtZXJvRG9jdW1lbnRvKG51bWVyb0RvYykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlQ2VsdWxhcihudW1lcm9DZWwpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuXG4gICAgICAvLyBFbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xuICAgICAgbGV0IGFycmF5UGhvbmVSZXBlYXQgPSBBcnJheS5mcm9tKFN0cmluZyhudW1lcm9DZWwpLCBOdW1iZXIpO1xuICAgICAgbGV0IGFycmF5UGhvbmVPdXRSZXBlYXQgPSBbLi4ubmV3IFNldChhcnJheVBob25lUmVwZWF0KV07XG4gICAgICBpZiAoYXJyYXlQaG9uZU91dFJlcGVhdC5sZW5ndGggPT0gMSkge1xuICAgICAgICBjZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gXCJFbCBuw7ptZXJvIHF1ZSBpbmdyZXNhIG5vIGVzIHZhbGlkb1wiO1xuICAgICAgICB2YWxPayA9IGZhbHNlO1xuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgbsO6bWVybyBxdWUgaW5ncmVzYSBubyBlcyB2YWxpZG9cIjtcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGljYXRpdm8gPT0gXCIrNTkzXCIgfHwgdGhpcy5pbmRpY2F0aXZvID09IFwiNTkzXCIpIHtcbiAgICAgIGlmIChudW1lcm9DZWwuc3Vic3RyaW5nKDAsIDEpICE9IFwiOVwiKSB7XG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByaW1lciBjYXLDoWN0ZXIgZGVsIGNlbHVsYXIgZGViZSBzZXIgOVwiO1xuICAgICAgICB2YWxPayA9IGZhbHNlO1xuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciA5XCI7XG4gICAgICAgIC8vcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICAvL3NlIHZhbGlkYW4gbG9zIGNhbXBvcyBwb3IgdGlwbyBkZSBjYW1wbyB5IG5vIHBvciB2YWx1ZVxuICAgIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5mb3JFYWNoKGZvcm1RdWVzdGlvbiA9PiB7XG4gICAgICBzd2l0Y2ggKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQpIHtcbiAgICAgICAgLy9zZSB2YWxpZGEgIGNhbXBvIGRlIHRpcG8gZW1haWxcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICB2YWxPayA9IHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsT2s7XG4gIH1cblxuICBvcmRlclN0cmluZyh2YWx1ZTogU3RyaW5nKSB7XG4gICAgbGV0IGFycmF5TnVtYmVyID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHZhbHVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgYXJyYXlOdW1iZXIucHVzaChwYXJzZUludCh2YWx1ZS5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgMSkpKTtcbiAgICB9XG4gICAgLy9vcmRlbmEgZWwgYXJyYXlcbiAgICBhcnJheU51bWJlci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gYSAtIGI7XG4gICAgfSk7XG4gICAgbGV0IG51bWJlck9yZGVyID0gXCJcIjtcbiAgICBudW1iZXJPcmRlciA9IGFycmF5TnVtYmVyWzBdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBhcnJheU51bWJlci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIG51bWJlck9yZGVyID0gbnVtYmVyT3JkZXIgKyAoYXJyYXlOdW1iZXJbMF0gKyBpbmRleCkudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bWJlck9yZGVyO1xuICB9XG5cbiAgdmFsaWRNaW5sZW5naHRBbGxRdWVzdGlvbnMoZm9ybTogYW55KTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucykge1xuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xuICAgICAgICBsZXQgbWluTGVuZ3RoID0gcGFyc2VJbnQoaXRlbS5xdWVzdGlvbi5taW5MZW5ndGgpO1xuICAgICAgICBsZXQgZm9ybVZhbHVlTGVuZ3RoID0gcGFyc2VJbnQoZm9ybVtpdGVtLnF1ZXN0aW9uLnZhbHVlXS50b1N0cmluZygpLmxlbmd0aCk7XG4gICAgICAgIGlmIChtaW5MZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtaW5MZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoIDwgbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFsaWRNYXhMZW5ndGhBbGxRdWVzdGlvbnMoZm9ybTogYW55KTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucykge1xuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gcGFyc2VJbnQoaXRlbS5xdWVzdGlvbi5tYXhMZW5ndGgpO1xuICAgICAgICBsZXQgZm9ybVZhbHVlTGVuZ3RoID0gcGFyc2VJbnQoZm9ybVtpdGVtLnF1ZXN0aW9uLnZhbHVlXS50b1N0cmluZygpLmxlbmd0aCk7XG4gICAgICAgIGlmIChtYXhMZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtYXhMZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoID4gbWF4TGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFsaWRSZXF1aXJlZChmb3JtOiBOZ0Zvcm0sIHF1ZXN0aW9uKTogQm9vbGVhbiB7XG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cbiAgICB0cnkge1xuICAgICAgaWYgKHF1ZXN0aW9uICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLmVycm9ycyAhPSBudWxsICYmXG4gICAgICAgICAgZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0uZXJyb3JzLnJlcXVpcmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbGlkTWluTGVuZ3RoKGZvcm06IE5nRm9ybSwgcXVlc3Rpb24pOiBCb29sZWFuIHtcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxuICAgIHRyeSB7XG4gICAgICBpZiAocXVlc3Rpb24gIT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocXVlc3Rpb24ubWluTGVuZ3RoID4gZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0udmFsdWUudG9Mb2NhbGVTdHJpbmcoKS5sZW5ndGggJiYgcXVlc3Rpb24ubWluTGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbGlkTWF4TGVuZ3RoKGZvcm06IE5nRm9ybSwgcXVlc3Rpb24pOiBCb29sZWFuIHtcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxuICAgIHRyeSB7XG4gICAgICBpZiAocXVlc3Rpb24gIT0gdW5kZWZpbmVkICYmIHF1ZXN0aW9uLnZhbHVlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocXVlc3Rpb24ubWF4TGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChxdWVzdGlvbi5tYXhMZW5ndGggKyAxIDw9IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwuL2csICcnKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0uaGFzRXJyb3IoJ2Vycm9yTWF4TGVuZ3RoJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0uc2V0RXJyb3JzKHsgJ2Vycm9yTWF4TGVuZ3RoJzogdHJ1ZSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHR5Y1NlbGVjdGlvbihldmVudCkge1xuICAgIHRoaXMudmlld0F1dGhEYXRhLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgb3BlbkxhYmVsVXJsKGV2ZW50LCBxdWVzdGlvbikge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBsZXQgdHljID0gPEhUTUxJbnB1dEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjaGVja1wiICsgcXVlc3Rpb24uaWQpO1xuICAgIHR5Yy5zdHlsZS5jb2xvciA9IFwiI0EzQUQzMlwiO1xuICAgIHdpbmRvdy5vcGVuKHF1ZXN0aW9uLnVybGxhYmVsLCBcIl9ibGFua1wiKTtcbiAgfVxuXG4gIGNhbmNlbGxLZXlwcmVzcygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbikge1xuICAgIGxldCB2YWxPayA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKS5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIiwgXCJ0cnVlXCIpO1xuICAgICAgbGV0IGVtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCk7XG4gICAgICBsZXQgZW1haWwgPSBmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVnaXN0cmVkO1xuICAgICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgICBpZiAoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlcXVpcmVkICYmIChlbWFpbCA9PSBcIlwiIHx8IGVtYWlsID09IHVuZGVmaW5lZCB8fCBlbWFpbCA9PSBudWxsKSkge1xuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9IFwiRWwgY29ycmVjbyBlbMOpY3Ryb25pY28gZXMgcmVxdWVyaWRvXCI7XG4gICAgICAgICAgZW1sLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICB2YWxPayA9IGZhbHNlO1xuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFoYXNFcnJvcikge1xuICAgICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcbiAgICAgICAgICBlbWwuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiNGRjAwMDBcIjtcbiAgICAgICAgICBlbWwudGV4dENvbnRlbnQgPSBcIkRlYmUgc2VyIG3DrW5pbW8gZGUgXCIgKyBmb3JtUXVlc3Rpb24ucXVlc3Rpb24ubWluTGVuZ3RoICsgXCIgY2FyYWN0ZXJlc1wiO1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XG4gICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWhhc0Vycm9yKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbGlkTWF4TGVuZ3RoKHVuZGVmaW5lZCwgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uKSkge1xuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9IFwiRGViZSBzZXIgbWF4aW1vIGRlIFwiICsgZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLm1heExlbmd0aCArIFwiIGNhcmFjdGVyZXNcIjtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtUXVlc3Rpb24ucXVlc3Rpb24uaWQpLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICB2YWxPayA9IGZhbHNlO1xuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFoYXNFcnJvcikge1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBTdHJpbmcoZW1haWwpLm1hdGNoKHJlZ2V4VHlwZS5lbWFpbC5leHApO1xuICAgICAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7XG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XG4gICAgICAgICAgZW1sLnRleHRDb250ZW50ID0gXCJUdSBlbWFpbCBlcyBpbnZhbGlkb1wiO1xuICAgICAgICAgIGVtbC5yZW1vdmVBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICB9XG4gICAgcmV0dXJuIHZhbE9rO1xuICB9XG5cbiAgY2FsZW5kYXJSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbikge1xuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmb3JtUXVlc3Rpb24ucXVlc3Rpb24uaWQpLnNldEF0dHJpYnV0ZShcImhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICBsZXQgZWNhbGVuZGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcbiAgICAgIC8vc2UgdmFsaWRhIHF1ZSBubyBzZWEgbnVsbCBzaSBlcyByZXF1ZXJpZG9cbiAgICAgIGxldCBkYXRlID0gZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlZ2lzdHJlZDtcbiAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGRhdGUgPT0gXCJcIiB8fCBkYXRlID09IHVuZGVmaW5lZCB8fCBkYXRlID09IG51bGwpKSB7XG4gICAgICAgIGVjYWxlbmRhci5zdHlsZS5ib3JkZXJDb2xvciA9IFwiI0ZGMDAwMFwiO1xuICAgICAgICBlY2FsZW5kYXIudGV4dENvbnRlbnQgPSBcIkxhIGZlY2hhIGVzIHJlcXVlcmlkYVwiO1xuICAgICAgICBlY2FsZW5kYXIucmVtb3ZlQXR0cmlidXRlKFwiaGlkZGVuXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZU5vdFNwYWNlKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmNoYXJDb2RlID09IDMyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICB2YWxpZGF0ZU51bWVyb0RvY3VtZW50byhudW1lcm9Eb2M6IFN0cmluZykge1xuICAgIGlmICghbnVtZXJvRG9jLm1hdGNoKFwiXlswLTldKiRcIikpIHtcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbXCJudW1lcm9Eb2NcIl0uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0qJCcpXSk7XG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wibnVtZXJvRG9jXCJdLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wibnVtZXJvRG9jXCJdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbXCJudW1lcm9Eb2NcIl0ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdGhpcy5wYXR0ZXJuTm90VmFsaWREY3RvID0gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5wYXR0ZXJuTm90VmFsaWREY3RvID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFsaWRhdGVDZWx1bGFyKG51bWVyb0NlbDogU3RyaW5nKSB7XG4gICAgaWYgKCFudW1lcm9DZWwubWF0Y2goXCJeWzAtOV0qJFwiKSkge1xuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5wYXR0ZXJuKCdeWzAtOV0qJCcpXSk7XG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW1wiY2VsdWxhclwiXS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1tcImNlbHVsYXJcIl0ubWFya0FzVG91Y2hlZCgpO1xuICAgICAgdGhpcy5wYXR0ZXJuTm90VmFsaWRDZWwgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnBhdHRlcm5Ob3RWYWxpZENlbCA9IGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb25rZXlwcmVzcyhldmVudCkge1xuICAgIHJldHVybiAoZXZlbnQuY2hhckNvZGUgPT0gMCkgPyBudWxsIDogZXZlbnQuY2hhckNvZGUgPj0gNDggJiYgZXZlbnQuY2hhckNvZGUgPD0gNTdcbiAgfVxuXG4gIG9uQ2hhbmdlU3RlcChzdGVwOiBTdGVwLCBuZXh0U3RlcDogU3RlcCwgdmFsdWUpIHtcbiAgICBpZiAobmV4dFN0ZXAgJiYgbmV4dFN0ZXAuc3RlcE9yZGVyICE9IDEpIHtcbiAgICAgIHRoaXMucmVzZXRGaWVsZChzdGVwKTtcbiAgICAgIG5leHRTdGVwLnZpZXdEYXRhID0gW107XG4gICAgICBuZXh0U3RlcC52aWV3RGF0YSA9IG5leHRTdGVwLnN0ZXBEYXRhLmZpbHRlcih4ID0+IHgucmVsYXRpb25hbElkcy5pbmNsdWRlcyhOdW1iZXIodmFsdWUpKSk7XG5cbiAgICB9XG4gIH1cbiAgcmVzZXRGaWVsZChzdGVwSW46IFN0ZXApIHtcbiAgICB0aGlzLnN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBpZiAoc3RlcC5zdGVwT3JkZXIgPiBzdGVwSW4uc3RlcE9yZGVyKSB7XG4gICAgICAgIHN0ZXAudmlld0RhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgIHN0ZXAudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==