appproject-components 0.0.29 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/{esm2020 → esm2022}/appproject-components.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/appproject-components.component.mjs +15 -15
  3. package/{esm2020 → esm2022}/lib/appproject-components.module.mjs +96 -96
  4. package/{esm2020 → esm2022}/lib/appproject-components.service.mjs +14 -14
  5. package/esm2022/lib/baseInputComponent.mjs +66 -0
  6. package/esm2022/lib/input-area/input-area.component.mjs +53 -0
  7. package/esm2022/lib/input-arquivo/input-arquivo.component.mjs +115 -0
  8. package/esm2022/lib/input-cep/input-cep.component.mjs +180 -0
  9. package/esm2022/lib/input-format/input-format.component.mjs +138 -0
  10. package/esm2022/lib/input-pesquisa/input-pesquisa.component.mjs +548 -0
  11. package/esm2022/lib/input-select/input-select.component.mjs +88 -0
  12. package/esm2022/lib/input-text/input-text.component.mjs +76 -0
  13. package/esm2022/lib/input-valor/input-valor.component.mjs +158 -0
  14. package/{esm2020 → esm2022}/lib/model-treeview/model-treeview.component.mjs +14 -14
  15. package/{esm2020 → esm2022}/public-api.mjs +18 -18
  16. package/fesm2022/appproject-components.mjs +1511 -0
  17. package/fesm2022/appproject-components.mjs.map +1 -0
  18. package/index.d.ts +5 -5
  19. package/lib/appproject-components.component.d.ts +8 -8
  20. package/lib/appproject-components.module.d.ts +26 -26
  21. package/lib/appproject-components.service.d.ts +6 -6
  22. package/lib/baseInputComponent.d.ts +27 -27
  23. package/lib/input-area/input-area.component.d.ts +21 -21
  24. package/lib/input-arquivo/input-arquivo.component.d.ts +34 -33
  25. package/lib/input-cep/input-cep.component.d.ts +29 -29
  26. package/lib/input-format/input-format.component.d.ts +27 -25
  27. package/lib/input-pesquisa/input-pesquisa.component.d.ts +68 -68
  28. package/lib/input-select/input-select.component.d.ts +29 -28
  29. package/lib/input-text/input-text.component.d.ts +29 -25
  30. package/lib/input-valor/input-valor.component.d.ts +28 -25
  31. package/lib/model-treeview/model-treeview.component.d.ts +8 -8
  32. package/package.json +8 -14
  33. package/public-api.d.ts +13 -13
  34. package/esm2020/lib/baseInputComponent.mjs +0 -65
  35. package/esm2020/lib/input-area/input-area.component.mjs +0 -53
  36. package/esm2020/lib/input-arquivo/input-arquivo.component.mjs +0 -110
  37. package/esm2020/lib/input-cep/input-cep.component.mjs +0 -180
  38. package/esm2020/lib/input-format/input-format.component.mjs +0 -129
  39. package/esm2020/lib/input-pesquisa/input-pesquisa.component.mjs +0 -540
  40. package/esm2020/lib/input-select/input-select.component.mjs +0 -80
  41. package/esm2020/lib/input-text/input-text.component.mjs +0 -65
  42. package/esm2020/lib/input-valor/input-valor.component.mjs +0 -125
  43. package/fesm2015/appproject-components.mjs +0 -1452
  44. package/fesm2015/appproject-components.mjs.map +0 -1
  45. package/fesm2020/appproject-components.mjs +0 -1437
  46. package/fesm2020/appproject-components.mjs.map +0 -1
