@stiunb/unb-lib-components 18.0.23 → 18.0.25

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 (26) hide show
  1. package/README.md +27 -0
  2. package/esm2022/lib/unb-mensagem/unb-mensagem.component.mjs +18 -26
  3. package/esm2022/lib/unb-mensagem/unb-mensagem.service.mjs +16 -21
  4. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.mjs +60 -29
  5. package/esm2022/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.mjs +4 -4
  6. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.mjs +98 -67
  7. package/esm2022/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.mjs +4 -4
  8. package/esm2022/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.mjs +111 -96
  9. package/esm2022/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.mjs +98 -38
  10. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.mjs +57 -29
  11. package/esm2022/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.mjs +4 -4
  12. package/esm2022/lib/unb-pessoa/unb-pessoa.service.mjs +141 -45
  13. package/fesm2022/stiunb-unb-lib-components.mjs +556 -321
  14. package/fesm2022/stiunb-unb-lib-components.mjs.map +1 -1
  15. package/lib/unb-mensagem/unb-mensagem.component.d.ts +3 -17
  16. package/lib/unb-mensagem/unb-mensagem.service.d.ts +16 -18
  17. package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-form.d.ts +6 -2
  18. package/lib/unb-pessoa/unb-pessoa-email-form/unb-pessoa-email-list.d.ts +2 -5
  19. package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-form.d.ts +6 -3
  20. package/lib/unb-pessoa/unb-pessoa-endereco-form/unb-pessoa-endereco-list.d.ts +2 -5
  21. package/lib/unb-pessoa/unb-pessoa-form/unb-pessoa-form.component.d.ts +16 -10
  22. package/lib/unb-pessoa/unb-pessoa-pesquisar/unb-pessoa-pesquisar.component.d.ts +21 -11
  23. package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-form.d.ts +6 -4
  24. package/lib/unb-pessoa/unb-pessoa-telefone-form/unb-pessoa-telefone-list.d.ts +2 -5
  25. package/lib/unb-pessoa/unb-pessoa.service.d.ts +9 -13
  26. package/package.json +2 -3
@@ -1,29 +1,30 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { UnbTipoMensagemEnum } from '../../unb-mensagem/unb-mensagem.service';
2
3
  import { listaEstados } from '../pessoa-tabelas-apoio';
3
4
  import { UnbPessoaEmail } from '../unb-pessoa-models/unb-pessoa-email.model';
4
5
  import { UnbPessoaEndereco } from '../unb-pessoa-models/unb-pessoa-endereco.model';
5
6
  import { UnbPessoaModel } from '../unb-pessoa-models/unb-pessoa.model';
6
7
  import { TipoPessoaEnum } from '../unb-tipo-pessoa.enum';
7
- import { UnbTipoMensagemEnum } from '../../unb-mensagem/unb-mensagem.service';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "../unb-pessoa.service";
10
10
  import * as i2 from "@angular/material/snack-bar";
11
11
  import * as i3 from "../../unb-mensagem/unb-mensagem.service";
12
12
  import * as i4 from "@angular/common";
13
13
  import * as i5 from "@angular/forms";
