ngx-sp-auth 0.0.0-watch
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.
- package/README.md +24 -0
- package/esm2022/lib/auth.module.mjs +87 -0
- package/esm2022/lib/auth.service.mjs +306 -0
- package/esm2022/lib/components/login/login.component.mjs +326 -0
- package/esm2022/lib/components/menu-lateral/dropdown/primary-dropdown/primary-dropdown.component.mjs +68 -0
- package/esm2022/lib/components/menu-lateral/dropdown/secondary-dropdown/secondary-dropdown.component.mjs +32 -0
- package/esm2022/lib/components/menu-lateral/menu/list-estab.service.mjs +55 -0
- package/esm2022/lib/components/menu-lateral/menu/menu-lateral.component.mjs +235 -0
- package/esm2022/lib/components/menu-lateral/menu/selecao-estabelecimentos-modal/selecao-estabelecimentos-modal.component.mjs +200 -0
- package/esm2022/lib/components/menu-lateral/menu-services.service.mjs +151 -0
- package/esm2022/lib/components/menu-lateral/model/iestabelecimento.model.mjs +2 -0
- package/esm2022/lib/components/menu-lateral/model/imenu-item-structure.model.mjs +2 -0
- package/esm2022/lib/components/menu-lateral/model/imenu.model.mjs +12 -0
- package/esm2022/lib/components/menu-lateral/model/infrausuarioimg.mjs +12 -0
- package/esm2022/lib/components/menu-lateral/model/isubmenu-item-structure.model.mjs +2 -0
- package/esm2022/lib/components/menu-lateral/model/ret-estabelecimento-session.mjs +10 -0
- package/esm2022/lib/components/menu-lateral/model/ret-infrausuarioemail.mjs +8 -0
- package/esm2022/lib/components/menu-lateral/model/ret-infrausuarioimg.mjs +11 -0
- package/esm2022/lib/components/menu-lateral/model/usuario-img.mjs +8 -0
- package/esm2022/lib/components/menu-lateral/submenus/dynamic-menu/dynamic-menu.component.mjs +54 -0
- package/esm2022/lib/components/menu-lateral/submenus/notif-submenu/notif-submenu.component.mjs +14 -0
- package/esm2022/lib/components/nova-senha/nova-senhacomponent.mjs +191 -0
- package/esm2022/lib/custom/custom-login.service.mjs +52 -0
- package/esm2022/lib/custom/custom-menu.service.mjs +88 -0
- package/esm2022/lib/custom/menu-config.service.mjs +70 -0
- package/esm2022/lib/custom/models/icustom-login-service.mjs +2 -0
- package/esm2022/lib/custom/models/icustom-menu-service.mjs +2 -0
- package/esm2022/lib/custom/models/imenu-config.mjs +2 -0
- package/esm2022/lib/environments/environments.service.mjs +21 -0
- package/esm2022/lib/environments/models/ienvironments.mjs +2 -0
- package/esm2022/lib/guards/auth-guard.mjs +34 -0
- package/esm2022/lib/guards/external-login-guard.mjs +88 -0
- package/esm2022/lib/guards/login-guard.mjs +35 -0
- package/esm2022/lib/interceptors/auth-aplic.interceptor.mjs +41 -0
- package/esm2022/lib/interceptors/auth-infra.interceptor.mjs +30 -0
- package/esm2022/lib/models/code-2fa.mjs +2 -0
- package/esm2022/lib/models/custom-propriedades-login.mjs +3 -0
- package/esm2022/lib/models/forgotten-password-form.mjs +2 -0
- package/esm2022/lib/models/login-form.mjs +2 -0
- package/esm2022/lib/models/login.mjs +2 -0
- package/esm2022/lib/models/nova-senha-form.mjs +2 -0
- package/esm2022/lib/models/password-recup.mjs +2 -0
- package/esm2022/lib/models/payload.mjs +2 -0
- package/esm2022/lib/models/ret-login.mjs +21 -0
- package/esm2022/lib/models/ret-token.mjs +8 -0
- package/esm2022/lib/models/token.mjs +2 -0
- package/esm2022/lib/server/ret-server-config.mjs +9 -0
- package/esm2022/lib/server/server.service.mjs +38 -0
- package/esm2022/lib/storage/auth-storage.service.mjs +409 -0
- package/esm2022/ngx-sp-auth.mjs +5 -0
- package/esm2022/public-api.mjs +37 -0
- package/fesm2022/ngx-sp-auth.mjs +2520 -0
- package/fesm2022/ngx-sp-auth.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/auth.module.d.ts +21 -0
- package/lib/auth.service.d.ts +42 -0
- package/lib/components/login/login.component.d.ts +67 -0
- package/lib/components/menu-lateral/dropdown/primary-dropdown/primary-dropdown.component.d.ts +20 -0
- package/lib/components/menu-lateral/dropdown/secondary-dropdown/secondary-dropdown.component.d.ts +12 -0
- package/lib/components/menu-lateral/menu/list-estab.service.d.ts +19 -0
- package/lib/components/menu-lateral/menu/menu-lateral.component.d.ts +74 -0
- package/lib/components/menu-lateral/menu/selecao-estabelecimentos-modal/selecao-estabelecimentos-modal.component.d.ts +71 -0
- package/lib/components/menu-lateral/menu-services.service.d.ts +31 -0
- package/lib/components/menu-lateral/model/iestabelecimento.model.d.ts +4 -0
- package/lib/components/menu-lateral/model/imenu-item-structure.model.d.ts +12 -0
- package/lib/components/menu-lateral/model/imenu.model.d.ts +40 -0
- package/lib/components/menu-lateral/model/infrausuarioimg.d.ts +9 -0
- package/lib/components/menu-lateral/model/isubmenu-item-structure.model.d.ts +9 -0
- package/lib/components/menu-lateral/model/ret-estabelecimento-session.d.ts +8 -0
- package/lib/components/menu-lateral/model/ret-infrausuarioemail.d.ts +6 -0
- package/lib/components/menu-lateral/model/ret-infrausuarioimg.d.ts +9 -0
- package/lib/components/menu-lateral/model/usuario-img.d.ts +5 -0
- package/lib/components/menu-lateral/submenus/dynamic-menu/dynamic-menu.component.d.ts +25 -0
- package/lib/components/menu-lateral/submenus/notif-submenu/notif-submenu.component.d.ts +8 -0
- package/lib/components/nova-senha/nova-senhacomponent.d.ts +48 -0
- package/lib/custom/custom-login.service.d.ts +38 -0
- package/lib/custom/custom-menu.service.d.ts +48 -0
- package/lib/custom/menu-config.service.d.ts +32 -0
- package/lib/custom/models/icustom-login-service.d.ts +13 -0
- package/lib/custom/models/icustom-menu-service.d.ts +10 -0
- package/lib/custom/models/imenu-config.d.ts +7 -0
- package/lib/environments/environments.service.d.ts +11 -0
- package/lib/environments/models/ienvironments.d.ts +4 -0
- package/lib/guards/auth-guard.d.ts +14 -0
- package/lib/guards/external-login-guard.d.ts +21 -0
- package/lib/guards/login-guard.d.ts +24 -0
- package/lib/interceptors/auth-aplic.interceptor.d.ts +22 -0
- package/lib/interceptors/auth-infra.interceptor.d.ts +16 -0
- package/lib/models/code-2fa.d.ts +4 -0
- package/lib/models/custom-propriedades-login.d.ts +11 -0
- package/lib/models/forgotten-password-form.d.ts +5 -0
- package/lib/models/login-form.d.ts +5 -0
- package/lib/models/login.d.ts +4 -0
- package/lib/models/nova-senha-form.d.ts +5 -0
- package/lib/models/password-recup.d.ts +5 -0
- package/lib/models/payload.d.ts +9 -0
- package/lib/models/ret-login.d.ts +20 -0
- package/lib/models/ret-token.d.ts +6 -0
- package/lib/models/token.d.ts +8 -0
- package/lib/server/ret-server-config.d.ts +7 -0
- package/lib/server/server.service.d.ts +14 -0
- package/lib/storage/auth-storage.service.d.ts +90 -0
- package/package.json +25 -0
- package/public-api.d.ts +36 -0
- package/src/assets/imgs/Property1-cadeado.png +0 -0
- package/src/assets/imgs/Property1-calendariofino.png +0 -0
- package/src/assets/imgs/Property1-mao.png +0 -0
- package/src/assets/styles/styles.novo.scss +0 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { FormGroup, Validators } from '@angular/forms';
|
|
3
|
+
import { map, Subscription, take, timer } from 'rxjs';
|
|
4
|
+
//import { CustomLoginService } from 'src/app/project/custom/login/custom-login.service';
|
|
5
|
+
import { FormUtils } from 'ngx-sp-infra';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "ngx-bootstrap/modal";
|
|
8
|
+
import * as i2 from "ngx-sp-infra";
|
|
9
|
+
import * as i3 from "@angular/forms";
|
|
10
|
+
import * as i4 from "../../auth.service";
|
|
11
|
+
import * as i5 from "../../server/server.service";
|
|
12
|
+
import * as i6 from "../../environments/environments.service";
|
|
13
|
+
import * as i7 from "../../storage/auth-storage.service";
|
|
14
|
+
import * as i8 from "../../custom/custom-login.service";
|
|
15
|
+
import * as i9 from "@angular/platform-browser";
|
|
16
|
+
import * as i10 from "@angular/router";
|
|
17
|
+
import * as i11 from "ngx-toastr";
|
|
18
|
+
import * as i12 from "@angular/common";
|
|
19
|
+
export class LoginComponent {
|
|
20
|
+
constructor(
|
|
21
|
+
//public _customLoginService: CustomLoginService,
|
|
22
|
+
_bsModalService, _messageService, _formBuilder, _authService, _serverService, _environmentService, _authStorageService, _customLoginService, _title, _router, _toastrService) {
|
|
23
|
+
this._bsModalService = _bsModalService;
|
|
24
|
+
this._messageService = _messageService;
|
|
25
|
+
this._formBuilder = _formBuilder;
|
|
26
|
+
this._authService = _authService;
|
|
27
|
+
this._serverService = _serverService;
|
|
28
|
+
this._environmentService = _environmentService;
|
|
29
|
+
this._authStorageService = _authStorageService;
|
|
30
|
+
this._customLoginService = _customLoginService;
|
|
31
|
+
this._title = _title;
|
|
32
|
+
this._router = _router;
|
|
33
|
+
this._toastrService = _toastrService;
|
|
34
|
+
// #region ==========> PROPERTIES <==========
|
|
35
|
+
// #region PRIVATE
|
|
36
|
+
this.idFgtPsw = 1;
|
|
37
|
+
// Variáveis específicas para funcionalidades padrões dos formulários
|
|
38
|
+
this.currentTime = new Date();
|
|
39
|
+
this.year = this.currentTime.getFullYear();
|
|
40
|
+
this.isLoading = false;
|
|
41
|
+
this.isLoadingSendAuthentication2Fa = false;
|
|
42
|
+
this.showParmsAuthentication2Fa = false;
|
|
43
|
+
this.isLoadingGetNewCode = false;
|
|
44
|
+
//propriedades que vão receber os valores do customLoginService ####VERIFICAR DEPOIS####
|
|
45
|
+
// @Input() customPropriedadesLogin?: CustomPropriedadesLogin;
|
|
46
|
+
// #endregion PUBLIC
|
|
47
|
+
// #region Timer
|
|
48
|
+
this._subscription = new Subscription();
|
|
49
|
+
this.timerDuration = 90;
|
|
50
|
+
this.secondsLeft = this.timerDuration;
|
|
51
|
+
this.countdown$ = timer(0, 1000).pipe(take(this.timerDuration + 1), map(secondsElapsed => this.timerDuration - secondsElapsed));
|
|
52
|
+
// #endregion Timer
|
|
53
|
+
// #region ==========> FORM BUILDER <==========
|
|
54
|
+
this.form = new FormGroup({});
|
|
55
|
+
this.formFgtPsw = new FormGroup({});
|
|
56
|
+
this.formAuthentication2Fa = new FormGroup({});
|
|
57
|
+
}
|
|
58
|
+
;
|
|
59
|
+
;
|
|
60
|
+
// Propriedade necessário para que a classe static FormUtils possa ser utilizada no Html
|
|
61
|
+
get FormUtils() {
|
|
62
|
+
return FormUtils;
|
|
63
|
+
}
|
|
64
|
+
// #region FORM DATA
|
|
65
|
+
// Variáveis específicas para funcionalidades padrões dos formulários (Login)
|
|
66
|
+
get dominio() {
|
|
67
|
+
return this.form.get('dominio')?.value;
|
|
68
|
+
}
|
|
69
|
+
get usuario() {
|
|
70
|
+
return this.form.get('usuario')?.value;
|
|
71
|
+
}
|
|
72
|
+
get senha() {
|
|
73
|
+
return this.form.get('senha')?.value;
|
|
74
|
+
}
|
|
75
|
+
// Variáveis específicas para funcionalidades padrões dos formulários (RequestRecoverPassword)
|
|
76
|
+
get dominioFgtPsw() {
|
|
77
|
+
return this.formFgtPsw.get('dominioFgtPsw')?.value;
|
|
78
|
+
}
|
|
79
|
+
get usuarioFgtPsw() {
|
|
80
|
+
return this.formFgtPsw.get('usuarioFgtPsw')?.value;
|
|
81
|
+
}
|
|
82
|
+
// Variáveis específicas para funcionalidades padrões dos formulários (Autenticação 2 Fatores)
|
|
83
|
+
get code() {
|
|
84
|
+
return this.formAuthentication2Fa.get('code')?.value;
|
|
85
|
+
}
|
|
86
|
+
// #endregion FORM DATA
|
|
87
|
+
// #endregion ==========> PROPERTIES <==========
|
|
88
|
+
ngOnInit() {
|
|
89
|
+
this._title.setTitle(this._customLoginService.loginPageTitle);
|
|
90
|
+
if (this._customLoginService.loginTitle != "") {
|
|
91
|
+
document.getElementById("title").innerHTML = this._customLoginService.loginTitle;
|
|
92
|
+
}
|
|
93
|
+
if (this._customLoginService.loginSubtitle != "") {
|
|
94
|
+
document.getElementById("subtitle").innerHTML = this._customLoginService.loginSubtitle;
|
|
95
|
+
}
|
|
96
|
+
this.createForm();
|
|
97
|
+
}
|
|
98
|
+
// #region FORM VALIDATORS
|
|
99
|
+
// Método para configuração dos campos de edição do formulário (Login)
|
|
100
|
+
createForm() {
|
|
101
|
+
// Dados originais de Login
|
|
102
|
+
if (this._environmentService.production) {
|
|
103
|
+
this.form = this._formBuilder.group({
|
|
104
|
+
dominio: ['', [Validators.required, Validators.maxLength(50)]],
|
|
105
|
+
usuario: ['', [Validators.required, Validators.maxLength(100)]],
|
|
106
|
+
senha: ['', [Validators.required, Validators.maxLength(100)]]
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.form = this._formBuilder.group({
|
|
111
|
+
dominio: [this._customLoginService.loginDesenvDomain, [Validators.required, Validators.maxLength(50)]],
|
|
112
|
+
usuario: [this._customLoginService.loginDesenvUser, [Validators.required, Validators.maxLength(100)]],
|
|
113
|
+
senha: [this._customLoginService.loginDesenvPassword, [Validators.required, Validators.maxLength(100)]]
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Método para configuração dos campos de edição do formulário (RequestRecoverPassword)
|
|
118
|
+
createFormForgottenPassword() {
|
|
119
|
+
this.formFgtPsw = this._formBuilder.group({
|
|
120
|
+
dominioFgtPsw: ['', [Validators.required, Validators.maxLength(50)]],
|
|
121
|
+
usuarioFgtPsw: ['', [Validators.required, Validators.maxLength(100)]],
|
|
122
|
+
});
|
|
123
|
+
this.formFgtPsw.get('recoverCdominioFgtPswodeRecPsw')?.setValue('');
|
|
124
|
+
this.formFgtPsw.get('usuarioFgtPsw')?.setValue('');
|
|
125
|
+
}
|
|
126
|
+
// Método para configuração dos campos de edição do formulário (Autenticação 2 Fatores)
|
|
127
|
+
createFormAuthentication2Fa() {
|
|
128
|
+
this.formAuthentication2Fa = this._formBuilder.group({
|
|
129
|
+
code: ['', [Validators.required, Validators.maxLength(6)]],
|
|
130
|
+
});
|
|
131
|
+
this.form.get('code')?.setValue('');
|
|
132
|
+
}
|
|
133
|
+
// #endregion FORM VALIDATORS
|
|
134
|
+
// #endregion ==========> FORM BUILDER <==========
|
|
135
|
+
// #region ==========> SERVICE METHODS <==========
|
|
136
|
+
// #region GET
|
|
137
|
+
// Obtém a Url do Config Erp
|
|
138
|
+
geturlErpConfig() {
|
|
139
|
+
// verificar depois
|
|
140
|
+
return `${this._environmentService.hostName}/SisproErpCloud/ConfigErp`;
|
|
141
|
+
}
|
|
142
|
+
/*
|
|
143
|
+
* Obtém os parâmetros de configuração do servidor para Autenticação Básica de segurança
|
|
144
|
+
*/
|
|
145
|
+
getServer() {
|
|
146
|
+
if (this.form.valid) {
|
|
147
|
+
this.isLoading = true;
|
|
148
|
+
this._serverService.getServer().subscribe({
|
|
149
|
+
next: response => {
|
|
150
|
+
this.logOn();
|
|
151
|
+
},
|
|
152
|
+
error: (error) => {
|
|
153
|
+
this.isLoading = false;
|
|
154
|
+
//this._projectUtilservice.showHttpError(error);
|
|
155
|
+
this._messageService.showAlertDanger(error);
|
|
156
|
+
//pode ser substituido por console.error
|
|
157
|
+
throw new Error(error);
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
FormUtils.validateFields(this.form);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// #endregion GET
|
|
166
|
+
// #region POST
|
|
167
|
+
// Executa o Login
|
|
168
|
+
logOn() {
|
|
169
|
+
this._authService.login(this.form.value).subscribe({
|
|
170
|
+
next: (response) => {
|
|
171
|
+
this.isLoading = false;
|
|
172
|
+
if (response.FeedbackMessage != "") {
|
|
173
|
+
this._toastrService.warning(response.FeedbackMessage, '', {
|
|
174
|
+
timeOut: 3000,
|
|
175
|
+
extendedTimeOut: 2000
|
|
176
|
+
});
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
//Incialização de Senha
|
|
180
|
+
if (response.InitializePassword) {
|
|
181
|
+
let param = btoa(`true$${this.dominio}$${this.usuario}`);
|
|
182
|
+
this._router.navigate([`auth/login/novaSenha/${param}`]);
|
|
183
|
+
this._toastrService.success("Verifique no seu e-mail o código de validação.");
|
|
184
|
+
}
|
|
185
|
+
if (response.InfraInAuthTypeId == 1 && response.InfraIn2FaTypeId != null && response.InfraIn2FaTypeId == 1 && response.Is2FaEnabled) {
|
|
186
|
+
this.createFormAuthentication2Fa();
|
|
187
|
+
this._subscription = this.countdown$.subscribe(secondsLeft => {
|
|
188
|
+
this.secondsLeft = secondsLeft;
|
|
189
|
+
});
|
|
190
|
+
this.showParmsAuthentication2Fa = true;
|
|
191
|
+
this._toastrService.success("Verifique no seu e-mail o código de validação.");
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
error: (error) => {
|
|
195
|
+
this.isLoading = false;
|
|
196
|
+
//this._projectUtilservice.showHttpError(error);
|
|
197
|
+
this._messageService.showAlertDanger(error);
|
|
198
|
+
throw new Error(error);
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Envia requisição para esquecer senha
|
|
203
|
+
sendForgottenPassword() {
|
|
204
|
+
if (this.formFgtPsw.valid) {
|
|
205
|
+
this._serverService.getServer().subscribe({
|
|
206
|
+
next: response => {
|
|
207
|
+
this.forgottenPassword();
|
|
208
|
+
},
|
|
209
|
+
error: (error) => {
|
|
210
|
+
//this._projectUtilservice.showHttpError(error);
|
|
211
|
+
this._messageService.showAlertDanger(error);
|
|
212
|
+
throw new Error(error);
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
FormUtils.validateFields(this.formFgtPsw);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Requisição para esquecer senha
|
|
221
|
+
forgottenPassword() {
|
|
222
|
+
this._authService.forgottenPassword(this.formFgtPsw.value).subscribe({
|
|
223
|
+
next: (response) => {
|
|
224
|
+
this.closeForgottenPasswordModal();
|
|
225
|
+
let param = btoa(`false$${this.dominio}$${this.usuario}$${3}`);
|
|
226
|
+
this._router.navigate([`auth/login/novaSenha/${param}`]);
|
|
227
|
+
this._toastrService.success("Verifique no seu e-mail o código de validação.");
|
|
228
|
+
},
|
|
229
|
+
error: (error) => {
|
|
230
|
+
//this._projectUtilservice.showHttpError(error);
|
|
231
|
+
this._messageService.showAlertDanger(error);
|
|
232
|
+
throw new Error(error);
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
// Envia requisição para validar código 2 fatores
|
|
237
|
+
sendCode() {
|
|
238
|
+
if (this.formAuthentication2Fa.valid) {
|
|
239
|
+
this.isLoadingSendAuthentication2Fa = true;
|
|
240
|
+
this.validateCode();
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
FormUtils.validateFields(this.formAuthentication2Fa);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Validação do código 2 fatores
|
|
247
|
+
validateCode() {
|
|
248
|
+
this._authService.validateAuthentication2Fa(this.code).subscribe({
|
|
249
|
+
next: (response) => {
|
|
250
|
+
this._subscription.unsubscribe();
|
|
251
|
+
this.isLoadingSendAuthentication2Fa = false;
|
|
252
|
+
},
|
|
253
|
+
error: (error) => {
|
|
254
|
+
this.isLoadingSendAuthentication2Fa = false;
|
|
255
|
+
//this._projectUtilservice.showHttpError(error);
|
|
256
|
+
this._messageService.showAlertDanger(error);
|
|
257
|
+
throw new Error(error);
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
// Envia requisição para validar código 2 fatores
|
|
262
|
+
getNewCode() {
|
|
263
|
+
this.isLoadingGetNewCode = true;
|
|
264
|
+
this._serverService.getServer().subscribe({
|
|
265
|
+
next: response => {
|
|
266
|
+
this._subscription = this.countdown$.subscribe(secondsLeft => {
|
|
267
|
+
this.secondsLeft = secondsLeft;
|
|
268
|
+
});
|
|
269
|
+
this.GetNewCode2Fa();
|
|
270
|
+
},
|
|
271
|
+
error: (error) => {
|
|
272
|
+
//this._projectUtilservice.showHttpError(error);
|
|
273
|
+
this._messageService.showAlertDanger(error);
|
|
274
|
+
throw new Error(error);
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
// Validação do código 2 fatores
|
|
279
|
+
GetNewCode2Fa() {
|
|
280
|
+
this._authService.GetNewCode2Fa().subscribe({
|
|
281
|
+
next: (response) => {
|
|
282
|
+
this.isLoadingGetNewCode = false;
|
|
283
|
+
this._toastrService.success("Enviamos um novo código para o endereço de e-mail vinculado ao seu usuário. Verifique o lixo eletrônico (SPAM) da sua caixa de entrada, caso não tenha encontrado nossa mensagem.");
|
|
284
|
+
},
|
|
285
|
+
error: (error) => {
|
|
286
|
+
this.isLoadingGetNewCode = false;
|
|
287
|
+
//this._projectUtilservice.showHttpError(error);
|
|
288
|
+
this._messageService.showAlertDanger(error);
|
|
289
|
+
throw new Error(error);
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// #endregion POST
|
|
294
|
+
// #region UTILIDADES
|
|
295
|
+
// Retorno para a tela de login
|
|
296
|
+
voltar() {
|
|
297
|
+
this._subscription.unsubscribe();
|
|
298
|
+
this.showParmsAuthentication2Fa = false;
|
|
299
|
+
this._authStorageService.logout();
|
|
300
|
+
this._router.navigate(["/auth/login"]);
|
|
301
|
+
}
|
|
302
|
+
// #endregion UTILIDADES
|
|
303
|
+
// #endregion ==========> SERVICE METHODS <==========
|
|
304
|
+
// #region ==========> MODALS <==========
|
|
305
|
+
// Executa esquecer senha
|
|
306
|
+
openForgottenPasswordModal(template) {
|
|
307
|
+
this.createFormForgottenPassword();
|
|
308
|
+
this.modalRef = this._bsModalService.show(template, {
|
|
309
|
+
class: 'modal-dialog-centered',
|
|
310
|
+
ignoreBackdropClick: false,
|
|
311
|
+
keyboard: false,
|
|
312
|
+
id: this.idFgtPsw
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
// Encerra esquecer senha
|
|
316
|
+
closeForgottenPasswordModal() {
|
|
317
|
+
this._bsModalService.hide(this.idFgtPsw);
|
|
318
|
+
}
|
|
319
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, deps: [{ token: i1.BsModalService }, { token: i2.MessageService }, { token: i3.FormBuilder }, { token: i4.AuthService }, { token: i5.ServerService }, { token: i6.EnvironmentService }, { token: i7.AuthStorageService }, { token: i8.LibCustomLoginService }, { token: i9.Title }, { token: i10.Router }, { token: i11.ToastrService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
320
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LoginComponent, selector: "lib-login", ngImport: i0, template: "<div class=\"container-fluid\">\r\n\t<div class=\"row\">\r\n\t\t<!-- Conte\u00FAdo da DIV do background -->\r\n\t\t<div class=\"col-md-7\">\r\n\t\t\t<div class=\"background\" style=\"background-image: linear-gradient(to bottom, rgba(10, 44, 81, 0.9), rgba(10, 44, 81, 0.9)), url({{_customLoginService.loginBackground}})\">\r\n\t\t\t\t<div class=\"text-position texto-apresentacao ps-5\">\r\n\t\t\t\t\t<h1 class=\"title\" id=\"title\"></h1>\r\n\t\t\t\t\t<p class=\"subtitle\" id=\"subtitle\"></p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- Conte\u00FAdo da DIV de Login -->\r\n\t\t<div class=\"col-md-5\">\r\n\r\n\t\t\t<div class=\"div-size\">\r\n\t\t\t\t<div class=\"logotipo\">\r\n\t\t\t\t\t<img style=\"height: 95px;\" src=\"{{ this._customLoginService.loginLogotipo }}\" alt=\"{{ this._customLoginService.loginAltLogotipo }}\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<form *ngIf=\"!showParmsAuthentication2Fa; else Authentication2Fa\" [formGroup]=\"form\" class=\"form-position\">\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"basic-addon1\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/cloud.svg\" alt=\"cloud icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"dominio\" id=\"dominio\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Dom\u00EDnio\" aria-label=\"Dom\u00EDnio\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('dominio'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('dominio')\" label=\"Dom\u00EDnio\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/at-sign.svg\" alt=\"at-sign icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"usuario\" id=\"usuario\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Usu\u00E1rio\" aria-label=\"Usu\u00E1rio\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('usuario'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('usuario')\" label=\"Usu\u00E1rio\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\" style=\"margin-bottom: 8px;\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px;\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/lock.svg\" alt=\"lock-icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"password\" class=\"form-control\" formControlName=\"senha\" id=\"senha\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Senha\" aria-label=\"senha\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('senha'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('senha')\" label=\"Senha\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"remember-password\">\r\n\t\t\t\t\t<!-- Lembrar Senha\r\n\t\t\t\t\t\t<input id=\"checkboxLembrarSenha\" type=\"checkbox\" />\r\n\t\t\t\t\t\t<label for=\"checkboxLembrarSenha\"> Lembrar minha senha </label>\r\n \t\t\t\t\t-->\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<button [disabled]=\"isLoading\" (click)=\"getServer()\" type=\"submit\"\r\n\t\t\t\t\t\tclass=\"btn btn-primary btn-acessar btn-lg\">\r\n\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoading\"></app-loading-button>\r\n\t\t\t\t\t\t<span> Acessar </span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button type=\"button\" (click)=\"openForgottenPasswordModal(forgottenPasswordModal)\" class=\"forgotten-password\">\r\n\t\t\t\t\t\t<span> Esqueceu sua senha? </span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</form>\r\n\r\n\t\t\t\t<ng-template #Authentication2Fa>\r\n\t\t\t\t\t<form [formGroup]=\"formAuthentication2Fa\" class=\"form-position\">\r\n\t\t\t\t\t\t<div class=\"input-group input-group-lg form-item mb-3\">\r\n\t\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px;\">\r\n\t\t\t\t\t\t\t\t<img src=\"assets/icons/lock.svg\" alt=\"lock-icon\" />\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"code\" id=\"code\"\r\n\t\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"C\u00F3digo de 2 fatores\" aria-label=\"C\u00F3digo de 2 fatores\"\r\n\t\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formAuthentication2Fa.get('code'))\">\r\n\t\t\t\t\t\t\t<app-field-error-message [control]=\"formAuthentication2Fa.get('code')\" label=\"C\u00F3digo de 2 fatores\"></app-field-error-message>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"row mb-3\">\r\n\t\t\t\t\t\t\t<button (click)=\"voltar()\" type=\"button\" class=\"btn btn-acessar glb-btn-outline-dark-disabled col me-1\">\r\n\t\t\t\t\t\t\t\tVoltar\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button [disabled]=\"isLoadingSendAuthentication2Fa\" (click)=\"sendCode()\" type=\"button\" class=\"btn btn-acessar btn-primary col ms-1\">\r\n\t\t\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoadingSendAuthentication2Fa\"></app-loading-button>\r\n\t\t\t\t\t\t\t\tAcessar\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t\t\t<button *ngIf=\"secondsLeft == 0; else newCode\" \r\n\t\t\t\t\t\t\t\t[disabled]=\"isLoading\" (click)=\"getNewCode()\" type=\"button\" class=\"btn btn-acessar btn-outline-primary col\">\r\n\t\t\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoading\"></app-loading-button>\r\n\t\t\t\t\t\t\t\tEnviar novo c\u00F3digo\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<ng-template #newCode>\r\n\t\t\t\t\t\t\t\t<p class=\"text-center\">{{ secondsLeft}} {{ secondsLeft == 1 ? 'segundo' : 'segundos' }} para obter novo c\u00F3digo</p>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</form>\t\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t\r\n\t\t\t\t<div class=\"footer-position\">\r\n\t\t\t\t\t<footer>\r\n\t\t\t\t\t\t<span class=\"footer\"> \r\n\t\t\t\t\t\t\t<a href=\"https://dpo.privacytools.com.br/policy-view/JmGeNlJdw/1/poli%CC%81tica-de-privacidade/pt_BR?s=1685731510066\" target=\"_blank\" class=\"sispro text-primary\"> Pol\u00EDtica de Privacidade </a>\r\n\t\t\t\t\t\t\t<p class=\"separator\"> | </p>\r\n\t\t\t\t\t\t\t<a href=\"https://dpo.privacytools.com.br/policy-view/Rork35NN2/2/poli%CC%81tica-de-cookies/pt_BR?s=1685731551976\" target=\"_blank\" class=\"sispro text-primary\"> Pol\u00EDtica de Cookies </a>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class=\"footer\"> Desenvolvido por \r\n\t\t\t\t\t\t\t<a href=\"https://www.sispro.com.br/\" target=\"_blank\" class=\"sispro text-primary\"> sispro s/a </a>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class=\"footer\"> Servi\u00E7os e Tecnologia da informa\u00E7\u00E3o \u00A9 {{ year }} Todos os direitos reservados </span>\r\n\t\t\t\t\t\t\t<div class=\"icons\">\r\n\t\t\t\t\t\t\t\t<a href=\"https://pt-br.facebook.com/SisproERP/\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"facebook\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t<a href=\"https://www.instagram.com/accounts/login/?next=/sispro_software/\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"instagram\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t<a href=\"https://br.linkedin.com/company/sispro\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"linkedin\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"d-flex justify-content-center\">\r\n\t\t\t\t\t\t\t\t<a [href]=\"geturlErpConfig()\" style=\"text-decoration: none; font-size: 12px;\">\r\n\t\t\t\t\t\t\t\t\tConfigurar ERP\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</footer>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<!-- Template do modal de senha esquecida -->\r\n<ng-template #forgottenPasswordModal>\r\n\t<form [formGroup]=\"formFgtPsw\">\r\n\t\t<div class=\"modal-content\" style=\"box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.5);\">\r\n\t\t\t<div class=\"modal-header p-3\">\r\n\t\t\t\t<h4 class=\"modal-title\"> Recupera\u00E7\u00E3o de senha </h4>\r\n\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\r\n\t\t\t\t\t(click)=\"closeForgottenPasswordModal()\">\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"modal-body\">\r\n\t\t\t\t<label for=\"inputDominioFgtPsw\" class=\"input-label\"> Dom\u00EDnio <span class=\"text-danger\">*</span></label>\r\n\t\t\t\t<input type=\"text\" id=\"inputDominioFgtPsw\" formControlName=\"dominioFgtPsw\"\r\n\t\t\t\t\tclass=\"form-control input-text\" aria-label=\"Sizing example input\" aria-label=\"Dom\u00EDnio\"\r\n\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formFgtPsw.get('dominioFgtPsw'))\">\r\n\t\t\t\t<app-field-error-message [control]=\"formFgtPsw.get('dominioFgtPsw')\" label=\"Dom\u00EDnio\"></app-field-error-message>\t\t\t\t\r\n\r\n\t\t\t\t<label for=\"inputUsuarioFgtPsw\" class=\"input-label\"> Usu\u00E1rio <span class=\"text-danger\">*</span></label>\r\n\t\t\t\t<input type=\"text\" id=\"inputUsuarioFgtPsw\" formControlName=\"usuarioFgtPsw\"\r\n\t\t\t\t\tclass=\"form-control input-text\" aria-label=\"Sizing example input\" aria-label=\"Usu\u00E1rio\"\r\n\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formFgtPsw.get('usuarioFgtPsw'))\">\r\n\t\t\t\t<app-field-error-message [control]=\"formFgtPsw.get('usuarioFgtPsw')\" label=\"Usu\u00E1rio\"></app-field-error-message>\t\t\t\t\r\n\t\t\r\n\t\t\t</div>\r\n\t\t\t<div class=\"modal-footer\">\r\n\t\t\t\t<button type=\"button\" class=\"btn glb-btn-dark-disabled modal-button\" (click)=\"closeForgottenPasswordModal()\">\r\n\t\t\t\t\t<span> Cancelar </span>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" class=\"btn btn-primary modal-button\" (click)=\"sendForgottenPassword();\">\r\n\t\t\t\t\t<span> Continuar </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t</div>\r\n\t</form>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";*{padding:0;margin:0;font-family:Open Sans,sans-serif}.background{display:grid;height:100vh;align-content:center;background-size:cover;color:#f5f5f5;align-items:center;justify-content:center}.div-size{display:flex;flex-direction:column;justify-content:space-around;width:100%;height:100vh;align-items:center;background-color:#f5f5f5;box-shadow:0 0 15px #333}.title{font-size:3.5vw;text-transform:uppercase;font-weight:700}.subtitle{font-size:21px}.logotipo{display:flex;justify-content:center;margin-top:10%}.form-position{display:flex;flex-direction:column;align-content:center;width:378px}.form-item{margin-bottom:16px}.input-group-text{padding:10px 11px;border-radius:4px 0 0 4px}.remember-password{display:flex;align-items:center;margin-bottom:8px;justify-content:center}.remember-password label{margin-left:8px}.forgotten-password{background-color:#f5f5f5;border:none;text-decoration:underline;font-size:14px;box-shadow:none;margin-top:8px;cursor:pointer}.forgotten-password:focus{outline-style:none}.input-label{font-size:16px;padding:10px 0 8px 16px}.input-label:first-child{font-size:16px;padding-top:16px}.input-text{width:343px;height:38px;margin:0 0 10px 16px;padding:0 8px}.input-text:last-child{font-size:16px;margin-bottom:24px}.form-control{max-width:341px}.footer{display:flex;justify-content:center}.footer-position{font-size:14px;display:flex;justify-content:center;align-items:flex-end}.icons{display:flex;justify-content:center;align-items:center;margin-top:16px}.icons a{padding:4px}.icon-item{margin-left:24px;color:#007bff}.sispro{color:#2847a0;margin-left:5px;text-transform:uppercase;text-decoration:none;font-weight:700}.modal-footer{padding:0}.modal:before{content:\"\";display:inline-block;height:100%;vertical-align:middle}.modal-style{display:flex;align-items:center;justify-content:center}.modal-style h4{font-size:20px;font-weight:700;padding:10px}.modal-button{margin:16px 0;padding:7px 12px}.modal-button:last-child{margin-right:16px;margin-left:8px}.modal-close{display:flex;align-content:center;margin-right:10px;padding:6px}.col-md-7,.col-md-5{padding:0}.btn-acessar{height:48px;outline-style:none}.texto-apresentacao{align-items:start}.separator{margin-left:5px}\n"], dependencies: [{ kind: "directive", type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i2.FieldErrorMessageComponent, selector: "app-field-error-message, lib-error-message", inputs: ["customMessage", "control", "label"] }, { kind: "component", type: i2.LoadingButtonComponent, selector: "app-loading-button, lib-loading-button", inputs: ["isLoading"] }, { kind: "component", type: i2.LibIconsComponent, selector: "lib-icon", inputs: ["iconName", "iconColor", "iconSize", "iconFill"] }], preserveWhitespaces: true }); }
|
|
321
|
+
}
|
|
322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginComponent, decorators: [{
|
|
323
|
+
type: Component,
|
|
324
|
+
args: [{ selector: 'lib-login', standalone: false, preserveWhitespaces: true, template: "<div class=\"container-fluid\">\r\n\t<div class=\"row\">\r\n\t\t<!-- Conte\u00FAdo da DIV do background -->\r\n\t\t<div class=\"col-md-7\">\r\n\t\t\t<div class=\"background\" style=\"background-image: linear-gradient(to bottom, rgba(10, 44, 81, 0.9), rgba(10, 44, 81, 0.9)), url({{_customLoginService.loginBackground}})\">\r\n\t\t\t\t<div class=\"text-position texto-apresentacao ps-5\">\r\n\t\t\t\t\t<h1 class=\"title\" id=\"title\"></h1>\r\n\t\t\t\t\t<p class=\"subtitle\" id=\"subtitle\"></p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- Conte\u00FAdo da DIV de Login -->\r\n\t\t<div class=\"col-md-5\">\r\n\r\n\t\t\t<div class=\"div-size\">\r\n\t\t\t\t<div class=\"logotipo\">\r\n\t\t\t\t\t<img style=\"height: 95px;\" src=\"{{ this._customLoginService.loginLogotipo }}\" alt=\"{{ this._customLoginService.loginAltLogotipo }}\" />\r\n\t\t\t\t</div>\r\n\t\t\t\t<form *ngIf=\"!showParmsAuthentication2Fa; else Authentication2Fa\" [formGroup]=\"form\" class=\"form-position\">\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"basic-addon1\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/cloud.svg\" alt=\"cloud icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"dominio\" id=\"dominio\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Dom\u00EDnio\" aria-label=\"Dom\u00EDnio\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('dominio'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('dominio')\" label=\"Dom\u00EDnio\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/at-sign.svg\" alt=\"at-sign icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"usuario\" id=\"usuario\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Usu\u00E1rio\" aria-label=\"Usu\u00E1rio\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('usuario'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('usuario')\" label=\"Usu\u00E1rio\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"input-group input-group-lg form-item\" style=\"margin-bottom: 8px;\">\r\n\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px;\">\r\n\t\t\t\t\t\t\t<img src=\"assets/icons/lock.svg\" alt=\"lock-icon\" />\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<input type=\"password\" class=\"form-control\" formControlName=\"senha\" id=\"senha\"\r\n\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"Senha\" aria-label=\"senha\"\r\n\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(form.get('senha'))\">\r\n\t\t\t\t\t\t<app-field-error-message [control]=\"form.get('senha')\" label=\"Senha\"></app-field-error-message>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"remember-password\">\r\n\t\t\t\t\t<!-- Lembrar Senha\r\n\t\t\t\t\t\t<input id=\"checkboxLembrarSenha\" type=\"checkbox\" />\r\n\t\t\t\t\t\t<label for=\"checkboxLembrarSenha\"> Lembrar minha senha </label>\r\n \t\t\t\t\t-->\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<button [disabled]=\"isLoading\" (click)=\"getServer()\" type=\"submit\"\r\n\t\t\t\t\t\tclass=\"btn btn-primary btn-acessar btn-lg\">\r\n\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoading\"></app-loading-button>\r\n\t\t\t\t\t\t<span> Acessar </span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button type=\"button\" (click)=\"openForgottenPasswordModal(forgottenPasswordModal)\" class=\"forgotten-password\">\r\n\t\t\t\t\t\t<span> Esqueceu sua senha? </span>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</form>\r\n\r\n\t\t\t\t<ng-template #Authentication2Fa>\r\n\t\t\t\t\t<form [formGroup]=\"formAuthentication2Fa\" class=\"form-position\">\r\n\t\t\t\t\t\t<div class=\"input-group input-group-lg form-item mb-3\">\r\n\t\t\t\t\t\t\t<span class=\"input-group-text\" id=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t\tstyle=\"padding: 10px; border-radius: 4px 0px 0px 4px;\">\r\n\t\t\t\t\t\t\t\t<img src=\"assets/icons/lock.svg\" alt=\"lock-icon\" />\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<input type=\"text\" class=\"form-control\" formControlName=\"code\" id=\"code\"\r\n\t\t\t\t\t\t\t\taria-label=\"Sizing example input\" placeholder=\"C\u00F3digo de 2 fatores\" aria-label=\"C\u00F3digo de 2 fatores\"\r\n\t\t\t\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formAuthentication2Fa.get('code'))\">\r\n\t\t\t\t\t\t\t<app-field-error-message [control]=\"formAuthentication2Fa.get('code')\" label=\"C\u00F3digo de 2 fatores\"></app-field-error-message>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"row mb-3\">\r\n\t\t\t\t\t\t\t<button (click)=\"voltar()\" type=\"button\" class=\"btn btn-acessar glb-btn-outline-dark-disabled col me-1\">\r\n\t\t\t\t\t\t\t\tVoltar\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<button [disabled]=\"isLoadingSendAuthentication2Fa\" (click)=\"sendCode()\" type=\"button\" class=\"btn btn-acessar btn-primary col ms-1\">\r\n\t\t\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoadingSendAuthentication2Fa\"></app-loading-button>\r\n\t\t\t\t\t\t\t\tAcessar\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t\t\t<button *ngIf=\"secondsLeft == 0; else newCode\" \r\n\t\t\t\t\t\t\t\t[disabled]=\"isLoading\" (click)=\"getNewCode()\" type=\"button\" class=\"btn btn-acessar btn-outline-primary col\">\r\n\t\t\t\t\t\t\t\t<app-loading-button [isLoading]=\"isLoading\"></app-loading-button>\r\n\t\t\t\t\t\t\t\tEnviar novo c\u00F3digo\r\n\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t<ng-template #newCode>\r\n\t\t\t\t\t\t\t\t<p class=\"text-center\">{{ secondsLeft}} {{ secondsLeft == 1 ? 'segundo' : 'segundos' }} para obter novo c\u00F3digo</p>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</form>\t\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t\r\n\t\t\t\t<div class=\"footer-position\">\r\n\t\t\t\t\t<footer>\r\n\t\t\t\t\t\t<span class=\"footer\"> \r\n\t\t\t\t\t\t\t<a href=\"https://dpo.privacytools.com.br/policy-view/JmGeNlJdw/1/poli%CC%81tica-de-privacidade/pt_BR?s=1685731510066\" target=\"_blank\" class=\"sispro text-primary\"> Pol\u00EDtica de Privacidade </a>\r\n\t\t\t\t\t\t\t<p class=\"separator\"> | </p>\r\n\t\t\t\t\t\t\t<a href=\"https://dpo.privacytools.com.br/policy-view/Rork35NN2/2/poli%CC%81tica-de-cookies/pt_BR?s=1685731551976\" target=\"_blank\" class=\"sispro text-primary\"> Pol\u00EDtica de Cookies </a>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class=\"footer\"> Desenvolvido por \r\n\t\t\t\t\t\t\t<a href=\"https://www.sispro.com.br/\" target=\"_blank\" class=\"sispro text-primary\"> sispro s/a </a>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t<span class=\"footer\"> Servi\u00E7os e Tecnologia da informa\u00E7\u00E3o \u00A9 {{ year }} Todos os direitos reservados </span>\r\n\t\t\t\t\t\t\t<div class=\"icons\">\r\n\t\t\t\t\t\t\t\t<a href=\"https://pt-br.facebook.com/SisproERP/\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"facebook\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t<a href=\"https://www.instagram.com/accounts/login/?next=/sispro_software/\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"instagram\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t\t<a href=\"https://br.linkedin.com/company/sispro\" target=\"_blank\">\r\n\t\t\t\t\t\t\t\t\t<lib-icon class=\"text-primary\" iconName=\"linkedin\" iconSize=\"medium-small\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</div>\r\n\r\n\t\t\t\t\t\t\t<div class=\"d-flex justify-content-center\">\r\n\t\t\t\t\t\t\t\t<a [href]=\"geturlErpConfig()\" style=\"text-decoration: none; font-size: 12px;\">\r\n\t\t\t\t\t\t\t\t\tConfigurar ERP\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</footer>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</div>\r\n\r\n<!-- Template do modal de senha esquecida -->\r\n<ng-template #forgottenPasswordModal>\r\n\t<form [formGroup]=\"formFgtPsw\">\r\n\t\t<div class=\"modal-content\" style=\"box-shadow: 2px 2px 5px 0px rgba(0,0,0,0.5);\">\r\n\t\t\t<div class=\"modal-header p-3\">\r\n\t\t\t\t<h4 class=\"modal-title\"> Recupera\u00E7\u00E3o de senha </h4>\r\n\t\t\t\t<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"\r\n\t\t\t\t\t(click)=\"closeForgottenPasswordModal()\">\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\t\t\t<div class=\"modal-body\">\r\n\t\t\t\t<label for=\"inputDominioFgtPsw\" class=\"input-label\"> Dom\u00EDnio <span class=\"text-danger\">*</span></label>\r\n\t\t\t\t<input type=\"text\" id=\"inputDominioFgtPsw\" formControlName=\"dominioFgtPsw\"\r\n\t\t\t\t\tclass=\"form-control input-text\" aria-label=\"Sizing example input\" aria-label=\"Dom\u00EDnio\"\r\n\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formFgtPsw.get('dominioFgtPsw'))\">\r\n\t\t\t\t<app-field-error-message [control]=\"formFgtPsw.get('dominioFgtPsw')\" label=\"Dom\u00EDnio\"></app-field-error-message>\t\t\t\t\r\n\r\n\t\t\t\t<label for=\"inputUsuarioFgtPsw\" class=\"input-label\"> Usu\u00E1rio <span class=\"text-danger\">*</span></label>\r\n\t\t\t\t<input type=\"text\" id=\"inputUsuarioFgtPsw\" formControlName=\"usuarioFgtPsw\"\r\n\t\t\t\t\tclass=\"form-control input-text\" aria-label=\"Sizing example input\" aria-label=\"Usu\u00E1rio\"\r\n\t\t\t\t\taria-describedby=\"inputGroup-sizing-lg\"\r\n\t\t\t\t\t[class.is-invalid]=\"FormUtils.isInvalidField(formFgtPsw.get('usuarioFgtPsw'))\">\r\n\t\t\t\t<app-field-error-message [control]=\"formFgtPsw.get('usuarioFgtPsw')\" label=\"Usu\u00E1rio\"></app-field-error-message>\t\t\t\t\r\n\t\t\r\n\t\t\t</div>\r\n\t\t\t<div class=\"modal-footer\">\r\n\t\t\t\t<button type=\"button\" class=\"btn glb-btn-dark-disabled modal-button\" (click)=\"closeForgottenPasswordModal()\">\r\n\t\t\t\t\t<span> Cancelar </span>\r\n\t\t\t\t</button>\r\n\t\t\t\t<button type=\"button\" class=\"btn btn-primary modal-button\" (click)=\"sendForgottenPassword();\">\r\n\t\t\t\t\t<span> Continuar </span>\r\n\t\t\t\t</button>\r\n\t\t\t</div>\r\n\r\n\t\t</div>\r\n\t</form>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";*{padding:0;margin:0;font-family:Open Sans,sans-serif}.background{display:grid;height:100vh;align-content:center;background-size:cover;color:#f5f5f5;align-items:center;justify-content:center}.div-size{display:flex;flex-direction:column;justify-content:space-around;width:100%;height:100vh;align-items:center;background-color:#f5f5f5;box-shadow:0 0 15px #333}.title{font-size:3.5vw;text-transform:uppercase;font-weight:700}.subtitle{font-size:21px}.logotipo{display:flex;justify-content:center;margin-top:10%}.form-position{display:flex;flex-direction:column;align-content:center;width:378px}.form-item{margin-bottom:16px}.input-group-text{padding:10px 11px;border-radius:4px 0 0 4px}.remember-password{display:flex;align-items:center;margin-bottom:8px;justify-content:center}.remember-password label{margin-left:8px}.forgotten-password{background-color:#f5f5f5;border:none;text-decoration:underline;font-size:14px;box-shadow:none;margin-top:8px;cursor:pointer}.forgotten-password:focus{outline-style:none}.input-label{font-size:16px;padding:10px 0 8px 16px}.input-label:first-child{font-size:16px;padding-top:16px}.input-text{width:343px;height:38px;margin:0 0 10px 16px;padding:0 8px}.input-text:last-child{font-size:16px;margin-bottom:24px}.form-control{max-width:341px}.footer{display:flex;justify-content:center}.footer-position{font-size:14px;display:flex;justify-content:center;align-items:flex-end}.icons{display:flex;justify-content:center;align-items:center;margin-top:16px}.icons a{padding:4px}.icon-item{margin-left:24px;color:#007bff}.sispro{color:#2847a0;margin-left:5px;text-transform:uppercase;text-decoration:none;font-weight:700}.modal-footer{padding:0}.modal:before{content:\"\";display:inline-block;height:100%;vertical-align:middle}.modal-style{display:flex;align-items:center;justify-content:center}.modal-style h4{font-size:20px;font-weight:700;padding:10px}.modal-button{margin:16px 0;padding:7px 12px}.modal-button:last-child{margin-right:16px;margin-left:8px}.modal-close{display:flex;align-content:center;margin-right:10px;padding:6px}.col-md-7,.col-md-5{padding:0}.btn-acessar{height:48px;outline-style:none}.texto-apresentacao{align-items:start}.separator{margin-left:5px}\n"] }]
|
|
325
|
+
}], ctorParameters: () => [{ type: i1.BsModalService }, { type: i2.MessageService }, { type: i3.FormBuilder }, { type: i4.AuthService }, { type: i5.ServerService }, { type: i6.EnvironmentService }, { type: i7.AuthStorageService }, { type: i8.LibCustomLoginService }, { type: i9.Title }, { type: i10.Router }, { type: i11.ToastrService }] });
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNwLWF1dGgvc3JjL2xpYi9jb21wb25lbnRzL2xvZ2luL2xvZ2luLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zcC1hdXRoL3NyYy9saWIvY29tcG9uZW50cy9sb2dpbi9sb2dpbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUF1QixNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQWUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3BFLE9BQU8sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLdEQseUZBQXlGO0FBQ3pGLE9BQU8sRUFBRSxTQUFTLEVBQWtCLE1BQU0sY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7OztBQWV6RCxNQUFNLE9BQU8sY0FBYztJQUUxQjtJQUNDLGlEQUFpRDtJQUN6QyxlQUErQixFQUMvQixlQUErQixFQUMvQixZQUF5QixFQUN6QixZQUF5QixFQUN6QixjQUE2QixFQUM3QixtQkFBdUMsRUFDdkMsbUJBQXVDLEVBQ3hDLG1CQUEwQyxFQUN6QyxNQUFhLEVBQ2IsT0FBZSxFQUNmLGNBQTZCO1FBVjdCLG9CQUFlLEdBQWYsZUFBZSxDQUFnQjtRQUMvQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWE7UUFDekIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0Isd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFvQjtRQUN2Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW9CO1FBQ3hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBdUI7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UzsrQkFDQyxXQUFXLGNBR1QsS0FBSyx1QkFDSSxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5cclxuaW1wb3J0IHsgbWFwLCBTdWJzY3JpcHRpb24sIHRha2UsIHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBCc01vZGFsUmVmLCBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xyXG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XHJcblxyXG4vL2ltcG9ydCB7IEN1c3RvbUxvZ2luU2VydmljZSB9IGZyb20gJ3NyYy9hcHAvcHJvamVjdC9jdXN0b20vbG9naW4vY3VzdG9tLWxvZ2luLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtVXRpbHMsIE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmd4LXNwLWluZnJhJztcclxuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudHMnO1xyXG5pbXBvcnQgeyBMaWJDdXN0b21Mb2dpblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jdXN0b20vY3VzdG9tLWxvZ2luLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXJ2ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmVyL3NlcnZlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXV0aFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9hdXRoLXN0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogJ2xpYi1sb2dpbicsXHJcblx0dGVtcGxhdGVVcmw6ICcuL2xvZ2luLmNvbXBvbmVudC5odG1sJyxcclxuXHRzdHlsZVVybHM6IFsnLi9sb2dpbi5jb21wb25lbnQuc2NzcyddLFxyXG5cdHN0YW5kYWxvbmU6IGZhbHNlLFxyXG5cdHByZXNlcnZlV2hpdGVzcGFjZXM6IHRydWUsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMb2dpbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0Ly9wdWJsaWMgX2N1c3RvbUxvZ2luU2VydmljZTogQ3VzdG9tTG9naW5TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfYnNNb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG5cdFx0cHJpdmF0ZSBfYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfc2VydmVyU2VydmljZTogU2VydmVyU2VydmljZSxcclxuXHRcdHByaXZhdGUgX2Vudmlyb25tZW50U2VydmljZTogRW52aXJvbm1lbnRTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfYXV0aFN0b3JhZ2VTZXJ2aWNlOiBBdXRoU3RvcmFnZVNlcnZpY2UsXHJcblx0XHRwdWJsaWMgX2N1c3RvbUxvZ2luU2VydmljZTogTGliQ3VzdG9tTG9naW5TZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfdGl0bGU6IFRpdGxlLFxyXG5cdFx0cHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXHJcblx0XHRwcml2YXRlIF90b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlXHJcblx0KSB7IH1cclxuXHJcblx0Ly8gI3JlZ2lvbiA9PT09PT09PT09PiBQUk9QRVJUSUVTIDw9PT09PT09PT09XHJcblxyXG5cdC8vICNyZWdpb24gUFJJVkFURVxyXG5cclxuXHRwcml2YXRlIGlkRmd0UHN3OiBudW1iZXIgPSAxO1xyXG5cclxuXHQvLyAjZW5kcmVnaW9uIFBSSVZBVEVcclxuXHJcblx0Ly8gI3JlZ2lvbiBQVUJMSUNcclxuXHJcblx0cHVibGljIG1vZGFsUmVmPzogQnNNb2RhbFJlZjtcclxuXHJcblx0Ly8gIFZhcmnDoXZlaXMgZXNwZWPDrWZpY2FzIHBhcmEgZnVuY2lvbmFsaWRhZGVzIHBhZHLDtWVzIGRvcyBmb3JtdWzDoXJpb3NcclxuXHRwdWJsaWMgY3VycmVudFRpbWU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cdHB1YmxpYyB5ZWFyOiBudW1iZXIgPSB0aGlzLmN1cnJlbnRUaW1lLmdldEZ1bGxZZWFyKCk7XHJcblxyXG5cdHB1YmxpYyBpc0xvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHRwdWJsaWMgaXNMb2FkaW5nU2VuZEF1dGhlbnRpY2F0aW9uMkZhOiBib29sZWFuID0gZmFsc2U7XHJcblx0cHVibGljIHNob3dQYXJtc0F1dGhlbnRpY2F0aW9uMkZhID0gZmFsc2U7XHJcblx0cHVibGljIGlzTG9hZGluZ0dldE5ld0NvZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Ly9wcm9wcmllZGFkZXMgcXVlIHbDo28gcmVjZWJlciBvcyB2YWxvcmVzIGRvIGN1c3RvbUxvZ2luU2VydmljZSAjIyMjVkVSSUZJQ0FSIERFUE9JUyMjIyNcclxuXHJcblx0Ly8gQElucHV0KCkgY3VzdG9tUHJvcHJpZWRhZGVzTG9naW4/OiBDdXN0b21Qcm9wcmllZGFkZXNMb2dpbjtcclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiBQVUJMSUNcclxuXHJcblx0Ly8gI3JlZ2lvbiBUaW1lclxyXG5cclxuXHRwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHRwcml2YXRlIHRpbWVyRHVyYXRpb246IG51bWJlciA9IDkwO1xyXG5cdHB1YmxpYyBzZWNvbmRzTGVmdDogbnVtYmVyID0gdGhpcy50aW1lckR1cmF0aW9uO1xyXG5cclxuXHRwcml2YXRlIGNvdW50ZG93biQgPSB0aW1lcigwLCAxMDAwKS5waXBlKFxyXG5cdFx0dGFrZSh0aGlzLnRpbWVyRHVyYXRpb24gKyAxKSxcclxuXHJcblx0XHRtYXAoc2Vjb25kc0VsYXBzZWQgPT4gdGhpcy50aW1lckR1cmF0aW9uIC0gc2Vjb25kc0VsYXBzZWQpXHJcblx0KTtcclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiBUaW1lclxyXG5cclxuXHQvLyAjcmVnaW9uID09PT09PT09PT0+IEZPUk0gQlVJTERFUiA8PT09PT09PT09PVxyXG5cdHB1YmxpYyBmb3JtOiBGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHRwdWJsaWMgZm9ybUZndFBzdzogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7O1xyXG5cdHB1YmxpYyBmb3JtQXV0aGVudGljYXRpb24yRmE6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pOztcclxuXHJcblx0Ly8gIFByb3ByaWVkYWRlIG5lY2Vzc8OhcmlvIHBhcmEgcXVlIGEgY2xhc3NlIHN0YXRpYyBGb3JtVXRpbHMgcG9zc2Egc2VyIHV0aWxpemFkYSBubyBIdG1sXHJcblx0cHVibGljIGdldCBGb3JtVXRpbHMoKTogdHlwZW9mIEZvcm1VdGlscyB7XHJcblx0XHRyZXR1cm4gRm9ybVV0aWxzO1xyXG5cdH1cclxuXHJcblx0Ly8gI3JlZ2lvbiBGT1JNIERBVEFcclxuXHJcblx0Ly8gIFZhcmnDoXZlaXMgZXNwZWPDrWZpY2FzIHBhcmEgZnVuY2lvbmFsaWRhZGVzIHBhZHLDtWVzIGRvcyBmb3JtdWzDoXJpb3MgKExvZ2luKVxyXG5cdHB1YmxpYyBnZXQgZG9taW5pbygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybS5nZXQoJ2RvbWluaW8nKT8udmFsdWU7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgZ2V0IHVzdWFyaW8oKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLmZvcm0uZ2V0KCd1c3VhcmlvJyk/LnZhbHVlO1xyXG5cdH1cclxuXHJcblx0cHVibGljIGdldCBzZW5oYSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3NlbmhhJyk/LnZhbHVlO1xyXG5cdH1cclxuXHJcblx0Ly8gIFZhcmnDoXZlaXMgZXNwZWPDrWZpY2FzIHBhcmEgZnVuY2lvbmFsaWRhZGVzIHBhZHLDtWVzIGRvcyBmb3JtdWzDoXJpb3MgKFJlcXVlc3RSZWNvdmVyUGFzc3dvcmQpXHJcblx0cHVibGljIGdldCBkb21pbmlvRmd0UHN3KCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5mb3JtRmd0UHN3LmdldCgnZG9taW5pb0ZndFBzdycpPy52YWx1ZTtcclxuXHR9XHJcblxyXG5cdHB1YmxpYyBnZXQgdXN1YXJpb0ZndFBzdygpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybUZndFBzdy5nZXQoJ3VzdWFyaW9GZ3RQc3cnKT8udmFsdWU7XHJcblx0fVxyXG5cclxuXHQvLyAgVmFyacOhdmVpcyBlc3BlY8OtZmljYXMgcGFyYSBmdW5jaW9uYWxpZGFkZXMgcGFkcsO1ZXMgZG9zIGZvcm11bMOhcmlvcyAoQXV0ZW50aWNhw6fDo28gMiBGYXRvcmVzKVxyXG5cdHB1YmxpYyBnZXQgY29kZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMuZm9ybUF1dGhlbnRpY2F0aW9uMkZhLmdldCgnY29kZScpPy52YWx1ZTtcclxuXHR9XHJcblxyXG5cdC8vICNlbmRyZWdpb24gRk9STSBEQVRBXHJcblxyXG5cdC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gUFJPUEVSVElFUyA8PT09PT09PT09PVxyXG5cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLl90aXRsZS5zZXRUaXRsZSh0aGlzLl9jdXN0b21Mb2dpblNlcnZpY2UubG9naW5QYWdlVGl0bGUpO1xyXG5cclxuXHRcdGlmICh0aGlzLl9jdXN0b21Mb2dpblNlcnZpY2UubG9naW5UaXRsZSAhPSBcIlwiKSB7XHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidGl0bGVcIikhLmlubmVySFRNTCA9IHRoaXMuX2N1c3RvbUxvZ2luU2VydmljZS5sb2dpblRpdGxlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLl9jdXN0b21Mb2dpblNlcnZpY2UubG9naW5TdWJ0aXRsZSAhPSBcIlwiKSB7XHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3VidGl0bGVcIikhLmlubmVySFRNTCA9IHRoaXMuX2N1c3RvbUxvZ2luU2VydmljZS5sb2dpblN1YnRpdGxlO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5jcmVhdGVGb3JtKCk7XHJcblx0fVxyXG5cclxuXHQvLyAjcmVnaW9uIEZPUk0gVkFMSURBVE9SU1xyXG5cclxuXHQvLyAgTcOpdG9kbyBwYXJhIGNvbmZpZ3VyYcOnw6NvIGRvcyBjYW1wb3MgZGUgZWRpw6fDo28gZG8gZm9ybXVsw6FyaW8gKExvZ2luKVxyXG5cdHByaXZhdGUgY3JlYXRlRm9ybSgpOiB2b2lkIHtcclxuXHJcblx0XHQvLyAgRGFkb3Mgb3JpZ2luYWlzIGRlIExvZ2luXHJcblx0XHRpZiAodGhpcy5fZW52aXJvbm1lbnRTZXJ2aWNlLnByb2R1Y3Rpb24pIHtcclxuXHRcdFx0dGhpcy5mb3JtID0gdGhpcy5fZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG5cdFx0XHRcdGRvbWluaW86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV1dLFxyXG5cdFx0XHRcdHVzdWFyaW86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldXSxcclxuXHRcdFx0XHRzZW5oYTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV1dXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdHRoaXMuZm9ybSA9IHRoaXMuX2Zvcm1CdWlsZGVyLmdyb3VwKHtcclxuXHRcdFx0XHRkb21pbmlvOiBbdGhpcy5fY3VzdG9tTG9naW5TZXJ2aWNlLmxvZ2luRGVzZW52RG9tYWluLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXV0sXHJcblx0XHRcdFx0dXN1YXJpbzogW3RoaXMuX2N1c3RvbUxvZ2luU2VydmljZS5sb2dpbkRlc2VudlVzZXIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXV0sXHJcblx0XHRcdFx0c2VuaGE6IFt0aGlzLl9jdXN0b21Mb2dpblNlcnZpY2UubG9naW5EZXNlbnZQYXNzd29yZCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldXVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vICBNw6l0b2RvIHBhcmEgY29uZmlndXJhw6fDo28gZG9zIGNhbXBvcyBkZSBlZGnDp8OjbyBkbyBmb3JtdWzDoXJpbyAoUmVxdWVzdFJlY292ZXJQYXNzd29yZClcclxuXHRwcml2YXRlIGNyZWF0ZUZvcm1Gb3Jnb3R0ZW5QYXNzd29yZCgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLmZvcm1GZ3RQc3cgPSB0aGlzLl9mb3JtQnVpbGRlci5ncm91cCh7XHJcblx0XHRcdGRvbWluaW9GZ3RQc3c6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV1dLFxyXG5cdFx0XHR1c3VhcmlvRmd0UHN3OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXV0sXHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLmZvcm1GZ3RQc3cuZ2V0KCdyZWNvdmVyQ2RvbWluaW9GZ3RQc3dvZGVSZWNQc3cnKT8uc2V0VmFsdWUoJycpO1xyXG5cdFx0dGhpcy5mb3JtRmd0UHN3LmdldCgndXN1YXJpb0ZndFBzdycpPy5zZXRWYWx1ZSgnJyk7XHJcblx0fVxyXG5cclxuXHQvLyAgTcOpdG9kbyBwYXJhIGNvbmZpZ3VyYcOnw6NvIGRvcyBjYW1wb3MgZGUgZWRpw6fDo28gZG8gZm9ybXVsw6FyaW8gKEF1dGVudGljYcOnw6NvIDIgRmF0b3JlcylcclxuXHRwcml2YXRlIGNyZWF0ZUZvcm1BdXRoZW50aWNhdGlvbjJGYSgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLmZvcm1BdXRoZW50aWNhdGlvbjJGYSA9IHRoaXMuX2Zvcm1CdWlsZGVyLmdyb3VwKHtcclxuXHRcdFx0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNildXSxcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMuZm9ybS5nZXQoJ2NvZGUnKT8uc2V0VmFsdWUoJycpO1xyXG5cdH1cclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiBGT1JNIFZBTElEQVRPUlNcclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBGT1JNIEJVSUxERVIgPD09PT09PT09PT1cclxuXHJcblx0Ly8gI3JlZ2lvbiA9PT09PT09PT09PiBTRVJWSUNFIE1FVEhPRFMgPD09PT09PT09PT1cclxuXHJcblx0Ly8gI3JlZ2lvbiBHRVRcclxuXHJcblx0Ly8gT2J0w6ltIGEgVXJsIGRvIENvbmZpZyBFcnBcclxuXHRwdWJsaWMgZ2V0dXJsRXJwQ29uZmlnKCk6IHN0cmluZyB7XHJcblx0XHQvLyB2ZXJpZmljYXIgZGVwb2lzIFxyXG5cdFx0cmV0dXJuIGAke3RoaXMuX2Vudmlyb25tZW50U2VydmljZS5ob3N0TmFtZX0vU2lzcHJvRXJwQ2xvdWQvQ29uZmlnRXJwYDtcclxuXHR9XHJcblxyXG5cdC8qXHJcblx0KiBPYnTDqW0gb3MgcGFyw6JtZXRyb3MgZGUgY29uZmlndXJhw6fDo28gZG8gc2Vydmlkb3IgcGFyYSBBdXRlbnRpY2HDp8OjbyBCw6FzaWNhIGRlIHNlZ3VyYW7Dp2FcclxuXHQqL1xyXG5cdHB1YmxpYyBnZXRTZXJ2ZXIoKTogdm9pZCB7XHJcblxyXG5cdFx0aWYgKHRoaXMuZm9ybS52YWxpZCkge1xyXG5cdFx0XHR0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcblxyXG5cdFx0XHR0aGlzLl9zZXJ2ZXJTZXJ2aWNlLmdldFNlcnZlcigpLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0bmV4dDogcmVzcG9uc2UgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5sb2dPbigpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHQvL3RoaXMuX3Byb2plY3RVdGlsc2VydmljZS5zaG93SHR0cEVycm9yKGVycm9yKTtcclxuXHRcdFx0XHRcdHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnNob3dBbGVydERhbmdlcihlcnJvcik7XHJcblxyXG5cdFx0XHRcdFx0Ly9wb2RlIHNlciBzdWJzdGl0dWlkbyBwb3IgY29uc29sZS5lcnJvclxyXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0pXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRGb3JtVXRpbHMudmFsaWRhdGVGaWVsZHModGhpcy5mb3JtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vICNlbmRyZWdpb24gR0VUXHJcblxyXG5cdC8vICNyZWdpb24gUE9TVFxyXG5cclxuXHQvLyAgRXhlY3V0YSBvIExvZ2luXHJcblx0cHVibGljIGxvZ09uKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5fYXV0aFNlcnZpY2UubG9naW4odGhpcy5mb3JtLnZhbHVlKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHR0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRpZiAocmVzcG9uc2UuRmVlZGJhY2tNZXNzYWdlICE9IFwiXCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuX3RvYXN0clNlcnZpY2Uud2FybmluZyhyZXNwb25zZS5GZWVkYmFja01lc3NhZ2UsXHJcblx0XHRcdFx0XHRcdCcnLFxyXG5cdFx0XHRcdFx0XHR7XHJcblx0XHRcdFx0XHRcdFx0dGltZU91dDogMzAwMCxcclxuXHRcdFx0XHRcdFx0XHRleHRlbmRlZFRpbWVPdXQ6IDIwMDBcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvL0luY2lhbGl6YcOnw6NvIGRlIFNlbmhhXHJcblx0XHRcdFx0aWYgKHJlc3BvbnNlLkluaXRpYWxpemVQYXNzd29yZCkge1xyXG5cdFx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBidG9hKGB0cnVlJCR7dGhpcy5kb21pbmlvfSQke3RoaXMudXN1YXJpb31gKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW2BhdXRoL2xvZ2luL25vdmFTZW5oYS8ke3BhcmFtfWBdKTtcclxuXHJcblx0XHRcdFx0XHR0aGlzLl90b2FzdHJTZXJ2aWNlLnN1Y2Nlc3MoXCJWZXJpZmlxdWUgbm8gc2V1IGUtbWFpbCBvIGPDs2RpZ28gZGUgdmFsaWRhw6fDo28uXCIpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKHJlc3BvbnNlLkluZnJhSW5BdXRoVHlwZUlkID09IDEgJiYgcmVzcG9uc2UuSW5mcmFJbjJGYVR5cGVJZCAhPSBudWxsICYmIHJlc3BvbnNlLkluZnJhSW4yRmFUeXBlSWQgPT0gMSAmJiByZXNwb25zZS5JczJGYUVuYWJsZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuY3JlYXRlRm9ybUF1dGhlbnRpY2F0aW9uMkZhKCk7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5jb3VudGRvd24kLnN1YnNjcmliZShzZWNvbmRzTGVmdCA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2Vjb25kc0xlZnQgPSBzZWNvbmRzTGVmdDtcclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuc2hvd1Bhcm1zQXV0aGVudGljYXRpb24yRmEgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdHRoaXMuX3RvYXN0clNlcnZpY2Uuc3VjY2VzcyhcIlZlcmlmaXF1ZSBubyBzZXUgZS1tYWlsIG8gY8OzZGlnbyBkZSB2YWxpZGHDp8Ojby5cIik7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSxcclxuXHRcdFx0ZXJyb3I6IChlcnJvcikgPT4ge1xyXG5cdFx0XHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdC8vdGhpcy5fcHJvamVjdFV0aWxzZXJ2aWNlLnNob3dIdHRwRXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRcdHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnNob3dBbGVydERhbmdlcihlcnJvcik7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGVycm9yKVxyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gRW52aWEgcmVxdWlzacOnw6NvIHBhcmEgZXNxdWVjZXIgc2VuaGFcclxuXHRwdWJsaWMgc2VuZEZvcmdvdHRlblBhc3N3b3JkKCk6IHZvaWQge1xyXG5cclxuXHRcdGlmICh0aGlzLmZvcm1GZ3RQc3cudmFsaWQpIHtcclxuXHRcdFx0dGhpcy5fc2VydmVyU2VydmljZS5nZXRTZXJ2ZXIoKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IHJlc3BvbnNlID0+IHtcclxuXHRcdFx0XHRcdHRoaXMuZm9yZ290dGVuUGFzc3dvcmQoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHRcdC8vdGhpcy5fcHJvamVjdFV0aWxzZXJ2aWNlLnNob3dIdHRwRXJyb3IoZXJyb3IpO1xyXG5cdFx0XHRcdFx0dGhpcy5fbWVzc2FnZVNlcnZpY2Uuc2hvd0FsZXJ0RGFuZ2VyKGVycm9yKTtcclxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvcilcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9KVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdEZvcm1VdGlscy52YWxpZGF0ZUZpZWxkcyh0aGlzLmZvcm1GZ3RQc3cpO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIFJlcXVpc2nDp8OjbyBwYXJhIGVzcXVlY2VyIHNlbmhhXHJcblx0cHVibGljIGZvcmdvdHRlblBhc3N3b3JkKCk6IHZvaWQge1xyXG5cclxuXHRcdHRoaXMuX2F1dGhTZXJ2aWNlLmZvcmdvdHRlblBhc3N3b3JkKHRoaXMuZm9ybUZndFBzdy52YWx1ZSkuc3Vic2NyaWJlKHtcclxuXHRcdFx0bmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5jbG9zZUZvcmdvdHRlblBhc3N3b3JkTW9kYWwoKTtcclxuXHJcblx0XHRcdFx0bGV0IHBhcmFtOiBzdHJpbmcgPSBidG9hKGBmYWxzZSQke3RoaXMuZG9taW5pb30kJHt0aGlzLnVzdWFyaW99JCR7M31gKTtcclxuXHJcblx0XHRcdFx0dGhpcy5fcm91dGVyLm5hdmlnYXRlKFtgYXV0aC9sb2dpbi9ub3ZhU2VuaGEvJHtwYXJhbX1gXSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuX3RvYXN0clNlcnZpY2Uuc3VjY2VzcyhcIlZlcmlmaXF1ZSBubyBzZXUgZS1tYWlsIG8gY8OzZGlnbyBkZSB2YWxpZGHDp8Ojby5cIik7XHJcblx0XHRcdH0sXHJcblx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHQvL3RoaXMuX3Byb2plY3RVdGlsc2VydmljZS5zaG93SHR0cEVycm9yKGVycm9yKTtcclxuXHRcdFx0XHR0aGlzLl9tZXNzYWdlU2VydmljZS5zaG93QWxlcnREYW5nZXIoZXJyb3IpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvcilcclxuXHRcdFx0fSxcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEVudmlhIHJlcXVpc2nDp8OjbyBwYXJhIHZhbGlkYXIgY8OzZGlnbyAyIGZhdG9yZXNcclxuXHRwdWJsaWMgc2VuZENvZGUoKTogdm9pZCB7XHJcblxyXG5cdFx0aWYgKHRoaXMuZm9ybUF1dGhlbnRpY2F0aW9uMkZhLnZhbGlkKSB7XHJcblx0XHRcdHRoaXMuaXNMb2FkaW5nU2VuZEF1dGhlbnRpY2F0aW9uMkZhID0gdHJ1ZTtcclxuXHJcblx0XHRcdHRoaXMudmFsaWRhdGVDb2RlKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRGb3JtVXRpbHMudmFsaWRhdGVGaWVsZHModGhpcy5mb3JtQXV0aGVudGljYXRpb24yRmEpO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG5cdC8vIFZhbGlkYcOnw6NvIGRvIGPDs2RpZ28gMiBmYXRvcmVzXHJcblx0cHVibGljIHZhbGlkYXRlQ29kZSgpOiB2b2lkIHtcclxuXHJcblx0XHR0aGlzLl9hdXRoU2VydmljZS52YWxpZGF0ZUF1dGhlbnRpY2F0aW9uMkZhKHRoaXMuY29kZSkuc3Vic2NyaWJlKHtcclxuXHRcdFx0bmV4dDogKHJlc3BvbnNlKSA9PiB7XHJcblx0XHRcdFx0dGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcblxyXG5cdFx0XHRcdHRoaXMuaXNMb2FkaW5nU2VuZEF1dGhlbnRpY2F0aW9uMkZhID0gZmFsc2U7XHJcblx0XHRcdH0sXHJcblx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHR0aGlzLmlzTG9hZGluZ1NlbmRBdXRoZW50aWNhdGlvbjJGYSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHQvL3RoaXMuX3Byb2plY3RVdGlsc2VydmljZS5zaG93SHR0cEVycm9yKGVycm9yKTtcclxuXHRcdFx0XHR0aGlzLl9tZXNzYWdlU2VydmljZS5zaG93QWxlcnREYW5nZXIoZXJyb3IpO1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihlcnJvcilcclxuXHRcdFx0fSxcclxuXHRcdH0pO1xyXG5cclxuXHR9XHJcblxyXG5cdC8vIEVudmlhIHJlcXVpc2nDp8OjbyBwYXJhIHZhbGlkYXIgY8OzZGlnbyAyIGZhdG9yZXNcclxuXHRwdWJsaWMgZ2V0TmV3Q29kZSgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXNMb2FkaW5nR2V0TmV3Q29kZSA9IHRydWU7XHJcblxyXG5cdFx0dGhpcy5fc2VydmVyU2VydmljZS5nZXRTZXJ2ZXIoKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiByZXNwb25zZSA9PiB7XHJcblx0XHRcdFx0dGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5jb3VudGRvd24kLnN1YnNjcmliZShzZWNvbmRzTGVmdCA9PiB7XHJcblx0XHRcdFx0XHR0aGlzLnNlY29uZHNMZWZ0ID0gc2Vjb25kc0xlZnQ7XHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdHRoaXMuR2V0TmV3Q29kZTJGYSgpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRlcnJvcjogKGVycm9yKSA9PiB7XHJcblx0XHRcdFx0Ly90aGlzLl9wcm9qZWN0VXRpbHNlcnZpY2Uuc2hvd0h0dHBFcnJvcihlcnJvcik7XHJcblx0XHRcdFx0dGhpcy5fbWVzc2FnZVNlcnZpY2Uuc2hvd0FsZXJ0RGFuZ2VyKGVycm9yKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3IpXHJcblx0XHRcdH0sXHJcblx0XHR9KTtcclxuXHJcblx0fVxyXG5cclxuXHQvLyBWYWxpZGHDp8OjbyBkbyBjw7NkaWdvIDIgZmF0b3Jlc1xyXG5cdHB1YmxpYyBHZXROZXdDb2RlMkZhKCk6IHZvaWQge1xyXG5cclxuXHRcdHRoaXMuX2F1dGhTZXJ2aWNlLkdldE5ld0NvZGUyRmEoKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHR0aGlzLmlzTG9hZGluZ0dldE5ld0NvZGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0dGhpcy5fdG9hc3RyU2VydmljZS5zdWNjZXNzKFwiRW52aWFtb3MgdW0gbm92byBjw7NkaWdvIHBhcmEgbyBlbmRlcmXDp28gZGUgZS1tYWlsIHZpbmN1bGFkbyBhbyBzZXUgdXN1w6FyaW8uIFZlcmlmaXF1ZSBvIGxpeG8gZWxldHLDtG5pY28gKFNQQU0pIGRhIHN1YSBjYWl4YSBkZSBlbnRyYWRhLCBjYXNvIG7Do28gdGVuaGEgZW5jb250cmFkbyBub3NzYSBtZW5zYWdlbS5cIik7XHJcblx0XHRcdH0sXHJcblx0XHRcdGVycm9yOiAoZXJyb3IpID0+IHtcclxuXHRcdFx0XHR0aGlzLmlzTG9hZGluZ0dldE5ld0NvZGUgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0Ly90aGlzLl9wcm9qZWN0VXRpbHNlcnZpY2Uuc2hvd0h0dHBFcnJvcihlcnJvcik7XHJcblx0XHRcdFx0dGhpcy5fbWVzc2FnZVNlcnZpY2Uuc2hvd0FsZXJ0RGFuZ2VyKGVycm9yKTtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG5cdFx0XHR9LFxyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiBQT1NUXHJcblxyXG5cdC8vICNyZWdpb24gVVRJTElEQURFU1xyXG5cclxuXHQvLyBSZXRvcm5vIHBhcmEgYSB0ZWxhIGRlIGxvZ2luXHJcblx0cHVibGljIHZvbHRhcigpOiB2b2lkIHtcclxuXHRcdHRoaXMuX3N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cdFx0dGhpcy5zaG93UGFybXNBdXRoZW50aWNhdGlvbjJGYSA9IGZhbHNlO1xyXG5cclxuXHRcdHRoaXMuX2F1dGhTdG9yYWdlU2VydmljZS5sb2dvdXQoKTtcclxuXHJcblx0XHR0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW1wiL2F1dGgvbG9naW5cIl0pO1xyXG5cdH1cclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiBVVElMSURBREVTXHJcblxyXG5cdC8vICNlbmRyZWdpb24gPT09PT09PT09PT4gU0VSVklDRSBNRVRIT0RTIDw9PT09PT09PT09XHJcblxyXG5cdC8vICNyZWdpb24gPT09PT09PT09PT4gTU9EQUxTIDw9PT09PT09PT09XHJcblxyXG5cdC8vIEV4ZWN1dGEgZXNxdWVjZXIgc2VuaGFcclxuXHRwdWJsaWMgb3BlbkZvcmdvdHRlblBhc3N3b3JkTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcclxuXHRcdHRoaXMuY3JlYXRlRm9ybUZvcmdvdHRlblBhc3N3b3JkKCk7XHJcblxyXG5cdFx0dGhpcy5tb2RhbFJlZiA9IHRoaXMuX2JzTW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHtcclxuXHRcdFx0Y2xhc3M6ICdtb2RhbC1kaWFsb2ctY2VudGVyZWQnLFxyXG5cdFx0XHRpZ25vcmVCYWNrZHJvcENsaWNrOiBmYWxzZSxcclxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxyXG5cdFx0XHRpZDogdGhpcy5pZEZndFBzd1xyXG5cdFx0fSk7XHJcblxyXG5cdH1cclxuXHJcblx0Ly8gRW5jZXJyYSBlc3F1ZWNlciBzZW5oYVxyXG5cdHB1YmxpYyBjbG9zZUZvcmdvdHRlblBhc3N3b3JkTW9kYWwoKTogdm9pZCB7XHJcblx0XHR0aGlzLl9ic01vZGFsU2VydmljZS5oaWRlKHRoaXMuaWRGZ3RQc3cpO1xyXG5cdH1cclxuXHJcblx0Ly8gI2VuZHJlZ2lvbiA9PT09PT09PT09PiBNT0RBTFMgPD09PT09PT09PT1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPlxyXG5cdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdDwhLS0gQ29udGXDumRvIGRhIERJViBkbyBiYWNrZ3JvdW5kIC0tPlxyXG5cdFx0PGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJiYWNrZ3JvdW5kXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDEwLCA0NCwgODEsIDAuOSksIHJnYmEoMTAsIDQ0LCA4MSwgMC45KSksIHVybCh7e19jdXN0b21Mb2dpblNlcnZpY2UubG9naW5CYWNrZ3JvdW5kfX0pXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHQtcG9zaXRpb24gdGV4dG8tYXByZXNlbnRhY2FvIHBzLTVcIj5cclxuXHRcdFx0XHRcdDxoMSBjbGFzcz1cInRpdGxlXCIgaWQ9XCJ0aXRsZVwiPjwvaDE+XHJcblx0XHRcdFx0XHQ8cCBjbGFzcz1cInN1YnRpdGxlXCIgaWQ9XCJzdWJ0aXRsZVwiPjwvcD5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHRcdDwhLS0gQ29udGXDumRvIGRhIERJViBkZSBMb2dpbiAtLT5cclxuXHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxyXG5cclxuXHRcdFx0PGRpdiBjbGFzcz1cImRpdi1zaXplXCI+XHJcblx0XHRcdFx0PGRpdiBjbGFzcz1cImxvZ290aXBvXCI+XHJcblx0XHRcdFx0XHQ8aW1nIHN0eWxlPVwiaGVpZ2h0OiA5NXB4O1wiIHNyYz1cInt7IHRoaXMuX2N1c3RvbUxvZ2luU2VydmljZS5sb2dpbkxvZ290aXBvIH19XCIgYWx0PVwie3sgdGhpcy5fY3VzdG9tTG9naW5TZXJ2aWNlLmxvZ2luQWx0TG9nb3RpcG8gfX1cIiAvPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDxmb3JtICAqbmdJZj1cIiFzaG93UGFybXNBdXRoZW50aWNhdGlvbjJGYTsgZWxzZSBBdXRoZW50aWNhdGlvbjJGYVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwiZm9ybS1wb3NpdGlvblwiPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWxnIGZvcm0taXRlbVwiPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBpZD1cImJhc2ljLWFkZG9uMVwiXHJcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHggMHB4IDBweCA0cHhcIj5cclxuXHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9jbG91ZC5zdmdcIiBhbHQ9XCJjbG91ZCBpY29uXCIgLz5cclxuXHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRvbWluaW9cIiBpZD1cImRvbWluaW9cIlxyXG5cdFx0XHRcdFx0XHRcdGFyaWEtbGFiZWw9XCJTaXppbmcgZXhhbXBsZSBpbnB1dFwiIHBsYWNlaG9sZGVyPVwiRG9tw61uaW9cIiBhcmlhLWxhYmVsPVwiRG9tw61uaW9cIlxyXG5cdFx0XHRcdFx0XHRcdGFyaWEtZGVzY3JpYmVkYnk9XCJpbnB1dEdyb3VwLXNpemluZy1sZ1wiXHJcblx0XHRcdFx0XHRcdFx0W2NsYXNzLmlzLWludmFsaWRdPVwiRm9ybVV0aWxzLmlzSW52YWxpZEZpZWxkKGZvcm0uZ2V0KCdkb21pbmlvJykpXCI+XHJcblx0XHRcdFx0XHRcdDxhcHAtZmllbGQtZXJyb3ItbWVzc2FnZSBbY29udHJvbF09XCJmb3JtLmdldCgnZG9taW5pbycpXCIgbGFiZWw9XCJEb23DrW5pb1wiPjwvYXBwLWZpZWxkLWVycm9yLW1lc3NhZ2U+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1sZyBmb3JtLWl0ZW1cIj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgaWQ9XCJpbnB1dEdyb3VwLXNpemluZy1sZ1wiXHJcblx0XHRcdFx0XHRcdFx0c3R5bGU9XCJwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHggMHB4IDBweCA0cHhcIj5cclxuXHRcdFx0XHRcdFx0XHQ8aW1nIHNyYz1cImFzc2V0cy9pY29ucy9hdC1zaWduLnN2Z1wiIGFsdD1cImF0LXNpZ24gaWNvblwiIC8+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ1c3VhcmlvXCIgaWQ9XCJ1c3VhcmlvXCJcclxuXHRcdFx0XHRcdFx0XHRhcmlhLWxhYmVsPVwiU2l6aW5nIGV4YW1wbGUgaW5wdXRcIiBwbGFjZWhvbGRlcj1cIlVzdcOhcmlvXCIgYXJpYS1sYWJlbD1cIlVzdcOhcmlvXCJcclxuXHRcdFx0XHRcdFx0XHRhcmlhLWRlc2NyaWJlZGJ5PVwiaW5wdXRHcm91cC1zaXppbmctbGdcIlxyXG5cdFx0XHRcdFx0XHRcdFtjbGFzcy5pcy1pbnZhbGlkXT1cIkZvcm1VdGlscy5pc0ludmFsaWRGaWVsZChmb3JtLmdldCgndXN1YXJpbycpKVwiPlxyXG5cdFx0XHRcdFx0XHQ8YXBwLWZpZWxkLWVycm9yLW1lc3NhZ2UgW2NvbnRyb2xdPVwiZm9ybS5nZXQoJ3VzdWFyaW8nKVwiIGxhYmVsPVwiVXN1w6FyaW9cIj48L2FwcC1maWVsZC1lcnJvci1tZXNzYWdlPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtbGcgZm9ybS1pdGVtXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7XCI+XHJcblx0XHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIGlkPVwiaW5wdXRHcm91cC1zaXppbmctbGdcIlxyXG5cdFx0XHRcdFx0XHRcdHN0eWxlPVwicGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4IDBweCAwcHggNHB4O1wiPlxyXG5cdFx0XHRcdFx0XHRcdDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2xvY2suc3ZnXCIgYWx0PVwibG9jay1pY29uXCIgLz5cclxuXHRcdFx0XHRcdFx0PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzZW5oYVwiIGlkPVwic2VuaGFcIlxyXG5cdFx0XHRcdFx0XHRcdGFyaWEtbGFiZWw9XCJTaXppbmcgZXhhbXBsZSBpbnB1dFwiIHBsYWNlaG9sZGVyPVwiU2VuaGFcIiBhcmlhLWxhYmVsPVwic2VuaGFcIlxyXG5cdFx0XHRcdFx0XHRcdGFyaWEtZGVzY3JpYmVkYnk9XCJpbnB1dEdyb3VwLXNpemluZy1sZ1wiXHJcblx0XHRcdFx0XHRcdFx0W2NsYXNzLmlzLWludmFsaWRdPVwiRm9ybVV0aWxzLmlzSW52YWxpZEZpZWxkKGZvcm0uZ2V0KCdzZW5oYScpKVwiPlxyXG5cdFx0XHRcdFx0XHQ8YXBwLWZpZWxkLWVycm9yLW1lc3NhZ2UgW2NvbnRyb2xdPVwiZm9ybS5nZXQoJ3NlbmhhJylcIiBsYWJlbD1cIlNlbmhhXCI+PC9hcHAtZmllbGQtZXJyb3ItbWVzc2FnZT5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInJlbWVtYmVyLXBhc3N3b3JkXCI+XHJcblx0XHRcdFx0XHQ8IS0tIExlbWJyYXIgU2VuaGFcclxuXHRcdFx0XHRcdFx0PGlucHV0IGlkPVwiY2hlY2tib3hMZW1icmFyU2VuaGFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPlxyXG5cdFx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiY2hlY2tib3hMZW1icmFyU2VuaGFcIj4gTGVtYnJhciBtaW5oYSBzZW5oYSA8L2xhYmVsPlxyXG4gXHRcdFx0XHRcdC0tPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8YnV0dG9uIFtkaXNhYmxlZF09XCJpc0xvYWRpbmdcIiAoY2xpY2spPVwiZ2V0U2VydmVyKClcIiB0eXBlPVwic3VibWl0XCJcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWFjZXNzYXIgYnRuLWxnXCI+XHJcblx0XHRcdFx0XHRcdDxhcHAtbG9hZGluZy1idXR0b24gW2lzTG9hZGluZ109XCJpc0xvYWRpbmdcIj48L2FwcC1sb2FkaW5nLWJ1dHRvbj5cclxuXHRcdFx0XHRcdFx0PHNwYW4+IEFjZXNzYXIgPC9zcGFuPlxyXG5cdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib3BlbkZvcmdvdHRlblBhc3N3b3JkTW9kYWwoZm9yZ290dGVuUGFzc3dvcmRNb2RhbClcIiBjbGFzcz1cImZvcmdvdHRlbi1wYXNzd29yZFwiPlxyXG5cdFx0XHRcdFx0XHQ8c3Bhbj4gRXNxdWVjZXUgc3VhIHNlbmhhPyA8L3NwYW4+XHJcblx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHQ8L2Zvcm0+XHJcblxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAjQXV0aGVudGljYXRpb24yRmE+XHJcblx0XHRcdFx0XHQ8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1BdXRoZW50aWNhdGlvbjJGYVwiIGNsYXNzPVwiZm9ybS1wb3NpdGlvblwiPlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtbGcgZm9ybS1pdGVtIG1iLTNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImlucHV0LWdyb3VwLXRleHRcIiBpZD1cImlucHV0R3JvdXAtc2l6aW5nLWxnXCJcclxuXHRcdFx0XHRcdFx0XHRcdHN0eWxlPVwicGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4IDBweCAwcHggNHB4O1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvbG9jay5zdmdcIiBhbHQ9XCJsb2NrLWljb25cIiAvPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImNvZGVcIiBpZD1cImNvZGVcIlxyXG5cdFx0XHRcdFx0XHRcdFx0YXJpYS1sYWJlbD1cIlNpemluZyBleGFtcGxlIGlucHV0XCIgcGxhY2Vob2xkZXI9XCJDw7NkaWdvIGRlIDIgZmF0b3Jlc1wiIGFyaWEtbGFiZWw9XCJDw7NkaWdvIGRlIDIgZmF0b3Jlc1wiXHJcblx0XHRcdFx0XHRcdFx0XHRhcmlhLWRlc2NyaWJlZGJ5PVwiaW5wdXRHcm91cC1zaXppbmctbGdcIlxyXG5cdFx0XHRcdFx0XHRcdFx0W2NsYXNzLmlzLWludmFsaWRdPVwiRm9ybVV0aWxzLmlzSW52YWxpZEZpZWxkKGZvcm1BdXRoZW50aWNhdGlvbjJGYS5nZXQoJ2NvZGUnKSlcIj5cclxuXHRcdFx0XHRcdFx0XHQ8YXBwLWZpZWxkLWVycm9yLW1lc3NhZ2UgW2NvbnRyb2xdPVwiZm9ybUF1dGhlbnRpY2F0aW9uMkZhLmdldCgnY29kZScpXCIgbGFiZWw9XCJDw7NkaWdvIGRlIDIgZmF0b3Jlc1wiPjwvYXBwLWZpZWxkLWVycm9yLW1lc3NhZ2U+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uIChjbGljayk9XCJ2b2x0YXIoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYWNlc3NhciBnbGItYnRuLW91dGxpbmUtZGFyay1kaXNhYmxlZCBjb2wgbWUtMVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0Vm9sdGFyXHJcblx0XHRcdFx0XHRcdFx0PC9idXR0b24+XHJcblx0XHRcdFx0XHRcdFx0PGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nU2VuZEF1dGhlbnRpY2F0aW9uMkZhXCIgKGNsaWNrKT1cInNlbmRDb2RlKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWFjZXNzYXIgYnRuLXByaW1hcnkgY29sIG1zLTFcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxhcHAtbG9hZGluZy1idXR0b24gW2lzTG9hZGluZ109XCJpc0xvYWRpbmdTZW5kQXV0aGVudGljYXRpb24yRmFcIj48L2FwcC1sb2FkaW5nLWJ1dHRvbj5cclxuXHRcdFx0XHRcdFx0XHRcdEFjZXNzYXJcclxuXHRcdFx0XHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuXHRcdFx0XHRcdFx0XHQ8YnV0dG9uICpuZ0lmPVwic2Vjb25kc0xlZnQgPT0gMDsgZWxzZSBuZXdDb2RlXCIgXHJcblx0XHRcdFx0XHRcdFx0XHRbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCIgKGNsaWNrKT1cImdldE5ld0NvZGUoKVwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tYWNlc3NhciBidG4tb3V0bGluZS1wcmltYXJ5IGNvbFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PGFwcC1sb2FkaW5nLWJ1dHRvbiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvYXBwLWxvYWRpbmctYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdFx0RW52aWFyIG5vdm8gY8OzZGlnb1xyXG5cdFx0XHRcdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbmV3Q29kZT5cclxuXHRcdFx0XHRcdFx0XHRcdDxwIGNsYXNzPVwidGV4dC1jZW50ZXJcIj57eyBzZWNvbmRzTGVmdH19IHt7IHNlY29uZHNMZWZ0ID09IDEgPyAnc2VndW5kbycgOiAnc2VndW5kb3MnIH19IHBhcmEgb2J0ZXIgbm92byBjw7NkaWdvPC9wPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0PC9mb3JtPlx0XHJcblx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZm9vdGVyLXBvc2l0aW9uXCI+XHJcblx0XHRcdFx0XHQ8Zm9vdGVyPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZvb3RlclwiPiBcclxuXHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiaHR0cHM6Ly9kcG8ucHJpdmFjeXRvb2xzLmNvbS5ici9wb2xpY3ktdmlldy9KbUdlTmxKZHcvMS9wb2xpJUNDJTgxdGljYS1kZS1wcml2YWNpZGFkZS9wdF9CUj9zPTE2ODU3MzE1MTAwNjZcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInNpc3BybyB0ZXh0LXByaW1hcnlcIj4gUG9sw610aWNhIGRlIFByaXZhY2lkYWRlIDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8cCBjbGFzcz1cInNlcGFyYXRvclwiPiB8IDwvcD5cclxuXHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiaHR0cHM6Ly9kcG8ucHJpdmFjeXRvb2xzLmNvbS5ici9wb2xpY3ktdmlldy9Sb3JrMzVOTjIvMi9wb2xpJUNDJTgxdGljYS1kZS1jb29raWVzL3B0X0JSP3M9MTY4NTczMTU1MTk3NlwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwic2lzcHJvIHRleHQtcHJpbWFyeVwiPiBQb2zDrXRpY2EgZGUgQ29va2llcyA8L2E+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmb290ZXJcIj4gRGVzZW52b2x2aWRvIHBvciBcclxuXHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiaHR0cHM6Ly93d3cuc2lzcHJvLmNvbS5ici9cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cInNpc3BybyB0ZXh0LXByaW1hcnlcIj4gc2lzcHJvIHMvYSA8L2E+XHJcblx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmb290ZXJcIj4gU2VydmnDp29zIGUgVGVjbm9sb2dpYSBkYSBpbmZvcm1hw6fDo28gwqkge3sgeWVhciB9fSBUb2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zIDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaWNvbnNcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxhIGhyZWY9XCJodHRwczovL3B0LWJyLmZhY2Vib29rLmNvbS9TaXNwcm9FUlAvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxsaWItaWNvbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiIGljb25OYW1lPVwiZmFjZWJvb2tcIiBpY29uU2l6ZT1cIm1lZGl1bS1zbWFsbFwiLz5cclxuXHRcdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHRcdDxhIGhyZWY9XCJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL2FjY291bnRzL2xvZ2luLz9uZXh0PS9zaXNwcm9fc29mdHdhcmUvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxsaWItaWNvbiBjbGFzcz1cInRleHQtcHJpbWFyeVwiIGljb25OYW1lPVwiaW5zdGFncmFtXCIgaWNvblNpemU9XCJtZWRpdW0tc21hbGxcIi8+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2E+XHJcblx0XHRcdFx0XHRcdFx0XHQ8YSBocmVmPVwiaHR0cHM6Ly9ici5saW5rZWRpbi5jb20vY29tcGFueS9zaXNwcm9cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PGxpYi1pY29uIGNsYXNzPVwidGV4dC1wcmltYXJ5XCIgaWNvbk5hbWU9XCJsaW5rZWRpblwiIGljb25TaXplPVwibWVkaXVtLXNtYWxsXCIvPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9hPlxyXG5cdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxhIFtocmVmXT1cImdldHVybEVycENvbmZpZygpXCIgc3R5bGU9XCJ0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtc2l6ZTogMTJweDtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Q29uZmlndXJhciBFUlBcclxuXHRcdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdDwvZm9vdGVyPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGVtcGxhdGUgZG8gbW9kYWwgZGUgc2VuaGEgZXNxdWVjaWRhIC0tPlxyXG48bmctdGVtcGxhdGUgI2ZvcmdvdHRlblBhc3N3b3JkTW9kYWw+XHJcblx0PGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtRmd0UHN3XCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIHN0eWxlPVwiYm94LXNoYWRvdzogMnB4IDJweCA1cHggMHB4IHJnYmEoMCwwLDAsMC41KTtcIj5cclxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlciBwLTNcIj5cclxuXHRcdFx0XHQ8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiPiBSZWN1cGVyYcOnw6NvIGRlIHNlbmhhIDwvaDQ+XHJcblx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiXHJcblx0XHRcdFx0XHQoY2xpY2spPVwiY2xvc2VGb3Jnb3R0ZW5QYXNzd29yZE1vZGFsKClcIj5cclxuXHRcdFx0XHQ8L2J1dHRvbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcblx0XHRcdFx0PGxhYmVsIGZvcj1cImlucHV0RG9taW5pb0ZndFBzd1wiIGNsYXNzPVwiaW5wdXQtbGFiZWxcIj4gRG9tw61uaW8gPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+PC9sYWJlbD5cclxuXHRcdFx0XHQ8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlucHV0RG9taW5pb0ZndFBzd1wiIGZvcm1Db250cm9sTmFtZT1cImRvbWluaW9GZ3RQc3dcIlxyXG5cdFx0XHRcdFx0Y2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtdGV4dFwiIGFyaWEtbGFiZWw9XCJTaXppbmcgZXhhbXBsZSBpbnB1dFwiIGFyaWEtbGFiZWw9XCJEb23DrW5pb1wiXHJcblx0XHRcdFx0XHRhcmlhLWRlc2NyaWJlZGJ5PVwiaW5wdXRHcm91cC1zaXppbmctbGdcIlxyXG5cdFx0XHRcdFx0W2NsYXNzLmlzLWludmFsaWRdPVwiRm9ybVV0aWxzLmlzSW52YWxpZEZpZWxkKGZvcm1GZ3RQc3cuZ2V0KCdkb21pbmlvRmd0UHN3JykpXCI+XHJcblx0XHRcdFx0PGFwcC1maWVsZC1lcnJvci1tZXNzYWdlIFtjb250cm9sXT1cImZvcm1GZ3RQc3cuZ2V0KCdkb21pbmlvRmd0UHN3JylcIiBsYWJlbD1cIkRvbcOtbmlvXCI+PC9hcHAtZmllbGQtZXJyb3ItbWVzc2FnZT5cdFx0XHRcdFxyXG5cclxuXHRcdFx0XHQ8bGFiZWwgZm9yPVwiaW5wdXRVc3VhcmlvRmd0UHN3XCIgY2xhc3M9XCJpbnB1dC1sYWJlbFwiPiBVc3XDoXJpbyA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj48L2xhYmVsPlxyXG5cdFx0XHRcdDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaW5wdXRVc3VhcmlvRmd0UHN3XCIgZm9ybUNvbnRyb2xOYW1lPVwidXN1YXJpb0ZndFBzd1wiXHJcblx0XHRcdFx0XHRjbGFzcz1cImZvcm0tY29udHJvbCBpbnB1dC10ZXh0XCIgYXJpYS1sYWJlbD1cIlNpemluZyBleGFtcGxlIGlucHV0XCIgYXJpYS1sYWJlbD1cIlVzdcOhcmlvXCJcclxuXHRcdFx0XHRcdGFyaWEtZGVzY3JpYmVkYnk9XCJpbnB1dEdyb3VwLXNpemluZy1sZ1wiXHJcblx0XHRcdFx0XHRbY2xhc3MuaXMtaW52YWxpZF09XCJGb3JtVXRpbHMuaXNJbnZhbGlkRmllbGQoZm9ybUZndFBzdy5nZXQoJ3VzdWFyaW9GZ3RQc3cnKSlcIj5cclxuXHRcdFx0XHQ8YXBwLWZpZWxkLWVycm9yLW1lc3NhZ2UgW2NvbnRyb2xdPVwiZm9ybUZndFBzdy5nZXQoJ3VzdWFyaW9GZ3RQc3cnKVwiIGxhYmVsPVwiVXN1w6FyaW9cIj48L2FwcC1maWVsZC1lcnJvci1tZXNzYWdlPlx0XHRcdFx0XHJcblx0XHRcclxuXHRcdFx0PC9kaXY+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuXHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBnbGItYnRuLWRhcmstZGlzYWJsZWQgbW9kYWwtYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlRm9yZ290dGVuUGFzc3dvcmRNb2RhbCgpXCI+XHJcblx0XHRcdFx0XHQ8c3Bhbj4gQ2FuY2VsYXIgPC9zcGFuPlxyXG5cdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHRcdDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1vZGFsLWJ1dHRvblwiIChjbGljayk9XCJzZW5kRm9yZ290dGVuUGFzc3dvcmQoKTtcIj5cclxuXHRcdFx0XHRcdDxzcGFuPiBDb250aW51YXIgPC9zcGFuPlxyXG5cdFx0XHRcdDwvYnV0dG9uPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHJcblx0XHQ8L2Rpdj5cclxuXHQ8L2Zvcm0+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|
package/esm2022/lib/components/menu-lateral/dropdown/primary-dropdown/primary-dropdown.component.mjs
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../../../custom/custom-menu.service";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
import * as i3 from "ngx-sp-infra";
|
|
7
|
+
import * as i4 from "../secondary-dropdown/secondary-dropdown.component";
|
|
8
|
+
//import { ProjectUtilservice } from 'src/app/project/utils/project-utils.service';
|
|
9
|
+
//import { environment } from '../../../../environments/environments';
|
|
10
|
+
export class PrimaryDropdownComponent {
|
|
11
|
+
constructor(_customMenuService) {
|
|
12
|
+
this._customMenuService = _customMenuService;
|
|
13
|
+
this.buttonWasClicked = new Observable;
|
|
14
|
+
this.primaryDropdown = [];
|
|
15
|
+
}
|
|
16
|
+
ngOnInit() {
|
|
17
|
+
console.log('ngOnInit');
|
|
18
|
+
this.buttonWasClicked.subscribe(() => { this.selectDataState = true; });
|
|
19
|
+
// Resolver colisão de eventos
|
|
20
|
+
if (this._customMenuService.menuDynamic) {
|
|
21
|
+
if (!this._customMenuService.menuConfig) {
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
this.primaryDropdown = this._customMenuService.menuConfig.initializeMenuDropdown(this.primaryDropdown);
|
|
24
|
+
}, 2000);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.primaryDropdown = this._customMenuService.menuConfig.initializeMenuDropdown(this.primaryDropdown);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.primaryDropdown = this._customMenuService.menuConfig.initializeMenuDropdown(this.primaryDropdown);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
openDropdown(modulo, desiredDropdown) {
|
|
35
|
+
this.modulo = modulo;
|
|
36
|
+
if (desiredDropdown == null) {
|
|
37
|
+
this.selectDataState = true;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.selectDataState = false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
onClickedOutside(e, ref) {
|
|
44
|
+
if (this.selectDataState = false) {
|
|
45
|
+
this.selectDataState = true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
backToPrimary(data) {
|
|
49
|
+
this.selectDataState = true;
|
|
50
|
+
}
|
|
51
|
+
redirectToPrePortal() {
|
|
52
|
+
const url = `https://siscandesv6.sispro.com.br/SisproErpCloud/PrePortal`;
|
|
53
|
+
window.open(url, '_blank');
|
|
54
|
+
}
|
|
55
|
+
redirectToModulo(modulo) {
|
|
56
|
+
const url = `https://siscandesv6.sispro.com.br/SisproErpCloud/${modulo}`;
|
|
57
|
+
window.open(url, '_blank');
|
|
58
|
+
}
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrimaryDropdownComponent, deps: [{ token: i1.LibCustomMenuService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
60
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PrimaryDropdownComponent, selector: "app-primary-dropdown", inputs: { buttonWasClicked: "buttonWasClicked" }, ngImport: i0, template: "<div class=\"p-2\">\r\n <div *ngIf=\"selectDataState; else secondary_dropdown\" class=\"mb-2 w-100\">\r\n <li *ngFor=\"let modulo of primaryDropdown\" (click)=\"(modulo.secondary_level != null ? openDropdown(modulo, secondary_dropdown) : redirectToModulo(modulo.URL))\">\r\n <a class=\"dropdown-item mb-2\">\r\n <img src=\"{{ modulo.icon }}\" alt=\"{{ modulo.label }}\">\r\n {{ modulo.label }}\r\n </a>\r\n </li>\r\n <hr class=\"dropdown-divider\">\r\n <li>\r\n <a class=\"dropdown-item link-portal mt-2\" (click)=\"redirectToPrePortal()\" target=\"_blank\">Portal Sispro</a>\r\n </li>\r\n </div>\r\n\r\n <ng-template #secondary_dropdown>\r\n <div #secondary_ref (clickOutside)=\"onClickedOutside($event, secondary_ref)\">\r\n <app-secondary-dropdown [modulo]=\"this.modulo\" (backPrimaryDropdown)=\"backToPrimary($event)\"></app-secondary-dropdown>\r\n </div>\r\n </ng-template>\r\n</div>", styles: ["*{padding:0;margin:0}li a{font-size:14px}li a img{margin-right:4px}li a:hover{font-weight:700;background-color:transparent}.dropdown-divider{height:0}.link-portal{color:#2847a0;text-decoration:underline;text-align:center;font-weight:700;font-size:14px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "component", type: i4.SecondaryDropdownComponent, selector: "app-secondary-dropdown", inputs: ["modulo"], outputs: ["backPrimaryDropdown"] }] }); }
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PrimaryDropdownComponent, decorators: [{
|
|
63
|
+
type: Component,
|
|
64
|
+
args: [{ selector: 'app-primary-dropdown', template: "<div class=\"p-2\">\r\n <div *ngIf=\"selectDataState; else secondary_dropdown\" class=\"mb-2 w-100\">\r\n <li *ngFor=\"let modulo of primaryDropdown\" (click)=\"(modulo.secondary_level != null ? openDropdown(modulo, secondary_dropdown) : redirectToModulo(modulo.URL))\">\r\n <a class=\"dropdown-item mb-2\">\r\n <img src=\"{{ modulo.icon }}\" alt=\"{{ modulo.label }}\">\r\n {{ modulo.label }}\r\n </a>\r\n </li>\r\n <hr class=\"dropdown-divider\">\r\n <li>\r\n <a class=\"dropdown-item link-portal mt-2\" (click)=\"redirectToPrePortal()\" target=\"_blank\">Portal Sispro</a>\r\n </li>\r\n </div>\r\n\r\n <ng-template #secondary_dropdown>\r\n <div #secondary_ref (clickOutside)=\"onClickedOutside($event, secondary_ref)\">\r\n <app-secondary-dropdown [modulo]=\"this.modulo\" (backPrimaryDropdown)=\"backToPrimary($event)\"></app-secondary-dropdown>\r\n </div>\r\n </ng-template>\r\n</div>", styles: ["*{padding:0;margin:0}li a{font-size:14px}li a img{margin-right:4px}li a:hover{font-weight:700;background-color:transparent}.dropdown-divider{height:0}.link-portal{color:#2847a0;text-decoration:underline;text-align:center;font-weight:700;font-size:14px}\n"] }]
|
|
65
|
+
}], ctorParameters: () => [{ type: i1.LibCustomMenuService }], propDecorators: { buttonWasClicked: [{
|
|
66
|
+
type: Input
|
|
67
|
+
}] } });
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWFyeS1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvbWVudS1sYXRlcmFsL2Ryb3Bkb3duL3ByaW1hcnktZHJvcGRvd24vcHJpbWFyeS1kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3AtYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvbWVudS1sYXRlcmFsL2Ryb3Bkb3duL3ByaW1hcnktZHJvcGRvd24vcHJpbWFyeS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBR2xDLG1GQUFtRjtBQUNuRixzRUFBc0U7QUFPdEUsTUFBTSxPQUFPLHdCQUF3QjtJQVUvQixZQUNjLGtCQUF3QztRQUF4Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCO1FBTjdDLHFCQUFnQixHQUF3QixJQUFJLFVBQVUsQ0FBQztRQUV6RCxvQkFBZSxHQUFlLEVBQ3BDLENBQUE7SUFLRyxDQUFDO0lBRUwsUUFBUTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUVwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNWLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzdHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNmLENBQUM7aUJBQU0sQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdHLENBQUM7UUFFUCxDQUFDO2FBQU0sQ0FBQztZQUNGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0csQ0FBQztJQUVQLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBVyxFQUFFLGVBQWlDO1FBQzVELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUM7YUFBTSxDQUFDO1lBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDbkMsQ0FBQztJQUNQLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxDQUFRLEVBQUUsR0FBbUI7UUFDL0MsSUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUM7SUFDUCxDQUFDO0lBRU0sYUFBYSxDQUFDLElBQWE7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVNLG1CQUFtQjtRQUNwQixNQUFNLEdBQUcsR0FBVyw0REFBNEQsQ0FBQztRQUVqRixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU0sZ0JBQWdCLENBQUMsTUFBYztRQUNoQyxNQUFNLEdBQUcsR0FBVyxvREFBb0QsTUFBTSxFQUFFLENBQUM7UUFFakYsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQzsrR0FsRU0sd0JBQXdCO21HQUF4Qix3QkFBd0IsOEdDWnJDLDBpQ0FtQk07OzRGRFBPLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDTSxzQkFBc0I7eUZBU3ZCLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgTGliQ3VzdG9tTWVudVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9jdXN0b20vY3VzdG9tLW1lbnUuc2VydmljZSc7XHJcbi8vaW1wb3J0IHsgUHJvamVjdFV0aWxzZXJ2aWNlIH0gZnJvbSAnc3JjL2FwcC9wcm9qZWN0L3V0aWxzL3Byb2plY3QtdXRpbHMuc2VydmljZSc7XHJcbi8vaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnRzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgICBzZWxlY3RvcjogJ2FwcC1wcmltYXJ5LWRyb3Bkb3duJyxcclxuICAgICAgdGVtcGxhdGVVcmw6ICcuL3ByaW1hcnktZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgICBzdHlsZVVybHM6IFsnLi9wcmltYXJ5LWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcmltYXJ5RHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgICAgcHVibGljIHNlbGVjdERhdGFTdGF0ZSE6IGJvb2xlYW47XHJcbiAgICAgIHB1YmxpYyBtb2R1bG86IGFueTtcclxuXHJcbiAgICAgIEBJbnB1dCgpIGJ1dHRvbldhc0NsaWNrZWQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBuZXcgT2JzZXJ2YWJsZTtcclxuXHJcbiAgICAgIHB1YmxpYyBwcmltYXJ5RHJvcGRvd246IEFycmF5PGFueT4gPSBbXHJcbiAgICAgIF1cclxuXHJcbiAgICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgICAgICBwcml2YXRlIF9jdXN0b21NZW51U2VydmljZTogTGliQ3VzdG9tTWVudVNlcnZpY2UsXHJcbiAgICAgICAgICAgIC8vcHJpdmF0ZSBfcHJvamVjdFV0aWxzZXJ2aWNlOiBQcm9qZWN0VXRpbHNlcnZpY2VcclxuICAgICAgKSB7IH1cclxuXHJcbiAgICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmdPbkluaXQnKTtcclxuICAgICAgICAgICAgdGhpcy5idXR0b25XYXNDbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuc2VsZWN0RGF0YVN0YXRlID0gdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlc29sdmVyIGNvbGlzw6NvIGRlIGV2ZW50b3NcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbU1lbnVTZXJ2aWNlLm1lbnVEeW5hbWljKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2N1c3RvbU1lbnVTZXJ2aWNlLm1lbnVDb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeURyb3Bkb3duID0gdGhpcy5fY3VzdG9tTWVudVNlcnZpY2UubWVudUNvbmZpZy5pbml0aWFsaXplTWVudURyb3Bkb3duKHRoaXMucHJpbWFyeURyb3Bkb3duKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJpbWFyeURyb3Bkb3duID0gdGhpcy5fY3VzdG9tTWVudVNlcnZpY2UubWVudUNvbmZpZy5pbml0aWFsaXplTWVudURyb3Bkb3duKHRoaXMucHJpbWFyeURyb3Bkb3duKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wcmltYXJ5RHJvcGRvd24gPSB0aGlzLl9jdXN0b21NZW51U2VydmljZS5tZW51Q29uZmlnLmluaXRpYWxpemVNZW51RHJvcGRvd24odGhpcy5wcmltYXJ5RHJvcGRvd24pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgb3BlbkRyb3Bkb3duKG1vZHVsbzogYW55LCBkZXNpcmVkRHJvcGRvd246IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgICAgICAgICAgdGhpcy5tb2R1bG8gPSBtb2R1bG87XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVzaXJlZERyb3Bkb3duID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRhU3RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERhdGFTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyBvbkNsaWNrZWRPdXRzaWRlKGU6IEV2ZW50LCByZWY6IEhUTUxEaXZFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdERhdGFTdGF0ZSA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVN0YXRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwdWJsaWMgYmFja1RvUHJpbWFyeShkYXRhOiBib29sZWFuKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0RGF0YVN0YXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHVibGljIHJlZGlyZWN0VG9QcmVQb3J0YWwoKTogdm9pZCB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gYGh0dHBzOi8vc2lzY2FuZGVzdjYuc2lzcHJvLmNvbS5ici9TaXNwcm9FcnBDbG91ZC9QcmVQb3J0YWxgO1xyXG5cclxuICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHB1YmxpYyByZWRpcmVjdFRvTW9kdWxvKG1vZHVsbzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybDogc3RyaW5nID0gYGh0dHBzOi8vc2lzY2FuZGVzdjYuc2lzcHJvLmNvbS5ici9TaXNwcm9FcnBDbG91ZC8ke21vZHVsb31gO1xyXG5cclxuICAgICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XHJcbiAgICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInAtMlwiPlxyXG4gICAgPGRpdiAqbmdJZj1cInNlbGVjdERhdGFTdGF0ZTsgZWxzZSBzZWNvbmRhcnlfZHJvcGRvd25cIiBjbGFzcz1cIm1iLTIgdy0xMDBcIj5cclxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtb2R1bG8gb2YgcHJpbWFyeURyb3Bkb3duXCIgKGNsaWNrKT1cIihtb2R1bG8uc2Vjb25kYXJ5X2xldmVsICE9IG51bGwgPyBvcGVuRHJvcGRvd24obW9kdWxvLCBzZWNvbmRhcnlfZHJvcGRvd24pIDogcmVkaXJlY3RUb01vZHVsbyhtb2R1bG8uVVJMKSlcIj5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBtb2R1bG8uaWNvbiB9fVwiIGFsdD1cInt7IG1vZHVsby5sYWJlbCB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IG1vZHVsby5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8aHIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+XHJcbiAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbSBsaW5rLXBvcnRhbCBtdC0yXCIgKGNsaWNrKT1cInJlZGlyZWN0VG9QcmVQb3J0YWwoKVwiIHRhcmdldD1cIl9ibGFua1wiPlBvcnRhbCBTaXNwcm88L2E+XHJcbiAgICAgICAgICAgIDwvbGk+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3NlY29uZGFyeV9kcm9wZG93bj5cclxuICAgICAgICA8ZGl2ICNzZWNvbmRhcnlfcmVmIChjbGlja091dHNpZGUpPVwib25DbGlja2VkT3V0c2lkZSgkZXZlbnQsIHNlY29uZGFyeV9yZWYpXCI+XHJcbiAgICAgICAgICAgIDxhcHAtc2Vjb25kYXJ5LWRyb3Bkb3duIFttb2R1bG9dPVwidGhpcy5tb2R1bG9cIiAoYmFja1ByaW1hcnlEcm9wZG93bik9XCJiYWNrVG9QcmltYXJ5KCRldmVudClcIj48L2FwcC1zZWNvbmRhcnktZHJvcGRvd24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj4iXX0=
|