@@ -0,0 +1,548 @@
1
+ import { Component, EventEmitter, Inject, Input, ViewChild } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { Subject, of } from 'rxjs';
4
+ import { BaseInputComponent } from '../baseInputComponent';
5
+ import { debounceTime, switchMap } from 'rxjs/operators';
6
+ import { ModelTreeviewComponent } from '../model-treeview/model-treeview.component';
7
+ import { LibConfigService } from '../appproject-components.module';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common/http";
10
+ import * as i2 from "@ionic/angular";
11
+ import * as i3 from "@angular/common";
12
+ export class InputPesquisaComponent extends BaseInputComponent {
13
+ writeValue(value) {
14
+ //console.log('write value', value);
15
+ this.onChange(value);
16
+ this.data = value;
17
+ if (value == null || value == 0) {
18
+ this.writePesquisa('');
19
+ this.selectedItem = null;
20
+ }
21
+ else {
22
+ if (this.loadInit == true) {
23
+ this.loadInit = false;
24
+ this.modelChanged.next(value);
25
+ //this.carregaItemIdParaLista(value);
26
+ }
27
+ else {
28
+ //console.log(this.selectedItem);
29
+ if (!this.selectedItem || (this.selectedItem && this.selectedItem[this.campoId] != value)) {
30
+ console.log('Id diferente');
31
+ this.modelChanged.next(value);
32
+ //this.carregaItemIdParaLista(value);
33
+ }
34
+ }
35
+ }
36
+ }
37
+ registerOnChange(fn) {
38
+ this.onChange = fn;
39
+ }
40
+ registerOnTouched(fn) {
41
+ this.onTouch = fn;
42
+ }
43
+ setDisabledState(isDisabled) {
44
+ this.disabled = this.disabled;
45
+ }
46
+ constructor(config, httpClient, modalCtrl) {
47
+ super();
48
+ this.config = config;
49
+ this.httpClient = httpClient;
50
+ this.modalCtrl = modalCtrl;
51
+ this.podePesquisar = true;
52
+ this.textoPesquisa = '';
53
+ this.selectElementVisivel = false;
54
+ this.listaPesquisa = [];
55
+ this.max = '30';
56
+ this.pesquisaSubject = new Subject();
57
+ this.filterFunction = null;
58
+ this.selectId = 'selectElement';
59
+ this.campoId = 'Id';
60
+ this.campoPaiId = 'PaiId';
61
+ this.campoDisplay = 'Descricao';
62
+ this.tipo = '';
63
+ //@ViewChild('selectElement', { read: ElementRef, static: true }) selectElement;
64
+ this.selectElement = null;
65
+ this.pesquisaChange = new EventEmitter();
66
+ //parametros para chamada API
67
+ //endpoint para pesquisa por digitação
68
+ this.url = '';
69
+ this.urlItem = '';
70
+ //endpoint para montar a arvore, se estiver vazia será usado o campo 'url'
71
+ this.urlTree = '';
72
+ this.empresa = 0;
73
+ this.loadInit = false;
74
+ this.onChange = (data) => { };
75
+ this.onTouch = () => { };
76
+ this.disabled = false;
77
+ this.console = console;
78
+ this.modelChanged = new Subject();
79
+ this.BASE_API = this.config.apiUrl;
80
+ this.modelChangeSubscription = this.modelChanged
81
+ .pipe(debounceTime(500))
82
+ .subscribe(data => {
83
+ this.carregaItemIdParaLista(data);
84
+ });
85
+ }
86
+ onBlur(event) {
87
+ console.log('blur', event);
88
+ //console.log(event.detail.relatedTarget);
89
+ if (event.detail.relatedTarget == null || event.detail.relatedTarget.id.indexOf(this.selectId + 'IonItem') == -1) {
90
+ //console.log("true", event.detail.relatedTarget.id);
91
+ //pesquisar item na lista
92
+ if (!this.existeNaListaTexto(this.textoPesquisa, true)) {
93
+ this.limparClick();
94
+ }
95
+ this.dropDownPesquisa(0);
96
+ if (this.form) {
97
+ this.form.get(this.formControlName)?.markAsTouched();
98
+ }
99
+ }
100
+ }
101
+ ngOnInit() {
102
+ //tratar urls
103
+ this.url = this.url.startsWith('http') ? this.url : `${this.BASE_API}/${this.url}`;
104
+ this.urlItem = this.urlItem.startsWith('http') ? this.urlItem : `${this.BASE_API}/${this.urlItem}`;
105
+ this.pesquisaSubject.pipe(switchMap((url) => {
106
+ this.console.log('subject url:', url);
107
+ if (!this.isEmpty(url))
108
+ return this.httpClient.get(url);
109
+ else
110
+ return of([]);
111
+ }))
112
+ .subscribe({
113
+ next: (result) => {
114
+ //this.listaPesquisa = result;
115
+ this.console.log('subject subscribe result:', result);
116
+ this.listaPesquisa = [];
117
+ if (result && result.length > 0) {
118
+ if (this.filterFunction) {
119
+ result = result.filter(this.filterFunction);
120
+ }
121
+ result.forEach((ent, index) => {
122
+ this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
123
+ });
124
+ }
125
+ this.podePesquisar = true;
126
+ if (this.listaPesquisa.length > 0) {
127
+ this.dropDownPesquisa(this.listaPesquisa.length);
128
+ }
129
+ },
130
+ error: (error) => {
131
+ this.podePesquisar = true;
132
+ console.log('erro pesquisa', error);
133
+ }
134
+ });
135
+ }
136
+ writePesquisa(value) {
137
+ //console.log('write pesquisa', value);
138
+ this.textoPesquisa = value;
139
+ }
140
+ showPesquisa(e) {
141
+ //console.log('show pesquisa', e.keyCode);
142
+ var self = this;
143
+ const index = e.target.selectionStart >= 1 ? (e.target.selectionStart - 1) : 0;
144
+ //console.log(index, 'valor ', event.target.value, 'char ', event.target.value.charCodeAt(index));
145
+ const keyAt = e.target.value.charCodeAt(index);
146
+ /*
147
+ if ((e.keyCode >= 48 && e.keyCode <= 57) ||
148
+ (keyAt >= 48 && keyAt <= 57) ||
149
+ (e.keyCode >= 65 && e.keyCode <= 90) ||
150
+ (e.keyCode >= 96 && e.keyCode <= 105) ||
151
+ (e.keyCode == 8)) {
152
+ */
153
+ if (e.keyCode != 40 && e.keyCode != 38) {
154
+ if (!self.podePesquisar) {
155
+ return;
156
+ }
157
+ let filtro = self.textoPesquisa;
158
+ if (filtro != null && filtro != '' && filtro.length >= 2) {
159
+ self.pesquisarEntidade(filtro);
160
+ }
161
+ else {
162
+ if (e.keyCode == 8 && !filtro) {
163
+ this.limparClick();
164
+ }
165
+ }
166
+ }
167
+ else {
168
+ if (e.keyCode == 40 || e.keyCode == 38) {
169
+ self.dropDownPesquisa(self.listaPesquisa.length);
170
+ if (self.selectElementVisivel == true) {
171
+ //let select = self.selectElement; //document.getElementById(self.TemplateSelect1Id());
172
+ //ion-list
173
+ //selecionado
174
+ //console.log(self.listaPesquisa);
175
+ let inc = e.keyCode == 40 ? 1 : -1;
176
+ let selected = self.listaPesquisa.find(s => s['Selected'] === true);
177
+ let cur = 0;
178
+ if (selected != null) {
179
+ cur = selected['Index'];
180
+ //desmarcar o atual
181
+ selected['Selected'] = false;
182
+ cur = cur + inc;
183
+ }
184
+ else {
185
+ cur = 0;
186
+ }
187
+ if (cur < 0) {
188
+ cur = self.listaPesquisa.length - 1;
189
+ }
190
+ else if (cur >= self.listaPesquisa.length) {
191
+ cur = 0;
192
+ }
193
+ let novoSelected = self.listaPesquisa.find(n => n['Index'] === cur);
194
+ if (novoSelected != null) {
195
+ novoSelected['Selected'] = true;
196
+ self.selectedItem = novoSelected;
197
+ self.textoPesquisa = novoSelected[self.campoDisplay];
198
+ }
199
+ /*
200
+ let select = document.getElementById(this.selectId) as any;
201
+ console.log('select Element', select)
202
+ if (select != null) {
203
+ let inc = e.keyCode == 40 ? 1 : -1;
204
+ let cur = select.selectedIndex;
205
+ if (cur == NaN) cur = -1;
206
+ select.selectedIndex = cur + inc;
207
+ if (select.selectedIndex >= 0 && select.selectedIndex < self.listaPesquisa.length) {
208
+ self.selectedItem = self.listaPesquisa[select.selectedIndex];
209
+ if (self.selectedItem != null) {
210
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
211
+ }
212
+ }
213
+ }
214
+ */
215
+ }
216
+ }
217
+ else if (e.keyCode == 13) {
218
+ console.log('enter key', e);
219
+ //self.selecionarComboClick(e);
220
+ self.selecionarComboClick(null);
221
+ //return false;
222
+ }
223
+ else if (e.keyCode == 27) {
224
+ //ESC
225
+ self.dropDownPesquisa(0);
226
+ }
227
+ }
228
+ }
229
+ highlight(texto) {
230
+ let index = texto.toLowerCase().indexOf(this.textoPesquisa.toLowerCase());
231
+ //console.log(index);
232
+ if (index >= 0) {
233
+ return texto.substring(0, index) + '<strong>' + texto.substring(index, index + this.textoPesquisa.length) + '</strong>' + texto.substring(index + this.textoPesquisa.length); //texto.replace(this.textoPesquisa, `<strong>${this.textoPesquisa}</strong>`);
234
+ }
235
+ else {
236
+ return texto;
237
+ }
238
+ }
239
+ selecionarComboClick(item) {
240
+ // console.log(item);
241
+ var self = this;
242
+ // console.log('combo click', self);
243
+ /*
244
+ let select = document.getElementById(this.selectId) as any;
245
+ if (select.selectedIndex >= 0) {
246
+ self.selectedItem = self.listaPesquisa[select.selectedIndex];
247
+ }
248
+ console.log('selected', this.selectedItem);
249
+ //self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
250
+ if (self.selectedItem != null) {
251
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
252
+ self.writeValue(self.selectedItem[self.campoId]);
253
+ if (e != null) {
254
+ self.selectElementVisivel = false;
255
+ if (self.action != null) {
256
+ self.action(self.selectedItem(), e);
257
+ }
258
+ }
259
+ }
260
+ else {
261
+ self.selectElementVisivel = false;
262
+ }
263
+ */
264
+ // pesquisar selecionado
265
+ // console.log(this.listaPesquisa);
266
+ let selected = this.listaPesquisa.find(s => s['Selected'] === true);
267
+ // if (!selected) {
268
+ // console.log(this.campoId, item);
269
+ // selected = this.listaPesquisa.filter( s => s[this.campoId] == item[this.campoId]);
270
+ // }
271
+ //se o item form passado como parametro (click no ion-item)
272
+ if (item != null) {
273
+ if (selected != null) {
274
+ selected['Selected'] = false;
275
+ }
276
+ item['Selected'] = true;
277
+ selected = item;
278
+ }
279
+ if (selected != null) {
280
+ self.selectedItem = selected;
281
+ self.textoPesquisa = selected[self.campoDisplay];
282
+ self.writeValue(selected[self.campoId]);
283
+ self.selectElementVisivel = false;
284
+ //console.log('action', self.change);
285
+ if (self.pesquisaChange != null) {
286
+ self.pesquisaChange.emit(self.selectedItem);
287
+ }
288
+ }
289
+ else {
290
+ self.selectElementVisivel = false;
291
+ }
292
+ // this.listaPesquisa.forEach( pesquisa => {
293
+ // console.log(pesquisa, self.data);
294
+ // } );
295
+ // console.log(this.textoPesquisa);
296
+ }
297
+ selecionarComboChange(e) {
298
+ var self = this;
299
+ console.log('combo change', e);
300
+ self.selectedItem = this.listaPesquisa.find(i => i[this.campoId] == e);
301
+ if (self.selectedItem != null) {
302
+ self.writeValue(e);
303
+ self.textoPesquisa = self.selectedItem[self.campoDisplay];
304
+ if (e != null) {
305
+ self.selectElementVisivel = false;
306
+ if (self.pesquisaChange != null) {
307
+ self.pesquisaChange.emit(self.selectedItem);
308
+ }
309
+ }
310
+ }
311
+ else {
312
+ self.selectElementVisivel = false;
313
+ }
314
+ }
315
+ dropDownPesquisa(length) {
316
+ var self = this;
317
+ if (self.listaPesquisa != null && self.listaPesquisa.length > 0) {
318
+ if (length == -1) {
319
+ length = self.listaPesquisa.length;
320
+ }
321
+ self.selectElementVisivel = length == 0 ? false : true;
322
+ //console.log(this.selectElement);
323
+ //this.selectElement.open();
324
+ /*
325
+ //let element = this.selectElement;
326
+ let element = document.getElementById(this.selectId);
327
+ console.log('dropDown', element);
328
+ (element as any).size = length + 1;
329
+ if (length == 0) {
330
+ self.selectElementVisivel = false;
331
+ } else {
332
+ self.selectElementVisivel = true;
333
+ }
334
+ */
335
+ }
336
+ }
337
+ pesquisarEntidade(filtro) {
338
+ let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
339
+ console.log('pesquisarEntidade url', url);
340
+ this.podePesquisar = false;
341
+ this.pesquisaSubject.next(url);
342
+ }
343
+ pesquisarEntidadeOld(filtro) {
344
+ let url = this.url.replace('<<FILTRO>>', filtro).replace('<<EMPRESA>>', this.empresa.toString());
345
+ console.log('pesquisarEntidade url', url);
346
+ this.podePesquisar = false;
347
+ this.httpClient.get(url)
348
+ .subscribe({ next: (result) => {
349
+ //this.listaPesquisa = result;
350
+ if (this.filterFunction) {
351
+ result = result.filter(this.filterFunction);
352
+ }
353
+ this.listaPesquisa = [];
354
+ result.forEach((ent, index) => {
355
+ this.listaPesquisa.push({ ...ent, Index: index, Selected: false });
356
+ });
357
+ this.podePesquisar = true;
358
+ if (this.listaPesquisa.length > 0) {
359
+ this.dropDownPesquisa(this.listaPesquisa.length);
360
+ }
361
+ }, error: error => {
362
+ console.log('erro pesquisa', error);
363
+ this.podePesquisar = true;
364
+ } });
365
+ }
366
+ existeNaLista(id, setRegistro = false) {
367
+ if (this.listaPesquisa && this.listaPesquisa.length > 0) {
368
+ let existe = this.listaPesquisa.find(l => l[this.campoId] === id);
369
+ if (existe) {
370
+ if (setRegistro) {
371
+ this.selectedItem = existe;
372
+ this.selecionarComboClick(this.selectedItem);
373
+ }
374
+ return true;
375
+ }
376
+ else {
377
+ return false;
378
+ }
379
+ }
380
+ else {
381
+ return false;
382
+ }
383
+ }
384
+ existeNaListaTexto(texto, setRegistro = false) {
385
+ console.log("existe texto:", texto, this.campoDisplay, this.listaPesquisa);
386
+ if (this.listaPesquisa && this.listaPesquisa.length > 0) {
387
+ let existe = this.listaPesquisa.find(l => l[this.campoDisplay].toUpperCase() === texto.toUpperCase());
388
+ if (existe) {
389
+ if (setRegistro) {
390
+ this.selectedItem = existe;
391
+ this.selecionarComboClick(this.selectedItem);
392
+ }
393
+ return true;
394
+ }
395
+ else {
396
+ return false;
397
+ }
398
+ }
399
+ else {
400
+ return false;
401
+ }
402
+ }
403
+ validarItemSelecionado(setarRegistro = false) {
404
+ console.log('validar selecionado');
405
+ //passar pela função de filtro
406
+ let valido = false;
407
+ if (this.selectedItem) {
408
+ if (this.filterFunction) {
409
+ let existe = [{ ...this.selectedItem }].filter(this.filterFunction);
410
+ if (existe != null && existe.length > 0) {
411
+ valido = true;
412
+ }
413
+ }
414
+ else {
415
+ valido = true;
416
+ }
417
+ if (valido && setarRegistro) {
418
+ this.selecionarComboClick(this.selectedItem);
419
+ }
420
+ return valido;
421
+ }
422
+ else {
423
+ return false;
424
+ }
425
+ }
426
+ carregaItemIdParaLista(id) {
427
+ let url = this.urlItem.replace('<<ID>>', id.toString());
428
+ console.log(this.urlItem);
429
+ console.log('pesquisar ID url', url);
430
+ this.podePesquisar = false;
431
+ this.httpClient.get(url)
432
+ .subscribe({ next: (result) => {
433
+ this.listaPesquisa = [];
434
+ this.listaPesquisa.push({ ...result, Index: 0, Selected: true });
435
+ this.podePesquisar = true;
436
+ if (this.listaPesquisa.length > 0) {
437
+ this.selectedItem = this.listaPesquisa[0];
438
+ this.selecionarComboClick(this.selectedItem);
439
+ }
440
+ }, error: error => {
441
+ console.log('erro pesquisa', error);
442
+ this.podePesquisar = true;
443
+ } });
444
+ }
445
+ limparClick() {
446
+ this.writeValue(null);
447
+ this.writePesquisa(null);
448
+ this.listaPesquisa = [];
449
+ this.dropDownPesquisa(0);
450
+ //this.podePesquisar = true;
451
+ this.pesquisaSubject.next('');
452
+ if (this.limpar) {
453
+ this.limpar();
454
+ }
455
+ }
456
+ verificarPesquisa() {
457
+ //TODO: verificar se o texto corresponde com um item da lista
458
+ this.selecionarComboClick(null);
459
+ }
460
+ async pesquisarClick() {
461
+ /*
462
+ if (this.pesquisaAction != null) {
463
+ this.pesquisaAction();
464
+ }
465
+ */
466
+ //pesquisaCategoria
467
+ console.log(this.filterFunction, this.url, this.urlTree);
468
+ const modal = await this.modalCtrl.create({
469
+ component: ModelTreeviewComponent,
470
+ componentProps: {
471
+ //campoId: this.campoId,
472
+ //campoPai: this.campoPaiId,
473
+ //campoLabel: this.campoDisplay,
474
+ filterFunction: this.filterFunction,
475
+ empresaSelecionadaId: this.empresa,
476
+ tipo: this.tipo,
477
+ //especifico
478
+ //planoContas: this.planoContas,
479
+ url: this.isEmpty(this.urlTree) ? this.url : this.urlTree
480
+ },
481
+ cssClass: 'my-custom-modal-pesquisa'
482
+ });
483
+ modal.onDidDismiss().then(data => {
484
+ let result = data['data'];
485
+ console.log(result);
486
+ if (result != null && result.Id > 0) {
487
+ this.carregaItemIdParaLista(result.Id);
488
+ }
489
+ });
490
+ modal.present();
491
+ }
492
+ isEmpty(valor) {
493
+ return valor == null || valor == undefined || valor == '';
494
+ }
495
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: InputPesquisaComponent, deps: [{ token: LibConfigService }, { token: i1.HttpClient }, { token: i2.ModalController }], target: i0.ɵɵFactoryTarget.Component }); }
496
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: InputPesquisaComponent, selector: "kb-input-pesquisa", inputs: { textoPesquisa: "textoPesquisa", max: "max", filterFunction: "filterFunction", selectId: "selectId", campoId: "campoId", campoPaiId: "campoPaiId", campoDisplay: "campoDisplay", tipo: "tipo", pesquisaChange: "pesquisaChange", pesquisaAction: "pesquisaAction", limpar: "limpar", url: "url", urlItem: "urlItem", urlTree: "urlTree", empresa: "empresa", loadInit: "loadInit" }, providers: [{
497
+ provide: NG_VALUE_ACCESSOR,
498
+ useExisting: InputPesquisaComponent,
499
+ multi: true
500
+ }], viewQueries: [{ propertyName: "selectElement", first: true, predicate: ["selectElement"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"padding-inline-end: 0px;\">\r\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\r\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\r\n <!-- formControlName=\"{{ campo }}\" -->\r\n <ion-spinner *ngIf=\"!podePesquisar\"\r\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \r\n slot=\"start\" name=\"lines\"></ion-spinner>\r\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\r\n <!-- conflito com click da lista -->\r\n <ion-input #inputPesquisa\r\n type=\"{{type}}\" \r\n [placeholder]=\"placeholder\" \r\n maxlength=\"{{ max }}\" \r\n (ionBlur)=\"onBlur($event)\"\r\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \r\n (keyup)=\"showPesquisa($event)\"\r\n autocomplete=\"off\" [style.--background]=\"inputBackgroungColor\"\r\n (click)=\"dropDownPesquisa(-1)\"\r\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\r\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\r\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\r\n (click)=\"limparClick()\">\r\n <ion-icon name=\"close-outline\"></ion-icon>\r\n </ion-button>\r\n \r\n <!--\r\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\r\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\r\n (click)=\"pesquisarClick()\">\r\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\r\n </ion-button>\r\n -->\r\n \r\n </ion-item>\r\n \r\n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\r\n \r\n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \r\n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\r\n class=\"pesquisa-item\">\r\n <!-- {{ item | json}} -->\r\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\r\n </ion-item>\r\n \r\n </ion-list>\r\n \r\n <!--\r\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\r\n (ionChange)=\"selecionarComboChange($event.target.value)\">\r\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\r\n {{ item[campoDisplay] }}\r\n </ion-select-option>\r\n </ion-select>\r\n -->\r\n \r\n <!--\r\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\r\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\r\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\r\n {{ item[campoDisplay] }}\r\n </option>\r\n \r\n </select>\r\n -->\r\n \r\n <div class=\"validation-errors\" *ngIf=\"form\">\r\n \r\n <ng-container *ngFor=\"let validation of validation_messages\">\r\n <div class=\"error-message\"\r\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\r\n &#8226; {{ validation.message }}\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>", styles: [".pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;margin-left:20px;margin-top:-4px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n", "@charset \"UTF-8\";ion-label{margin-bottom:4px!important}ion-item ion-label{overflow:initial!important}ion-input{padding:var(--input-padding, 8px)!important;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:var(--input-max-height, 29px);transition:.2s ease}.has-focus{border:1px solid var(--ion-color-bluetool, #1f477d)}input:focus ion-input,input:focus ion-textarea{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}input:disabled{opacity:.9!important}.error-message{font-size:small;color:var(--error-text-color, red);margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-end{--inner-padding-end: 0px}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}.item-inner{padding-right:0!important}.label-right ion-label{transform-origin:right top;align-self:flex-end;margin-bottom:4%!important}.align-to-right ion-label{position:relative;left:25%;text-align:end}.error-input ion-input,.error-shake ion-input{animation:shake .4s 1 linear;border:1px solid var(--error-text-color, red)!important}@keyframes shake{0%{transform:translate(20px)}20%{transform:translate(-20px)}40%{transform:translate(10px)}60%{transform:translate(-10px)}80%{transform:translate(4px)}to{transform:translate(0)}}.error-input ion-label,.error-shake ion-label{color:var(--error-text-color, red)!important}.error-input ion-input,.error-shake ion-input{border:1px solid red!important}.error-shake ion-input{animation:shake .4s 1 linear}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i2.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i2.IonInput, selector: "ion-input", inputs: ["accept", "autocapitalize", "autocomplete", "autocorrect", "autofocus", "clearInput", "clearOnEdit", "color", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "legacy", "max", "maxlength", "min", "minlength", "mode", "multiple", "name", "pattern", "placeholder", "readonly", "required", "shape", "size", "spellcheck", "step", "type", "value"] }, { kind: "component", type: i2.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i2.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i2.IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: i2.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "directive", type: i2.TextValueAccessor, selector: "ion-input:not([type=number]),ion-textarea,ion-searchbar" }] }); }
501
+ }
502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: InputPesquisaComponent, decorators: [{
503
+ type: Component,
504
+ args: [{ selector: 'kb-input-pesquisa', providers: [{
505
+ provide: NG_VALUE_ACCESSOR,
506
+ useExisting: InputPesquisaComponent,
507
+ multi: true
508
+ }], template: "<div style=\"padding-inline-end: 0px;\">\r\n <ion-item lines=\"none\" style=\"--background: inherited; --background-focused: transparent; margin-top: 2px;\" [class]=\"itemClass\">\r\n <ion-label position=\"{{ labelPosition }}\" color=\"{{ labelColor }}\">{{ label }}</ion-label>\r\n <!-- formControlName=\"{{ campo }}\" -->\r\n <ion-spinner *ngIf=\"!podePesquisar\"\r\n style=\"--min-height: 0px !important; margin-inline-end: 5px !important; margin-top: 16px;\" \r\n slot=\"start\" name=\"lines\"></ion-spinner>\r\n <!-- (ionBlur)=\"verificarPesquisa()\" -->\r\n <!-- conflito com click da lista -->\r\n <ion-input #inputPesquisa\r\n type=\"{{type}}\" \r\n [placeholder]=\"placeholder\" \r\n maxlength=\"{{ max }}\" \r\n (ionBlur)=\"onBlur($event)\"\r\n [value]=\"textoPesquisa\" (input)=\"writePesquisa(inputPesquisa.value)\" \r\n (keyup)=\"showPesquisa($event)\"\r\n autocomplete=\"off\" [style.--background]=\"inputBackgroungColor\"\r\n (click)=\"dropDownPesquisa(-1)\"\r\n [disabled]=\"readonly\" debounce=\"500\"></ion-input>\r\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\r\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\r\n (click)=\"limparClick()\">\r\n <ion-icon name=\"close-outline\"></ion-icon>\r\n </ion-button>\r\n \r\n <!--\r\n <ion-button size=\"small\" slot=\"end\" tabindex=\"-1\"\r\n style=\"margin-top: 25px; margin-inline-start: 4px !important; --padding-start:2px; --padding-end: 2px;\" fill=\"clear\" color=\"medium\"\r\n (click)=\"pesquisarClick()\">\r\n <ion-icon color=\"primary\" name=\"search\"></ion-icon>\r\n </ion-button>\r\n -->\r\n \r\n </ion-item>\r\n \r\n <ion-list tabindex=\"-1\" [hidden]=\"!selectElementVisivel || !listaPesquisa || listaPesquisa.length == 0\" class=\"pesquisa-list\" style=\"max-height: 250px; overflow-y: auto;\">\r\n \r\n <ion-item tabindex=\"-1\" button *ngFor=\"let item of listaPesquisa\" \r\n (click)=\"selecionarComboClick(item)\" [id]=\"selectId + 'IonItem' + item['Index']\"\r\n class=\"pesquisa-item\">\r\n <!-- {{ item | json}} -->\r\n <span [class]=\"{'selected-item': item['Selected'] === true}\" [innerHTML]=\"highlight(item[campoDisplay])\"></span>\r\n </ion-item>\r\n \r\n </ion-list>\r\n \r\n <!--\r\n <ion-select interface=\"popover\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\r\n (ionChange)=\"selecionarComboChange($event.target.value)\">\r\n <ion-select-option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\r\n {{ item[campoDisplay] }}\r\n </ion-select-option>\r\n </ion-select>\r\n -->\r\n \r\n <!--\r\n <select [id]=\"selectId\" #selectElement tabindex=\"-1\" [hidden]=\"!selectElementVisivel\"\r\n (change)=\"selecionarComboChange($event.target.value)\" class=\"pesquisa-select\">\r\n <option *ngFor=\"let item of listaPesquisa\" [value]=\"item[campoId]\" (click)=\"selecionarComboClick(item[campoId])\">\r\n {{ item[campoDisplay] }}\r\n </option>\r\n \r\n </select>\r\n -->\r\n \r\n <div class=\"validation-errors\" *ngIf=\"form\">\r\n \r\n <ng-container *ngFor=\"let validation of validation_messages\">\r\n <div class=\"error-message\"\r\n *ngIf=\"form.get(formControlName)?.hasError(validation.type) && (form.get(formControlName)?.dirty || form.get(formControlName)?.touched)\">\r\n &#8226; {{ validation.message }}\r\n </div>\r\n </ng-container>\r\n \r\n </div>\r\n </div>", styles: [".pesquisa-select{display:block;position:absolute;top:58px;left:20px;width:100%;z-index:800;font-size:16px;font-family:Roboto,Helvetica Neue,sans-serif;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.pesquisa-select option{overflow-y:hidden}.pesquisa-select option:hover,.pesquisa-select option:checked{background-color:#add8e6}.pesquisa-list{display:block;position:absolute;margin-left:20px;margin-top:-4px;width:calc(100% - 50px);z-index:800;border:1px lightgrey solid;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:0}.pesquisa-item{--inner-padding-top: 0px;--inner-padding-bottom: 0px;--padding-top: 0px;--padding-bottom: 0px;--min-height: 30px !important;font-size:12px}.pesquisa-item button{padding:0}.selected-item{background-color:#add8e6}\n", "@charset \"UTF-8\";ion-label{margin-bottom:4px!important}ion-item ion-label{overflow:initial!important}ion-input{padding:var(--input-padding, 8px)!important;border:1px solid darkgray;border-radius:4px;width:100%;margin-top:2px;max-height:var(--input-max-height, 29px);transition:.2s ease}.has-focus{border:1px solid var(--ion-color-bluetool, #1f477d)}input:focus ion-input,input:focus ion-textarea{border:1px solid lightblue!important}input:focus ion-label{--color: blue !important}input:disabled{opacity:.9!important}.error-message{font-size:small;color:var(--error-text-color, red);margin-left:15px}.padding{padding:auto}.no-padding{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px;height:55px!important}.no-padding-end{--inner-padding-end: 0px}.no-padding-no-height{--inner-padding-end: 0px;--padding-start: 0px;--padding-bottom: 0px;--inner-padding-bottom: 0px}.padding-top{--padding-top: 0px}.item-inner{padding-right:0!important}.label-right ion-label{transform-origin:right top;align-self:flex-end;margin-bottom:4%!important}.align-to-right ion-label{position:relative;left:25%;text-align:end}.error-input ion-input,.error-shake ion-input{animation:shake .4s 1 linear;border:1px solid var(--error-text-color, red)!important}@keyframes shake{0%{transform:translate(20px)}20%{transform:translate(-20px)}40%{transform:translate(10px)}60%{transform:translate(-10px)}80%{transform:translate(4px)}to{transform:translate(0)}}.error-input ion-label,.error-shake ion-label{color:var(--error-text-color, red)!important}.error-input ion-input,.error-shake ion-input{border:1px solid red!important}.error-shake ion-input{animation:shake .4s 1 linear}\n"] }]
509
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
510
+ type: Inject,
511
+ args: [LibConfigService]
512
+ }] }, { type: i1.HttpClient }, { type: i2.ModalController }], propDecorators: { textoPesquisa: [{
513
+ type: Input
514
+ }], max: [{
515
+ type: Input
516
+ }], filterFunction: [{
517
+ type: Input
518
+ }], selectId: [{
519
+ type: Input
520
+ }], campoId: [{
521
+ type: Input
522
+ }], campoPaiId: [{
523
+ type: Input
524
+ }], campoDisplay: [{
525
+ type: Input
526
+ }], tipo: [{
527
+ type: Input
528
+ }], selectElement: [{
529
+ type: ViewChild,
530
+ args: ['selectElement', { static: false }]
531
+ }], pesquisaChange: [{
532
+ type: Input
533
+ }], pesquisaAction: [{
534
+ type: Input
535
+ }], limpar: [{
536
+ type: Input
537
+ }], url: [{
538
+ type: Input
539
+ }], urlItem: [{
540
+ type: Input
541
+ }], urlTree: [{
542
+ type: Input
543
+ }], empresa: [{
544
+ type: Input
545
+ }], loadInit: [{
546
+ type: Input
547
+ }] } });
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXBwcHJvamVjdC1jb21wb25lbnRzL3NyYy9saWIvaW5wdXQtcGVzcXVpc2EvaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsT0FBTyxFQUFnQixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFZOUUsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjtJQTJDNUQsVUFBVSxDQUFDLEtBQW1CO1FBQzVCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsRUFB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c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgUHJlZGljYXRlLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJb25TZWxlY3QsIE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBCYXNlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlSW5wdXRDb21wb25lbnQnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xyXG5pbXBvcnQgeyBNb2RlbFRyZWV2aWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWwtdHJlZXZpZXcvbW9kZWwtdHJlZXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTGliQ29uZmlnLCBMaWJDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vYXBwcHJvamVjdC1jb21wb25lbnRzLm1vZHVsZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2tiLWlucHV0LXBlc3F1aXNhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQtcGVzcXVpc2EuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2lucHV0LXBlc3F1aXNhLmNvbXBvbmVudC5zY3NzJywgJy4vLi4vYmFzZUNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbe1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogSW5wdXRQZXNxdWlzYUNvbXBvbmVudCxcclxuICAgIG11bHRpOiB0cnVlXHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIElucHV0UGVzcXVpc2FDb21wb25lbnQgZXh0ZW5kcyBCYXNlSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgcG9kZVBlc3F1aXNhcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgdGV4dG9QZXNxdWlzYTogc3RyaW5nID0gJyc7XHJcbiAgc2VsZWN0RWxlbWVudFZpc2l2ZWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsaXN0YVBlc3F1aXNhOiBhbnlbXSA9IFtdO1xyXG4gIHNlbGVjdGVkSXRlbTogYW55O1xyXG4gIEBJbnB1dCgpIG92ZXJyaWRlIG1heDogc3RyaW5nID0gJzMwJztcclxuICBwcml2YXRlIHBlc3F1aXNhU3ViamVjdDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgQElucHV0KCkgZmlsdGVyRnVuY3Rpb246IFByZWRpY2F0ZTxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgc2VsZWN0SWQ6IHN0cmluZyA9ICdzZWxlY3RFbGVtZW50JztcclxuICBASW5wdXQoKSBjYW1wb0lkOiBzdHJpbmcgPSAnSWQnO1xyXG4gIEBJbnB1dCgpIGNhbXBvUGFpSWQ6IHN0cmluZyA9ICdQYWlJZCc7XHJcbiAgQElucHV0KCkgY2FtcG9EaXNwbGF5OiBzdHJpbmcgPSAnRGVzY3JpY2FvJztcclxuICBASW5wdXQoKSB0aXBvOiBzdHJpbmcgPSAnJztcclxuICAvL0BWaWV3Q2hpbGQoJ3NlbGVjdEVsZW1lbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KSBzZWxlY3RFbGVtZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdEVsZW1lbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0RWxlbWVudDogSW9uU2VsZWN0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHBlc3F1aXNhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBJbnB1dCgpIHBlc3F1aXNhQWN0aW9uPzogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgbGltcGFyPzogRnVuY3Rpb247XHJcbiAgLy9wYXJhbWV0cm9zIHBhcmEgY2hhbWFkYSBBUElcclxuICAvL2VuZHBvaW50IHBhcmEgcGVzcXVpc2EgcG9yIGRpZ2l0YcOnw6NvXHJcbiAgQElucHV0KCkgdXJsOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB1cmxJdGVtOiBzdHJpbmcgPSAnJztcclxuICAvL2VuZHBvaW50IHBhcmEgbW9udGFyIGEgYXJ2b3JlLCBzZSBlc3RpdmVyIHZhemlhIHNlcsOhIHVzYWRvIG8gY2FtcG8gJ3VybCdcclxuICBASW5wdXQoKSB1cmxUcmVlOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBlbXByZXNhOiBudW1iZXIgPSAwO1xyXG4gIEBJbnB1dCgpIGxvYWRJbml0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vcGxhbm9Db250YXM6IG51bWJlcjtcclxuXHJcbiAgLy9jb250cm9sIHZhbHVlIGFjZXNzb3JcclxuICBwdWJsaWMgZGF0YTogbnVtYmVyIHwgYW55O1xyXG4gIHByaXZhdGUgb25DaGFuZ2U6IEZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcikgPT4geyB9O1xyXG4gIHByaXZhdGUgb25Ub3VjaDogRnVuY3Rpb24gPSAoKSA9PiB7IH07XHJcbiAgcHJpdmF0ZSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBjb25zb2xlID0gY29uc29sZTtcclxuXHJcbiAgbW9kZWxDaGFuZ2VkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgbW9kZWxDaGFuZ2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlciB8IGFueSk6IHZvaWQge1xyXG4gICAgLy9jb25zb2xlLmxvZygnd3JpdGUgdmFsdWUnLCB2YWx1ZSk7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT0gMCkge1xyXG4gICAgICB0aGlzLndyaXRlUGVzcXVpc2EoJycpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5sb2FkSW5pdCA9PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkSW5pdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubW9kZWxDaGFuZ2VkLm5leHQodmFsdWUpO1xyXG4gICAgICAgIC8vdGhpcy5jYXJyZWdhSXRlbUlkUGFyYUxpc3RhKHZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRJdGVtIHx8ICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbVt0aGlzLmNhbXBvSWRdICE9IHZhbHVlKSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0lkIGRpZmVyZW50ZScpO1xyXG4gICAgICAgICAgdGhpcy5tb2RlbENoYW5nZWQubmV4dCh2YWx1ZSk7XHJcbiAgICAgICAgICAvL3RoaXMuY2FycmVnYUl0ZW1JZFBhcmFMaXN0YSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoID0gZm47XHJcbiAgfVxyXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgQkFTRV9BUEkgPSB0aGlzLmNvbmZpZy5hcGlVcmw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTGliQ29uZmlnU2VydmljZSkgcHJpdmF0ZSBjb25maWc6IExpYkNvbmZpZyxcclxuICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIpIHtcclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgdGhpcy5tb2RlbENoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMubW9kZWxDaGFuZ2VkXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKCdibHVyJywgZXZlbnQpO1xyXG4gICAgLy9jb25zb2xlLmxvZyhldmVudC5kZXRhaWwucmVsYXRlZFRhcmdldCk7XHJcbiAgICBpZiAoZXZlbnQuZGV0YWlsLnJlbGF0ZWRUYXJnZXQgPT0gbnVsbCB8fCBldmVudC5kZXRhaWwucmVsYXRlZFRhcmdldC5pZC5pbmRleE9mKHRoaXMuc2VsZWN0SWQgKyAnSW9uSXRlbScpID09IC0xKSB7XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJ0cnVlXCIsIGV2ZW50LmRldGFpbC5yZWxhdGVkVGFyZ2V0LmlkKTtcclxuICAgICAgLy9wZXNxdWlzYXIgaXRlbSBuYSBsaXN0YVxyXG4gICAgICBpZiAoIXRoaXMuZXhpc3RlTmFMaXN0YVRleHRvKHRoaXMudGV4dG9QZXNxdWlzYSwgdHJ1ZSkpIHtcclxuICAgICAgICB0aGlzLmxpbXBhckNsaWNrKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSgwKTtcclxuICAgICAgaWYgKHRoaXMuZm9ybSkge1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpPy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xyXG4gICAgLy90cmF0YXIgdXJsc1xyXG4gICAgdGhpcy51cmwgPSB0aGlzLnVybC5zdGFydHNXaXRoKCdodHRwJykgPyB0aGlzLnVybCA6IGAke3RoaXMuQkFTRV9BUEl9LyR7dGhpcy51cmx9YDtcclxuICAgIHRoaXMudXJsSXRlbSA9IHRoaXMudXJsSXRlbS5zdGFydHNXaXRoKCdodHRwJykgPyB0aGlzLnVybEl0ZW0gOiBgJHt0aGlzLkJBU0VfQVBJfS8ke3RoaXMudXJsSXRlbX1gO1xyXG5cclxuICAgIHRoaXMucGVzcXVpc2FTdWJqZWN0LnBpcGUoc3dpdGNoTWFwKCh1cmwpID0+IHtcclxuICAgICAgdGhpcy5jb25zb2xlLmxvZygnc3ViamVjdCB1cmw6JywgdXJsKTtcclxuICAgICAgaWYgKCF0aGlzLmlzRW1wdHkodXJsKSlcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxhbnk+KHVybCk7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy90aGlzLmxpc3RhUGVzcXVpc2EgPSByZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLmNvbnNvbGUubG9nKCdzdWJqZWN0IHN1YnNjcmliZSByZXN1bHQ6JywgcmVzdWx0KTtcclxuICAgICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYSA9IFtdO1xyXG5cclxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKHRoaXMuZmlsdGVyRnVuY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgoZW50OiBhbnksIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLmVudCwgSW5kZXg6IGluZGV4LCBTZWxlY3RlZDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0YVBlc3F1aXNhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kcm9wRG93blBlc3F1aXNhKHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAsIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJybyBwZXNxdWlzYScsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVQZXNxdWlzYSh2YWx1ZTogc3RyaW5nIHwgYW55KTogdm9pZCB7XHJcbiAgICAvL2NvbnNvbGUubG9nKCd3cml0ZSBwZXNxdWlzYScsIHZhbHVlKTtcclxuICAgIHRoaXMudGV4dG9QZXNxdWlzYSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2hvd1Blc3F1aXNhKGU6IGFueSk6IHZvaWQge1xyXG4gICAgLy9jb25zb2xlLmxvZygnc2hvdyBwZXNxdWlzYScsIGUua2V5Q29kZSk7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBpbmRleCA9IGUudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID49IDEgPyAoZS50YXJnZXQuc2VsZWN0aW9uU3RhcnQgLSAxKSA6IDA7XHJcbiAgICAvL2NvbnNvbGUubG9nKGluZGV4LCAndmFsb3IgJywgZXZlbnQudGFyZ2V0LnZhbHVlLCAnY2hhciAnLCBldmVudC50YXJnZXQudmFsdWUuY2hhckNvZGVBdChpbmRleCkpO1xyXG4gICAgY29uc3Qga2V5QXQgPSBlLnRhcmdldC52YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtcclxuICAgIC8qXHJcbiAgICBpZiAoKGUua2V5Q29kZSA+PSA0OCAmJiBlLmtleUNvZGUgPD0gNTcpIHx8XHJcbiAgICAgIChrZXlBdCA+PSA0OCAmJiBrZXlBdCA8PSA1NykgfHxcclxuICAgICAgKGUua2V5Q29kZSA+PSA2NSAmJiBlLmtleUNvZGUgPD0gOTApIHx8XHJcbiAgICAgIChlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSkgfHxcclxuICAgICAgKGUua2V5Q29kZSA9PSA4KSkge1xyXG4gICAgICAgICovXHJcbiAgICBpZiAoZS5rZXlDb2RlICE9IDQwICYmIGUua2V5Q29kZSAhPSAzOCkge1xyXG4gICAgICBpZiAoIXNlbGYucG9kZVBlc3F1aXNhcikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZmlsdHJvID0gc2VsZi50ZXh0b1Blc3F1aXNhO1xyXG4gICAgICBpZiAoZmlsdHJvICE9IG51bGwgJiYgZmlsdHJvICE9ICcnICYmIGZpbHRyby5sZW5ndGggPj0gMikge1xyXG4gICAgICAgIHNlbGYucGVzcXVpc2FyRW50aWRhZGUoZmlsdHJvKTtcclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PSA4ICYmICFmaWx0cm8pIHtcclxuICAgICAgICAgIHRoaXMubGltcGFyQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKGUua2V5Q29kZSA9PSA0MCB8fCBlLmtleUNvZGUgPT0gMzgpIHtcclxuICAgICAgICBzZWxmLmRyb3BEb3duUGVzcXVpc2Eoc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCk7XHJcbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgLy9sZXQgc2VsZWN0ID0gc2VsZi5zZWxlY3RFbGVtZW50OyAvL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNlbGYuVGVtcGxhdGVTZWxlY3QxSWQoKSk7XHJcblxyXG4gICAgICAgICAgLy9pb24tbGlzdFxyXG4gICAgICAgICAgLy9zZWxlY2lvbmFkb1xyXG4gICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmLmxpc3RhUGVzcXVpc2EpO1xyXG4gICAgICAgICAgbGV0IGluYyA9IGUua2V5Q29kZSA9PSA0MCA/IDEgOiAtMTtcclxuICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHNlbGYubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XHJcbiAgICAgICAgICBsZXQgY3VyID0gMDtcclxuICAgICAgICAgIGlmIChzZWxlY3RlZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGN1ciA9IHNlbGVjdGVkWydJbmRleCddO1xyXG4gICAgICAgICAgICAvL2Rlc21hcmNhciBvIGF0dWFsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkWydTZWxlY3RlZCddID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGN1ciA9IGN1ciArIGluYztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1ciA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGN1ciA8IDApIHtcclxuICAgICAgICAgICAgY3VyID0gc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1ciA+PSBzZWxmLmxpc3RhUGVzcXVpc2EubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGN1ciA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IG5vdm9TZWxlY3RlZCA9IHNlbGYubGlzdGFQZXNxdWlzYS5maW5kKG4gPT4gblsnSW5kZXgnXSA9PT0gY3VyKTtcclxuICAgICAgICAgIGlmIChub3ZvU2VsZWN0ZWQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBub3ZvU2VsZWN0ZWRbJ1NlbGVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IG5vdm9TZWxlY3RlZDtcclxuICAgICAgICAgICAgc2VsZi50ZXh0b1Blc3F1aXNhID0gbm92b1NlbGVjdGVkW3NlbGYuY2FtcG9EaXNwbGF5XTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICBsZXQgc2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWxlY3RJZCkgYXMgYW55O1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3NlbGVjdCBFbGVtZW50Jywgc2VsZWN0KVxyXG4gICAgICAgICAgaWYgKHNlbGVjdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmMgPSBlLmtleUNvZGUgPT0gNDAgPyAxIDogLTE7XHJcbiAgICAgICAgICAgIGxldCBjdXIgPSBzZWxlY3Quc2VsZWN0ZWRJbmRleDtcclxuICAgICAgICAgICAgaWYgKGN1ciA9PSBOYU4pIGN1ciA9IC0xO1xyXG4gICAgICAgICAgICBzZWxlY3Quc2VsZWN0ZWRJbmRleCA9IGN1ciArIGluYztcclxuICAgICAgICAgICAgaWYgKHNlbGVjdC5zZWxlY3RlZEluZGV4ID49IDAgJiYgc2VsZWN0LnNlbGVjdGVkSW5kZXggPCBzZWxmLmxpc3RhUGVzcXVpc2EubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSBzZWxmLmxpc3RhUGVzcXVpc2Fbc2VsZWN0LnNlbGVjdGVkSW5kZXhdO1xyXG4gICAgICAgICAgICAgIGlmIChzZWxmLnNlbGVjdGVkSXRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvRGlzcGxheV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAqL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gZWxzZVxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlbnRlciBrZXknLCBlKVxyXG4gICAgICAgICAgLy9zZWxmLnNlbGVjaW9uYXJDb21ib0NsaWNrKGUpO1xyXG4gICAgICAgICAgc2VsZi5zZWxlY2lvbmFyQ29tYm9DbGljayhudWxsKTtcclxuICAgICAgICAgIC8vcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDI3KSB7XHJcbiAgICAgICAgICAvL0VTQ1xyXG4gICAgICAgICAgc2VsZi5kcm9wRG93blBlc3F1aXNhKDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHQodGV4dG86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgaW5kZXggPSB0ZXh0by50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGhpcy50ZXh0b1Blc3F1aXNhLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgLy9jb25zb2xlLmxvZyhpbmRleCk7XHJcbiAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICByZXR1cm4gdGV4dG8uc3Vic3RyaW5nKDAsIGluZGV4KSArICc8c3Ryb25nPicgKyB0ZXh0by5zdWJzdHJpbmcoaW5kZXgsIGluZGV4ICsgdGhpcy50ZXh0b1Blc3F1aXNhLmxlbmd0aCkgKyAnPC9zdHJvbmc+JyArIHRleHRvLnN1YnN0cmluZyhpbmRleCArIHRoaXMudGV4dG9QZXNxdWlzYS5sZW5ndGgpOyAgLy90ZXh0by5yZXBsYWNlKHRoaXMudGV4dG9QZXNxdWlzYSwgYDxzdHJvbmc+JHt0aGlzLnRleHRvUGVzcXVpc2F9PC9zdHJvbmc+YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGV4dG87XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY2lvbmFyQ29tYm9DbGljayhpdGVtOiBhbnkpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xyXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ2NvbWJvIGNsaWNrJywgc2VsZik7XHJcblxyXG4gICAgLypcclxuICAgIGxldCBzZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNlbGVjdElkKSBhcyBhbnk7XHJcbiAgICBpZiAoc2VsZWN0LnNlbGVjdGVkSW5kZXggPj0gMCkge1xyXG4gICAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IHNlbGYubGlzdGFQZXNxdWlzYVtzZWxlY3Quc2VsZWN0ZWRJbmRleF07XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnc2VsZWN0ZWQnLCB0aGlzLnNlbGVjdGVkSXRlbSk7XHJcbiAgICAvL3NlbGYuc2VsZWN0ZWRJdGVtID0gdGhpcy5saXN0YVBlc3F1aXNhLmZpbmQoaSA9PiBpW3RoaXMuY2FtcG9JZF0gPT0gZSk7XHJcbiAgICBpZiAoc2VsZi5zZWxlY3RlZEl0ZW0gIT0gbnVsbCkge1xyXG4gICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvRGlzcGxheV07XHJcbiAgICAgIHNlbGYud3JpdGVWYWx1ZShzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvSWRdKTtcclxuICAgICAgaWYgKGUgIT0gbnVsbCkge1xyXG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc2VsZi5hY3Rpb24gIT0gbnVsbCkge1xyXG4gICAgICAgICAgc2VsZi5hY3Rpb24oc2VsZi5zZWxlY3RlZEl0ZW0oKSwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgKi9cclxuICAgIC8vIHBlc3F1aXNhciBzZWxlY2lvbmFkb1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5saXN0YVBlc3F1aXNhKTtcclxuICAgIGxldCBzZWxlY3RlZCA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKHMgPT4gc1snU2VsZWN0ZWQnXSA9PT0gdHJ1ZSk7XHJcblxyXG4gICAgLy8gaWYgKCFzZWxlY3RlZCkge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyh0aGlzLmNhbXBvSWQsIGl0ZW0pO1xyXG4gICAgLy8gICBzZWxlY3RlZCA9IHRoaXMubGlzdGFQZXNxdWlzYS5maWx0ZXIoIHMgPT4gc1t0aGlzLmNhbXBvSWRdID09IGl0ZW1bdGhpcy5jYW1wb0lkXSk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy9zZSBvIGl0ZW0gZm9ybSBwYXNzYWRvIGNvbW8gcGFyYW1ldHJvIChjbGljayBubyBpb24taXRlbSlcclxuICAgIGlmIChpdGVtICE9IG51bGwpIHtcclxuICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHtcclxuICAgICAgICBzZWxlY3RlZFsnU2VsZWN0ZWQnXSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGl0ZW1bJ1NlbGVjdGVkJ10gPSB0cnVlO1xyXG4gICAgICBzZWxlY3RlZCA9IGl0ZW07XHJcbiAgICB9XHJcbiAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkge1xyXG4gICAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkO1xyXG4gICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxlY3RlZFtzZWxmLmNhbXBvRGlzcGxheV07XHJcbiAgICAgIHNlbGYud3JpdGVWYWx1ZShzZWxlY3RlZFtzZWxmLmNhbXBvSWRdKTtcclxuICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGZhbHNlO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKCdhY3Rpb24nLCBzZWxmLmNoYW5nZSk7XHJcbiAgICAgIGlmIChzZWxmLnBlc3F1aXNhQ2hhbmdlICE9IG51bGwpIHtcclxuICAgICAgICBzZWxmLnBlc3F1aXNhQ2hhbmdlLmVtaXQoc2VsZi5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLmxpc3RhUGVzcXVpc2EuZm9yRWFjaCggcGVzcXVpc2EgPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhwZXNxdWlzYSwgc2VsZi5kYXRhKTtcclxuICAgIC8vIH0gKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudGV4dG9QZXNxdWlzYSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY2lvbmFyQ29tYm9DaGFuZ2UoZTogYW55KSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnY29tYm8gY2hhbmdlJywgZSk7XHJcbiAgICBzZWxmLnNlbGVjdGVkSXRlbSA9IHRoaXMubGlzdGFQZXNxdWlzYS5maW5kKGkgPT4gaVt0aGlzLmNhbXBvSWRdID09IGUpO1xyXG4gICAgaWYgKHNlbGYuc2VsZWN0ZWRJdGVtICE9IG51bGwpIHtcclxuICAgICAgc2VsZi53cml0ZVZhbHVlKGUpO1xyXG4gICAgICBzZWxmLnRleHRvUGVzcXVpc2EgPSBzZWxmLnNlbGVjdGVkSXRlbVtzZWxmLmNhbXBvRGlzcGxheV07XHJcbiAgICAgIGlmIChlICE9IG51bGwpIHtcclxuICAgICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHNlbGYucGVzcXVpc2FDaGFuZ2UgIT0gbnVsbCkge1xyXG4gICAgICAgICAgc2VsZi5wZXNxdWlzYUNoYW5nZS5lbWl0KHNlbGYuc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBzZWxmLnNlbGVjdEVsZW1lbnRWaXNpdmVsID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkcm9wRG93blBlc3F1aXNhKGxlbmd0aDogbnVtYmVyKSB7XHJcbiAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICBpZiAoc2VsZi5saXN0YVBlc3F1aXNhICE9IG51bGwgJiYgc2VsZi5saXN0YVBlc3F1aXNhLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKGxlbmd0aCA9PSAtMSkge1xyXG4gICAgICAgIGxlbmd0aCA9IHNlbGYubGlzdGFQZXNxdWlzYS5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGxlbmd0aCA9PSAwID8gZmFsc2UgOiB0cnVlO1xyXG5cclxuICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLnNlbGVjdEVsZW1lbnQpO1xyXG4gICAgICAvL3RoaXMuc2VsZWN0RWxlbWVudC5vcGVuKCk7XHJcblxyXG4gICAgICAvKlxyXG4gICAgICAvL2xldCBlbGVtZW50ID0gdGhpcy5zZWxlY3RFbGVtZW50O1xyXG4gICAgICBsZXQgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2VsZWN0SWQpO1xyXG4gICAgICBjb25zb2xlLmxvZygnZHJvcERvd24nLCBlbGVtZW50KTtcclxuICAgICAgKGVsZW1lbnQgYXMgYW55KS5zaXplID0gbGVuZ3RoICsgMTtcclxuICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgc2VsZi5zZWxlY3RFbGVtZW50VmlzaXZlbCA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGYuc2VsZWN0RWxlbWVudFZpc2l2ZWwgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgICovXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwZXNxdWlzYXJFbnRpZGFkZShmaWx0cm86IHN0cmluZykge1xyXG4gICAgbGV0IHVybCA9IHRoaXMudXJsLnJlcGxhY2UoJzw8RklMVFJPPj4nLCBmaWx0cm8pLnJlcGxhY2UoJzw8RU1QUkVTQT4+JywgdGhpcy5lbXByZXNhLnRvU3RyaW5nKCkpO1xyXG4gICAgY29uc29sZS5sb2coJ3Blc3F1aXNhckVudGlkYWRlIHVybCcsIHVybCk7XHJcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcclxuICAgIHRoaXMucGVzcXVpc2FTdWJqZWN0Lm5leHQodXJsKTtcclxuICB9XHJcblxyXG4gIHBlc3F1aXNhckVudGlkYWRlT2xkKGZpbHRybzogc3RyaW5nKSB7XHJcbiAgICBsZXQgdXJsID0gdGhpcy51cmwucmVwbGFjZSgnPDxGSUxUUk8+PicsIGZpbHRybykucmVwbGFjZSgnPDxFTVBSRVNBPj4nLCB0aGlzLmVtcHJlc2EudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyRW50aWRhZGUgdXJsJywgdXJsKTtcclxuICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IGZhbHNlO1xyXG4gICAgdGhpcy5odHRwQ2xpZW50LmdldDxhbnk+KHVybClcclxuICAgICAgLnN1YnNjcmliZSh7IG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vdGhpcy5saXN0YVBlc3F1aXNhID0gcmVzdWx0O1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlckZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKHRoaXMuZmlsdGVyRnVuY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EgPSBbXTtcclxuICAgICAgICByZXN1bHQuZm9yRWFjaCgoZW50OiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIHRoaXMubGlzdGFQZXNxdWlzYS5wdXNoKHsgLi4uZW50LCBJbmRleDogaW5kZXgsIFNlbGVjdGVkOiBmYWxzZSB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2RlUGVzcXVpc2FyID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5saXN0YVBlc3F1aXNhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSh0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yOiBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5wb2RlUGVzcXVpc2FyID0gdHJ1ZTtcclxuICAgICAgfX0pO1xyXG4gIH1cclxuXHJcbiAgZXhpc3RlTmFMaXN0YShpZDogbnVtYmVyLCBzZXRSZWdpc3RybzogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5saXN0YVBlc3F1aXNhICYmIHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxldCBleGlzdGUgPSB0aGlzLmxpc3RhUGVzcXVpc2EuZmluZChsID0+IGxbdGhpcy5jYW1wb0lkXSA9PT0gaWQpO1xyXG4gICAgICBpZiAoZXhpc3RlKSB7XHJcbiAgICAgICAgaWYgKHNldFJlZ2lzdHJvKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGV4aXN0ZTtcclxuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4aXN0ZU5hTGlzdGFUZXh0byh0ZXh0bzogc3RyaW5nLCBzZXRSZWdpc3RybzogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zb2xlLmxvZyhcImV4aXN0ZSB0ZXh0bzpcIiwgdGV4dG8sIHRoaXMuY2FtcG9EaXNwbGF5LCB0aGlzLmxpc3RhUGVzcXVpc2EpO1xyXG4gICAgaWYgKHRoaXMubGlzdGFQZXNxdWlzYSAmJiB0aGlzLmxpc3RhUGVzcXVpc2EubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZXhpc3RlID0gdGhpcy5saXN0YVBlc3F1aXNhLmZpbmQobCA9PiBsW3RoaXMuY2FtcG9EaXNwbGF5XS50b1VwcGVyQ2FzZSgpID09PSB0ZXh0by50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgaWYgKGV4aXN0ZSkge1xyXG4gICAgICAgIGlmIChzZXRSZWdpc3Rybykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBleGlzdGU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGFySXRlbVNlbGVjaW9uYWRvKHNldGFyUmVnaXN0cm86IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc29sZS5sb2coJ3ZhbGlkYXIgc2VsZWNpb25hZG8nKTtcclxuICAgIC8vcGFzc2FyIHBlbGEgZnVuw6fDo28gZGUgZmlsdHJvXHJcbiAgICBsZXQgdmFsaWRvID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyRnVuY3Rpb24pIHtcclxuICAgICAgICBsZXQgZXhpc3RlID0gW3sgLi4udGhpcy5zZWxlY3RlZEl0ZW0gfV0uZmlsdGVyKHRoaXMuZmlsdGVyRnVuY3Rpb24pO1xyXG4gICAgICAgIGlmIChleGlzdGUgIT0gbnVsbCAmJiBleGlzdGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdmFsaWRvID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdmFsaWRvID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsaWRvICYmIHNldGFyUmVnaXN0cm8pIHtcclxuICAgICAgICB0aGlzLnNlbGVjaW9uYXJDb21ib0NsaWNrKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHZhbGlkbztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhcnJlZ2FJdGVtSWRQYXJhTGlzdGEoaWQ6IG51bWJlcikge1xyXG4gICAgbGV0IHVybCA9IHRoaXMudXJsSXRlbS5yZXBsYWNlKCc8PElEPj4nLCBpZC50b1N0cmluZygpKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMudXJsSXRlbSk7XHJcbiAgICBjb25zb2xlLmxvZygncGVzcXVpc2FyIElEIHVybCcsIHVybCk7XHJcbiAgICB0aGlzLnBvZGVQZXNxdWlzYXIgPSBmYWxzZTtcclxuICAgIHRoaXMuaHR0cENsaWVudC5nZXQ8YW55Pih1cmwpXHJcbiAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EgPSBbXTtcclxuICAgICAgICB0aGlzLmxpc3RhUGVzcXVpc2EucHVzaCh7IC4uLnJlc3VsdCwgSW5kZXg6IDAsIFNlbGVjdGVkOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMucG9kZVBlc3F1aXNhciA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMubGlzdGFQZXNxdWlzYS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMubGlzdGFQZXNxdWlzYVswXTtcclxuICAgICAgICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgZXJyb3I6ICBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm8gcGVzcXVpc2EnLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5wb2RlUGVzcXVpc2FyID0gdHJ1ZTtcclxuICAgICAgfX0pO1xyXG4gIH1cclxuXHJcbiAgbGltcGFyQ2xpY2soKSB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUobnVsbCk7XHJcbiAgICB0aGlzLndyaXRlUGVzcXVpc2EobnVsbCk7XHJcbiAgICB0aGlzLmxpc3RhUGVzcXVpc2EgPSBbXTtcclxuICAgIHRoaXMuZHJvcERvd25QZXNxdWlzYSgwKTtcclxuICAgIC8vdGhpcy5wb2RlUGVzcXVpc2FyID0gdHJ1ZTtcclxuICAgIHRoaXMucGVzcXVpc2FTdWJqZWN0Lm5leHQoJycpO1xyXG4gICAgaWYgKHRoaXMubGltcGFyKSB7XHJcbiAgICAgIHRoaXMubGltcGFyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2ZXJpZmljYXJQZXNxdWlzYSgpIHtcclxuICAgIC8vVE9ETzogdmVyaWZpY2FyIHNlIG8gdGV4dG8gY29ycmVzcG9uZGUgY29tIHVtIGl0ZW0gZGEgbGlzdGFcclxuICAgIHRoaXMuc2VsZWNpb25hckNvbWJvQ2xpY2sobnVsbCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwZXNxdWlzYXJDbGljaygpIHtcclxuICAgIC8qXHJcbiAgICBpZiAodGhpcy5wZXNxdWlzYUFjdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMucGVzcXVpc2FBY3Rpb24oKTtcclxuICAgIH1cclxuICAgICovXHJcbiAgICAvL3Blc3F1aXNhQ2F0ZWdvcmlhXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmZpbHRlckZ1bmN0aW9uLCB0aGlzLnVybCwgdGhpcy51cmxUcmVlKTtcclxuXHJcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XHJcbiAgICAgIGNvbXBvbmVudDogTW9kZWxUcmVldmlld0NvbXBvbmVudCxcclxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcclxuICAgICAgICAvL2NhbXBvSWQ6IHRoaXMuY2FtcG9JZCxcclxuICAgICAgICAvL2NhbXBvUGFpOiB0aGlzLmNhbXBvUGFpSWQsXHJcbiAgICAgICAgLy9jYW1wb0xhYmVsOiB0aGlzLmNhbXBvRGlzcGxheSxcclxuICAgICAgICBmaWx0ZXJGdW5jdGlvbjogdGhpcy5maWx0ZXJGdW5jdGlvbixcclxuICAgICAgICBlbXByZXNhU2VsZWNpb25hZGFJZDogdGhpcy5lbXByZXNhLFxyXG4gICAgICAgIHRpcG86IHRoaXMudGlwbyxcclxuICAgICAgICAvL2VzcGVjaWZpY29cclxuICAgICAgICAvL3BsYW5vQ29udGFzOiB0aGlzLnBsYW5vQ29udGFzLFxyXG4gICAgICAgIHVybDogdGhpcy5pc0VtcHR5KHRoaXMudXJsVHJlZSkgPyB0aGlzLnVybCA6IHRoaXMudXJsVHJlZVxyXG4gICAgICB9LFxyXG4gICAgICBjc3NDbGFzczogJ215LWN1c3RvbS1tb2RhbC1wZXNxdWlzYSdcclxuICAgIH0pO1xyXG5cclxuICAgIG1vZGFsLm9uRGlkRGlzbWlzcygpLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBkYXRhWydkYXRhJ107XHJcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XHJcbiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuSWQgPiAwKSB7XHJcbiAgICAgICAgdGhpcy5jYXJyZWdhSXRlbUlkUGFyYUxpc3RhKHJlc3VsdC5JZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbW9kYWwucHJlc2VudCgpO1xyXG5cclxuICB9XHJcblxyXG4gIGlzRW1wdHkodmFsb3I6IHN0cmluZyB8IGFueSkge1xyXG4gICAgcmV0dXJuIHZhbG9yID09IG51bGwgfHwgdmFsb3IgPT0gdW5kZWZpbmVkIHx8IHZhbG9yID09ICcnXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgc3R5bGU9XCJwYWRkaW5nLWlubGluZS1lbmQ6IDBweDtcIj5cclxuICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiBzdHlsZT1cIi0tYmFja2dyb3VuZDogaW5oZXJpdGVkOyAtLWJhY2tncm91bmQtZm9jdXNlZDogdHJhbnNwYXJlbnQ7IG1hcmdpbi10b3A6IDJweDtcIiBbY2xhc3NdPVwiaXRlbUNsYXNzXCI+XHJcbiAgICAgIDxpb24tbGFiZWwgcG9zaXRpb249XCJ7eyBsYWJlbFBvc2l0aW9uIH19XCIgY29sb3I9XCJ7eyBsYWJlbENvbG9yIH19XCI+e3sgbGFiZWwgfX08L2lvbi1sYWJlbD5cclxuICAgICAgPCEtLSBmb3JtQ29udHJvbE5hbWU9XCJ7eyBjYW1wbyB9fVwiICAtLT5cclxuICAgICAgPGlvbi1zcGlubmVyICpuZ0lmPVwiIXBvZGVQZXNxdWlzYXJcIlxyXG4gICAgICAgIHN0eWxlPVwiLS1taW4taGVpZ2h0OiAwcHggIWltcG9ydGFudDsgbWFyZ2luLWlubGluZS1lbmQ6IDVweCAhaW1wb3J0YW50OyBtYXJnaW4tdG9wOiAxNnB4O1wiIFxyXG4gICAgICAgIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJsaW5lc1wiPjwvaW9uLXNwaW5uZXI+XHJcbiAgICAgIDwhLS0gKGlvbkJsdXIpPVwidmVyaWZpY2FyUGVzcXVpc2EoKVwiIC0tPlxyXG4gICAgICA8IS0tIGNvbmZsaXRvIGNvbSBjbGljayBkYSBsaXN0YSAtLT5cclxuICAgICAgPGlvbi1pbnB1dCAjaW5wdXRQZXNxdWlzYVxyXG4gICAgICAgIHR5cGU9XCJ7e3R5cGV9fVwiIFxyXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIFxyXG4gICAgICAgIG1heGxlbmd0aD1cInt7IG1heCB9fVwiIFxyXG4gICAgICAgIChpb25CbHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICBbdmFsdWVdPVwidGV4dG9QZXNxdWlzYVwiIChpbnB1dCk9XCJ3cml0ZVBlc3F1aXNhKGlucHV0UGVzcXVpc2EudmFsdWUpXCIgXHJcbiAgICAgICAgKGtleXVwKT1cInNob3dQZXNxdWlzYSgkZXZlbnQpXCJcclxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBbc3R5bGUuLS1iYWNrZ3JvdW5kXT1cImlucHV0QmFja2dyb3VuZ0NvbG9yXCJcclxuICAgICAgICAoY2xpY2spPVwiZHJvcERvd25QZXNxdWlzYSgtMSlcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJyZWFkb25seVwiIGRlYm91bmNlPVwiNTAwXCI+PC9pb24taW5wdXQ+XHJcbiAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIHNsb3Q9XCJlbmRcIiB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDI1cHg7IG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDRweCAhaW1wb3J0YW50OyAtLXBhZGRpbmctc3RhcnQ6MnB4OyAtLXBhZGRpbmctZW5kOiAycHg7XCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJtZWRpdW1cIlxyXG4gICAgICAgIChjbGljayk9XCJsaW1wYXJDbGljaygpXCI+XHJcbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gIFxyXG4gICAgICA8IS0tXHJcbiAgICAgIDxpb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIHNsb3Q9XCJlbmRcIiB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICBzdHlsZT1cIm1hcmdpbi10b3A6IDI1cHg7IG1hcmdpbi1pbmxpbmUtc3RhcnQ6IDRweCAhaW1wb3J0YW50OyAtLXBhZGRpbmctc3RhcnQ6MnB4OyAtLXBhZGRpbmctZW5kOiAycHg7XCIgZmlsbD1cImNsZWFyXCIgY29sb3I9XCJtZWRpdW1cIlxyXG4gICAgICAgIChjbGljayk9XCJwZXNxdWlzYXJDbGljaygpXCI+XHJcbiAgICAgICAgPGlvbi1pY29uIGNvbG9yPVwicHJpbWFyeVwiIG5hbWU9XCJzZWFyY2hcIj48L2lvbi1pY29uPlxyXG4gICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgIC0tPlxyXG4gICAgICBcclxuICAgIDwvaW9uLWl0ZW0+XHJcbiAgXHJcbiAgICA8aW9uLWxpc3QgdGFiaW5kZXg9XCItMVwiIFtoaWRkZW5dPVwiIXNlbGVjdEVsZW1lbnRWaXNpdmVsIHx8ICFsaXN0YVBlc3F1aXNhIHx8IGxpc3RhUGVzcXVpc2EubGVuZ3RoID09IDBcIiBjbGFzcz1cInBlc3F1aXNhLWxpc3RcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1MHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICBcclxuICAgICAgPGlvbi1pdGVtIHRhYmluZGV4PVwiLTFcIiBidXR0b24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGlzdGFQZXNxdWlzYVwiIFxyXG4gICAgICAoY2xpY2spPVwic2VsZWNpb25hckNvbWJvQ2xpY2soaXRlbSlcIiBbaWRdPVwic2VsZWN0SWQgKyAnSW9uSXRlbScgKyBpdGVtWydJbmRleCddXCJcclxuICAgICAgICBjbGFzcz1cInBlc3F1aXNhLWl0ZW1cIj5cclxuICAgICAgICA8IS0tIHt7IGl0ZW0gfCBqc29ufX0gLS0+XHJcbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cInsnc2VsZWN0ZWQtaXRlbSc6IGl0ZW1bJ1NlbGVjdGVkJ10gPT09IHRydWV9XCIgW2lubmVySFRNTF09XCJoaWdobGlnaHQoaXRlbVtjYW1wb0Rpc3BsYXldKVwiPjwvc3Bhbj5cclxuICAgICAgPC9pb24taXRlbT5cclxuICBcclxuICAgIDwvaW9uLWxpc3Q+XHJcbiAgXHJcbiAgICA8IS0tXHJcbiAgICA8aW9uLXNlbGVjdCBpbnRlcmZhY2U9XCJwb3BvdmVyXCIgI3NlbGVjdEVsZW1lbnQgdGFiaW5kZXg9XCItMVwiIFtoaWRkZW5dPVwiIXNlbGVjdEVsZW1lbnRWaXNpdmVsXCJcclxuICAgICAgKGlvbkNoYW5nZSk9XCJzZWxlY2lvbmFyQ29tYm9DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSlcIj5cclxuICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGxpc3RhUGVzcXVpc2FcIiBbdmFsdWVdPVwiaXRlbVtjYW1wb0lkXVwiIChjbGljayk9XCJzZWxlY2lvbmFyQ29tYm9DbGljayhpdGVtW2NhbXBvSWRdKVwiPlxyXG4gICAgICAgIHt7IGl0ZW1bY2FtcG9EaXNwbGF5XSB9fVxyXG4gICAgICA8L2lvbi1zZWxlY3Qtb3B0aW9uPlxyXG4gICAgPC9pb24tc2VsZWN0PlxyXG4gICAgLS0+XHJcbiAgXHJcbiAgICA8IS0tXHJcbiAgICA8c2VsZWN0IFtpZF09XCJzZWxlY3RJZFwiICNzZWxlY3RFbGVtZW50IHRhYmluZGV4PVwiLTFcIiBbaGlkZGVuXT1cIiFzZWxlY3RFbGVtZW50VmlzaXZlbFwiXHJcbiAgICAgIChjaGFuZ2UpPVwic2VsZWNpb25hckNvbWJvQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpXCIgY2xhc3M9XCJwZXNxdWlzYS1zZWxlY3RcIj5cclxuICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0YVBlc3F1aXNhXCIgW3ZhbHVlXT1cIml0ZW1bY2FtcG9JZF1cIiAoY2xpY2spPVwic2VsZWNpb25hckNvbWJvQ2xpY2soaXRlbVtjYW1wb0lkXSlcIj5cclxuICAgICAgICB7eyBpdGVtW2NhbXBvRGlzcGxheV0gfX1cclxuICAgICAgPC9vcHRpb24+XHJcbiAgXHJcbiAgICA8L3NlbGVjdD5cclxuICAgIC0tPlxyXG4gIFxyXG4gICAgPGRpdiBjbGFzcz1cInZhbGlkYXRpb24tZXJyb3JzXCIgKm5nSWY9XCJmb3JtXCI+XHJcbiAgXHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhbGlkYXRpb24gb2YgdmFsaWRhdGlvbl9tZXNzYWdlc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCJcclxuICAgICAgICAgICpuZ0lmPVwiZm9ybS5nZXQoZm9ybUNvbnRyb2xOYW1lKT8uaGFzRXJyb3IodmFsaWRhdGlvbi50eXBlKSAmJiAoZm9ybS5nZXQoZm9ybUNvbnRyb2xOYW1lKT8uZGlydHkgfHwgZm9ybS5nZXQoZm9ybUNvbnRyb2xOYW1lKT8udG91Y2hlZClcIj5cclxuICAgICAgICAgICYjODIyNjsge3sgdmFsaWRhdGlvbi5tZXNzYWdlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+Il19