14
- import * as i6 from "@angular/material/button";
15
- import * as i7 from "../../unb-mensagem/unb-mensagem.component";
16
- import * as i8 from "@angular/material/card";
17
- import * as i9 from "@angular/material/form-field";
18
- import * as i10 from "@angular/material/input";
19
- import * as i11 from "@angular/material/select";
20
- import * as i12 from "@angular/material/core";
21
- import * as i13 from "@angular/material/progress-bar";
22
- import * as i14 from "@angular/material/datepicker";
23
- import * as i15 from "../unb-pessoa-pesquisar/unb-pessoa-pesquisar.component";
24
- import * as i16 from "../unb-pessoa-telefone-form/unb-pessoa-telefone-list";
25
- import * as i17 from "../unb-pessoa-endereco-form/unb-pessoa-endereco-list";
26
- import * as i18 from "../unb-pessoa-email-form/unb-pessoa-email-list";
14
+ import * as i6 from "@angular/material/icon";
15
+ import * as i7 from "@angular/material/button";
16
+ import * as i8 from "../../unb-mensagem/unb-mensagem.component";
17
+ import * as i9 from "@angular/material/card";
18
+ import * as i10 from "@angular/material/form-field";
19
+ import * as i11 from "@angular/material/input";
20
+ import * as i12 from "@angular/material/select";
21
+ import * as i13 from "@angular/material/core";
22
+ import * as i14 from "@angular/material/progress-bar";
23
+ import * as i15 from "@angular/material/datepicker";
24
+ import * as i16 from "../unb-pessoa-pesquisar/unb-pessoa-pesquisar.component";
25
+ import * as i17 from "../unb-pessoa-telefone-form/unb-pessoa-telefone-list";
26
+ import * as i18 from "../unb-pessoa-endereco-form/unb-pessoa-endereco-list";
27
+ import * as i19 from "../unb-pessoa-email-form/unb-pessoa-email-list";
27
28
  export class UnbPessoaFormComponent {
28
29
  constructor(service, snackBar, alertService) {
29
30
  this.service = service;
@@ -39,18 +40,28 @@ export class UnbPessoaFormComponent {
39
40
  // Quando verdadeiro, o formulário e ações ficam desabilitados porque os dados
40
41
  // devem ser alterados apenas pelo app SouGov (matricula SIAPE presente)
41
42
  this.isReadonlyFromSiape = false;
42
- this.apiPessoaConfig = { url: '', token: '' };
43
+ this.backendURL = "";
43
44
  this.pesquisarPorCPF = true;
44
45
  this.pesquisarPorCNPJ = true;
45
46
  this.pesquisarPorEstrangeiro = true;
46
47
  this.campoPesquisaMaxWidth = '400px';
48
+ this.pessoaEmitted = new EventEmitter();
49
+ this.isLoadingChange = new EventEmitter();
50
+ this.idMensagemService = "unbPessoaForm";
51
+ // Controla se está incluindo nova pessoa ou editando existente
52
+ this.documentoPesquisado = '';
53
+ this.incluindoNovaPessoa = false;
54
+ this.editandoPessoa = false;
47
55
  }
48
56
  ngOnInit() {
49
- if (this.apiPessoaConfig.url.endsWith('/')) {
50
- this.apiPessoaConfig.url = this.apiPessoaConfig.url.slice(0, -1);
57
+ this.alertService.hideMessage(this.idMensagemService);
58
+ if (this.backendURL == "") {
59
+ this.handleErrorPrintConsole("[UnbPessoaPesquisarComponent] ERROR: apiPessoaConfig.url está null. Insira o parâmetro (apiPessoaConfig) com o valor válido!");
60
+ return;
61
+ }
62
+ else {
63
+ this.service.setBackendUrl(this.backendURL);
51
64
  }
52
- this.alertService.hideMessage();
53
- this.service.setApiConfig(this.apiPessoaConfig);
54
65
  // atencao, o pessoaRecebida que inicializa esse componente
55
66
  this.escolaridade = this.service.getEscolaridade();
56
67
  this.paises = this.service.getPaises();
@@ -59,7 +70,11 @@ export class UnbPessoaFormComponent {
59
70
  pessoaRecebida(pessoaRecebida) {
60
71
  this.buscaRealizada = true;
61
72
  this.pessoa = pessoaRecebida;
62
- this.alertService.hideMessage();
73
+ this.alertService.hideMessage(this.idMensagemService);
74
+ // Reseta o formulário quando uma nova pessoa é recebida
75
+ if (this.pessoaForm) {
76
+ this.pessoaForm.resetForm();
77
+ }
63
78
  // inicializa pra nao quebrar
64
79
  if (!this.pessoa.enderecos)
65
80
  this.pessoa.enderecos = [];
@@ -67,46 +82,50 @@ export class UnbPessoaFormComponent {
67
82
  this.pessoa.emails = [];
68
83
  if (!this.pessoa.telefones)
69
84
  this.pessoa.telefones = [];
70
- // Se a pessoa vier com matriculaSiape preenchido, colocamos o formulário em modo somente-leitura
71
- // e mostraremos uma mensagem informativa na UI. Também desabilita ações de salvar.
72
- if (this.pessoa && this.pessoa.matriculaSiape !== undefined && this.pessoa.matriculaSiape !== null && this.pessoa.matriculaSiape !== 0) {
73
- this.isReadonlyFromSiape = true;
74
- // opcional: informar via snackBar também
75
- this.openSnackBar('Servidor com matriculla SIAPE deve ter seus dados autalizados pelo aplicativo do sougov.');
76
- }
77
- else {
78
- this.isReadonlyFromSiape = false;
85
+ // 1. Verifica se é um registro que existe no banco
86
+ const existeRegistro = !!this.pessoa?.codigoPessoa;
87
+ // 2. Verifica se é bloqueado pelo SIAPE (Só faz sentido se o registro existir)
88
+ this.isReadonlyFromSiape = existeRegistro && !!this.pessoa?.matriculaSiape;
89
+ // 3. Define o documento (usando aquele mapa limpo)
90
+ const docMap = {
91
+ [TipoPessoaEnum.FISICA]: this.pessoa.cpf,
92
+ [TipoPessoaEnum.JURIDICA]: this.pessoa.cnpj,
93
+ [TipoPessoaEnum.ESTRANGEIRA]: this.pessoa.passaporte
94
+ };
95
+ this.documentoPesquisado = docMap[this.pessoa.tipoPessoa] || '';
96
+ // 4. (Opcional) Snackbar se for SIAPE
97
+ if (this.isReadonlyFromSiape) {
98
+ this.openSnackBar('Dados importados do SIAPE não podem ser alterados.');
79
99
  }
80
100
  }
81
101
  salvar(form) {
82
- this.alertService.hideMessage();
102
+ this.alertService.hideMessage(this.idMensagemService);
103
+ // Suas validações
83
104
  if (!this.validar(form))
84
105
  return;
85
- if (!this.service)
86
- return;
87
106
  this.isLoading = true;
107
+ this.isLoadingChange.emit(true);
88
108
  const payload = this.convertPessoaToPayload(this.pessoa);
89
- let result = this.service.salvar(payload, this.pessoa.tipoPessoa);
90
- if (result && typeof result.subscribe === 'function') {
91
- // Use o formato 'next/error' para clareza
92
- result.subscribe({
93
- next: (resposta) => {
94
- this.isLoading = false;
95
- this.alertService.showMessage("<strong>Registro salvo com sucesso!</strong>", UnbTipoMensagemEnum.SUCCESS);
96
- if (resposta) {
97
- this.pessoa.codigoPessoa = resposta.codigoPessoa || this.pessoa.codigoPessoa;
98
- this.pessoa.idPessoa = resposta.idPessoa || this.pessoa.idPessoa;
99
- }
100
- },
101
- error: (err) => {
102
- this.erro(err);
109
+ // O service já tem o .pipe(catchError) interno, então o erro chega tratado
110
+ this.service.salvar(payload, this.pessoa.tipoPessoa)
111
+ .subscribe({
112
+ next: (resposta) => {
113
+ this.isLoading = false;
114
+ this.isLoadingChange.emit(false);
115
+ // Mensagem de Sucesso
116
+ this.alertService.showMessage("<strong>Registro salvo com sucesso!</strong>", UnbTipoMensagemEnum.SUCCESS, this.idMensagemService);
117
+ // Atualiza dados retornados (IDs gerados)
118
+ if (resposta) {
119
+ this.pessoa.codigoPessoa = resposta.codigoPessoa || this.pessoa.codigoPessoa;
120
+ this.pessoa.idPessoa = resposta.idPessoa || this.pessoa.idPessoa;
121
+ this.pessoaEmitted.emit(this.pessoa);
103
122
  }
104
- });
105
- }
106
- else {
107
- console.error("Erro: O método salvar() não retornou um Observable.");
108
- this.isLoading = false; // Garante que o loading pare
109
- }
123
+ },
124
+ error: (err) => {
125
+ // AQUI: O 'err' já chega limpo com { mensagemSimples, mensagemHtml }
126
+ this.handleError(err);
127
+ }
128
+ });
110
129
  }
111
130
  validar(form) {
112
131
  if (!this.pessoa) {
@@ -168,45 +187,6 @@ export class UnbPessoaFormComponent {
168
187
  emailsEmitted(emails) {
169
188
  this.pessoa.emails = emails;
170
189
  }
171
- erro(erro) {
172
- this.isLoading = false;
173
- const errorResponse = erro.error;
174
- // 1. Tratamento para Erros de Validação (que contêm o array 'detalhes')
175
- if (errorResponse && errorResponse.detalhes && Array.isArray(errorResponse.detalhes) && errorResponse.detalhes.length > 0) {
176
- // Mensagem genérica para o SnackBar
177
- this.openSnackBar("O formulário possui erro(s). Por favor, verificar.");
178
- // Constrói a mensagem HTML detalhada para o AlertService
179
- const criticasHtml = errorResponse.detalhes.map((det) => {
180
- // Formata cada erro como um item de lista
181
- return `<li><strong>${det.nomeCampo}:</strong> ${det.critica}</li>`;
182
- }).join('');
183
- // Cria a mensagem final, envolvendo os erros em uma tag <ul>
184
- const detailedHtmlMessage = `<strong>Erros de Validação:</strong> <ul>${criticasHtml}</ul>`;
185
- // Mostra os detalhes formatados no AlertService
186
- this.alertService.showMessage(detailedHtmlMessage, UnbTipoMensagemEnum.DANGER);
187
- }
188
- // 2. Tratamento para Outros Tipos de Erro (sem o array 'detalhes')
189
- else {
190
- let errorMessage = 'Ocorreu um erro desconhecido.'; // Mensagem padrão
191
- // Tenta extrair a mensagem de erro específica
192
- if (errorResponse) {
193
- if (errorResponse.mensagem) {
194
- errorMessage = errorResponse.mensagem;
195
- }
196
- else if (errorResponse.detail) {
197
- errorMessage = errorResponse.detail;
198
- }
199
- }
200
- else if (erro.message) {
201
- errorMessage = erro.message;
202
- }
203
- // Mostra uma mensagem genérica no SnackBar
204
- this.openSnackBar('Ocorreu um erro ao processar sua solicitação.');
205
- // Mostra o erro específico no AlertService, como você sugeriu
206
- let erroStrong = "<strong>" + errorMessage + "</strong>";
207
- this.alertService.showMessage(erroStrong, UnbTipoMensagemEnum.DANGER);
208
- }
209
- }
210
190
  openSnackBar(message) {
211
191
  this.snackBar.open(message, 'x', {
212
192
  duration: 5000,
@@ -329,13 +309,44 @@ export class UnbPessoaFormComponent {
329
309
  return null;
330
310
  }
331
311
  }
312
+ handleErrorPrintConsole(erro) {
313
+ console.log(erro);
314
+ this.handleError(erro);
315
+ }
316
+ handleError(erro) {
317
+ this.isLoading = false;
318
+ this.isLoadingChange.emit(false);
319
+ // 1. Mostra a mensagem curta/simples no SnackBar (Fundo da tela)
320
+ // Ex: "O formulário possui erros de validação." ou "Sessão expirada."
321
+ if (erro.mensagemSimples) {
322
+ this.openSnackBar(erro.mensagemSimples);
323
+ }
324
+ // 2. Mostra a mensagem detalhada HTML no componente <unb-mensagem>
325
+ // Ex: Lista com <ul><li>Campo Data inválido...</li></ul>
326
+ if (this.alertService && erro.mensagemHtml) {
327
+ // Se o seu alertService suportar ID do componente alvo, passe aqui.
328
+ // Caso contrário, ele mostra no componente padrão.
329
+ this.alertService.showMessage(erro.mensagemHtml, UnbTipoMensagemEnum.DANGER, this.idMensagemService);
330
+ }
331
+ }
332
+ getLabelDocumento() {
333
+ switch (this.pessoa.tipoPessoa) {
334
+ case this.tipoPessoaEnum().FISICA: return 'CPF';
335
+ case this.tipoPessoaEnum().JURIDICA: return 'CNPJ';
336
+ case this.tipoPessoaEnum().ESTRANGEIRA: return 'Passaporte';
337
+ default: return 'Documento';
338
+ }
339
+ }
332
340
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, deps: [{ token: i1.UnBPessoaService }, { token: i2.MatSnackBar }, { token: i3.UnbMensagemService }], target: i0.ɵɵFactoryTarget.Component }); }
333
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { apiPessoaConfig: "apiPessoaConfig", defaultTipoPessoa: "defaultTipoPessoa", pesquisarPorCPF: "pesquisarPorCPF", pesquisarPorCNPJ: "pesquisarPorCNPJ", pesquisarPorEstrangeiro: "pesquisarPorEstrangeiro", campoPesquisaMaxWidth: "campoPesquisaMaxWidth" }, ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\">\r\n <lib-unb-pessoa-pesquisar [apiPessoaConfig]=\"apiPessoaConfig\" [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\" (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem></unb-mensagem>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada && apiPessoaConfig.url\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento.identificador\">\r\n {{ ufNascimento.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\"\r\n [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\"\r\n [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo"] }, { kind: "component", type: i8.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i8.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i8.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i13.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i14.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i14.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i14.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i15.UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["apiPessoaConfig", "pesquisarPorCPF", "pesquisarPorCNPJ", "pesquisarPorEstrangeiro", "defaultTipoPessoa", "campoPesquisaMaxWidth", "pessoa", "mostrarPesquisa", "limparAposPesquisa", "label", "placeholder", "hint"], outputs: ["pessoaEmitted"] }, { kind: "component", type: i16.UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "apiPessoaConfig"], outputs: ["telefonesEmitted"] }, { kind: "component", type: i17.UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "apiPessoaConfig"], outputs: ["enderecosEmitted"] }, { kind: "component", type: i18.UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "apiPessoaConfig"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
341
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.2", type: UnbPessoaFormComponent, selector: "lib-unb-pessoa-form", inputs: { backendURL: "backendURL", defaultTipoPessoa: "defaultTipoPessoa", pesquisarPorCPF: "pesquisarPorCPF", pesquisarPorCNPJ: "pesquisarPorCNPJ", pesquisarPorEstrangeiro: "pesquisarPorEstrangeiro", campoPesquisaMaxWidth: "campoPesquisaMaxWidth" }, outputs: { pessoaEmitted: "pessoaEmitted", isLoadingChange: "isLoadingChange" }, viewQueries: [{ propertyName: "pessoaForm", first: true, predicate: ["pessoaForm"], descendants: true }], ngImport: i0, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar [backendURL]=\"backendURL\" [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\" [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\" [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\"\r\n (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadonlyFromSiape,\r\n 'status-bloqueado': isReadonlyFromSiape\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadonlyFromSiape ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadonlyFromSiape\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadonlyFromSiape\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container>\r\n\r\n com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n\r\n</div>\r\n\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0;border-radius:6px;font-size:14px;font-weight:500}.status-banner.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}.status-banner.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}.status-banner.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.UnbMensagemComponent, selector: "unb-mensagem", inputs: ["mensagem", "tipo", "identificador"] }, { kind: "component", type: i9.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i9.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i9.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i10.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i14.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i15.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i15.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i15.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i16.UnbPessoaPesquisarComponent, selector: "lib-unb-pessoa-pesquisar", inputs: ["backendURL", "pesquisarPorCPF", "pesquisarPorCNPJ", "pesquisarPorEstrangeiro", "defaultTipoPessoa", "campoPesquisaMaxWidth", "pessoa", "mostrarPesquisa", "limparAposPesquisa", "label", "placeholder", "hint"], outputs: ["pessoaEmitted", "isLoadingChange"] }, { kind: "component", type: i17.UnbPessoaTelefoneListComponent, selector: "lib-unb-pessoa-telefone-list", inputs: ["podeEditar", "telefones", "backendURL"], outputs: ["telefonesEmitted"] }, { kind: "component", type: i18.UnbPessoaenderecoListComponent, selector: "lib-unb-pessoa-endereco-list", inputs: ["podeEditar", "enderecos", "backendURL"], outputs: ["enderecosEmitted"] }, { kind: "component", type: i19.UnbPessoaEmailListComponent, selector: "lib-unb-pessoa-email-list", inputs: ["podeEditar", "emails", "backendURL"], outputs: ["emailsEmitted"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
334
342
  }
335
343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: UnbPessoaFormComponent, decorators: [{
336
344
  type: Component,
337
- args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\">\r\n <lib-unb-pessoa-pesquisar [apiPessoaConfig]=\"apiPessoaConfig\" [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\" (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem></unb-mensagem>\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada && apiPessoaConfig.url\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let ufNascimento of getListaEstados()\" [value]=\"ufNascimento.identificador\">\r\n {{ ufNascimento.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.identificador\">\r\n {{ cidade.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\"\r\n [telefones]=\"pessoa.telefones\" (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\"\r\n [enderecos]=\"pessoa.enderecos\" (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [apiPessoaConfig]=\"apiPessoaConfig\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}\n"] }]
338
- }], ctorParameters: () => [{ type: i1.UnBPessoaService }, { type: i2.MatSnackBar }, { type: i3.UnbMensagemService }], propDecorators: { apiPessoaConfig: [{
345
+ args: [{ selector: 'lib-unb-pessoa-form', standalone: false, template: "<mat-progress-bar *ngIf=\"isLoading\" mode=\"indeterminate\"></mat-progress-bar>\r\n\r\n<div class=\"form-container\" [class.disabled-wrapper]=\"isLoading\">\r\n <lib-unb-pessoa-pesquisar [backendURL]=\"backendURL\" [defaultTipoPessoa]=\"defaultTipoPessoa\"\r\n [pesquisarPorCNPJ]=\"pesquisarPorCNPJ\" [pesquisarPorCPF]=\"pesquisarPorCPF\"\r\n [pesquisarPorEstrangeiro]=\"pesquisarPorEstrangeiro\" [campoPesquisaMaxWidth]=\"campoPesquisaMaxWidth\"\r\n (pessoaEmitted)=\"pessoaRecebida($event)\">\r\n </lib-unb-pessoa-pesquisar>\r\n</div>\r\n\r\n<unb-mensagem [identificador]=\"idMensagemService\"></unb-mensagem>\r\n\r\n<!-- Label indicando que est\u00E1 incluindo nova pessoa -->\r\n<div *ngIf=\"documentoPesquisado\"\r\n class=\"status-banner\" \r\n [ngClass]=\"{\r\n 'status-inclusao': !pessoa.codigoPessoa,\r\n 'status-edicao': pessoa.codigoPessoa && !isReadonlyFromSiape,\r\n 'status-bloqueado': isReadonlyFromSiape\r\n }\">\r\n\r\n <mat-icon>\r\n {{ !pessoa.codigoPessoa ? 'person_add' : (isReadonlyFromSiape ? 'lock' : 'edit') }}\r\n </mat-icon>\r\n\r\n <span>\r\n <ng-container *ngIf=\"!pessoa.codigoPessoa\">Incluindo nova pessoa</ng-container>\r\n <ng-container *ngIf=\"pessoa.codigoPessoa && !isReadonlyFromSiape\">Editando pessoa</ng-container>\r\n <ng-container *ngIf=\"isReadonlyFromSiape\">Registro SIAPE (Visualiza\u00E7\u00E3o)</ng-container>\r\n\r\n com <strong>{{ getLabelDocumento() }} {{ documentoPesquisado }}</strong>\r\n </span>\r\n\r\n</div>\r\n\r\n\r\n<form #pessoaForm=\"ngForm\" [class.readonly]=\"isReadonlyFromSiape || isLoading\" class=\"form-container mt-2\"\r\n *ngIf=\"buscaRealizada\" (ngSubmit)=\"salvar(pessoaForm)\">\r\n\r\n <!-- Campos Pessoa F\u00EDsica e Estrangeira -->\r\n <ng-container\r\n *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA || pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nome\" name=\"nome\" #nome=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Sexo</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoSexo\" name=\"codigoSexo\" #codigoSexo=\"ngModel\" required>\r\n <mat-option [value]=\"1\">Masculino</mat-option>\r\n <mat-option [value]=\"2\">Feminino</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Data Nascimento</mat-label>\r\n <input matInput [matDatepicker]=\"dataNascimentoPicker\" [(ngModel)]=\"pessoa.dataNascimento\" name=\"dataNascimento\"\r\n #dataNascimento=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataNascimentoPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataNascimentoPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Estado Civil</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoEstadoCivil\" name=\"codigoEstadoCivil\" #codigoEstadoCivil=\"ngModel\">\r\n <mat-option *ngFor=\"let estado of estadosCivil | async\" [value]=\"estado.codigo\">\r\n {{ estado.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <!--\r\n <mat-form-field class=\"form-15\" appearance=\"outline\">\r\n <mat-label>Naturalidade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let cidade of getListaEstados()\" [value]=\"cidade.codigo\">\r\n {{ cidade.descricao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n -->\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisNascimento\" name=\"codigoPaisNascimento\" #codigoPaisNascimento=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n <span *ngIf=\"paisNascimento.denominacao === 'BRASIL'\">\uD83C\uDDE7\uD83C\uDDF7 <b>{{ paisNascimento.denominacao }}</b></span>\r\n <span *ngIf=\"paisNascimento.denominacao !== 'BRASIL'\">{{ paisNascimento.denominacao }}</span>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\"> <!-- 22 eh Brasil-->\r\n <mat-label>UF Nascimento</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.ufNascimento\" name=\"ufNascimento\" #ufNascimento=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-15\" appearance=\"outline\" *ngIf=\"pessoa.codigoPaisNascimento == 22\">\r\n <mat-label>Naturalidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.naturalidade\" name=\"naturalidade\" #naturalidade=\"ngModel\"\r\n required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Escolaridade</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.escolaridade\" name=\"codigoEscolaridade\" #codigoEscolaridade=\"ngModel\" required>\r\n <mat-option *ngFor=\"let escolaridade of escolaridade | async\" [value]=\"escolaridade.codigo\">\r\n {{ escolaridade.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeSocial\" name=\"nomeSocial\" #nomeSocial=\"ngModel\" />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome da M\u00E3e</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeMae\" name=\"nomeMae\" #nomeMae=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome do Pai</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomePai\" name=\"nomePai\" #nomePai=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!-- Campos Pessoa Jur\u00EDdica -->\r\n <ng-container *ngIf=\"pessoa.tipoPessoa === tipoPessoaEnum().JURIDICA\">\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Raz\u00E3o Social</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.razaoSocial\" name=\"razaoSocial\" />\r\n </mat-form-field>\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Nome Fantasia</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.nomeFantasia\" name=\"nomeFantasia\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().FISICA\">\r\n <b style=\"flex: 1 1 100%; margin-bottom: 10px;\">Documenta\u00E7\u00E3o</b>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Identidade</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rg\" name=\"rg\" #rg=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>\u00D3rg\u00E3o Emissor</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgOrgao\" name=\"rgOrgao\" #rgOrgao=\"ngModel\" required />\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-25\" appearance=\"outline\">\r\n <mat-label>Unidade Federativa</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.rgUf\" name=\"rgUf\" #rgUf=\"ngModel\" required>\r\n <mat-option *ngFor=\"let estado of getListaEstados()\" [value]=\"estado.identificador\">\r\n {{ estado.identificador }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-20\" appearance=\"outline\">\r\n <mat-label>Data de Emiss\u00E3o</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.rgDataEmissao\" name=\"rgDataEmissao\" #rgDataEmissao=\"ngModel\" />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"pessoa.tipoPessoa == tipoPessoaEnum().ESTRANGEIRA \">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Data Chegada Brasil</mat-label>\r\n <input matInput [matDatepicker]=\"dataChegadaBrasilPicker\" [(ngModel)]=\"pessoa.dataChegadaBrasil\"\r\n name=\"dataChegadaBrasil\" #dataChegadaBrasil=\"ngModel\" required>\r\n <mat-datepicker-toggle matSuffix [for]=\"dataChegadaBrasilPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #dataChegadaBrasilPicker></mat-datepicker>\r\n </mat-form-field>\r\n\r\n <mat-form-field class=\"form-10\" appearance=\"outline\">\r\n <mat-label>Pa\u00EDs Passaporte</mat-label>\r\n <mat-select [(ngModel)]=\"pessoa.codigoPaisPassaporte\" name=\"codigoPaisPassaporte\" #codigoPaisPassaporte=\"ngModel\"\r\n required>\r\n <mat-option *ngFor=\"let paisNascimento of paises | async\" [value]=\"paisNascimento.codigo\">\r\n {{ paisNascimento.denominacao }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>N\u00FAmero Passaporte</mat-label>\r\n <input type=\"text\" matInput [(ngModel)]=\"pessoa.passaporte\" name=\"passaporte\" #passaporte=\"ngModel\" required />\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <lib-unb-pessoa-telefone-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [telefones]=\"pessoa.telefones\"\r\n (telefonesEmitted)=\"telefonesEmitted($event)\"></lib-unb-pessoa-telefone-list>\r\n\r\n <lib-unb-pessoa-endereco-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [enderecos]=\"pessoa.enderecos\"\r\n (enderecosEmitted)=\"enderecosEmitted($event)\"></lib-unb-pessoa-endereco-list>\r\n\r\n <lib-unb-pessoa-email-list style=\"flex: 1 1 100%;\" [backendURL]=\"backendURL\" [emails]=\"pessoa.emails\"\r\n (emailsEmitted)=\"emailsEmitted($event)\"></lib-unb-pessoa-email-list>\r\n\r\n <div *ngIf=\"isReadonlyFromSiape\" style=\"flex:1 1 100%; margin-bottom:10px;\">\r\n <mat-card>\r\n <mat-card-content>\r\n <strong>Servidor com matr\u00EDcula SIAPE deve ter seus dados autalizados pelo aplicativo do sougov</strong>\r\n </mat-card-content>\r\n </mat-card>\r\n </div>\r\n\r\n <mat-card-actions class=\"card-actions-buttons\" *ngIf=\"buscaRealizada\">\r\n <button mat-flat-button [disabled]=\"isLoading || isReadonlyFromSiape\" type=\"submit\" color=\"primary\">\r\n Salvar\r\n </button>\r\n </mat-card-actions>\r\n\r\n</form>", styles: [".card-actions-buttons{display:flex;gap:5px;flex-wrap:wrap}.form-container{display:flex;flex-wrap:wrap;column-gap:10px}:host{display:block}@media (max-width: 1000px){.form-container{flex-direction:column;gap:5px}}.break{flex-basis:100%;height:0}.form-5{flex:1 1 5%}.inline-table-container{display:flex;align-items:center;justify-content:space-between;padding:5px}@media (max-width: 600px){.form-5,.form-10,.form-15{flex:1 1 100%}}.form-10{flex:1 1 10%}.form-15{flex:1 1 15%}.form-20{flex:1 1 20%}.form-25{flex:1 1 25%}.form-30{flex:1 1 30%}.form-35{flex:1 1 35%}.form-40{flex:1 1 40%}.form-45{flex:1 1 45%}.form-50{flex:1 1 50%}.form-100{flex:1 1 100%;min-width:250px}.readonly{pointer-events:none;opacity:.6}.disabled-wrapper{pointer-events:none;opacity:.6;filter:grayscale(1)}.status-banner{display:flex;align-items:center;gap:8px;padding:10px 16px;margin:2px 0;border-radius:6px;font-size:14px;font-weight:500}.status-banner.status-inclusao{background-color:#e3f2fd;color:#1565c0;border:1px solid #bbdefb}.status-banner.status-edicao{background-color:#fff3e0;color:#ef6c00;border:1px solid #ffe0b2}.status-banner.status-bloqueado{background-color:#fce4ec;color:#c2185b;border:1px solid #f8bbd0}\n"] }]
346
+ }], ctorParameters: () => [{ type: i1.UnBPessoaService }, { type: i2.MatSnackBar }, { type: i3.UnbMensagemService }], propDecorators: { pessoaForm: [{
347
+ type: ViewChild,
348
+ args: ['pessoaForm']
349
+ }], backendURL: [{
339
350
  type: Input
340
351
  }], defaultTipoPessoa: [{
341
352
  type: Input
@@ -347,5 +358,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImpor
347
358
  type: Input
348
359
  }], campoPesquisaMaxWidth: [{
349
360
  type: Input
361
+ }], pessoaEmitted: [{
362
+ type: Output
363
+ }], isLoadingChange: [{
364
+ type: Output
350
365
  }] } });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VuYi1saWItY29tcG9uZW50cy9zcmMvbGliL3VuYi1wZXNzb2EvdW5iLXBlc3NvYS1mb3JtL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmItbGliLWNvbXBvbmVudHMvc3JjL2xpYi91bmItcGVzc29hL3VuYi1wZXNzb2EtZm9ybS91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFHekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUtuRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBc0IsbUJBQW1CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTbEcsTUFBTSxPQUFPLHNCQUFzQjtJQXNCakMsWUFBb0IsT0FBeUIsRUFBVSxRQUFxQixFQUFVLFlBQWdDO1FBQWxHLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFvQjtRQXJCdEgsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxhQUFRLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQ25DLFVBQUssR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBRTdCLGdCQUFXLEdBQUcsY0FBYyxDQUFDO1FBRTdCLFdBQU0sR0FBbUIsSUFBSSxjQUFjLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUN2RSxnQkFBVyxHQUEyQixFQUFFLENBQUMsQ0FBQyxzQ0FBc0M7UUFFaEYsOEVBQThFO1FBQzlFLHdFQUF3RTtRQUN4RSx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFNUIsb0JBQWUsR0FBbUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUV6RSxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIsNEJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQy9CLDBCQUFxQixHQUFXLE9BQU8sQ0FBQztJQUV5RSxDQUFDO0lBTzNILFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFaEQsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFDRCxjQUFjLENBQUMsY0FBOEI7UUFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVoQyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFdkQsaUdBQWlHO1FBQ2pHLG1GQUFtRjtRQUNuRixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN2SSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLDBGQUEwRixDQUFDLENBQUM7UUFDaEgsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFNO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVsRSxJQUFJLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsMENBQTBDO1lBQzFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLENBQUMsUUFBYSxFQUFFLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyw4Q0FBOEMsRUFBRSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDM0csSUFBSSxRQUFRLEVBQUUsQ0FBQzt3QkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO3dCQUM3RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO29CQUNuRSxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUVMLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsNkJBQTZCO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxxREFBcUQ7WUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUNqRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUN0RixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxJQUFJLENBQUMsWUFBWSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDakYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQ2pELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDakQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBOEI7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUE4QjtRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVPLElBQUksQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFakMsd0VBQXdFO1FBQ3hFLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFeEgsb0NBQW9DO1lBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsb0RBQW9ELENBQUMsQ0FBQztZQUV4RSx5REFBeUQ7WUFDekQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDekQsMENBQTBDO2dCQUMxQyxPQUFPLGVBQWUsR0FBRyxDQUFDLFNBQVMsY0FBYyxHQUFHLENBQUMsT0FBTyxPQUFPLENBQUM7WUFDeEUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRVosNkRBQTZEO1lBQzdELE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLFlBQVksT0FBTyxDQUFDO1lBRTVGLGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuRixDQUFDO1FBQ0QsbUVBQW1FO2FBQzlELENBQUM7WUFDRixJQUFJLFlBQVksR0FBRywrQkFBK0IsQ0FBQyxDQUFDLGtCQUFrQjtZQUV0RSw4Q0FBOEM7WUFDOUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3pCLFlBQVksR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUMxQyxDQUFDO3FCQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUM5QixZQUFZLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2hDLENBQUM7WUFFRCwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1lBRW5FLDhEQUE4RDtZQUM5RCxJQUFJLFVBQVUsR0FBRyxVQUFVLEdBQUcsWUFBWSxHQUFHLFdBQVcsQ0FBQztZQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNMLENBQUM7SUFFQyxZQUFZLENBQUMsT0FBZTtRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1lBQy9CLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZUFBZTtRQUNiLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7S0FFQztJQUNPLHNCQUFzQixDQUFDLE1BQXNCO1FBQ25ELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFekIsMkJBQTJCO1FBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWE7WUFDaEMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtZQUMxQyxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7WUFDcEMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtZQUMxQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDMUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQzVCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDMUIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQzVCLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZTtTQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVKLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDeEIsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtZQUMxQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7WUFDWixjQUFjLEVBQUUsR0FBRyxDQUFDLE1BQU07WUFDMUIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVztTQUM3QixDQUFDLENBQUMsQ0FBQztRQUVKLE1BQU0sYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDL0QsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFVBQVUsRUFBRSxLQUFLLENBQUMsS0FBSztZQUN2QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1NBQy9CLENBQUMsQ0FBQyxDQUFDO1FBRUosbUNBQW1DO1FBQ25DLE9BQU87WUFDTCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7WUFDekIsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBRWpDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDN0Isb0VBQW9FO1lBQ3BFLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3pELFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1lBQzNDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ3ZDLDZDQUE2QztZQUM3QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBRXZCLGNBQWMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztZQUNuRSxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO1lBQ2pELFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUNqQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFFakMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ2IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixhQUFhLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFFakUsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtZQUMvQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1lBQ3ZGLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDM0Msa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQjtZQUM3QyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFFdkMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQjtZQUN6QyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFDdkMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlO1lBRXZDLHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxzQkFBc0I7WUFDckQscUJBQXFCLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtZQUNuRCxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1lBQzdDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUV6QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1lBQzNDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7WUFDL0Msc0JBQXNCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztZQUNuRix1QkFBdUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDO1lBQ3JGLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7WUFDakQsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLDRCQUE0QjtZQUNqRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1lBRTdFLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO1lBQ2pELHNFQUFzRTtZQUN0RSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM1RCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFFM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBRWpDLFNBQVMsRUFBRSxnQkFBZ0I7WUFDM0IsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixNQUFNLEVBQUUsYUFBYTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCLENBQUMsSUFBUztRQUN2QyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRXBDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0RCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDNUIsT0FBTyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7OEdBL1ZVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLGlVQ3RCbkMsMGhVQW1NTzs7MkZEN0tNLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsS0FBSztnSkFtQlIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbGlzdGFFc3RhZG9zIH0gZnJvbSAnLi4vcGVzc29hLXRhYmVsYXMtYXBvaW8nO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbWFpbCB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW1haWwubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFbmRlcmVjbyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZW5kZXJlY28ubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc2NvbGFyaWRhZGUgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVzY29sYXJpZGFkZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYUVzdGFkb0NpdmlsIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc3RhZG8tY2l2aWwubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FQYWlzIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1wYWlzJztcclxuaW1wb3J0IHsgVW5iUGVzc29hVGVsZWZvbmUgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLXRlbGVmb25lLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hTW9kZWwgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLm1vZGVsJztcclxuaW1wb3J0IHsgVW5CUGVzc29hU2VydmljZSB9IGZyb20gJy4uL3VuYi1wZXNzb2Euc2VydmljZSc7XHJcbmltcG9ydCB7IFRpcG9QZXNzb2FFbnVtIH0gZnJvbSAnLi4vdW5iLXRpcG8tcGVzc29hLmVudW0nO1xyXG5pbXBvcnQgeyBVbmJNZW5zYWdlbVNlcnZpY2UsIFVuYlRpcG9NZW5zYWdlbUVudW0gfSBmcm9tICcuLi8uLi91bmItbWVuc2FnZW0vdW5iLW1lbnNhZ2VtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ0Zvcm0gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi11bmItcGVzc29hLWZvcm0nLFxyXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi91bmItcGVzc29hLWZvcm0uY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIFVuYlBlc3NvYUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGJ1c2NhUmVhbGl6YWRhOiBib29sZWFuID0gZmFsc2U7XHJcbiAgZW5kZXJlY28gPSBuZXcgVW5iUGVzc29hRW5kZXJlY28oKTtcclxuICBlbWFpbCA9IG5ldyBVbmJQZXNzb2FFbWFpbCgpO1xyXG5cclxuICB0aXBvc1Blc3NvYSA9IFRpcG9QZXNzb2FFbnVtO1xyXG5cclxuICBwZXNzb2E6IFVuYlBlc3NvYU1vZGVsID0gbmV3IFVuYlBlc3NvYU1vZGVsKCk7IC8vIGluaWNpYWxpemEgY29tIHBlc3NvYVxyXG4gIGRhZG9zU2Fsdm9zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307IC8vIEFybWF6ZW5hIG9zIGRhZG9zIGFvIHRyb2NhciBkZSB0aXBvXHJcblxyXG4gIC8vIFF1YW5kbyB2ZXJkYWRlaXJvLCBvIGZvcm11bMOhcmlvIGUgYcOnw7VlcyBmaWNhbSBkZXNhYmlsaXRhZG9zIHBvcnF1ZSBvcyBkYWRvc1xyXG4gIC8vIGRldmVtIHNlciBhbHRlcmFkb3MgYXBlbmFzIHBlbG8gYXBwIFNvdUdvdiAobWF0cmljdWxhIFNJQVBFIHByZXNlbnRlKVxyXG4gIGlzUmVhZG9ubHlGcm9tU2lhcGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgYXBpUGVzc29hQ29uZmlnOiB7IHVybDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0gPSB7IHVybDogJycsIHRva2VuOiAnJyB9O1xyXG4gIEBJbnB1dCgpIGRlZmF1bHRUaXBvUGVzc29hITogVGlwb1Blc3NvYUVudW07XHJcbiAgQElucHV0KCkgcGVzcXVpc2FyUG9yQ1BGID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwZXNxdWlzYXJQb3JDTlBKID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwZXNxdWlzYXJQb3JFc3RyYW5nZWlybyA9IHRydWU7XHJcbiAgQElucHV0KCkgY2FtcG9QZXNxdWlzYU1heFdpZHRoOiBzdHJpbmcgPSAnNDAwcHgnOyBcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBVbkJQZXNzb2FTZXJ2aWNlLCBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IFVuYk1lbnNhZ2VtU2VydmljZSkgeyB9XHJcblxyXG4gIC8vIHRhYmVsYXMgdHJhZGljaW9uYWlzIHF1ZSB2ZW0gZG8gYmFja2VuZFxyXG4gIGVzY29sYXJpZGFkZSE6IE9ic2VydmFibGU8VW5iUGVzc29hRXNjb2xhcmlkYWRlW10+O1xyXG4gIHBhaXNlcyE6IE9ic2VydmFibGU8VW5iUGVzc29hUGFpc1tdPjtcclxuICBlc3RhZG9zQ2l2aWwhOiBPYnNlcnZhYmxlPFVuYlBlc3NvYUVzdGFkb0NpdmlsW10+O1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmFwaVBlc3NvYUNvbmZpZy51cmwuZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICB0aGlzLmFwaVBlc3NvYUNvbmZpZy51cmwgPSB0aGlzLmFwaVBlc3NvYUNvbmZpZy51cmwuc2xpY2UoMCwgLTEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGVydFNlcnZpY2UuaGlkZU1lc3NhZ2UoKTtcclxuICAgIHRoaXMuc2VydmljZS5zZXRBcGlDb25maWcodGhpcy5hcGlQZXNzb2FDb25maWcpO1xyXG5cclxuICAgIC8vIGF0ZW5jYW8sIG8gcGVzc29hUmVjZWJpZGEgcXVlIGluaWNpYWxpemEgZXNzZSBjb21wb25lbnRlXHJcbiAgICB0aGlzLmVzY29sYXJpZGFkZSA9IHRoaXMuc2VydmljZS5nZXRFc2NvbGFyaWRhZGUoKTtcclxuICAgIHRoaXMucGFpc2VzID0gdGhpcy5zZXJ2aWNlLmdldFBhaXNlcygpO1xyXG4gICAgdGhpcy5lc3RhZG9zQ2l2aWwgPSB0aGlzLnNlcnZpY2UuZ2V0RXN0YWRvQ2l2aWwoKTtcclxuICB9XHJcbiAgcGVzc29hUmVjZWJpZGEocGVzc29hUmVjZWJpZGE6IFVuYlBlc3NvYU1vZGVsKSB7XHJcbiAgICB0aGlzLmJ1c2NhUmVhbGl6YWRhID0gdHJ1ZTtcclxuICAgIHRoaXMucGVzc29hID0gcGVzc29hUmVjZWJpZGE7XHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5oaWRlTWVzc2FnZSgpO1xyXG5cclxuICAgIC8vIGluaWNpYWxpemEgcHJhIG5hbyBxdWVicmFyXHJcbiAgICBpZiAoIXRoaXMucGVzc29hLmVuZGVyZWNvcykgdGhpcy5wZXNzb2EuZW5kZXJlY29zID0gW107XHJcbiAgICBpZiAoIXRoaXMucGVzc29hLmVtYWlscykgdGhpcy5wZXNzb2EuZW1haWxzID0gW107XHJcbiAgICBpZiAoIXRoaXMucGVzc29hLnRlbGVmb25lcykgdGhpcy5wZXNzb2EudGVsZWZvbmVzID0gW107XHJcbiAgICBcclxuICAgIC8vIFNlIGEgcGVzc29hIHZpZXIgY29tIG1hdHJpY3VsYVNpYXBlIHByZWVuY2hpZG8sIGNvbG9jYW1vcyBvIGZvcm11bMOhcmlvIGVtIG1vZG8gc29tZW50ZS1sZWl0dXJhXHJcbiAgICAvLyBlIG1vc3RyYXJlbW9zIHVtYSBtZW5zYWdlbSBpbmZvcm1hdGl2YSBuYSBVSS4gVGFtYsOpbSBkZXNhYmlsaXRhIGHDp8O1ZXMgZGUgc2FsdmFyLlxyXG4gICAgaWYgKHRoaXMucGVzc29hICYmIHRoaXMucGVzc29hLm1hdHJpY3VsYVNpYXBlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wZXNzb2EubWF0cmljdWxhU2lhcGUgIT09IG51bGwgJiYgdGhpcy5wZXNzb2EubWF0cmljdWxhU2lhcGUgIT09IDApIHtcclxuICAgICAgdGhpcy5pc1JlYWRvbmx5RnJvbVNpYXBlID0gdHJ1ZTtcclxuICAgICAgLy8gb3BjaW9uYWw6IGluZm9ybWFyIHZpYSBzbmFja0JhciB0YW1iw6ltXHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKCdTZXJ2aWRvciBjb20gbWF0cmljdWxsYSBTSUFQRSBkZXZlIHRlciBzZXVzIGRhZG9zIGF1dGFsaXphZG9zIHBlbG8gYXBsaWNhdGl2byBkbyBzb3Vnb3YuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzUmVhZG9ubHlGcm9tU2lhcGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhbHZhcihmb3JtOiBOZ0Zvcm0pIHtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmhpZGVNZXNzYWdlKCk7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhcihmb3JtKSkgcmV0dXJuXHJcbiAgICBpZiAoIXRoaXMuc2VydmljZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jb252ZXJ0UGVzc29hVG9QYXlsb2FkKHRoaXMucGVzc29hKTtcclxuICAgIGxldCByZXN1bHQgPSB0aGlzLnNlcnZpY2Uuc2FsdmFyKHBheWxvYWQsIHRoaXMucGVzc29hLnRpcG9QZXNzb2EpO1xyXG5cclxuICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgLy8gVXNlIG8gZm9ybWF0byAnbmV4dC9lcnJvcicgcGFyYSBjbGFyZXphXHJcbiAgICAgIHJlc3VsdC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXNwb3N0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvd01lc3NhZ2UoXCI8c3Ryb25nPlJlZ2lzdHJvIHNhbHZvIGNvbSBzdWNlc3NvITwvc3Ryb25nPlwiLCBVbmJUaXBvTWVuc2FnZW1FbnVtLlNVQ0NFU1MpO1xyXG4gICAgICAgICAgaWYgKHJlc3Bvc3RhKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVzc29hLmNvZGlnb1Blc3NvYSA9IHJlc3Bvc3RhLmNvZGlnb1Blc3NvYSB8fCB0aGlzLnBlc3NvYS5jb2RpZ29QZXNzb2E7XHJcbiAgICAgICAgICAgIHRoaXMucGVzc29hLmlkUGVzc29hID0gcmVzcG9zdGEuaWRQZXNzb2EgfHwgdGhpcy5wZXNzb2EuaWRQZXNzb2E7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHsgXHJcbiAgICAgICAgICB0aGlzLmVycm8oZXJyKTsgXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJybzogTyBtw6l0b2RvIHNhbHZhcigpIG7Do28gcmV0b3Jub3UgdW0gT2JzZXJ2YWJsZS5cIik7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7IC8vIEdhcmFudGUgcXVlIG8gbG9hZGluZyBwYXJlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGFyKGZvcm06IE5nRm9ybSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnBlc3NvYSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkVycm8gYW8gY2FycmVnYXIgb2JqZXRvIHBlc3NvYVwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgaWYgKGZvcm0uaW52YWxpZCkge1xyXG4gICAgICAgIC8vIHBhcmEgcXVlIG9zIGVycm9zIGFwYXJlw6dhbSBuYSB0ZWxhIHBhcmEgbyB1c3XDoXJpby5cclxuICAgICAgICBmb3JtLmNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpOyBcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIlBvciBmYXZvciwgcHJlZW5jaGEgb3MgY2FtcG9zIG9icmlnYXTDs3Jpb3MuXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EudGVsZWZvbmVzID09IG51bGwgfHwgKHRoaXMucGVzc29hLnRlbGVmb25lcyAhPSBudWxsICYmIHRoaXMucGVzc29hLnRlbGVmb25lcy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJDYWRhc3RyZSBwZWxvIG1lbm9zIHVtIHRlbGVmb25lIG5vIGJvdMOjbyBDYWRhc3RyYXIgTm92byBUZWxlZm9uZVwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS5lbmRlcmVjb3MgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EuZW5kZXJlY29zICE9IG51bGwgJiYgdGhpcy5wZXNzb2EuZW5kZXJlY29zLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkNhZGFzdHJlIHBlbG8gbWVub3MgdW0gZW5kZXJlw6dvIG5vIGJvdMOjbyBDYWRhc3RyYXIgTm92byBFbmRlcmXDp29cIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EuZW1haWxzID09IG51bGwgfHwgKHRoaXMucGVzc29hLmVtYWlscyAhPSBudWxsICYmIHRoaXMucGVzc29hLmVtYWlscy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJDYWRhc3RyZSBwZWxvIG1lbm9zIHVtIGUtbWFpbCBubyBib3TDo28gQ2FkYXN0cmFyIE5vdm8gRW1haWxcIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EudGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5GSVNJQ0EpIHtcclxuICAgICAgaWYgKCF0aGlzLnBlc3NvYS5ub21lIHx8ICh0aGlzLnBlc3NvYSAmJiB0aGlzLnBlc3NvYS5ub21lID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJOb21lIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5wZXNzb2EuZGF0YU5hc2NpbWVudG8pIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkRhdGEgZGUgTmFzY2ltZW50byDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLnRpcG9QZXNzb2EgPT0gVGlwb1Blc3NvYUVudW0uRVNUUkFOR0VJUkEpIHtcclxuICAgICAgaWYgKCF0aGlzLnBlc3NvYS5ub21lIHx8ICh0aGlzLnBlc3NvYSAmJiB0aGlzLnBlc3NvYS5ub21lID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJOb21lIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnBlc3NvYS5wYXNzYXBvcnRlID09IG51bGwgfHwgKHRoaXMucGVzc29hLnBhc3NhcG9ydGUgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5wYXNzYXBvcnRlID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJQYXNzYXBvcnRlIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EudGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5KVVJJRElDQSkge1xyXG4gICAgICBpZiAodGhpcy5wZXNzb2EuY25waiA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS5jbnBqICE9IG51bGwgJiYgdGhpcy5wZXNzb2EuY25waiA9PSBcIlwiKSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiQ05QSiDDqSB1bSBjYW1wbyBvYnJpZ2F0w7NyaW9cIik7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICB0ZWxlZm9uZXNFbWl0dGVkKHRlbGVmb25lczogVW5iUGVzc29hVGVsZWZvbmVbXSkge1xyXG4gICAgdGhpcy5wZXNzb2EudGVsZWZvbmVzID0gdGVsZWZvbmVzO1xyXG4gIH1cclxuXHJcbiAgZW5kZXJlY29zRW1pdHRlZChlbmRlcmVjb3M6IFVuYlBlc3NvYUVuZGVyZWNvW10pIHtcclxuICAgIHRoaXMucGVzc29hLmVuZGVyZWNvcyA9IGVuZGVyZWNvcztcclxuICB9XHJcblxyXG4gIGVtYWlsc0VtaXR0ZWQoZW1haWxzOiBVbmJQZXNzb2FFbWFpbFtdKSB7XHJcbiAgICB0aGlzLnBlc3NvYS5lbWFpbHMgPSBlbWFpbHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVycm8oZXJybzogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgY29uc3QgZXJyb3JSZXNwb25zZSA9IGVycm8uZXJyb3I7XHJcblxyXG4gICAgLy8gMS4gVHJhdGFtZW50byBwYXJhIEVycm9zIGRlIFZhbGlkYcOnw6NvIChxdWUgY29udMOqbSBvIGFycmF5ICdkZXRhbGhlcycpXHJcbiAgICBpZiAoZXJyb3JSZXNwb25zZSAmJiBlcnJvclJlc3BvbnNlLmRldGFsaGVzICYmIEFycmF5LmlzQXJyYXkoZXJyb3JSZXNwb25zZS5kZXRhbGhlcykgJiYgZXJyb3JSZXNwb25zZS5kZXRhbGhlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTWVuc2FnZW0gZ2Vuw6lyaWNhIHBhcmEgbyBTbmFja0JhclxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiTyBmb3JtdWzDoXJpbyBwb3NzdWkgZXJybyhzKS4gUG9yIGZhdm9yLCB2ZXJpZmljYXIuXCIpO1xyXG5cclxuICAgICAgICAvLyBDb25zdHLDs2kgYSBtZW5zYWdlbSBIVE1MIGRldGFsaGFkYSBwYXJhIG8gQWxlcnRTZXJ2aWNlXHJcbiAgICAgICAgY29uc3QgY3JpdGljYXNIdG1sID0gZXJyb3JSZXNwb25zZS5kZXRhbGhlcy5tYXAoKGRldDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIEZvcm1hdGEgY2FkYSBlcnJvIGNvbW8gdW0gaXRlbSBkZSBsaXN0YVxyXG4gICAgICAgICAgICByZXR1cm4gYDxsaT48c3Ryb25nPiR7ZGV0Lm5vbWVDYW1wb306PC9zdHJvbmc+ICR7ZGV0LmNyaXRpY2F9PC9saT5gO1xyXG4gICAgICAgIH0pLmpvaW4oJycpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENyaWEgYSBtZW5zYWdlbSBmaW5hbCwgZW52b2x2ZW5kbyBvcyBlcnJvcyBlbSB1bWEgdGFnIDx1bD5cclxuICAgICAgICBjb25zdCBkZXRhaWxlZEh0bWxNZXNzYWdlID0gYDxzdHJvbmc+RXJyb3MgZGUgVmFsaWRhw6fDo286PC9zdHJvbmc+IDx1bD4ke2NyaXRpY2FzSHRtbH08L3VsPmA7XHJcblxyXG4gICAgICAgIC8vIE1vc3RyYSBvcyBkZXRhbGhlcyBmb3JtYXRhZG9zIG5vIEFsZXJ0U2VydmljZVxyXG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3dNZXNzYWdlKGRldGFpbGVkSHRtbE1lc3NhZ2UsIFVuYlRpcG9NZW5zYWdlbUVudW0uREFOR0VSKTtcclxuXHJcbiAgICB9IFxyXG4gICAgLy8gMi4gVHJhdGFtZW50byBwYXJhIE91dHJvcyBUaXBvcyBkZSBFcnJvIChzZW0gbyBhcnJheSAnZGV0YWxoZXMnKVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICdPY29ycmV1IHVtIGVycm8gZGVzY29uaGVjaWRvLic7IC8vIE1lbnNhZ2VtIHBhZHLDo29cclxuXHJcbiAgICAgICAgLy8gVGVudGEgZXh0cmFpciBhIG1lbnNhZ2VtIGRlIGVycm8gZXNwZWPDrWZpY2FcclxuICAgICAgICBpZiAoZXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3JSZXNwb25zZS5tZW5zYWdlbSkge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JSZXNwb25zZS5tZW5zYWdlbTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvclJlc3BvbnNlLmRldGFpbCkge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JSZXNwb25zZS5kZXRhaWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGVycm8ubWVzc2FnZSkge1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNb3N0cmEgdW1hIG1lbnNhZ2VtIGdlbsOpcmljYSBubyBTbmFja0JhclxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKCdPY29ycmV1IHVtIGVycm8gYW8gcHJvY2Vzc2FyIHN1YSBzb2xpY2l0YcOnw6NvLicpO1xyXG5cclxuICAgICAgICAvLyBNb3N0cmEgbyBlcnJvIGVzcGVjw61maWNvIG5vIEFsZXJ0U2VydmljZSwgY29tbyB2b2PDqiBzdWdlcml1XHJcbiAgICAgICAgbGV0IGVycm9TdHJvbmcgPSBcIjxzdHJvbmc+XCIgKyBlcnJvck1lc3NhZ2UgKyBcIjwvc3Ryb25nPlwiO1xyXG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3dNZXNzYWdlKGVycm9TdHJvbmcsIFVuYlRpcG9NZW5zYWdlbUVudW0uREFOR0VSKTtcclxuICAgIH1cclxufVxyXG5cclxuICBvcGVuU25hY2tCYXIobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4obWVzc2FnZSwgJ3gnLCB7XHJcbiAgICAgIGR1cmF0aW9uOiA1MDAwLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0aXBvUGVzc29hRW51bSgpIHtcclxuICAgIHJldHVybiBUaXBvUGVzc29hRW51bTtcclxuICB9XHJcblxyXG4gIGdldExpc3RhRXN0YWRvcygpIHtcclxuICAgIHJldHVybiBsaXN0YUVzdGFkb3M7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogQ29udmVydGUgdW1hIGluc3TDom5jaWEgKG91IG9iamV0bykgZGUgVW5iUGVzc29hTW9kZWwgcGFyYSBvIHBheWxvYWQgZXNwZXJhZG8gcGVsbyBiYWNrZW5kLlxyXG4gKi9cclxuICBwcml2YXRlIGNvbnZlcnRQZXNzb2FUb1BheWxvYWQocGVzc29hOiBVbmJQZXNzb2FNb2RlbCk6IGFueSB7XHJcbiAgICBpZiAoIXBlc3NvYSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gLS0tIE1hcGVpYSBvcyBhcnJheXMgLS0tXHJcbiAgICBjb25zdCBlbmRlcmVjb3NQYXlsb2FkID0gKHBlc3NvYS5lbmRlcmVjb3MgfHwgW10pLm1hcCgoZW5kOiBhbnkpID0+ICh7XHJcbiAgICAgIG9yZGVtRW5kZXJlY286IGVuZC5vcmRlbUVuZGVyZWNvLFxyXG4gICAgICB0aXBvRW5kZXJlY29Db2RpZ286IGVuZC50aXBvRW5kZXJlY29Db2RpZ28sXHJcbiAgICAgIG11bmljaXBpb0NvZGlnbzogZW5kLm11bmljaXBpb0NvZGlnbyxcclxuICAgICAgcGFpc0VuZGVyZWNvQ29kaWdvOiBlbmQucGFpc0VuZGVyZWNvQ29kaWdvLFxyXG4gICAgICBsb2dyYWRvdXJvOiBlbmQubG9ncmFkb3VybyxcclxuICAgICAgY29tcGxlbWVudG86IGVuZC5jb21wbGVtZW50byxcclxuICAgICAgY2VwOiBlbmQuY2VwLFxyXG4gICAgICBiYWlycm86IGVuZC5iYWlycm8sXHJcbiAgICAgIHVmRW5kZXJlY286IGVuZC51ZkVuZGVyZWNvLFxyXG4gICAgICBjYWl4YVBvc3RhbDogZW5kLmNhaXhhUG9zdGFsLFxyXG4gICAgICBjb3JyZXNwb25kZW5jaWE6IGVuZC5jb3JyZXNwb25kZW5jaWFcclxuICAgIH0pKTtcclxuXHJcbiAgICBjb25zdCB0ZWxlZm9uZXNQYXlsb2FkID0gKHBlc3NvYS50ZWxlZm9uZXMgfHwgW10pLm1hcCgodGVsOiBhbnkpID0+ICh7XHJcbiAgICAgIG9yZGVtVGVsZWZvbmU6IHRlbC5vcmRlbSxcclxuICAgICAgdGlwb1RlbGVmb25lQ29kaWdvOiB0ZWwudGlwb1RlbGVmb25lQ29kaWdvLFxyXG4gICAgICBkZGk6IHRlbC5kZGksXHJcbiAgICAgIGRkZDogdGVsLmRkZCxcclxuICAgICAgbnVtZXJvVGVsZWZvbmU6IHRlbC5udW1lcm8sXHJcbiAgICAgIHJhbWFsOiB0ZWwucmFtYWwsXHJcbiAgICAgIGF1dG9yaXphU01TOiB0ZWwuYXV0b3JpemFTTVNcclxuICAgIH0pKTtcclxuXHJcbiAgICBjb25zdCBlbWFpbHNQYXlsb2FkID0gKHBlc3NvYS5lbWFpbHMgfHwgW10pLm1hcCgoZW1haWw6IGFueSkgPT4gKHtcclxuICAgICAgdGlwb0VtYWlsQ29kaWdvOiBlbWFpbC50aXBvRW1haWxDb2RpZ28sXHJcbiAgICAgIG9yZGVtRW1haWw6IGVtYWlsLm9yZGVtLFxyXG4gICAgICBlbWFpbDogZW1haWwuZW1haWwsXHJcbiAgICAgIGF1dG9yaXphY2FvOiBlbWFpbC5hdXRvcml6YWNhb1xyXG4gICAgfSkpO1xyXG5cclxuICAgIC8vIC0tLSBNb250YSBvIG9iamV0byBwcmluY2lwYWwgLS0tXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBpZFBlc3NvYTogcGVzc29hLmlkUGVzc29hLFxyXG4gICAgICBjb2RpZ29QZXNzb2E6IHBlc3NvYS5jb2RpZ29QZXNzb2EsXHJcblxyXG4gICAgICBub21lOiBwZXNzb2Eubm9tZSxcclxuICAgICAgbm9tZVNvY2lhbDogcGVzc29hLm5vbWVTb2NpYWwsXHJcbiAgICAgIC8vIEFkaWNpb25hIGEgY2hhdmUgJ2NwZicgYW8gb2JqZXRvIFNPTUVOVEUgU0UgcGVzc29hLmNwZiBmb3IgdHJ1dGh5XHJcbiAgICAgIC4uLihwZXNzb2EuY3BmICYmIHsgY3BmOiBwZXNzb2EuY3BmLnJlcGxhY2UoL1xcRC9nLCAnJykgfSksXHJcbiAgICAgIGNvZGlnb1NleG86IHBlc3NvYS5jb2RpZ29TZXhvLFxyXG4gICAgICBjb2RpZ29Fc3RhZG9DaXZpbDogcGVzc29hLmNvZGlnb0VzdGFkb0NpdmlsLFxyXG4gICAgICBjb2RpZ29Fc2NvbGFyaWRhZGU6IHBlc3NvYS5lc2NvbGFyaWRhZGUsXHJcbiAgICAgIC8vIGNvZGlnb1RpcG9TYW5ndWluZW86IHBlc3NvYS50aXBvU2FuZ3VpbmVvLFxyXG4gICAgICBub21lUGFpOiBwZXNzb2Eubm9tZVBhaSxcclxuICAgICAgbm9tZU1hZTogcGVzc29hLm5vbWVNYWUsXHJcblxyXG4gICAgICBkYXRhTmFzY2ltZW50bzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YU5hc2NpbWVudG8pLFxyXG4gICAgICBjb2RpZ29QYWlzTmFzY2ltZW50bzogcGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvLFxyXG4gICAgICB1Zk5hc2NpbWVudG86IHBlc3NvYS51Zk5hc2NpbWVudG8sXHJcbiAgICAgIG5hdHVyYWxpZGFkZTogcGVzc29hLm5hdHVyYWxpZGFkZSxcclxuXHJcbiAgICAgIHJnOiBwZXNzb2EucmcsXHJcbiAgICAgIHJnT3JnYW86IHBlc3NvYS5yZ09yZ2FvLFxyXG4gICAgICByZ1VmOiBwZXNzb2EucmdVZixcclxuICAgICAgcmdEYXRhRW1pc3NhbzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EucmdEYXRhRW1pc3NhbyksXHJcblxyXG4gICAgICBudW1lcm9UaXR1bG9FbGVpdG9yOiBwZXNzb2EubnVtZXJvVGl0dWxvRWxlaXRvcixcclxuICAgICAgZGF0YUVtaXNzYW9UaXR1bG9FbGVpdG9yOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5kYXRhRW1pc3Nhb1RpdHVsb0VsZWl0b3IpLFxyXG4gICAgICB6b25hVGl0dWxvRWxlaXRvcjogcGVzc29hLnpvbmFUaXR1bG9FbGVpdG9yLFxyXG4gICAgICBzZWNhb1RpdHVsb0VsZWl0b3I6IHBlc3NvYS5zZWNhb1RpdHVsb0VsZWl0b3IsXHJcbiAgICAgIHVmVGl0dWxvRWxlaXRvcjogcGVzc29hLnVmVGl0dWxvRWxlaXRvcixcclxuXHJcbiAgICAgIG51bWVyb1Jlc2VydmlzdGE6IHBlc3NvYS5udW1lcm9SZXNlcnZpc3RhLFxyXG4gICAgICBzZXJpZVJlc2VydmlzdGE6IHBlc3NvYS5zZXJpZVJlc2VydmlzdGEsXHJcbiAgICAgIG9yZ2FvUmVzZXJ2aXN0YTogcGVzc29hLm9yZ2FvUmVzZXJ2aXN0YSxcclxuXHJcbiAgICAgIG51bWVyb0NhcnRlaXJhVHJhYmFsaG86IHBlc3NvYS5udW1lcm9DYXJ0ZWlyYVRyYWJhbGhvLFxyXG4gICAgICBzZXJpZUNhcnRlaXJhVHJhYmFsaG86IHBlc3NvYS5zZXJpZUNhcnRlaXJhVHJhYmFsaG8sXHJcbiAgICAgIHVmQ2FydGVpcmFUcmFiYWxobzogcGVzc29hLnVmQ2FydGVpcmFUcmFiYWxobyxcclxuICAgICAgcGlzUGFzZXA6IHBlc3NvYS5waXNQYXNlcCxcclxuXHJcbiAgICAgIG51bWVyb0hhYmlsaXRhY2FvOiBwZXNzb2EubnVtZXJvSGFiaWxpdGFjYW8sXHJcbiAgICAgIHJlZ2lzdHJvSGFiaWxpdGFjYW86IHBlc3NvYS5yZWdpc3Ryb0hhYmlsaXRhY2FvLFxyXG4gICAgICBkYXRhRW1pc3Nhb0hhYmlsaXRhY2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5kYXRhRW1pc3Nhb0hhYmlsaXRhY2FvKSxcclxuICAgICAgZGF0YVZhbGlkYWRlSGFiaWxpdGFjYW86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLmRhdGFWYWxpZGFkZUhhYmlsaXRhY2FvKSxcclxuICAgICAgY2F0ZWdvcmlhSGFiaWxpdGFjYW86IHBlc3NvYS5jYXRlZ29yaWFIYWJpbGl0YWNhbyxcclxuICAgICAgZGVmaWNpZW5jaWFGaXNpY2FIYWJpbGl0YWNhbzogcGVzc29hLmRlZmljaWVuY2lhRmlzaWNhSGFiaWxpdGFjYW8sXHJcbiAgICAgIHByaW1laXJhSGFiaWxpdGFjYW86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLnByaW1laXJhSGFiaWxpdGFjYW8pLFxyXG5cclxuICAgICAgcGFzc2Fwb3J0ZTogcGVzc29hLnBhc3NhcG9ydGUsXHJcbiAgICAgIGNvZGlnb1BhaXNQYXNzYXBvcnRlOiBwZXNzb2EuY29kaWdvUGFpc1Bhc3NhcG9ydGUsXHJcbiAgICAgIC8vIEFkaWNpb25hIGEgY2hhdmUgJ2NucGonIGFvIG9iamV0byBTT01FTlRFIFNFIHBlc3NvYS5jbnBqIGZvciB0cnV0aHlcclxuICAgICAgLi4uKHBlc3NvYS5jbnBqICYmIHsgY25wajogcGVzc29hLmNucGoucmVwbGFjZSgvXFxEL2csICcnKSB9KSxcclxuICAgICAgcmF6YW9Tb2NpYWw6IHBlc3NvYS5yYXphb1NvY2lhbCxcclxuICAgICAgbm9tZUZhbnRhc2lhOiBwZXNzb2Eubm9tZUZhbnRhc2lhLFxyXG4gICAgICBzaWdsYTogcGVzc29hLnNpZ2xhLFxyXG4gICAgICBwYWdpbmFXZWI6IHBlc3NvYS5wYWdpbmFXZWIsXHJcblxyXG4gICAgICBhdXRvQ2FkYXN0cm86IHBlc3NvYS5hdXRvQ2FkYXN0cm8sXHJcblxyXG4gICAgICBlbmRlcmVjb3M6IGVuZGVyZWNvc1BheWxvYWQsXHJcbiAgICAgIHRlbGVmb25lczogdGVsZWZvbmVzUGF5bG9hZCxcclxuICAgICAgZW1haWxzOiBlbWFpbHNQYXlsb2FkXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0YSBhIGRhdGEgbm8gcGFkcsOjbyBERC9NTS9ZWVlZIHBhcmEgbyBiYWNrZW5kLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQoZGF0YTogYW55KTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAoIWRhdGEpIHJldHVybiBudWxsO1xyXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyAmJiBkYXRhLmluY2x1ZGVzKCcvJykpIHJldHVybiBkYXRhO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShkYXRhKTtcclxuICAgICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCBkaWEgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IG1lcyA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICBjb25zdCBhbm8gPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICAgIHJldHVybiBgJHtkaWF9LyR7bWVzfS8ke2Fub31gO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuIiwiPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCJpc0xvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cclxuXHJcbjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxyXG4gIDxsaWItdW5iLXBlc3NvYS1wZXNxdWlzYXIgW2FwaVBlc3NvYUNvbmZpZ109XCJhcGlQZXNzb2FDb25maWdcIiBbZGVmYXVsdFRpcG9QZXNzb2FdPVwiZGVmYXVsdFRpcG9QZXNzb2FcIlxyXG4gICAgW2NhbXBvUGVzcXVpc2FNYXhXaWR0aF09XCJjYW1wb1Blc3F1aXNhTWF4V2lkdGhcIiAocGVzc29hRW1pdHRlZCk9XCJwZXNzb2FSZWNlYmlkYSgkZXZlbnQpXCI+XHJcbiAgPC9saWItdW5iLXBlc3NvYS1wZXNxdWlzYXI+XHJcbjwvZGl2PlxyXG5cclxuPHVuYi1tZW5zYWdlbT48L3VuYi1tZW5zYWdlbT5cclxuXHJcbjxmb3JtICNwZXNzb2FGb3JtPVwibmdGb3JtXCIgW2NsYXNzLnJlYWRvbmx5XT1cImlzUmVhZG9ubHlGcm9tU2lhcGUgfHwgaXNMb2FkaW5nXCIgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBtdC0yXCJcclxuICAqbmdJZj1cImJ1c2NhUmVhbGl6YWRhICYmIGFwaVBlc3NvYUNvbmZpZy51cmxcIiAobmdTdWJtaXQpPVwic2FsdmFyKHBlc3NvYUZvcm0pXCI+XHJcblxyXG4gIDwhLS0gQ2FtcG9zIFBlc3NvYSBGw61zaWNhIGUgRXN0cmFuZ2VpcmEgIC0tPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0lmPVwicGVzc29hLnRpcG9QZXNzb2EgPT0gdGlwb1Blc3NvYUVudW0oKS5GSVNJQ0EgfHwgcGVzc29hLnRpcG9QZXNzb2EgPT0gdGlwb1Blc3NvYUVudW0oKS5FU1RSQU5HRUlSQVwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lXCIgbmFtZT1cIm5vbWVcIiAjbm9tZT1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5TZXhvPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb1NleG9cIiBuYW1lPVwiY29kaWdvU2V4b1wiICNjb2RpZ29TZXhvPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIxXCI+TWFzY3VsaW5vPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIyXCI+RmVtaW5pbm88L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+RGF0YSBOYXNjaW1lbnRvPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRhTmFzY2ltZW50b1BpY2tlclwiIFsobmdNb2RlbCldPVwicGVzc29hLmRhdGFOYXNjaW1lbnRvXCIgbmFtZT1cImRhdGFOYXNjaW1lbnRvXCJcclxuICAgICAgICAjZGF0YU5hc2NpbWVudG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZGF0YU5hc2NpbWVudG9QaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRhTmFzY2ltZW50b1BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Fc3RhZG8gQ2l2aWw8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvRXN0YWRvQ2l2aWxcIiBuYW1lPVwiY29kaWdvRXN0YWRvQ2l2aWxcIiAjY29kaWdvRXN0YWRvQ2l2aWw9XCJuZ01vZGVsXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVzdGFkbyBvZiBlc3RhZG9zQ2l2aWwgfCBhc3luY1wiIFt2YWx1ZV09XCJlc3RhZG8uY29kaWdvXCI+XHJcbiAgICAgICAgICB7eyBlc3RhZG8uZGVub21pbmFjYW8gfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPCEtLVxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5OYXR1cmFsaWRhZGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLm5hdHVyYWxpZGFkZVwiIG5hbWU9XCJuYXR1cmFsaWRhZGVcIiAjbmF0dXJhbGlkYWRlPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgY2lkYWRlIG9mIGdldExpc3RhRXN0YWRvcygpXCIgW3ZhbHVlXT1cImNpZGFkZS5jb2RpZ29cIj5cclxuICAgICAgICAgICAgICB7eyBjaWRhZGUuZGVzY3JpY2FvIH19XHJcbiAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIC0tPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+UGHDrXMgTmFzY2ltZW50bzwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlc3NvYS5jb2RpZ29QYWlzTmFzY2ltZW50b1wiIG5hbWU9XCJjb2RpZ29QYWlzTmFzY2ltZW50b1wiICNjb2RpZ29QYWlzTmFzY2ltZW50bz1cIm5nTW9kZWxcIlxyXG4gICAgICAgIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwYWlzTmFzY2ltZW50byBvZiBwYWlzZXMgfCBhc3luY1wiIFt2YWx1ZV09XCJwYWlzTmFzY2ltZW50by5jb2RpZ29cIj5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGFpc05hc2NpbWVudG8uZGVub21pbmFjYW8gPT09ICdCUkFTSUwnXCI+8J+Hp/Cfh7cgPGI+e3sgcGFpc05hc2NpbWVudG8uZGVub21pbmFjYW8gfX08L2I+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyAhPT0gJ0JSQVNJTCdcIj57eyBwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyB9fTwvc3Bhbj5cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG8gPT0gMjJcIj4gPCEtLSAyMiBlaCBCcmFzaWwtLT5cclxuICAgICAgPG1hdC1sYWJlbD5VRiBOYXNjaW1lbnRvPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLnVmTmFzY2ltZW50b1wiIG5hbWU9XCJ1Zk5hc2NpbWVudG9cIiAjdWZOYXNjaW1lbnRvPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCB1Zk5hc2NpbWVudG8gb2YgZ2V0TGlzdGFFc3RhZG9zKClcIiBbdmFsdWVdPVwidWZOYXNjaW1lbnRvLmlkZW50aWZpY2Fkb3JcIj5cclxuICAgICAgICAgIHt7IHVmTmFzY2ltZW50by5pZGVudGlmaWNhZG9yIH19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiICpuZ0lmPVwicGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvID09IDIyXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+TmF0dXJhbGlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5hdHVyYWxpZGFkZVwiIG5hbWU9XCJuYXR1cmFsaWRhZGVcIiAjbmF0dXJhbGlkYWRlPVwibmdNb2RlbFwiXHJcbiAgICAgICAgcmVxdWlyZWQgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+RXNjb2xhcmlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmVzY29sYXJpZGFkZVwiIG5hbWU9XCJjb2RpZ29Fc2NvbGFyaWRhZGVcIiAjY29kaWdvRXNjb2xhcmlkYWRlPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBlc2NvbGFyaWRhZGUgb2YgZXNjb2xhcmlkYWRlIHwgYXN5bmNcIiBbdmFsdWVdPVwiZXNjb2xhcmlkYWRlLmNvZGlnb1wiPlxyXG4gICAgICAgICAge3sgZXNjb2xhcmlkYWRlLmRlbm9taW5hY2FvIH19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPk5vbWUgU29jaWFsPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVTb2NpYWxcIiBuYW1lPVwibm9tZVNvY2lhbFwiICNub21lU29jaWFsPVwibmdNb2RlbFwiIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPk5vbWUgZGEgTcOjZTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lTWFlXCIgbmFtZT1cIm5vbWVNYWVcIiAjbm9tZU1hZT1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Ob21lIGRvIFBhaTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lUGFpXCIgbmFtZT1cIm5vbWVQYWlcIiAjbm9tZVBhaT1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPCEtLSBDYW1wb3MgUGVzc29hIEp1csOtZGljYSAtLT5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVzc29hLnRpcG9QZXNzb2EgPT09IHRpcG9QZXNzb2FFbnVtKCkuSlVSSURJQ0FcIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPlJhesOjbyBTb2NpYWw8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucmF6YW9Tb2NpYWxcIiBuYW1lPVwicmF6YW9Tb2NpYWxcIiAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPk5vbWUgRmFudGFzaWE8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2Eubm9tZUZhbnRhc2lhXCIgbmFtZT1cIm5vbWVGYW50YXNpYVwiIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicGVzc29hLnRpcG9QZXNzb2EgPT0gdGlwb1Blc3NvYUVudW0oKS5GSVNJQ0FcIj5cclxuICAgIDxiIHN0eWxlPVwiZmxleDogMSAxIDEwMCU7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+RG9jdW1lbnRhw6fDo288L2I+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+SWRlbnRpZGFkZTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ1wiIG5hbWU9XCJyZ1wiICNyZz1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD7Dk3Jnw6NvIEVtaXNzb3I8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucmdPcmdhb1wiIG5hbWU9XCJyZ09yZ2FvXCIgI3JnT3JnYW89XCJuZ01vZGVsXCIgcmVxdWlyZWQgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+VW5pZGFkZSBGZWRlcmF0aXZhPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLnJnVWZcIiBuYW1lPVwicmdVZlwiICNyZ1VmPVwibmdNb2RlbFwiIHJlcXVpcmVkPlxyXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjaWRhZGUgb2YgZ2V0TGlzdGFFc3RhZG9zKClcIiBbdmFsdWVdPVwiY2lkYWRlLmlkZW50aWZpY2Fkb3JcIj5cclxuICAgICAgICAgIHt7IGNpZGFkZS5pZGVudGlmaWNhZG9yIH19XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPkRhdGEgZGUgRW1pc3PDo288L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EucmdEYXRhRW1pc3Nhb1wiIG5hbWU9XCJyZ0RhdGFFbWlzc2FvXCIgI3JnRGF0YUVtaXNzYW89XCJuZ01vZGVsXCIgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkVTVFJBTkdFSVJBIFwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkICBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPkRhdGEgQ2hlZ2FkYSBCcmFzaWw8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cImRhdGFDaGVnYWRhQnJhc2lsUGlja2VyXCIgWyhuZ01vZGVsKV09XCJwZXNzb2EuZGF0YUNoZWdhZGFCcmFzaWxcIlxyXG4gICAgICAgIG5hbWU9XCJkYXRhQ2hlZ2FkYUJyYXNpbFwiICNkYXRhQ2hlZ2FkYUJyYXNpbD1cIm5nTW9kZWxcIiByZXF1aXJlZD5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRhQ2hlZ2FkYUJyYXNpbFBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGFDaGVnYWRhQnJhc2lsUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPlBhw61zIFBhc3NhcG9ydGU8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvUGFpc1Bhc3NhcG9ydGVcIiBuYW1lPVwiY29kaWdvUGFpc1Bhc3NhcG9ydGVcIiAjY29kaWdvUGFpc1Bhc3NhcG9ydGU9XCJuZ01vZGVsXCJcclxuICAgICAgICByZXF1aXJlZD5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcGFpc05hc2NpbWVudG8gb2YgcGFpc2VzIHwgYXN5bmNcIiBbdmFsdWVdPVwicGFpc05hc2NpbWVudG8uY29kaWdvXCI+XHJcbiAgICAgICAgICB7eyBwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyB9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+TsO6bWVybyBQYXNzYXBvcnRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLnBhc3NhcG9ydGVcIiBuYW1lPVwicGFzc2Fwb3J0ZVwiICNwYXNzYXBvcnRlPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bGliLXVuYi1wZXNzb2EtdGVsZWZvbmUtbGlzdCBzdHlsZT1cImZsZXg6IDEgMSAxMDAlO1wiIFthcGlQZXNzb2FDb25maWddPVwiYXBpUGVzc29hQ29uZmlnXCJcclxuICAgIFt0ZWxlZm9uZXNdPVwicGVzc29hLnRlbGVmb25lc1wiICh0ZWxlZm9uZXNFbWl0dGVkKT1cInRlbGVmb25lc0VtaXR0ZWQoJGV2ZW50KVwiPjwvbGliLXVuYi1wZXNzb2EtdGVsZWZvbmUtbGlzdD5cclxuXHJcbiAgPGxpYi11bmItcGVzc29hLWVuZGVyZWNvLWxpc3Qgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJTtcIiBbYXBpUGVzc29hQ29uZmlnXT1cImFwaVBlc3NvYUNvbmZpZ1wiXHJcbiAgICBbZW5kZXJlY29zXT1cInBlc3NvYS5lbmRlcmVjb3NcIiAoZW5kZXJlY29zRW1pdHRlZCk9XCJlbmRlcmVjb3NFbWl0dGVkKCRldmVudClcIj48L2xpYi11bmItcGVzc29hLWVuZGVyZWNvLWxpc3Q+XHJcblxyXG4gIDxsaWItdW5iLXBlc3NvYS1lbWFpbC1saXN0IHN0eWxlPVwiZmxleDogMSAxIDEwMCU7XCIgW2FwaVBlc3NvYUNvbmZpZ109XCJhcGlQZXNzb2FDb25maWdcIiBbZW1haWxzXT1cInBlc3NvYS5lbWFpbHNcIlxyXG4gICAgKGVtYWlsc0VtaXR0ZWQpPVwiZW1haWxzRW1pdHRlZCgkZXZlbnQpXCI+PC9saWItdW5iLXBlc3NvYS1lbWFpbC1saXN0PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNSZWFkb25seUZyb21TaWFwZVwiIHN0eWxlPVwiZmxleDoxIDEgMTAwJTsgbWFyZ2luLWJvdHRvbToxMHB4O1wiPlxyXG4gICAgPG1hdC1jYXJkPlxyXG4gICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICA8c3Ryb25nPlNlcnZpZG9yIGNvbSBtYXRyw61jdWxhIFNJQVBFIGRldmUgdGVyIHNldXMgZGFkb3MgYXV0YWxpemFkb3MgcGVsbyBhcGxpY2F0aXZvIGRvIHNvdWdvdjwvc3Ryb25nPlxyXG4gICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8L21hdC1jYXJkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LWNhcmQtYWN0aW9ucyBjbGFzcz1cImNhcmQtYWN0aW9ucy1idXR0b25zXCIgKm5nSWY9XCJidXNjYVJlYWxpemFkYVwiPlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gW2Rpc2FibGVkXT1cImlzTG9hZGluZyB8fCBpc1JlYWRvbmx5RnJvbVNpYXBlXCIgdHlwZT1cInN1Ym1pdFwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICBTYWx2YXJcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LWNhcmQtYWN0aW9ucz5cclxuXHJcbjwvZm9ybT4iXX0=
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5iLXBlc3NvYS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VuYi1saWItY29tcG9uZW50cy9zcmMvbGliL3VuYi1wZXNzb2EvdW5iLXBlc3NvYS1mb3JtL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91bmItbGliLWNvbXBvbmVudHMvc3JjL2xpYi91bmItcGVzc29hL3VuYi1wZXNzb2EtZm9ybS91bmItcGVzc29hLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJMUYsT0FBTyxFQUFzQixtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFLbkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXpELE1BQU0sT0FBTyxzQkFBc0I7SUEyQmpDLFlBQW9CLE9BQXlCLEVBQVUsUUFBcUIsRUFBVSxZQUFnQztRQUFsRyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBVSxpQkFBWSxHQUFaLFlBQVksQ0FBb0I7UUExQnRILGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0IsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsYUFBUSxHQUFHLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNuQyxVQUFLLEdBQUcsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUU3QixnQkFBVyxHQUFHLGNBQWMsQ0FBQztRQUU3QixXQUFNLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7UUFDdkUsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDLENBQUMsc0NBQXNDO1FBRWhGLDhFQUE4RTtRQUM5RSx3RUFBd0U7UUFDeEUsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBSTVCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFFeEIsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLDRCQUF1QixHQUFHLElBQUksQ0FBQztRQUMvQiwwQkFBcUIsR0FBVyxPQUFPLENBQUM7UUFFdkMsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUNuRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFTeEQsc0JBQWlCLEdBQUcsZUFBZSxDQUFDO1FBRXBDLCtEQUErRDtRQUMvRCx3QkFBbUIsR0FBVyxFQUFFLENBQUM7UUFDakMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLG1CQUFjLEdBQVksS0FBSyxDQUFDO0lBWjBGLENBQUM7SUFjM0gsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsOEhBQThILENBQUMsQ0FBQTtZQUM1SixPQUFPO1FBQ1QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQsY0FBYyxDQUFDLGNBQThCO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsY0FBYyxDQUFDO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXRELHdEQUF3RDtRQUN4RCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVM7WUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFdkQsc0RBQXNEO1FBQ3RELE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUVuRCwrRUFBK0U7UUFDL0UsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7UUFFM0UsbURBQW1EO1FBQ25ELE1BQU0sTUFBTSxHQUFHO1lBQ2IsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHO1lBQ3hDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSTtZQUMzQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7U0FDckQsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEUsc0NBQXNDO1FBQ3RDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVk7UUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFdEQsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU87UUFFaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV6RCwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2FBQ2pELFNBQVMsQ0FBQztZQUNULElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLHNCQUFzQjtnQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsOENBQThDLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUVuSSwwQ0FBMEM7Z0JBQzFDLElBQUksUUFBUSxFQUFFLENBQUM7b0JBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQztvQkFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztvQkFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssRUFBRSxDQUFDLEdBQXdCLEVBQUUsRUFBRTtnQkFDbEMscUVBQXFFO2dCQUNyRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLENBQUM7U0FDRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIscURBQXFEO1lBQ3JELElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDakUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0VBQWtFLENBQUMsQ0FBQztZQUN0RixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRyxJQUFJLENBQUMsWUFBWSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDakYsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQ2pELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQy9ELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQztnQkFDakQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkcsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUN2RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDckYsSUFBSSxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUNqRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBOEI7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUE4QjtRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxNQUF3QjtRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDOUIsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFlO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDL0IsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztRQUNaLE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVEOztLQUVDO0lBQ08sc0JBQXNCLENBQUMsTUFBc0I7UUFDbkQsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUV6QiwyQkFBMkI7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYTtZQUNoQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO1lBQzFDLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZTtZQUNwQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO1lBQzFDLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1lBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtZQUMxQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7WUFDNUIsZUFBZSxFQUFFLEdBQUcsQ0FBQyxlQUFlO1NBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSztZQUN4QixrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO1lBQzFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRztZQUNaLGNBQWMsRUFBRSxHQUFHLENBQUMsTUFBTTtZQUMxQixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO1NBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUosTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUMvRCxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsVUFBVSxFQUFFLEtBQUssQ0FBQyxLQUFLO1lBQ3ZCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztZQUNsQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7U0FDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSixtQ0FBbUM7UUFDbkMsT0FBTztZQUNMLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFFakMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixvRUFBb0U7WUFDcEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDekQsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDM0Msa0JBQWtCLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDdkMsNkNBQTZDO1lBQzdDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFFdkIsY0FBYyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQ25FLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7WUFDakQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWTtZQUVqQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7WUFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLGFBQWEsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztZQUVqRSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CO1lBQy9DLHdCQUF3QixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUM7WUFDdkYsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtZQUMzQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCO1lBQzdDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtZQUV2QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCO1lBQ3pDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZTtZQUN2QyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWU7WUFFdkMsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQjtZQUNyRCxxQkFBcUIsRUFBRSxNQUFNLENBQUMscUJBQXFCO1lBQ25ELGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxrQkFBa0I7WUFDN0MsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1lBRXpCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUI7WUFDM0MsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQjtZQUMvQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDO1lBQ25GLHVCQUF1QixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUM7WUFDckYsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtZQUNqRCw0QkFBNEIsRUFBRSxNQUFNLENBQUMsNEJBQTRCO1lBQ2pFLG1CQUFtQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7WUFFN0UsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxvQkFBb0I7WUFDakQsc0VBQXNFO1lBQ3RFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzVELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDakMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUUzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFFakMsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLE1BQU0sRUFBRSxhQUFhO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyx1QkFBdUIsQ0FBQyxJQUFTO1FBQ3ZDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUVoRSxJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM1QixPQUFPLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QixDQUFDLElBQVM7UUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBeUI7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsaUVBQWlFO1FBQ2pFLHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsbUVBQW1FO1FBQ25FLHlEQUF5RDtRQUN6RCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzNDLG9FQUFvRTtZQUNwRSxtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUM7SUFFRCxpQkFBaUI7UUFDZixRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUM7WUFDaEQsS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUM7WUFDbkQsS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUM7WUFDNUQsT0FBTyxDQUFDLENBQUMsT0FBTyxXQUFXLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7OEdBaFhVLHNCQUFzQjtrR0FBdEIsc0JBQXNCLGtmQ3RCbkMsbWpXQTZOTzs7MkZEdk1NLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsS0FBSztnSkFtQlEsVUFBVTtzQkFBbEMsU0FBUzt1QkFBQyxZQUFZO2dCQUVkLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFVuYk1lbnNhZ2VtU2VydmljZSwgVW5iVGlwb01lbnNhZ2VtRW51bSB9IGZyb20gJy4uLy4uL3VuYi1tZW5zYWdlbS91bmItbWVuc2FnZW0uc2VydmljZSc7XHJcbmltcG9ydCB7IGxpc3RhRXN0YWRvcyB9IGZyb20gJy4uL3Blc3NvYS10YWJlbGFzLWFwb2lvJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW1haWwgfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVtYWlsLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRW5kZXJlY28gfSBmcm9tICcuLi91bmItcGVzc29hLW1vZGVscy91bmItcGVzc29hLWVuZGVyZWNvLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hRXNjb2xhcmlkYWRlIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS1lc2NvbGFyaWRhZGUubW9kZWwnO1xyXG5pbXBvcnQgeyBVbmJQZXNzb2FFc3RhZG9DaXZpbCB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtZXN0YWRvLWNpdmlsLm1vZGVsJztcclxuaW1wb3J0IHsgVW5iUGVzc29hUGFpcyB9IGZyb20gJy4uL3VuYi1wZXNzb2EtbW9kZWxzL3VuYi1wZXNzb2EtcGFpcyc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYVRlbGVmb25lIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS10ZWxlZm9uZS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuYlBlc3NvYU1vZGVsIH0gZnJvbSAnLi4vdW5iLXBlc3NvYS1tb2RlbHMvdW5iLXBlc3NvYS5tb2RlbCc7XHJcbmltcG9ydCB7IFVuQlBlc3NvYVNlcnZpY2UsIFVuYlBlc3NvYUVycm9QYWRyYW8gfSBmcm9tICcuLi91bmItcGVzc29hLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUaXBvUGVzc29hRW51bSB9IGZyb20gJy4uL3VuYi10aXBvLXBlc3NvYS5lbnVtJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLXVuYi1wZXNzb2EtZm9ybScsXHJcbiAgc3RhbmRhbG9uZTogZmFsc2UsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL3VuYi1wZXNzb2EtZm9ybS5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVW5iUGVzc29hRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYnVzY2FSZWFsaXphZGE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlbmRlcmVjbyA9IG5ldyBVbmJQZXNzb2FFbmRlcmVjbygpO1xyXG4gIGVtYWlsID0gbmV3IFVuYlBlc3NvYUVtYWlsKCk7XHJcblxyXG4gIHRpcG9zUGVzc29hID0gVGlwb1Blc3NvYUVudW07XHJcblxyXG4gIHBlc3NvYTogVW5iUGVzc29hTW9kZWwgPSBuZXcgVW5iUGVzc29hTW9kZWwoKTsgLy8gaW5pY2lhbGl6YSBjb20gcGVzc29hXHJcbiAgZGFkb3NTYWx2b3M6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTsgLy8gQXJtYXplbmEgb3MgZGFkb3MgYW8gdHJvY2FyIGRlIHRpcG9cclxuXHJcbiAgLy8gUXVhbmRvIHZlcmRhZGVpcm8sIG8gZm9ybXVsw6FyaW8gZSBhw6fDtWVzIGZpY2FtIGRlc2FiaWxpdGFkb3MgcG9ycXVlIG9zIGRhZG9zXHJcbiAgLy8gZGV2ZW0gc2VyIGFsdGVyYWRvcyBhcGVuYXMgcGVsbyBhcHAgU291R292IChtYXRyaWN1bGEgU0lBUEUgcHJlc2VudGUpXHJcbiAgaXNSZWFkb25seUZyb21TaWFwZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKCdwZXNzb2FGb3JtJykgcGVzc29hRm9ybSE6IE5nRm9ybTtcclxuXHJcbiAgQElucHV0KCkgYmFja2VuZFVSTDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoKSBkZWZhdWx0VGlwb1Blc3NvYSE6IFRpcG9QZXNzb2FFbnVtO1xyXG4gIEBJbnB1dCgpIHBlc3F1aXNhclBvckNQRiA9IHRydWU7XHJcbiAgQElucHV0KCkgcGVzcXVpc2FyUG9yQ05QSiA9IHRydWU7XHJcbiAgQElucHV0KCkgcGVzcXVpc2FyUG9yRXN0cmFuZ2Vpcm8gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNhbXBvUGVzcXVpc2FNYXhXaWR0aDogc3RyaW5nID0gJzQwMHB4JztcclxuXHJcbiAgQE91dHB1dCgpIHBlc3NvYUVtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFVuYlBlc3NvYU1vZGVsPigpO1xyXG4gIEBPdXRwdXQoKSBpc0xvYWRpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2VydmljZTogVW5CUGVzc29hU2VydmljZSwgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBVbmJNZW5zYWdlbVNlcnZpY2UpIHsgfVxyXG5cclxuICAvLyB0YWJlbGFzIHRyYWRpY2lvbmFpcyBxdWUgdmVtIGRvIGJhY2tlbmRcclxuICBlc2NvbGFyaWRhZGUhOiBPYnNlcnZhYmxlPFVuYlBlc3NvYUVzY29sYXJpZGFkZVtdPjtcclxuICBwYWlzZXMhOiBPYnNlcnZhYmxlPFVuYlBlc3NvYVBhaXNbXT47XHJcbiAgZXN0YWRvc0NpdmlsITogT2JzZXJ2YWJsZTxVbmJQZXNzb2FFc3RhZG9DaXZpbFtdPjtcclxuXHJcbiAgaWRNZW5zYWdlbVNlcnZpY2UgPSBcInVuYlBlc3NvYUZvcm1cIjtcclxuXHJcbiAgLy8gQ29udHJvbGEgc2UgZXN0w6EgaW5jbHVpbmRvIG5vdmEgcGVzc29hIG91IGVkaXRhbmRvIGV4aXN0ZW50ZVxyXG4gIGRvY3VtZW50b1Blc3F1aXNhZG86IHN0cmluZyA9ICcnO1xyXG4gIGluY2x1aW5kb05vdmFQZXNzb2E6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBlZGl0YW5kb1Blc3NvYTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmhpZGVNZXNzYWdlKHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG4gICAgaWYgKHRoaXMuYmFja2VuZFVSTCA9PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3JQcmludENvbnNvbGUoXCJbVW5iUGVzc29hUGVzcXVpc2FyQ29tcG9uZW50XSBFUlJPUjogYXBpUGVzc29hQ29uZmlnLnVybCBlc3TDoSBudWxsLiBJbnNpcmEgbyBwYXLDom1ldHJvIChhcGlQZXNzb2FDb25maWcpIGNvbSBvIHZhbG9yIHbDoWxpZG8hXCIpXHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VydmljZS5zZXRCYWNrZW5kVXJsKHRoaXMuYmFja2VuZFVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYXRlbmNhbywgbyBwZXNzb2FSZWNlYmlkYSBxdWUgaW5pY2lhbGl6YSBlc3NlIGNvbXBvbmVudGVcclxuICAgIHRoaXMuZXNjb2xhcmlkYWRlID0gdGhpcy5zZXJ2aWNlLmdldEVzY29sYXJpZGFkZSgpO1xyXG4gICAgdGhpcy5wYWlzZXMgPSB0aGlzLnNlcnZpY2UuZ2V0UGFpc2VzKCk7XHJcbiAgICB0aGlzLmVzdGFkb3NDaXZpbCA9IHRoaXMuc2VydmljZS5nZXRFc3RhZG9DaXZpbCgpO1xyXG4gIH1cclxuXHJcbiAgcGVzc29hUmVjZWJpZGEocGVzc29hUmVjZWJpZGE6IFVuYlBlc3NvYU1vZGVsKSB7XHJcbiAgICB0aGlzLmJ1c2NhUmVhbGl6YWRhID0gdHJ1ZTtcclxuICAgIHRoaXMucGVzc29hID0gcGVzc29hUmVjZWJpZGE7XHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5oaWRlTWVzc2FnZSh0aGlzLmlkTWVuc2FnZW1TZXJ2aWNlKTtcclxuXHJcbiAgICAvLyBSZXNldGEgbyBmb3JtdWzDoXJpbyBxdWFuZG8gdW1hIG5vdmEgcGVzc29hIMOpIHJlY2ViaWRhXHJcbiAgICBpZiAodGhpcy5wZXNzb2FGb3JtKSB7XHJcbiAgICAgIHRoaXMucGVzc29hRm9ybS5yZXNldEZvcm0oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpbmljaWFsaXphIHByYSBuYW8gcXVlYnJhclxyXG4gICAgaWYgKCF0aGlzLnBlc3NvYS5lbmRlcmVjb3MpIHRoaXMucGVzc29hLmVuZGVyZWNvcyA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnBlc3NvYS5lbWFpbHMpIHRoaXMucGVzc29hLmVtYWlscyA9IFtdO1xyXG4gICAgaWYgKCF0aGlzLnBlc3NvYS50ZWxlZm9uZXMpIHRoaXMucGVzc29hLnRlbGVmb25lcyA9IFtdO1xyXG5cclxuICAgIC8vIDEuIFZlcmlmaWNhIHNlIMOpIHVtIHJlZ2lzdHJvIHF1ZSBqw6EgZXhpc3RlIG5vIGJhbmNvXHJcbiAgICBjb25zdCBleGlzdGVSZWdpc3RybyA9ICEhdGhpcy5wZXNzb2E/LmNvZGlnb1Blc3NvYTtcclxuXHJcbiAgICAvLyAyLiBWZXJpZmljYSBzZSDDqSBibG9xdWVhZG8gcGVsbyBTSUFQRSAoU8OzIGZheiBzZW50aWRvIHNlIG8gcmVnaXN0cm8gZXhpc3RpcilcclxuICAgIHRoaXMuaXNSZWFkb25seUZyb21TaWFwZSA9IGV4aXN0ZVJlZ2lzdHJvICYmICEhdGhpcy5wZXNzb2E/Lm1hdHJpY3VsYVNpYXBlO1xyXG5cclxuICAgIC8vIDMuIERlZmluZSBvIGRvY3VtZW50byAodXNhbmRvIGFxdWVsZSBtYXBhIGxpbXBvKVxyXG4gICAgY29uc3QgZG9jTWFwID0ge1xyXG4gICAgICBbVGlwb1Blc3NvYUVudW0uRklTSUNBXTogdGhpcy5wZXNzb2EuY3BmLFxyXG4gICAgICBbVGlwb1Blc3NvYUVudW0uSlVSSURJQ0FdOiB0aGlzLnBlc3NvYS5jbnBqLFxyXG4gICAgICBbVGlwb1Blc3NvYUVudW0uRVNUUkFOR0VJUkFdOiB0aGlzLnBlc3NvYS5wYXNzYXBvcnRlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5kb2N1bWVudG9QZXNxdWlzYWRvID0gZG9jTWFwW3RoaXMucGVzc29hLnRpcG9QZXNzb2FdIHx8ICcnO1xyXG5cclxuICAgIC8vIDQuIChPcGNpb25hbCkgU25hY2tiYXIgc2UgZm9yIFNJQVBFXHJcbiAgICBpZiAodGhpcy5pc1JlYWRvbmx5RnJvbVNpYXBlKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKCdEYWRvcyBpbXBvcnRhZG9zIGRvIFNJQVBFIG7Do28gcG9kZW0gc2VyIGFsdGVyYWRvcy4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNhbHZhcihmb3JtOiBOZ0Zvcm0pIHtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmhpZGVNZXNzYWdlKHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG5cclxuICAgIC8vIFN1YXMgdmFsaWRhw6fDtWVzXHJcbiAgICBpZiAoIXRoaXMudmFsaWRhcihmb3JtKSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNMb2FkaW5nQ2hhbmdlLmVtaXQodHJ1ZSk7XHJcblxyXG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuY29udmVydFBlc3NvYVRvUGF5bG9hZCh0aGlzLnBlc3NvYSk7XHJcblxyXG4gICAgLy8gTyBzZXJ2aWNlIGrDoSB0ZW0gbyAucGlwZShjYXRjaEVycm9yKSBpbnRlcm5vLCBlbnTDo28gbyBlcnJvIGNoZWdhIHRyYXRhZG9cclxuICAgIHRoaXMuc2VydmljZS5zYWx2YXIocGF5bG9hZCwgdGhpcy5wZXNzb2EudGlwb1Blc3NvYSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHJlc3Bvc3RhKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmdDaGFuZ2UuZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICAvLyBNZW5zYWdlbSBkZSBTdWNlc3NvXHJcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93TWVzc2FnZShcIjxzdHJvbmc+UmVnaXN0cm8gc2Fsdm8gY29tIHN1Y2Vzc28hPC9zdHJvbmc+XCIsIFVuYlRpcG9NZW5zYWdlbUVudW0uU1VDQ0VTUywgdGhpcy5pZE1lbnNhZ2VtU2VydmljZSk7XHJcblxyXG4gICAgICAgICAgLy8gQXR1YWxpemEgZGFkb3MgcmV0b3JuYWRvcyAoSURzIGdlcmFkb3MpXHJcbiAgICAgICAgICBpZiAocmVzcG9zdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5wZXNzb2EuY29kaWdvUGVzc29hID0gcmVzcG9zdGEuY29kaWdvUGVzc29hIHx8IHRoaXMucGVzc29hLmNvZGlnb1Blc3NvYTtcclxuICAgICAgICAgICAgdGhpcy5wZXNzb2EuaWRQZXNzb2EgPSByZXNwb3N0YS5pZFBlc3NvYSB8fCB0aGlzLnBlc3NvYS5pZFBlc3NvYTtcclxuICAgICAgICAgICAgdGhpcy5wZXNzb2FFbWl0dGVkLmVtaXQodGhpcy5wZXNzb2EpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnI6IFVuYlBlc3NvYUVycm9QYWRyYW8pID0+IHtcclxuICAgICAgICAgIC8vIEFRVUk6IE8gJ2VycicgasOhIGNoZWdhIGxpbXBvIGNvbSB7IG1lbnNhZ2VtU2ltcGxlcywgbWVuc2FnZW1IdG1sIH1cclxuICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhcihmb3JtOiBOZ0Zvcm0pOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5wZXNzb2EpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJFcnJvIGFvIGNhcnJlZ2FyIG9iamV0byBwZXNzb2FcIik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIC8vIHBhcmEgcXVlIG9zIGVycm9zIGFwYXJlw6dhbSBuYSB0ZWxhIHBhcmEgbyB1c3XDoXJpby5cclxuICAgICAgZm9ybS5jb250cm9sLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJQb3IgZmF2b3IsIHByZWVuY2hhIG9zIGNhbXBvcyBvYnJpZ2F0w7NyaW9zLlwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS50ZWxlZm9uZXMgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EudGVsZWZvbmVzICE9IG51bGwgJiYgdGhpcy5wZXNzb2EudGVsZWZvbmVzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkNhZGFzdHJlIHBlbG8gbWVub3MgdW0gdGVsZWZvbmUgbm8gYm90w6NvIENhZGFzdHJhciBOb3ZvIFRlbGVmb25lXCIpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucGVzc29hLmVuZGVyZWNvcyA9PSBudWxsIHx8ICh0aGlzLnBlc3NvYS5lbmRlcmVjb3MgIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5lbmRlcmVjb3MubGVuZ3RoID09IDApKSB7XHJcbiAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiQ2FkYXN0cmUgcGVsbyBtZW5vcyB1bSBlbmRlcmXDp28gbm8gYm90w6NvIENhZGFzdHJhciBOb3ZvIEVuZGVyZcOnb1wiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS5lbWFpbHMgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EuZW1haWxzICE9IG51bGwgJiYgdGhpcy5wZXNzb2EuZW1haWxzLmxlbmd0aCA9PSAwKSkge1xyXG4gICAgICB0aGlzLm9wZW5TbmFja0JhcihcIkNhZGFzdHJlIHBlbG8gbWVub3MgdW0gZS1tYWlsIG5vIGJvdMOjbyBDYWRhc3RyYXIgTm92byBFbWFpbFwiKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS50aXBvUGVzc29hID09IFRpcG9QZXNzb2FFbnVtLkZJU0lDQSkge1xyXG4gICAgICBpZiAoIXRoaXMucGVzc29hLm5vbWUgfHwgKHRoaXMucGVzc29hICYmIHRoaXMucGVzc29hLm5vbWUgPT0gXCJcIikpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIk5vbWUgw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLnBlc3NvYS5kYXRhTmFzY2ltZW50bykge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrQmFyKFwiRGF0YSBkZSBOYXNjaW1lbnRvIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5wZXNzb2EudGlwb1Blc3NvYSA9PSBUaXBvUGVzc29hRW51bS5FU1RSQU5HRUlSQSkge1xyXG4gICAgICBpZiAoIXRoaXMucGVzc29hLm5vbWUgfHwgKHRoaXMucGVzc29hICYmIHRoaXMucGVzc29hLm5vbWUgPT0gXCJcIikpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIk5vbWUgw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMucGVzc29hLnBhc3NhcG9ydGUgPT0gbnVsbCB8fCAodGhpcy5wZXNzb2EucGFzc2Fwb3J0ZSAhPSBudWxsICYmIHRoaXMucGVzc29hLnBhc3NhcG9ydGUgPT0gXCJcIikpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja0JhcihcIlBhc3NhcG9ydGUgw6kgdW0gY2FtcG8gb2JyaWdhdMOzcmlvXCIpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBlc3NvYS50aXBvUGVzc29hID09IFRpcG9QZXNzb2FFbnVtLkpVUklESUNBKSB7XHJcbiAgICAgIGlmICh0aGlzLnBlc3NvYS5jbnBqID09IG51bGwgfHwgKHRoaXMucGVzc29hLmNucGogIT0gbnVsbCAmJiB0aGlzLnBlc3NvYS5jbnBqID09IFwiXCIpKSB7XHJcbiAgICAgICAgdGhpcy5vcGVuU25hY2tCYXIoXCJDTlBKIMOpIHVtIGNhbXBvIG9icmlnYXTDs3Jpb1wiKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHRlbGVmb25lc0VtaXR0ZWQodGVsZWZvbmVzOiBVbmJQZXNzb2FUZWxlZm9uZVtdKSB7XHJcbiAgICB0aGlzLnBlc3NvYS50ZWxlZm9uZXMgPSB0ZWxlZm9uZXM7XHJcbiAgfVxyXG5cclxuICBlbmRlcmVjb3NFbWl0dGVkKGVuZGVyZWNvczogVW5iUGVzc29hRW5kZXJlY29bXSkge1xyXG4gICAgdGhpcy5wZXNzb2EuZW5kZXJlY29zID0gZW5kZXJlY29zO1xyXG4gIH1cclxuXHJcbiAgZW1haWxzRW1pdHRlZChlbWFpbHM6IFVuYlBlc3NvYUVtYWlsW10pIHtcclxuICAgIHRoaXMucGVzc29hLmVtYWlscyA9IGVtYWlscztcclxuICB9XHJcblxyXG4gIG9wZW5TbmFja0JhcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc25hY2tCYXIub3BlbihtZXNzYWdlLCAneCcsIHtcclxuICAgICAgZHVyYXRpb246IDUwMDAsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRpcG9QZXNzb2FFbnVtKCkge1xyXG4gICAgcmV0dXJuIFRpcG9QZXNzb2FFbnVtO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdGFFc3RhZG9zKCkge1xyXG4gICAgcmV0dXJuIGxpc3RhRXN0YWRvcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBDb252ZXJ0ZSB1bWEgaW5zdMOibmNpYSAob3Ugb2JqZXRvKSBkZSBVbmJQZXNzb2FNb2RlbCBwYXJhIG8gcGF5bG9hZCBlc3BlcmFkbyBwZWxvIGJhY2tlbmQuXHJcbiAqL1xyXG4gIHByaXZhdGUgY29udmVydFBlc3NvYVRvUGF5bG9hZChwZXNzb2E6IFVuYlBlc3NvYU1vZGVsKTogYW55IHtcclxuICAgIGlmICghcGVzc29hKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyAtLS0gTWFwZWlhIG9zIGFycmF5cyAtLS1cclxuICAgIGNvbnN0IGVuZGVyZWNvc1BheWxvYWQgPSAocGVzc29hLmVuZGVyZWNvcyB8fCBbXSkubWFwKChlbmQ6IGFueSkgPT4gKHtcclxuICAgICAgb3JkZW1FbmRlcmVjbzogZW5kLm9yZGVtRW5kZXJlY28sXHJcbiAgICAgIHRpcG9FbmRlcmVjb0NvZGlnbzogZW5kLnRpcG9FbmRlcmVjb0NvZGlnbyxcclxuICAgICAgbXVuaWNpcGlvQ29kaWdvOiBlbmQubXVuaWNpcGlvQ29kaWdvLFxyXG4gICAgICBwYWlzRW5kZXJlY29Db2RpZ286IGVuZC5wYWlzRW5kZXJlY29Db2RpZ28sXHJcbiAgICAgIGxvZ3JhZG91cm86IGVuZC5sb2dyYWRvdXJvLFxyXG4gICAgICBjb21wbGVtZW50bzogZW5kLmNvbXBsZW1lbnRvLFxyXG4gICAgICBjZXA6IGVuZC5jZXAsXHJcbiAgICAgIGJhaXJybzogZW5kLmJhaXJybyxcclxuICAgICAgdWZFbmRlcmVjbzogZW5kLnVmRW5kZXJlY28sXHJcbiAgICAgIGNhaXhhUG9zdGFsOiBlbmQuY2FpeGFQb3N0YWwsXHJcbiAgICAgIGNvcnJlc3BvbmRlbmNpYTogZW5kLmNvcnJlc3BvbmRlbmNpYVxyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IHRlbGVmb25lc1BheWxvYWQgPSAocGVzc29hLnRlbGVmb25lcyB8fCBbXSkubWFwKCh0ZWw6IGFueSkgPT4gKHtcclxuICAgICAgb3JkZW1UZWxlZm9uZTogdGVsLm9yZGVtLFxyXG4gICAgICB0aXBvVGVsZWZvbmVDb2RpZ286IHRlbC50aXBvVGVsZWZvbmVDb2RpZ28sXHJcbiAgICAgIGRkaTogdGVsLmRkaSxcclxuICAgICAgZGRkOiB0ZWwuZGRkLFxyXG4gICAgICBudW1lcm9UZWxlZm9uZTogdGVsLm51bWVybyxcclxuICAgICAgcmFtYWw6IHRlbC5yYW1hbCxcclxuICAgICAgYXV0b3JpemFTTVM6IHRlbC5hdXRvcml6YVNNU1xyXG4gICAgfSkpO1xyXG5cclxuICAgIGNvbnN0IGVtYWlsc1BheWxvYWQgPSAocGVzc29hLmVtYWlscyB8fCBbXSkubWFwKChlbWFpbDogYW55KSA9PiAoe1xyXG4gICAgICB0aXBvRW1haWxDb2RpZ286IGVtYWlsLnRpcG9FbWFpbENvZGlnbyxcclxuICAgICAgb3JkZW1FbWFpbDogZW1haWwub3JkZW0sXHJcbiAgICAgIGVtYWlsOiBlbWFpbC5lbWFpbCxcclxuICAgICAgYXV0b3JpemFjYW86IGVtYWlsLmF1dG9yaXphY2FvXHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gLS0tIE1vbnRhIG8gb2JqZXRvIHByaW5jaXBhbCAtLS1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlkUGVzc29hOiBwZXNzb2EuaWRQZXNzb2EsXHJcbiAgICAgIGNvZGlnb1Blc3NvYTogcGVzc29hLmNvZGlnb1Blc3NvYSxcclxuXHJcbiAgICAgIG5vbWU6IHBlc3NvYS5ub21lLFxyXG4gICAgICBub21lU29jaWFsOiBwZXNzb2Eubm9tZVNvY2lhbCxcclxuICAgICAgLy8gQWRpY2lvbmEgYSBjaGF2ZSAnY3BmJyBhbyBvYmpldG8gU09NRU5URSBTRSBwZXNzb2EuY3BmIGZvciB0cnV0aHlcclxuICAgICAgLi4uKHBlc3NvYS5jcGYgJiYgeyBjcGY6IHBlc3NvYS5jcGYucmVwbGFjZSgvXFxEL2csICcnKSB9KSxcclxuICAgICAgY29kaWdvU2V4bzogcGVzc29hLmNvZGlnb1NleG8sXHJcbiAgICAgIGNvZGlnb0VzdGFkb0NpdmlsOiBwZXNzb2EuY29kaWdvRXN0YWRvQ2l2aWwsXHJcbiAgICAgIGNvZGlnb0VzY29sYXJpZGFkZTogcGVzc29hLmVzY29sYXJpZGFkZSxcclxuICAgICAgLy8gY29kaWdvVGlwb1Nhbmd1aW5lbzogcGVzc29hLnRpcG9TYW5ndWluZW8sXHJcbiAgICAgIG5vbWVQYWk6IHBlc3NvYS5ub21lUGFpLFxyXG4gICAgICBub21lTWFlOiBwZXNzb2Eubm9tZU1hZSxcclxuXHJcbiAgICAgIGRhdGFOYXNjaW1lbnRvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5kYXRhTmFzY2ltZW50byksXHJcbiAgICAgIGNvZGlnb1BhaXNOYXNjaW1lbnRvOiBwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG8sXHJcbiAgICAgIHVmTmFzY2ltZW50bzogcGVzc29hLnVmTmFzY2ltZW50byxcclxuICAgICAgbmF0dXJhbGlkYWRlOiBwZXNzb2EubmF0dXJhbGlkYWRlLFxyXG5cclxuICAgICAgcmc6IHBlc3NvYS5yZyxcclxuICAgICAgcmdPcmdhbzogcGVzc29hLnJnT3JnYW8sXHJcbiAgICAgIHJnVWY6IHBlc3NvYS5yZ1VmLFxyXG4gICAgICByZ0RhdGFFbWlzc2FvOiB0aGlzLmZvcm1hdGFyRGF0YVBhcmFCYWNrZW5kKHBlc3NvYS5yZ0RhdGFFbWlzc2FvKSxcclxuXHJcbiAgICAgIG51bWVyb1RpdHVsb0VsZWl0b3I6IHBlc3NvYS5udW1lcm9UaXR1bG9FbGVpdG9yLFxyXG4gICAgICBkYXRhRW1pc3Nhb1RpdHVsb0VsZWl0b3I6IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLmRhdGFFbWlzc2FvVGl0dWxvRWxlaXRvciksXHJcbiAgICAgIHpvbmFUaXR1bG9FbGVpdG9yOiBwZXNzb2Euem9uYVRpdHVsb0VsZWl0b3IsXHJcbiAgICAgIHNlY2FvVGl0dWxvRWxlaXRvcjogcGVzc29hLnNlY2FvVGl0dWxvRWxlaXRvcixcclxuICAgICAgdWZUaXR1bG9FbGVpdG9yOiBwZXNzb2EudWZUaXR1bG9FbGVpdG9yLFxyXG5cclxuICAgICAgbnVtZXJvUmVzZXJ2aXN0YTogcGVzc29hLm51bWVyb1Jlc2VydmlzdGEsXHJcbiAgICAgIHNlcmllUmVzZXJ2aXN0YTogcGVzc29hLnNlcmllUmVzZXJ2aXN0YSxcclxuICAgICAgb3JnYW9SZXNlcnZpc3RhOiBwZXNzb2Eub3JnYW9SZXNlcnZpc3RhLFxyXG5cclxuICAgICAgbnVtZXJvQ2FydGVpcmFUcmFiYWxobzogcGVzc29hLm51bWVyb0NhcnRlaXJhVHJhYmFsaG8sXHJcbiAgICAgIHNlcmllQ2FydGVpcmFUcmFiYWxobzogcGVzc29hLnNlcmllQ2FydGVpcmFUcmFiYWxobyxcclxuICAgICAgdWZDYXJ0ZWlyYVRyYWJhbGhvOiBwZXNzb2EudWZDYXJ0ZWlyYVRyYWJhbGhvLFxyXG4gICAgICBwaXNQYXNlcDogcGVzc29hLnBpc1Bhc2VwLFxyXG5cclxuICAgICAgbnVtZXJvSGFiaWxpdGFjYW86IHBlc3NvYS5udW1lcm9IYWJpbGl0YWNhbyxcclxuICAgICAgcmVnaXN0cm9IYWJpbGl0YWNhbzogcGVzc29hLnJlZ2lzdHJvSGFiaWxpdGFjYW8sXHJcbiAgICAgIGRhdGFFbWlzc2FvSGFiaWxpdGFjYW86IHRoaXMuZm9ybWF0YXJEYXRhUGFyYUJhY2tlbmQocGVzc29hLmRhdGFFbWlzc2FvSGFiaWxpdGFjYW8pLFxyXG4gICAgICBkYXRhVmFsaWRhZGVIYWJpbGl0YWNhbzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EuZGF0YVZhbGlkYWRlSGFiaWxpdGFjYW8pLFxyXG4gICAgICBjYXRlZ29yaWFIYWJpbGl0YWNhbzogcGVzc29hLmNhdGVnb3JpYUhhYmlsaXRhY2FvLFxyXG4gICAgICBkZWZpY2llbmNpYUZpc2ljYUhhYmlsaXRhY2FvOiBwZXNzb2EuZGVmaWNpZW5jaWFGaXNpY2FIYWJpbGl0YWNhbyxcclxuICAgICAgcHJpbWVpcmFIYWJpbGl0YWNhbzogdGhpcy5mb3JtYXRhckRhdGFQYXJhQmFja2VuZChwZXNzb2EucHJpbWVpcmFIYWJpbGl0YWNhbyksXHJcblxyXG4gICAgICBwYXNzYXBvcnRlOiBwZXNzb2EucGFzc2Fwb3J0ZSxcclxuICAgICAgY29kaWdvUGFpc1Bhc3NhcG9ydGU6IHBlc3NvYS5jb2RpZ29QYWlzUGFzc2Fwb3J0ZSxcclxuICAgICAgLy8gQWRpY2lvbmEgYSBjaGF2ZSAnY25waicgYW8gb2JqZXRvIFNPTUVOVEUgU0UgcGVzc29hLmNucGogZm9yIHRydXRoeVxyXG4gICAgICAuLi4ocGVzc29hLmNucGogJiYgeyBjbnBqOiBwZXNzb2EuY25wai5yZXBsYWNlKC9cXEQvZywgJycpIH0pLFxyXG4gICAgICByYXphb1NvY2lhbDogcGVzc29hLnJhemFvU29jaWFsLFxyXG4gICAgICBub21lRmFudGFzaWE6IHBlc3NvYS5ub21lRmFudGFzaWEsXHJcbiAgICAgIHNpZ2xhOiBwZXNzb2Euc2lnbGEsXHJcbiAgICAgIHBhZ2luYVdlYjogcGVzc29hLnBhZ2luYVdlYixcclxuXHJcbiAgICAgIGF1dG9DYWRhc3RybzogcGVzc29hLmF1dG9DYWRhc3RybyxcclxuXHJcbiAgICAgIGVuZGVyZWNvczogZW5kZXJlY29zUGF5bG9hZCxcclxuICAgICAgdGVsZWZvbmVzOiB0ZWxlZm9uZXNQYXlsb2FkLFxyXG4gICAgICBlbWFpbHM6IGVtYWlsc1BheWxvYWRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXRhIGEgZGF0YSBubyBwYWRyw6NvIEREL01NL1lZWVkgcGFyYSBvIGJhY2tlbmQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXRhckRhdGFQYXJhQmFja2VuZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XHJcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICYmIGRhdGEuaW5jbHVkZXMoJy8nKSkgcmV0dXJuIGRhdGE7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGEpO1xyXG4gICAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IGRpYSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgY29uc3QgbWVzID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIGNvbnN0IGFubyA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgcmV0dXJuIGAke2RpYX0vJHttZXN9LyR7YW5vfWA7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvclByaW50Q29uc29sZShlcnJvOiBhbnkpIHtcclxuICAgIGNvbnNvbGUubG9nKGVycm8pO1xyXG4gICAgdGhpcy5oYW5kbGVFcnJvcihlcnJvKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKGVycm86IFVuYlBlc3NvYUVycm9QYWRyYW8pIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmlzTG9hZGluZ0NoYW5nZS5lbWl0KGZhbHNlKTtcclxuXHJcbiAgICAvLyAxLiBNb3N0cmEgYSBtZW5zYWdlbSBjdXJ0YS9zaW1wbGVzIG5vIFNuYWNrQmFyIChGdW5kbyBkYSB0ZWxhKVxyXG4gICAgLy8gRXg6IFwiTyBmb3JtdWzDoXJpbyBwb3NzdWkgZXJyb3MgZGUgdmFsaWRhw6fDo28uXCIgb3UgXCJTZXNzw6NvIGV4cGlyYWRhLlwiXHJcbiAgICBpZiAoZXJyby5tZW5zYWdlbVNpbXBsZXMpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tCYXIoZXJyby5tZW5zYWdlbVNpbXBsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIE1vc3RyYSBhIG1lbnNhZ2VtIGRldGFsaGFkYSBIVE1MIG5vIGNvbXBvbmVudGUgPHVuYi1tZW5zYWdlbT5cclxuICAgIC8vIEV4OiBMaXN0YSBjb20gPHVsPjxsaT5DYW1wbyBEYXRhIGludsOhbGlkby4uLjwvbGk+PC91bD5cclxuICAgIGlmICh0aGlzLmFsZXJ0U2VydmljZSAmJiBlcnJvLm1lbnNhZ2VtSHRtbCkge1xyXG4gICAgICAvLyBTZSBvIHNldSBhbGVydFNlcnZpY2Ugc3Vwb3J0YXIgSUQgZG8gY29tcG9uZW50ZSBhbHZvLCBwYXNzZSBhcXVpLlxyXG4gICAgICAvLyBDYXNvIGNvbnRyw6FyaW8sIGVsZSBtb3N0cmEgbm8gY29tcG9uZW50ZSBwYWRyw6NvLlxyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93TWVzc2FnZShlcnJvLm1lbnNhZ2VtSHRtbCwgVW5iVGlwb01lbnNhZ2VtRW51bS5EQU5HRVIsIHRoaXMuaWRNZW5zYWdlbVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TGFiZWxEb2N1bWVudG8oKTogc3RyaW5nIHtcclxuICAgIHN3aXRjaCAodGhpcy5wZXNzb2EudGlwb1Blc3NvYSkge1xyXG4gICAgICBjYXNlIHRoaXMudGlwb1Blc3NvYUVudW0oKS5GSVNJQ0E6IHJldHVybiAnQ1BGJztcclxuICAgICAgY2FzZSB0aGlzLnRpcG9QZXNzb2FFbnVtKCkuSlVSSURJQ0E6IHJldHVybiAnQ05QSic7XHJcbiAgICAgIGNhc2UgdGhpcy50aXBvUGVzc29hRW51bSgpLkVTVFJBTkdFSVJBOiByZXR1cm4gJ1Bhc3NhcG9ydGUnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ0RvY3VtZW50byc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG59XHJcbiIsIjxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiaXNMb2FkaW5nXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiZm9ybS1jb250YWluZXJcIiBbY2xhc3MuZGlzYWJsZWQtd3JhcHBlcl09XCJpc0xvYWRpbmdcIj5cclxuICA8bGliLXVuYi1wZXNzb2EtcGVzcXVpc2FyIFtiYWNrZW5kVVJMXT1cImJhY2tlbmRVUkxcIiBbZGVmYXVsdFRpcG9QZXNzb2FdPVwiZGVmYXVsdFRpcG9QZXNzb2FcIlxyXG4gICAgW3Blc3F1aXNhclBvckNOUEpdPVwicGVzcXVpc2FyUG9yQ05QSlwiIFtwZXNxdWlzYXJQb3JDUEZdPVwicGVzcXVpc2FyUG9yQ1BGXCJcclxuICAgIFtwZXNxdWlzYXJQb3JFc3RyYW5nZWlyb109XCJwZXNxdWlzYXJQb3JFc3RyYW5nZWlyb1wiIFtjYW1wb1Blc3F1aXNhTWF4V2lkdGhdPVwiY2FtcG9QZXNxdWlzYU1heFdpZHRoXCJcclxuICAgIChwZXNzb2FFbWl0dGVkKT1cInBlc3NvYVJlY2ViaWRhKCRldmVudClcIj5cclxuICA8L2xpYi11bmItcGVzc29hLXBlc3F1aXNhcj5cclxuPC9kaXY+XHJcblxyXG48dW5iLW1lbnNhZ2VtIFtpZGVudGlmaWNhZG9yXT1cImlkTWVuc2FnZW1TZXJ2aWNlXCI+PC91bmItbWVuc2FnZW0+XHJcblxyXG48IS0tIExhYmVsIGluZGljYW5kbyBxdWUgZXN0w6EgaW5jbHVpbmRvIG5vdmEgcGVzc29hIC0tPlxyXG48ZGl2ICpuZ0lmPVwiZG9jdW1lbnRvUGVzcXVpc2Fkb1wiXHJcbiAgICAgIGNsYXNzPVwic3RhdHVzLWJhbm5lclwiIFxyXG4gICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAnc3RhdHVzLWluY2x1c2FvJzogIXBlc3NvYS5jb2RpZ29QZXNzb2EsXHJcbiAgICAgICAnc3RhdHVzLWVkaWNhbyc6IHBlc3NvYS5jb2RpZ29QZXNzb2EgJiYgIWlzUmVhZG9ubHlGcm9tU2lhcGUsXHJcbiAgICAgICAnc3RhdHVzLWJsb3F1ZWFkbyc6IGlzUmVhZG9ubHlGcm9tU2lhcGVcclxuICAgICB9XCI+XHJcblxyXG4gIDxtYXQtaWNvbj5cclxuICAgIHt7ICFwZXNzb2EuY29kaWdvUGVzc29hID8gJ3BlcnNvbl9hZGQnIDogKGlzUmVhZG9ubHlGcm9tU2lhcGUgPyAnbG9jaycgOiAnZWRpdCcpIH19XHJcbiAgPC9tYXQtaWNvbj5cclxuXHJcbiAgPHNwYW4+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBlc3NvYS5jb2RpZ29QZXNzb2FcIj5JbmNsdWluZG8gbm92YSBwZXNzb2E8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EuY29kaWdvUGVzc29hICYmICFpc1JlYWRvbmx5RnJvbVNpYXBlXCI+RWRpdGFuZG8gcGVzc29hPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNSZWFkb25seUZyb21TaWFwZVwiPlJlZ2lzdHJvIFNJQVBFIChWaXN1YWxpemHDp8Ojbyk8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICBjb20gPHN0cm9uZz57eyBnZXRMYWJlbERvY3VtZW50bygpIH19IHt7IGRvY3VtZW50b1Blc3F1aXNhZG8gfX08L3N0cm9uZz5cclxuICA8L3NwYW4+XHJcblxyXG48L2Rpdj5cclxuXHJcblxyXG48Zm9ybSAjcGVzc29hRm9ybT1cIm5nRm9ybVwiIFtjbGFzcy5yZWFkb25seV09XCJpc1JlYWRvbmx5RnJvbVNpYXBlIHx8IGlzTG9hZGluZ1wiIGNsYXNzPVwiZm9ybS1jb250YWluZXIgbXQtMlwiXHJcbiAgKm5nSWY9XCJidXNjYVJlYWxpemFkYVwiIChuZ1N1Ym1pdCk9XCJzYWx2YXIocGVzc29hRm9ybSlcIj5cclxuXHJcbiAgPCEtLSBDYW1wb3MgUGVzc29hIEbDrXNpY2EgZSBFc3RyYW5nZWlyYSAgLS0+XHJcbiAgPG5nLWNvbnRhaW5lclxyXG4gICAgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkZJU0lDQSB8fCBwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkVTVFJBTkdFSVJBXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Ob21lPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVcIiBuYW1lPVwibm9tZVwiICNub21lPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPlNleG88L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuY29kaWdvU2V4b1wiIG5hbWU9XCJjb2RpZ29TZXhvXCIgI2NvZGlnb1NleG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjFcIj5NYXNjdWxpbm88L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj5GZW1pbmlubzwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTE1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5EYXRhIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cImRhdGFOYXNjaW1lbnRvUGlja2VyXCIgWyhuZ01vZGVsKV09XCJwZXNzb2EuZGF0YU5hc2NpbWVudG9cIiBuYW1lPVwiZGF0YU5hc2NpbWVudG9cIlxyXG4gICAgICAgICNkYXRhTmFzY2ltZW50bz1cIm5nTW9kZWxcIiByZXF1aXJlZD5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJkYXRhTmFzY2ltZW50b1BpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGFOYXNjaW1lbnRvUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMTBcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPkVzdGFkbyBDaXZpbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbKG5nTW9kZWwpXT1cInBlc3NvYS5jb2RpZ29Fc3RhZG9DaXZpbFwiIG5hbWU9XCJjb2RpZ29Fc3RhZG9DaXZpbFwiICNjb2RpZ29Fc3RhZG9DaXZpbD1cIm5nTW9kZWxcIj5cclxuICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgZXN0YWRvIG9mIGVzdGFkb3NDaXZpbCB8IGFzeW5jXCIgW3ZhbHVlXT1cImVzdGFkby5jb2RpZ29cIj5cclxuICAgICAgICAgIHt7IGVzdGFkby5kZW5vbWluYWNhbyB9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8IS0tXHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPk5hdHVyYWxpZGFkZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EubmF0dXJhbGlkYWRlXCIgbmFtZT1cIm5hdHVyYWxpZGFkZVwiICNuYXR1cmFsaWRhZGU9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBjaWRhZGUgb2YgZ2V0TGlzdGFFc3RhZG9zKClcIiBbdmFsdWVdPVwiY2lkYWRlLmNvZGlnb1wiPlxyXG4gICAgICAgICAgICAgIHt7IGNpZGFkZS5kZXNjcmljYW8gfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgLS0+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5QYcOtcyBOYXNjaW1lbnRvPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb1BhaXNOYXNjaW1lbnRvXCIgbmFtZT1cImNvZGlnb1BhaXNOYXNjaW1lbnRvXCIgI2NvZGlnb1BhaXNOYXNjaW1lbnRvPVwibmdNb2RlbFwiXHJcbiAgICAgICAgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBhaXNOYXNjaW1lbnRvIG9mIHBhaXNlcyB8IGFzeW5jXCIgW3ZhbHVlXT1cInBhaXNOYXNjaW1lbnRvLmNvZGlnb1wiPlxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyA9PT0gJ0JSQVNJTCdcIj7wn4en8J+HtyA8Yj57eyBwYWlzTmFzY2ltZW50by5kZW5vbWluYWNhbyB9fTwvYj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiAqbmdJZj1cInBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvICE9PSAnQlJBU0lMJ1wiPnt7IHBhaXNOYXNjaW1lbnRvLmRlbm9taW5hY2FvIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiAqbmdJZj1cInBlc3NvYS5jb2RpZ29QYWlzTmFzY2ltZW50byA9PSAyMlwiPiA8IS0tIDIyIGVoIEJyYXNpbC0tPlxyXG4gICAgICA8bWF0LWxhYmVsPlVGIE5hc2NpbWVudG88L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EudWZOYXNjaW1lbnRvXCIgbmFtZT1cInVmTmFzY2ltZW50b1wiICN1Zk5hc2NpbWVudG89XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVzdGFkbyBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJlc3RhZG8uaWRlbnRpZmljYWRvclwiPlxyXG4gICAgICAgICAge3sgZXN0YWRvLmlkZW50aWZpY2Fkb3IgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0xNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJwZXNzb2EuY29kaWdvUGFpc05hc2NpbWVudG8gPT0gMjJcIj5cclxuICAgICAgPG1hdC1sYWJlbD5OYXR1cmFsaWRhZGU8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2EubmF0dXJhbGlkYWRlXCIgbmFtZT1cIm5hdHVyYWxpZGFkZVwiICNuYXR1cmFsaWRhZGU9XCJuZ01vZGVsXCJcclxuICAgICAgICByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5Fc2NvbGFyaWRhZGU8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EuZXNjb2xhcmlkYWRlXCIgbmFtZT1cImNvZGlnb0VzY29sYXJpZGFkZVwiICNjb2RpZ29Fc2NvbGFyaWRhZGU9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVzY29sYXJpZGFkZSBvZiBlc2NvbGFyaWRhZGUgfCBhc3luY1wiIFt2YWx1ZV09XCJlc2NvbGFyaWRhZGUuY29kaWdvXCI+XHJcbiAgICAgICAgICB7eyBlc2NvbGFyaWRhZGUuZGVub21pbmFjYW8gfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBTb2NpYWw8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJwZXNzb2Eubm9tZVNvY2lhbFwiIG5hbWU9XCJub21lU29jaWFsXCIgI25vbWVTb2NpYWw9XCJuZ01vZGVsXCIgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBkYSBNw6NlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVNYWVcIiBuYW1lPVwibm9tZU1hZVwiICNub21lTWFlPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPk5vbWUgZG8gUGFpPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLm5vbWVQYWlcIiBuYW1lPVwibm9tZVBhaVwiICNub21lUGFpPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8IS0tIENhbXBvcyBQZXNzb2EgSnVyw61kaWNhIC0tPlxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PT0gdGlwb1Blc3NvYUVudW0oKS5KVVJJRElDQVwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+UmF6w6NvIFNvY2lhbDwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yYXphb1NvY2lhbFwiIG5hbWU9XCJyYXphb1NvY2lhbFwiIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yNVwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+Tm9tZSBGYW50YXNpYTwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5ub21lRmFudGFzaWFcIiBuYW1lPVwibm9tZUZhbnRhc2lhXCIgLz5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwZXNzb2EudGlwb1Blc3NvYSA9PSB0aXBvUGVzc29hRW51bSgpLkZJU0lDQVwiPlxyXG4gICAgPGIgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5Eb2N1bWVudGHDp8OjbzwvYj5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5JZGVudGlkYWRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLnJnXCIgbmFtZT1cInJnXCIgI3JnPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tMjVcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPsOTcmfDo28gRW1pc3NvcjwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ09yZ2FvXCIgbmFtZT1cInJnT3JnYW9cIiAjcmdPcmdhbz1cIm5nTW9kZWxcIiByZXF1aXJlZCAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTI1XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5VbmlkYWRlIEZlZGVyYXRpdmE8L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJwZXNzb2EucmdVZlwiIG5hbWU9XCJyZ1VmXCIgI3JnVWY9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGVzdGFkbyBvZiBnZXRMaXN0YUVzdGFkb3MoKVwiIFt2YWx1ZV09XCJlc3RhZG8uaWRlbnRpZmljYWRvclwiPlxyXG4gICAgICAgICAge3sgZXN0YWRvLmlkZW50aWZpY2Fkb3IgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS0yMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+RGF0YSBkZSBFbWlzc8OjbzwvbWF0LWxhYmVsPlxyXG4gICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cInBlc3NvYS5yZ0RhdGFFbWlzc2FvXCIgbmFtZT1cInJnRGF0YUVtaXNzYW9cIiAjcmdEYXRhRW1pc3Nhbz1cIm5nTW9kZWxcIiAvPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBlc3NvYS50aXBvUGVzc29hID09IHRpcG9QZXNzb2FFbnVtKCkuRVNUUkFOR0VJUkEgXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5EYXRhIENoZWdhZGEgQnJhc2lsPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJkYXRhQ2hlZ2FkYUJyYXNpbFBpY2tlclwiIFsobmdNb2RlbCldPVwicGVzc29hLmRhdGFDaGVnYWRhQnJhc2lsXCJcclxuICAgICAgICBuYW1lPVwiZGF0YUNoZWdhZGFCcmFzaWxcIiAjZGF0YUNoZWdhZGFCcmFzaWw9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZGF0YUNoZWdhZGFCcmFzaWxQaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgPG1hdC1kYXRlcGlja2VyICNkYXRhQ2hlZ2FkYUJyYXNpbFBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLTEwXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgPG1hdC1sYWJlbD5QYcOtcyBQYXNzYXBvcnRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwicGVzc29hLmNvZGlnb1BhaXNQYXNzYXBvcnRlXCIgbmFtZT1cImNvZGlnb1BhaXNQYXNzYXBvcnRlXCIgI2NvZGlnb1BhaXNQYXNzYXBvcnRlPVwibmdNb2RlbFwiXHJcbiAgICAgICAgcmVxdWlyZWQ+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IHBhaXNOYXNjaW1lbnRvIG9mIHBhaXNlcyB8IGFzeW5jXCIgW3ZhbHVlXT1cInBhaXNOYXNjaW1lbnRvLmNvZGlnb1wiPlxyXG4gICAgICAgICAge3sgcGFpc05hc2NpbWVudG8uZGVub21pbmFjYW8gfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+TsO6bWVybyBQYXNzYXBvcnRlPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIG1hdElucHV0IFsobmdNb2RlbCldPVwicGVzc29hLnBhc3NhcG9ydGVcIiBuYW1lPVwicGFzc2Fwb3J0ZVwiICNwYXNzYXBvcnRlPVwibmdNb2RlbFwiIHJlcXVpcmVkIC8+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bGliLXVuYi1wZXNzb2EtdGVsZWZvbmUtbGlzdCBzdHlsZT1cImZsZXg6IDEgMSAxMDAlO1wiIFtiYWNrZW5kVVJMXT1cImJhY2tlbmRVUkxcIiBbdGVsZWZvbmVzXT1cInBlc3NvYS50ZWxlZm9uZXNcIlxyXG4gICAgKHRlbGVmb25lc0VtaXR0ZWQpPVwidGVsZWZvbmVzRW1pdHRlZCgkZXZlbnQpXCI+PC9saWItdW5iLXBlc3NvYS10ZWxlZm9uZS1saXN0PlxyXG5cclxuICA8bGliLXVuYi1wZXNzb2EtZW5kZXJlY28tbGlzdCBzdHlsZT1cImZsZXg6IDEgMSAxMDAlO1wiIFtiYWNrZW5kVVJMXT1cImJhY2tlbmRVUkxcIiBbZW5kZXJlY29zXT1cInBlc3NvYS5lbmRlcmVjb3NcIlxyXG4gICAgKGVuZGVyZWNvc0VtaXR0ZWQpPVwiZW5kZXJlY29zRW1pdHRlZCgkZXZlbnQpXCI+PC9saWItdW5iLXBlc3NvYS1lbmRlcmVjby1saXN0PlxyXG5cclxuICA8bGliLXVuYi1wZXNzb2EtZW1haWwtbGlzdCBzdHlsZT1cImZsZXg6IDEgMSAxMDAlO1wiIFtiYWNrZW5kVVJMXT1cImJhY2tlbmRVUkxcIiBbZW1haWxzXT1cInBlc3NvYS5lbWFpbHNcIlxyXG4gICAgKGVtYWlsc0VtaXR0ZWQpPVwiZW1haWxzRW1pdHRlZCgkZXZlbnQpXCI+PC9saWItdW5iLXBlc3NvYS1lbWFpbC1saXN0PlxyXG5cclxuICA8ZGl2ICpuZ0lmPVwiaXNSZWFkb25seUZyb21TaWFwZVwiIHN0eWxlPVwiZmxleDoxIDEgMTAwJTsgbWFyZ2luLWJvdHRvbToxMHB4O1wiPlxyXG4gICAgPG1hdC1jYXJkPlxyXG4gICAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgICA8c3Ryb25nPlNlcnZpZG9yIGNvbSBtYXRyw61jdWxhIFNJQVBFIGRldmUgdGVyIHNldXMgZGFkb3MgYXV0YWxpemFkb3MgcGVsbyBhcGxpY2F0aXZvIGRvIHNvdWdvdjwvc3Ryb25nPlxyXG4gICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8L21hdC1jYXJkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LWNhcmQtYWN0aW9ucyBjbGFzcz1cImNhcmQtYWN0aW9ucy1idXR0b25zXCIgKm5nSWY9XCJidXNjYVJlYWxpemFkYVwiPlxyXG4gICAgPGJ1dHRvbiBtYXQtZmxhdC1idXR0b24gW2Rpc2FibGVkXT1cImlzTG9hZGluZyB8fCBpc1JlYWRvbmx5RnJvbVNpYXBlXCIgdHlwZT1cInN1Ym1pdFwiIGNvbG9yPVwicHJpbWFyeVwiPlxyXG4gICAgICBTYWx2YXJcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LWNhcmQtYWN0aW9ucz5cclxuXHJcbjwvZm9ybT4iXX0=