sigesp 1.1.56-20250722 → 1.1.57-20250722
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/esm2020/lib/app/app.component.mjs +14 -0
- package/esm2020/lib/app/app.module.mjs +34 -0
- package/esm2020/lib/core/interfaces/Auditoria.mjs +49 -0
- package/esm2020/lib/core/interfaces/Banco.mjs +2 -0
- package/esm2020/lib/core/interfaces/Catalogo.mjs +2 -0
- package/esm2020/lib/core/interfaces/CentroCosto.mjs +2 -0
- package/esm2020/lib/core/interfaces/Clasificacion.mjs +2 -0
- package/esm2020/lib/core/interfaces/Cliente.mjs +2 -0
- package/esm2020/lib/core/interfaces/ComprobantePresupuestario.mjs +2 -0
- package/esm2020/lib/core/interfaces/Comunidad.mjs +2 -0
- package/esm2020/lib/core/interfaces/Configuracion.mjs +2 -0
- package/esm2020/lib/core/interfaces/ConfiguracionRPC.mjs +2 -0
- package/esm2020/lib/core/interfaces/ConfiguracionSCG.mjs +2 -0
- package/esm2020/lib/core/interfaces/ConfigurationSPG.mjs +2 -0
- package/esm2020/lib/core/interfaces/Constantes.mjs +369 -0
- package/esm2020/lib/core/interfaces/CuentaEgresos.mjs +2 -0
- package/esm2020/lib/core/interfaces/CuentaIngreso.mjs +2 -0
- package/esm2020/lib/core/interfaces/CuentaIngresoEstructura.mjs +2 -0
- package/esm2020/lib/core/interfaces/CuentaInstitucional.mjs +2 -0
- package/esm2020/lib/core/interfaces/CuentaPresupuesto.mjs +2 -0
- package/esm2020/lib/core/interfaces/CuentasPorPagar.mjs +2 -0
- package/esm2020/lib/core/interfaces/Documento.mjs +2 -0
- package/esm2020/lib/core/interfaces/EntradaSuministro.mjs +2 -0
- package/esm2020/lib/core/interfaces/Especialidad.mjs +2 -0
- package/esm2020/lib/core/interfaces/EstructuraPresupuestaria.mjs +2 -0
- package/esm2020/lib/core/interfaces/FuenteFinanciamiento.mjs +2 -0
- package/esm2020/lib/core/interfaces/IBancoCuentasPorPagar.mjs +2 -0
- package/esm2020/lib/core/interfaces/ITipoDepositos.mjs +2 -0
- package/esm2020/lib/core/interfaces/Integracion.mjs +2 -0
- package/esm2020/lib/core/interfaces/Lugares.mjs +2 -0
- package/esm2020/lib/core/interfaces/Moneda.mjs +2 -0
- package/esm2020/lib/core/interfaces/Nomina.mjs +29 -0
- package/esm2020/lib/core/interfaces/PlanUnicoCuenta.mjs +2 -0
- package/esm2020/lib/core/interfaces/Presupuesto.mjs +2 -0
- package/esm2020/lib/core/interfaces/Proveedor.mjs +2 -0
- package/esm2020/lib/core/interfaces/RecursosHumanos.mjs +4 -0
- package/esm2020/lib/core/interfaces/Request.mjs +2 -0
- package/esm2020/lib/core/interfaces/Response.mjs +2 -0
- package/esm2020/lib/core/interfaces/Seguridad.mjs +2 -0
- package/esm2020/lib/core/interfaces/Servicios.mjs +2 -0
- package/esm2020/lib/core/interfaces/Sistema.mjs +2 -0
- package/esm2020/lib/core/interfaces/Tributos.mjs +2 -0
- package/esm2020/lib/core/interfaces/UnidadTributaria.mjs +2 -0
- package/esm2020/lib/core/interfaces/Usuario.mjs +2 -0
- package/esm2020/lib/core/interfaces/UsuarioPrefijo.mjs +2 -0
- package/esm2020/lib/core/models/CFG/Empresa.model.mjs +115 -0
- package/esm2020/lib/core/models/CFG/Enterprise.model.mjs +70 -0
- package/esm2020/lib/core/models/CFG/MPrefijo.model.mjs +67 -0
- package/esm2020/lib/core/models/CFG/Procede.model.mjs +31 -0
- package/esm2020/lib/core/models/CFG/TasaCambio.model.mjs +40 -0
- package/esm2020/lib/core/models/CFG/comunidad.model.mjs +22 -0
- package/esm2020/lib/core/models/CFG/locations.model.mjs +170 -0
- package/esm2020/lib/core/models/CFG/moneda.model.mjs +72 -0
- package/esm2020/lib/core/models/CFG/userPrefix.model.mjs +49 -0
- package/esm2020/lib/core/models/CXP/MConceptosCXP.model.mjs +34 -0
- package/esm2020/lib/core/models/CXP/MTipoDocumentoCXP.model.mjs +44 -0
- package/esm2020/lib/core/models/RPC/clasification.model.mjs +16 -0
- package/esm2020/lib/core/models/RPC/configuracionRPC.model.mjs +23 -0
- package/esm2020/lib/core/models/RPC/document.model.mjs +16 -0
- package/esm2020/lib/core/models/RPC/proveedores.model.mjs +9 -0
- package/esm2020/lib/core/models/RPC/providerBeneficiary.model.mjs +285 -0
- package/esm2020/lib/core/models/RPC/specialty.model.mjs +12 -0
- package/esm2020/lib/core/models/SCB/bank.model.mjs +181 -0
- package/esm2020/lib/core/models/SCG/IncomeAccount.mjs +127 -0
- package/esm2020/lib/core/models/SCG/accountMarriage.model.mjs +29 -0
- package/esm2020/lib/core/models/SCG/centroCosto.model.mjs +75 -0
- package/esm2020/lib/core/models/SCG/configuracionSCG.model.mjs +161 -0
- package/esm2020/lib/core/models/SCG/cuentaInstitucional.model.mjs +95 -0
- package/esm2020/lib/core/models/SCG/planUnicoCuenta.model.mjs +17 -0
- package/esm2020/lib/core/models/SFV/MClienteModel.mjs +116 -0
- package/esm2020/lib/core/models/SIV/MDetaContable.model.mjs +62 -0
- package/esm2020/lib/core/models/SIV/MDetaEntrada.model.mjs +94 -0
- package/esm2020/lib/core/models/SIV/MEntradaSuministro.model.mjs +132 -0
- package/esm2020/lib/core/models/SIV/MTipoDepositos.model.mjs +103 -0
- package/esm2020/lib/core/models/SNO/MAnticipoPrestaciones.model.mjs +100 -0
- package/esm2020/lib/core/models/SNO/MArchivoTxtCampo.model.mjs +61 -0
- package/esm2020/lib/core/models/SNO/MArchivosTxt.model.mjs +41 -0
- package/esm2020/lib/core/models/SNO/MAsignacionCargo.model.mjs +221 -0
- package/esm2020/lib/core/models/SNO/MAspectoEvaluacion.model.mjs +90 -0
- package/esm2020/lib/core/models/SNO/MAuditoria.model.mjs +61 -0
- package/esm2020/lib/core/models/SNO/MBeneficiario.model.mjs +137 -0
- package/esm2020/lib/core/models/SNO/MCargaFamiliar.model.mjs +52 -0
- package/esm2020/lib/core/models/SNO/MCargaMasiva.model.mjs +34 -0
- package/esm2020/lib/core/models/SNO/MCargosPersonal.model.mjs +116 -0
- package/esm2020/lib/core/models/SNO/MClasificacionObrero.mdel.mjs +46 -0
- package/esm2020/lib/core/models/SNO/MCodigoUnicoRac.model.mjs +39 -0
- package/esm2020/lib/core/models/SNO/MComponete.model.mjs +38 -0
- package/esm2020/lib/core/models/SNO/MConceptoVacaciones.model.mjs +85 -0
- package/esm2020/lib/core/models/SNO/MConceptosNomina.model.mjs +241 -0
- package/esm2020/lib/core/models/SNO/MConceptosPersonalNomina.model.mjs +97 -0
- package/esm2020/lib/core/models/SNO/MConcursante.model.mjs +317 -0
- package/esm2020/lib/core/models/SNO/MConcurso.model.mjs +246 -0
- package/esm2020/lib/core/models/SNO/MConfiguracionSNO.model.mjs +416 -0
- package/esm2020/lib/core/models/SNO/MConstanteNomina.model.mjs +70 -0
- package/esm2020/lib/core/models/SNO/MConstantePersonalNomina.model.mjs +79 -0
- package/esm2020/lib/core/models/SNO/MDedicacion.model.mjs +35 -0
- package/esm2020/lib/core/models/SNO/MDefinicionNomina.model.mjs +304 -0
- package/esm2020/lib/core/models/SNO/MDefinicionesBasicas.model.mjs +72 -0
- package/esm2020/lib/core/models/SNO/MDeudaAnterior.model.mjs +40 -0
- package/esm2020/lib/core/models/SNO/MEncargaduria.model.mjs +138 -0
- package/esm2020/lib/core/models/SNO/MEscalaEvaluacion.model.mjs +38 -0
- package/esm2020/lib/core/models/SNO/MEscalaEvaluacionDt.model.mjs +37 -0
- package/esm2020/lib/core/models/SNO/MEstructuraOrganizativa.model.mjs +130 -0
- package/esm2020/lib/core/models/SNO/MFamiliares.model.mjs +86 -0
- package/esm2020/lib/core/models/SNO/MFeriados.model.mjs +43 -0
- package/esm2020/lib/core/models/SNO/MFideicomiso.model.mjs +406 -0
- package/esm2020/lib/core/models/SNO/MFormacionAcademica.model.mjs +49 -0
- package/esm2020/lib/core/models/SNO/MGrado.model.mjs +44 -0
- package/esm2020/lib/core/models/SNO/MHojaTiempo.model.mjs +117 -0
- package/esm2020/lib/core/models/SNO/MImpuestoSobreRenta.model.mjs +73 -0
- package/esm2020/lib/core/models/SNO/MMetodoBanco.model.mjs +105 -0
- package/esm2020/lib/core/models/SNO/MNominaSimple.model.mjs +79 -0
- package/esm2020/lib/core/models/SNO/MPeriodoNomina.model.mjs +201 -0
- package/esm2020/lib/core/models/SNO/MPermisos.model.mjs +68 -0
- package/esm2020/lib/core/models/SNO/MPersonal.model.mjs +638 -0
- package/esm2020/lib/core/models/SNO/MPersonalJubilado.model.mjs +64 -0
- package/esm2020/lib/core/models/SNO/MPersonalNomina.model.mjs +315 -0
- package/esm2020/lib/core/models/SNO/MPlanHorario.model.mjs +117 -0
- package/esm2020/lib/core/models/SNO/MPlantillaConstancia.model.mjs +31 -0
- package/esm2020/lib/core/models/SNO/MPrestamo.model.mjs +221 -0
- package/esm2020/lib/core/models/SNO/MPrimaGrados.model.mjs +43 -0
- package/esm2020/lib/core/models/SNO/MPrimasConcepto.model.mjs +43 -0
- package/esm2020/lib/core/models/SNO/MRango.model.mjs +43 -0
- package/esm2020/lib/core/models/SNO/MReportesRRHH.mjs +402 -0
- package/esm2020/lib/core/models/SNO/MRequisitosConcursante.model.mjs +46 -0
- package/esm2020/lib/core/models/SNO/MRequisitosConcursos.model.mjs +37 -0
- package/esm2020/lib/core/models/SNO/MRequisitosMinimos.model.mjs +113 -0
- package/esm2020/lib/core/models/SNO/MSalarioHistorico.model.mjs +70 -0
- package/esm2020/lib/core/models/SNO/MSolicitudEmpleo.model.mjs +121 -0
- package/esm2020/lib/core/models/SNO/MTablaVacaciones.model.mjs +57 -0
- package/esm2020/lib/core/models/SNO/MTablaVacacionesPeriodo.model.mjs +40 -0
- package/esm2020/lib/core/models/SNO/MTabulador.model.mjs +96 -0
- package/esm2020/lib/core/models/SNO/MTipoEvaluacion.model.mjs +75 -0
- package/esm2020/lib/core/models/SNO/MTipoPersonal.model.mjs +34 -0
- package/esm2020/lib/core/models/SNO/MTiposEnfermedad.model.mjs +37 -0
- package/esm2020/lib/core/models/SNO/MTrabajoAnterior.model.mjs +65 -0
- package/esm2020/lib/core/models/SNO/MUbicacionFisica.model.mjs +61 -0
- package/esm2020/lib/core/models/SNO/MVacacionesPersonal.model.mjs +115 -0
- package/esm2020/lib/core/models/SOC/charge.model.mjs +69 -0
- package/esm2020/lib/core/models/SOC/clause.model.mjs +34 -0
- package/esm2020/lib/core/models/SOC/clauseModality.model.mjs +38 -0
- package/esm2020/lib/core/models/SOC/configuracionSOC.model.mjs +65 -0
- package/esm2020/lib/core/models/SOC/service.model.mjs +49 -0
- package/esm2020/lib/core/models/SOC/serviceCharge.model.mjs +40 -0
- package/esm2020/lib/core/models/SOC/serviceType.model.mjs +34 -0
- package/esm2020/lib/core/models/SPG/UnidadAdministradoraCentral.mjs +46 -0
- package/esm2020/lib/core/models/SPG/administrativeUnit.model.mjs +140 -0
- package/esm2020/lib/core/models/SPG/comprobantePresupuestario.model.mjs +101 -0
- package/esm2020/lib/core/models/SPG/configurationSPG.model.mjs +120 -0
- package/esm2020/lib/core/models/SPG/cuentaPresupuesto.model.mjs +184 -0
- package/esm2020/lib/core/models/SPG/estructuraPresupuestaria.model.mjs +186 -0
- package/esm2020/lib/core/models/SPG/expensiveAccount.model.mjs +100 -0
- package/esm2020/lib/core/models/SPG/fuenteFinanciamiento.model.mjs +52 -0
- package/esm2020/lib/core/models/SPG/incomeStructureAccount.model.mjs +85 -0
- package/esm2020/lib/core/models/SPG/organizationType.model.mjs +12 -0
- package/esm2020/lib/core/models/SSS/component.model.mjs +44 -0
- package/esm2020/lib/core/models/SSS/group.model.mjs +30 -0
- package/esm2020/lib/core/models/SSS/log.model.mjs +29 -0
- package/esm2020/lib/core/models/SSS/securityConfiguration.model.mjs +20 -0
- package/esm2020/lib/core/models/SSS/sistema.mjs +73 -0
- package/esm2020/lib/core/models/SSS/user.model.mjs +32 -0
- package/esm2020/lib/core/models/SSS/userDetail.model.mjs +79 -0
- package/esm2020/lib/core/models/SSS/userPermit.model.mjs +47 -0
- package/esm2020/lib/core/models/SSS/userRights.model.mjs +104 -0
- package/esm2020/lib/core/models/STB/MCargosAdicionales.mjs +87 -0
- package/esm2020/lib/core/models/STB/deduction.model.mjs +90 -0
- package/esm2020/lib/core/models/STB/deductionType.model.mjs +20 -0
- package/esm2020/lib/core/models/STB/unidadTributaria.model.mjs +14 -0
- package/esm2020/lib/core/models/basic-model.model.mjs +8 -0
- package/esm2020/lib/shared/components/catalogo/catalogo.component.mjs +76 -0
- package/esm2020/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.mjs +87 -0
- package/esm2020/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.mjs +74 -0
- package/esm2020/lib/shared/components/confirm/confirm.component.mjs +35 -0
- package/esm2020/lib/shared/components/icon/icon.component.mjs +22 -0
- package/esm2020/lib/shared/components/table-select/table-select.component.mjs +99 -0
- package/esm2020/lib/shared/material/customPaginator.mjs +24 -0
- package/esm2020/lib/shared/material/material.module.mjs +322 -0
- package/esm2020/lib/shared/pipes/iso-currency.pipe.mjs +43 -0
- package/esm2020/lib/shared/shared.module.mjs +66 -0
- package/esm2020/lib/sigesp.service.mjs +1829 -0
- package/esm2020/lib/validation.service.mjs +131 -0
- package/esm2020/public-api.mjs +156 -0
- package/esm2020/sigesp.mjs +5 -0
- package/fesm2015/sigesp.mjs +14898 -0
- package/fesm2015/sigesp.mjs.map +1 -0
- package/fesm2020/sigesp.mjs +14861 -0
- package/fesm2020/sigesp.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/app/app.component.d.ts +8 -0
- package/lib/app/app.module.d.ts +10 -0
- package/lib/core/interfaces/Auditoria.d.ts +19 -0
- package/lib/core/interfaces/Banco.d.ts +599 -0
- package/lib/core/interfaces/Catalogo.d.ts +13 -0
- package/lib/core/interfaces/CentroCosto.d.ts +21 -0
- package/lib/core/interfaces/Clasificacion.d.ts +6 -0
- package/lib/core/interfaces/Cliente.d.ts +36 -0
- package/lib/core/interfaces/ComprobantePresupuestario.d.ts +51 -0
- package/lib/core/interfaces/Comunidad.d.ts +12 -0
- package/lib/core/interfaces/Configuracion.d.ts +91 -0
- package/lib/core/interfaces/ConfiguracionRPC.d.ts +10 -0
- package/lib/core/interfaces/ConfiguracionSCG.d.ts +52 -0
- package/lib/core/interfaces/ConfigurationSPG.d.ts +49 -0
- package/lib/core/interfaces/Constantes.d.ts +85 -0
- package/lib/core/interfaces/CuentaEgresos.d.ts +158 -0
- package/lib/core/interfaces/CuentaIngreso.d.ts +38 -0
- package/lib/core/interfaces/CuentaIngresoEstructura.d.ts +26 -0
- package/lib/core/interfaces/CuentaInstitucional.d.ts +28 -0
- package/lib/core/interfaces/CuentaPresupuesto.d.ts +9 -0
- package/lib/core/interfaces/CuentasPorPagar.d.ts +37 -0
- package/lib/core/interfaces/Documento.d.ts +6 -0
- package/lib/core/interfaces/EntradaSuministro.d.ts +87 -0
- package/lib/core/interfaces/Especialidad.d.ts +4 -0
- package/lib/core/interfaces/EstructuraPresupuestaria.d.ts +83 -0
- package/lib/core/interfaces/FuenteFinanciamiento.d.ts +14 -0
- package/lib/core/interfaces/IBancoCuentasPorPagar.d.ts +190 -0
- package/lib/core/interfaces/ITipoDepositos.d.ts +31 -0
- package/lib/core/interfaces/Integracion.d.ts +6 -0
- package/lib/core/interfaces/Lugares.d.ts +40 -0
- package/lib/core/interfaces/Moneda.d.ts +20 -0
- package/lib/core/interfaces/Nomina.d.ts +554 -0
- package/lib/core/interfaces/PlanUnicoCuenta.d.ts +4 -0
- package/lib/core/interfaces/Presupuesto.d.ts +133 -0
- package/{projects/sigesp/src/lib/core/interfaces/Proveedor.ts → lib/core/interfaces/Proveedor.d.ts} +22 -26
- package/lib/core/interfaces/RecursosHumanos.d.ts +1627 -0
- package/{projects/sigesp/src/lib/core/interfaces/Request.ts → lib/core/interfaces/Request.d.ts} +3 -4
- package/lib/core/interfaces/Response.d.ts +7 -0
- package/lib/core/interfaces/Seguridad.d.ts +112 -0
- package/lib/core/interfaces/Servicios.d.ts +64 -0
- package/lib/core/interfaces/Sistema.d.ts +19 -0
- package/lib/core/interfaces/Tributos.d.ts +75 -0
- package/lib/core/interfaces/UnidadTributaria.d.ts +11 -0
- package/lib/core/interfaces/Usuario.d.ts +52 -0
- package/lib/core/interfaces/UsuarioPrefijo.d.ts +13 -0
- package/lib/core/models/CFG/Empresa.model.d.ts +39 -0
- package/lib/core/models/CFG/Enterprise.model.d.ts +24 -0
- package/lib/core/models/CFG/MPrefijo.model.d.ts +23 -0
- package/lib/core/models/CFG/Procede.model.d.ts +11 -0
- package/lib/core/models/CFG/TasaCambio.model.d.ts +14 -0
- package/lib/core/models/CFG/comunidad.model.d.ts +15 -0
- package/lib/core/models/CFG/locations.model.d.ts +54 -0
- package/lib/core/models/CFG/moneda.model.d.ts +26 -0
- package/lib/core/models/CFG/userPrefix.model.d.ts +17 -0
- package/lib/core/models/CXP/MConceptosCXP.model.d.ts +12 -0
- package/lib/core/models/CXP/MTipoDocumentoCXP.model.d.ts +16 -0
- package/lib/core/models/RPC/clasification.model.d.ts +11 -0
- package/lib/core/models/RPC/configuracionRPC.model.d.ts +12 -0
- package/lib/core/models/RPC/document.model.d.ts +11 -0
- package/lib/core/models/RPC/proveedores.model.d.ts +8 -0
- package/lib/core/models/RPC/providerBeneficiary.model.d.ts +116 -0
- package/lib/core/models/RPC/specialty.model.d.ts +9 -0
- package/lib/core/models/SCB/bank.model.d.ts +63 -0
- package/lib/core/models/SCG/IncomeAccount.d.ts +45 -0
- package/lib/core/models/SCG/accountMarriage.model.d.ts +11 -0
- package/lib/core/models/SCG/centroCosto.model.d.ts +27 -0
- package/lib/core/models/SCG/configuracionSCG.model.d.ts +56 -0
- package/lib/core/models/SCG/cuentaInstitucional.model.d.ts +34 -0
- package/lib/core/models/SCG/planUnicoCuenta.model.d.ts +8 -0
- package/lib/core/models/SFV/MClienteModel.d.ts +40 -0
- package/lib/core/models/SIV/MDetaContable.model.d.ts +21 -0
- package/lib/core/models/SIV/MDetaEntrada.model.d.ts +33 -0
- package/lib/core/models/SIV/MEntradaSuministro.model.d.ts +47 -0
- package/lib/core/models/SIV/MTipoDepositos.model.d.ts +35 -0
- package/lib/core/models/SNO/MAnticipoPrestaciones.model.d.ts +32 -0
- package/lib/core/models/SNO/MArchivoTxtCampo.model.d.ts +21 -0
- package/lib/core/models/SNO/MArchivosTxt.model.d.ts +15 -0
- package/lib/core/models/SNO/MAsignacionCargo.model.d.ts +87 -0
- package/lib/core/models/SNO/MAspectoEvaluacion.model.d.ts +30 -0
- package/lib/core/models/SNO/MAuditoria.model.d.ts +21 -0
- package/lib/core/models/SNO/MBeneficiario.model.d.ts +48 -0
- package/lib/core/models/SNO/MCargaFamiliar.model.d.ts +18 -0
- package/lib/core/models/SNO/MCargaMasiva.model.d.ts +12 -0
- package/lib/core/models/SNO/MCargosPersonal.model.d.ts +48 -0
- package/lib/core/models/SNO/MClasificacionObrero.mdel.d.ts +16 -0
- package/lib/core/models/SNO/MCodigoUnicoRac.model.d.ts +14 -0
- package/lib/core/models/SNO/MComponete.model.d.ts +14 -0
- package/lib/core/models/SNO/MConceptoVacaciones.model.d.ts +30 -0
- package/lib/core/models/SNO/MConceptosNomina.model.d.ts +84 -0
- package/lib/core/models/SNO/MConceptosPersonalNomina.model.d.ts +34 -0
- package/lib/core/models/SNO/MConcursante.model.d.ts +104 -0
- package/lib/core/models/SNO/MConcurso.model.d.ts +83 -0
- package/lib/core/models/SNO/MConfiguracionSNO.model.d.ts +140 -0
- package/lib/core/models/SNO/MConstanteNomina.model.d.ts +24 -0
- package/lib/core/models/SNO/MConstantePersonalNomina.model.d.ts +27 -0
- package/lib/core/models/SNO/MDedicacion.model.d.ts +13 -0
- package/lib/core/models/SNO/MDefinicionNomina.model.d.ts +115 -0
- package/lib/core/models/SNO/MDefinicionesBasicas.model.d.ts +25 -0
- package/lib/core/models/SNO/MDeudaAnterior.model.d.ts +14 -0
- package/lib/core/models/SNO/MEncargaduria.model.d.ts +47 -0
- package/lib/core/models/SNO/MEscalaEvaluacion.model.d.ts +15 -0
- package/lib/core/models/SNO/MEscalaEvaluacionDt.model.d.ts +14 -0
- package/lib/core/models/SNO/MEstructuraOrganizativa.model.d.ts +46 -0
- package/lib/core/models/SNO/MFamiliares.model.d.ts +31 -0
- package/lib/core/models/SNO/MFeriados.model.d.ts +16 -0
- package/lib/core/models/SNO/MFideicomiso.model.d.ts +143 -0
- package/lib/core/models/SNO/MFormacionAcademica.model.d.ts +18 -0
- package/lib/core/models/SNO/MGrado.model.d.ts +18 -0
- package/lib/core/models/SNO/MHojaTiempo.model.d.ts +40 -0
- package/lib/core/models/SNO/MImpuestoSobreRenta.model.d.ts +25 -0
- package/lib/core/models/SNO/MMetodoBanco.model.d.ts +35 -0
- package/lib/core/models/SNO/MNominaSimple.model.d.ts +34 -0
- package/lib/core/models/SNO/MPeriodoNomina.model.d.ts +57 -0
- package/lib/core/models/SNO/MPermisos.model.d.ts +24 -0
- package/lib/core/models/SNO/MPersonal.model.d.ts +219 -0
- package/lib/core/models/SNO/MPersonalJubilado.model.d.ts +23 -0
- package/lib/core/models/SNO/MPersonalNomina.model.d.ts +102 -0
- package/lib/core/models/SNO/MPlanHorario.model.d.ts +41 -0
- package/lib/core/models/SNO/MPlantillaConstancia.model.d.ts +11 -0
- package/lib/core/models/SNO/MPrestamo.model.d.ts +69 -0
- package/lib/core/models/SNO/MPrimaGrados.model.d.ts +15 -0
- package/lib/core/models/SNO/MPrimasConcepto.model.d.ts +15 -0
- package/lib/core/models/SNO/MRango.model.d.ts +15 -0
- package/lib/core/models/SNO/MReportesRRHH.d.ts +130 -0
- package/lib/core/models/SNO/MRequisitosConcursante.model.d.ts +16 -0
- package/lib/core/models/SNO/MRequisitosConcursos.model.d.ts +14 -0
- package/lib/core/models/SNO/MRequisitosMinimos.model.d.ts +39 -0
- package/lib/core/models/SNO/MSalarioHistorico.model.d.ts +25 -0
- package/lib/core/models/SNO/MSolicitudEmpleo.model.d.ts +42 -0
- package/lib/core/models/SNO/MTablaVacaciones.model.d.ts +15 -0
- package/lib/core/models/SNO/MTablaVacacionesPeriodo.model.d.ts +15 -0
- package/lib/core/models/SNO/MTabulador.model.d.ts +39 -0
- package/lib/core/models/SNO/MTipoEvaluacion.model.d.ts +28 -0
- package/lib/core/models/SNO/MTipoPersonal.model.d.ts +13 -0
- package/lib/core/models/SNO/MTiposEnfermedad.model.d.ts +14 -0
- package/lib/core/models/SNO/MTrabajoAnterior.model.d.ts +24 -0
- package/lib/core/models/SNO/MUbicacionFisica.model.d.ts +21 -0
- package/lib/core/models/SNO/MVacacionesPersonal.model.d.ts +40 -0
- package/lib/core/models/SOC/charge.model.d.ts +25 -0
- package/lib/core/models/SOC/clause.model.d.ts +12 -0
- package/lib/core/models/SOC/clauseModality.model.d.ts +14 -0
- package/lib/core/models/SOC/configuracionSOC.model.d.ts +21 -0
- package/lib/core/models/SOC/service.model.d.ts +17 -0
- package/lib/core/models/SOC/serviceCharge.model.d.ts +14 -0
- package/lib/core/models/SOC/serviceType.model.d.ts +12 -0
- package/lib/core/models/SPG/UnidadAdministradoraCentral.d.ts +16 -0
- package/lib/core/models/SPG/administrativeUnit.model.d.ts +68 -0
- package/lib/core/models/SPG/comprobantePresupuestario.model.d.ts +56 -0
- package/lib/core/models/SPG/configurationSPG.model.d.ts +46 -0
- package/lib/core/models/SPG/cuentaPresupuesto.model.d.ts +65 -0
- package/lib/core/models/SPG/estructuraPresupuestaria.model.d.ts +119 -0
- package/lib/core/models/SPG/expensiveAccount.model.d.ts +50 -0
- package/lib/core/models/SPG/fuenteFinanciamiento.model.d.ts +18 -0
- package/lib/core/models/SPG/incomeStructureAccount.model.d.ts +40 -0
- package/lib/core/models/SPG/organizationType.model.d.ts +9 -0
- package/lib/core/models/SSS/component.model.d.ts +16 -0
- package/lib/core/models/SSS/group.model.d.ts +16 -0
- package/lib/core/models/SSS/log.model.d.ts +15 -0
- package/lib/core/models/SSS/securityConfiguration.model.d.ts +9 -0
- package/lib/core/models/SSS/sistema.d.ts +25 -0
- package/lib/core/models/SSS/user.model.d.ts +22 -0
- package/lib/core/models/SSS/userDetail.model.d.ts +28 -0
- package/lib/core/models/SSS/userPermit.model.d.ts +18 -0
- package/lib/core/models/SSS/userRights.model.d.ts +35 -0
- package/lib/core/models/STB/MCargosAdicionales.d.ts +33 -0
- package/lib/core/models/STB/deduction.model.d.ts +30 -0
- package/lib/core/models/STB/deductionType.model.d.ts +9 -0
- package/lib/core/models/STB/unidadTributaria.model.d.ts +13 -0
- package/lib/core/models/basic-model.model.d.ts +6 -0
- package/lib/shared/components/catalogo/catalogo.component.d.ts +35 -0
- package/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.d.ts +39 -0
- package/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.d.ts +38 -0
- package/lib/shared/components/confirm/confirm.component.d.ts +21 -0
- package/lib/shared/components/icon/icon.component.d.ts +11 -0
- package/lib/shared/components/table-select/table-select.component.d.ts +39 -0
- package/lib/shared/material/customPaginator.d.ts +9 -0
- package/lib/shared/material/material.module.d.ts +48 -0
- package/lib/shared/pipes/iso-currency.pipe.d.ts +13 -0
- package/lib/shared/shared.module.d.ts +16 -0
- package/lib/sigesp.service.d.ts +901 -0
- package/lib/validation.service.d.ts +15 -0
- package/package.json +31 -73
- package/public-api.d.ts +164 -0
- package/.browserslistrc +0 -12
- package/.editorconfig +0 -13
- package/angular.json +0 -161
- package/e2e/protractor.conf.js +0 -32
- package/e2e/src/app.e2e-spec.ts +0 -23
- package/e2e/src/app.po.ts +0 -11
- package/e2e/tsconfig.json +0 -13
- package/karma.conf.js +0 -32
- package/lib +0 -0
- package/projects/sigesp/README.md +0 -24
- package/projects/sigesp/karma.conf.js +0 -32
- package/projects/sigesp/ng-package.json +0 -7
- package/projects/sigesp/package.json +0 -11
- package/projects/sigesp/src/lib/app/app.component.html +0 -1
- package/projects/sigesp/src/lib/app/app.component.scss +0 -0
- package/projects/sigesp/src/lib/app/app.component.ts +0 -15
- package/projects/sigesp/src/lib/app/app.module.ts +0 -21
- package/projects/sigesp/src/lib/core/interfaces/Auditoria.ts +0 -72
- package/projects/sigesp/src/lib/core/interfaces/Banco.ts +0 -639
- package/projects/sigesp/src/lib/core/interfaces/Catalogo.ts +0 -15
- package/projects/sigesp/src/lib/core/interfaces/CentroCosto.ts +0 -22
- package/projects/sigesp/src/lib/core/interfaces/Clasificacion.ts +0 -6
- package/projects/sigesp/src/lib/core/interfaces/Cliente.ts +0 -36
- package/projects/sigesp/src/lib/core/interfaces/ComprobantePresupuestario.ts +0 -52
- package/projects/sigesp/src/lib/core/interfaces/Comunidad.ts +0 -12
- package/projects/sigesp/src/lib/core/interfaces/Configuracion.ts +0 -100
- package/projects/sigesp/src/lib/core/interfaces/ConfiguracionRPC.ts +0 -10
- package/projects/sigesp/src/lib/core/interfaces/ConfiguracionSCG.ts +0 -53
- package/projects/sigesp/src/lib/core/interfaces/ConfigurationSPG.ts +0 -51
- package/projects/sigesp/src/lib/core/interfaces/Constantes.ts +0 -468
- package/projects/sigesp/src/lib/core/interfaces/CuentaEgresos.ts +0 -164
- package/projects/sigesp/src/lib/core/interfaces/CuentaIngreso.ts +0 -38
- package/projects/sigesp/src/lib/core/interfaces/CuentaIngresoEstructura.ts +0 -27
- package/projects/sigesp/src/lib/core/interfaces/CuentaInstitucional.ts +0 -28
- package/projects/sigesp/src/lib/core/interfaces/CuentaPresupuesto.ts +0 -10
- package/projects/sigesp/src/lib/core/interfaces/CuentasPorPagar.ts +0 -40
- package/projects/sigesp/src/lib/core/interfaces/Documento.ts +0 -6
- package/projects/sigesp/src/lib/core/interfaces/EntradaSuministro.ts +0 -93
- package/projects/sigesp/src/lib/core/interfaces/Especialidad.ts +0 -4
- package/projects/sigesp/src/lib/core/interfaces/EstructuraPresupuestaria.ts +0 -90
- package/projects/sigesp/src/lib/core/interfaces/FuenteFinanciamiento.ts +0 -14
- package/projects/sigesp/src/lib/core/interfaces/IBancoCuentasPorPagar.ts +0 -196
- package/projects/sigesp/src/lib/core/interfaces/ITipoDepositos.ts +0 -32
- package/projects/sigesp/src/lib/core/interfaces/Integracion.ts +0 -6
- package/projects/sigesp/src/lib/core/interfaces/Lugares.ts +0 -45
- package/projects/sigesp/src/lib/core/interfaces/Moneda.ts +0 -22
- package/projects/sigesp/src/lib/core/interfaces/Nomina.ts +0 -614
- package/projects/sigesp/src/lib/core/interfaces/PlanUnicoCuenta.ts +0 -4
- package/projects/sigesp/src/lib/core/interfaces/Presupuesto.ts +0 -145
- package/projects/sigesp/src/lib/core/interfaces/RecursosHumanos.ts +0 -1743
- package/projects/sigesp/src/lib/core/interfaces/Response.ts +0 -7
- package/projects/sigesp/src/lib/core/interfaces/Seguridad.ts +0 -120
- package/projects/sigesp/src/lib/core/interfaces/Servicios.ts +0 -70
- package/projects/sigesp/src/lib/core/interfaces/Sistema.ts +0 -21
- package/projects/sigesp/src/lib/core/interfaces/Tributos.ts +0 -80
- package/projects/sigesp/src/lib/core/interfaces/UnidadTributaria.ts +0 -11
- package/projects/sigesp/src/lib/core/interfaces/Usuario.ts +0 -57
- package/projects/sigesp/src/lib/core/interfaces/UsuarioPrefijo.ts +0 -13
- package/projects/sigesp/src/lib/core/models/CFG/Empresa.model.ts +0 -121
- package/projects/sigesp/src/lib/core/models/CFG/Enterprise.model.ts +0 -74
- package/projects/sigesp/src/lib/core/models/CFG/MPrefijo.model.ts +0 -69
- package/projects/sigesp/src/lib/core/models/CFG/Procede.model.ts +0 -34
- package/projects/sigesp/src/lib/core/models/CFG/TasaCambio.model.ts +0 -43
- package/projects/sigesp/src/lib/core/models/CFG/comunidad.model.ts +0 -34
- package/projects/sigesp/src/lib/core/models/CFG/locations.model.ts +0 -189
- package/projects/sigesp/src/lib/core/models/CFG/moneda.model.ts +0 -82
- package/projects/sigesp/src/lib/core/models/CFG/userPrefix.model.ts +0 -51
- package/projects/sigesp/src/lib/core/models/CXP/MConceptosCXP.model.ts +0 -36
- package/projects/sigesp/src/lib/core/models/CXP/MTipoDocumentoCXP.model.ts +0 -49
- package/projects/sigesp/src/lib/core/models/RPC/clasification.model.ts +0 -22
- package/projects/sigesp/src/lib/core/models/RPC/configuracionRPC.model.ts +0 -27
- package/projects/sigesp/src/lib/core/models/RPC/document.model.ts +0 -20
- package/projects/sigesp/src/lib/core/models/RPC/proveedores.model.ts +0 -15
- package/projects/sigesp/src/lib/core/models/RPC/providerBeneficiary.model.ts +0 -316
- package/projects/sigesp/src/lib/core/models/RPC/specialty.model.ts +0 -14
- package/projects/sigesp/src/lib/core/models/SCB/bank.model.ts +0 -205
- package/projects/sigesp/src/lib/core/models/SCG/IncomeAccount.ts +0 -134
- package/projects/sigesp/src/lib/core/models/SCG/accountMarriage.model.ts +0 -33
- package/projects/sigesp/src/lib/core/models/SCG/centroCosto.model.ts +0 -83
- package/projects/sigesp/src/lib/core/models/SCG/configuracionSCG.model.ts +0 -166
- package/projects/sigesp/src/lib/core/models/SCG/cuentaInstitucional.model.ts +0 -97
- package/projects/sigesp/src/lib/core/models/SCG/planUnicoCuenta.model.ts +0 -22
- package/projects/sigesp/src/lib/core/models/SFV/MClienteModel.ts +0 -119
- package/projects/sigesp/src/lib/core/models/SIV/MDetaContable.model.ts +0 -65
- package/projects/sigesp/src/lib/core/models/SIV/MDetaEntrada.model.ts +0 -98
- package/projects/sigesp/src/lib/core/models/SIV/MEntradaSuministro.model.ts +0 -135
- package/projects/sigesp/src/lib/core/models/SIV/MTipoDepositos.model.ts +0 -109
- package/projects/sigesp/src/lib/core/models/SNO/MAnticipoPrestaciones.model.ts +0 -112
- package/projects/sigesp/src/lib/core/models/SNO/MArchivoTxtCampo.model.ts +0 -63
- package/projects/sigesp/src/lib/core/models/SNO/MArchivosTxt.model.ts +0 -53
- package/projects/sigesp/src/lib/core/models/SNO/MAsignacionCargo.model.ts +0 -235
- package/projects/sigesp/src/lib/core/models/SNO/MAspectoEvaluacion.model.ts +0 -97
- package/projects/sigesp/src/lib/core/models/SNO/MAuditoria.model.ts +0 -67
- package/projects/sigesp/src/lib/core/models/SNO/MBeneficiario.model.ts +0 -139
- package/projects/sigesp/src/lib/core/models/SNO/MCargaFamiliar.model.ts +0 -54
- package/projects/sigesp/src/lib/core/models/SNO/MCargaMasiva.model.ts +0 -37
- package/projects/sigesp/src/lib/core/models/SNO/MCargosPersonal.model.ts +0 -123
- package/projects/sigesp/src/lib/core/models/SNO/MClasificacionObrero.mdel.ts +0 -48
- package/projects/sigesp/src/lib/core/models/SNO/MCodigoUnicoRac.model.ts +0 -41
- package/projects/sigesp/src/lib/core/models/SNO/MComponete.model.ts +0 -40
- package/projects/sigesp/src/lib/core/models/SNO/MConceptoVacaciones.model.ts +0 -94
- package/projects/sigesp/src/lib/core/models/SNO/MConceptosNomina.model.ts +0 -246
- package/projects/sigesp/src/lib/core/models/SNO/MConceptosPersonalNomina.model.ts +0 -103
- package/projects/sigesp/src/lib/core/models/SNO/MConcursante.model.ts +0 -333
- package/projects/sigesp/src/lib/core/models/SNO/MConcurso.model.ts +0 -267
- package/projects/sigesp/src/lib/core/models/SNO/MConfiguracionSNO.model.ts +0 -422
- package/projects/sigesp/src/lib/core/models/SNO/MConstanteNomina.model.ts +0 -76
- package/projects/sigesp/src/lib/core/models/SNO/MConstantePersonalNomina.model.ts +0 -85
- package/projects/sigesp/src/lib/core/models/SNO/MDedicacion.model.ts +0 -37
- package/projects/sigesp/src/lib/core/models/SNO/MDefinicionNomina.model.ts +0 -320
- package/projects/sigesp/src/lib/core/models/SNO/MDefinicionesBasicas.model.ts +0 -82
- package/projects/sigesp/src/lib/core/models/SNO/MDeudaAnterior.model.ts +0 -42
- package/projects/sigesp/src/lib/core/models/SNO/MEncargaduria.model.ts +0 -142
- package/projects/sigesp/src/lib/core/models/SNO/MEscalaEvaluacion.model.ts +0 -43
- package/projects/sigesp/src/lib/core/models/SNO/MEscalaEvaluacionDt.model.ts +0 -40
- package/projects/sigesp/src/lib/core/models/SNO/MEstructuraOrganizativa.model.ts +0 -136
- package/projects/sigesp/src/lib/core/models/SNO/MFamiliares.model.ts +0 -91
- package/projects/sigesp/src/lib/core/models/SNO/MFeriados.model.ts +0 -46
- package/projects/sigesp/src/lib/core/models/SNO/MFideicomiso.model.ts +0 -423
- package/projects/sigesp/src/lib/core/models/SNO/MFormacionAcademica.model.ts +0 -52
- package/projects/sigesp/src/lib/core/models/SNO/MGrado.model.ts +0 -50
- package/projects/sigesp/src/lib/core/models/SNO/MHojaTiempo.model.ts +0 -128
- package/projects/sigesp/src/lib/core/models/SNO/MImpuestoSobreRenta.model.ts +0 -77
- package/projects/sigesp/src/lib/core/models/SNO/MMetodoBanco.model.ts +0 -113
- package/projects/sigesp/src/lib/core/models/SNO/MNominaSimple.model.ts +0 -86
- package/projects/sigesp/src/lib/core/models/SNO/MPeriodoNomina.model.ts +0 -205
- package/projects/sigesp/src/lib/core/models/SNO/MPermisos.model.ts +0 -70
- package/projects/sigesp/src/lib/core/models/SNO/MPersonal.model.ts +0 -659
- package/projects/sigesp/src/lib/core/models/SNO/MPersonalJubilado.model.ts +0 -71
- package/projects/sigesp/src/lib/core/models/SNO/MPersonalNomina.model.ts +0 -323
- package/projects/sigesp/src/lib/core/models/SNO/MPlanHorario.model.ts +0 -134
- package/projects/sigesp/src/lib/core/models/SNO/MPlantillaConstancia.model.ts +0 -33
- package/projects/sigesp/src/lib/core/models/SNO/MPrestamo.model.ts +0 -242
- package/projects/sigesp/src/lib/core/models/SNO/MPrimaGrados.model.ts +0 -46
- package/projects/sigesp/src/lib/core/models/SNO/MPrimasConcepto.model.ts +0 -45
- package/projects/sigesp/src/lib/core/models/SNO/MRango.model.ts +0 -45
- package/projects/sigesp/src/lib/core/models/SNO/MReportesRRHH.ts +0 -425
- package/projects/sigesp/src/lib/core/models/SNO/MRequisitosConcursante.model.ts +0 -48
- package/projects/sigesp/src/lib/core/models/SNO/MRequisitosConcursos.model.ts +0 -41
- package/projects/sigesp/src/lib/core/models/SNO/MRequisitosMinimos.model.ts +0 -123
- package/projects/sigesp/src/lib/core/models/SNO/MSalarioHistorico.model.ts +0 -75
- package/projects/sigesp/src/lib/core/models/SNO/MSolicitudEmpleo.model.ts +0 -125
- package/projects/sigesp/src/lib/core/models/SNO/MTablaVacaciones.model.ts +0 -61
- package/projects/sigesp/src/lib/core/models/SNO/MTablaVacacionesPeriodo.model.ts +0 -45
- package/projects/sigesp/src/lib/core/models/SNO/MTabulador.model.ts +0 -108
- package/projects/sigesp/src/lib/core/models/SNO/MTipoEvaluacion.model.ts +0 -85
- package/projects/sigesp/src/lib/core/models/SNO/MTipoPersonal.model.ts +0 -37
- package/projects/sigesp/src/lib/core/models/SNO/MTiposEnfermedad.model.ts +0 -40
- package/projects/sigesp/src/lib/core/models/SNO/MTrabajoAnterior.model.ts +0 -70
- package/projects/sigesp/src/lib/core/models/SNO/MUbicacionFisica.model.ts +0 -63
- package/projects/sigesp/src/lib/core/models/SNO/MVacacionesPersonal.model.ts +0 -119
- package/projects/sigesp/src/lib/core/models/SOC/charge.model.ts +0 -81
- package/projects/sigesp/src/lib/core/models/SOC/clause.model.ts +0 -39
- package/projects/sigesp/src/lib/core/models/SOC/clauseModality.model.ts +0 -43
- package/projects/sigesp/src/lib/core/models/SOC/configuracionSOC.model.ts +0 -71
- package/projects/sigesp/src/lib/core/models/SOC/service.model.ts +0 -53
- package/projects/sigesp/src/lib/core/models/SOC/serviceCharge.model.ts +0 -42
- package/projects/sigesp/src/lib/core/models/SOC/serviceType.model.ts +0 -39
- package/projects/sigesp/src/lib/core/models/SPG/UnidadAdministradoraCentral.ts +0 -50
- package/projects/sigesp/src/lib/core/models/SPG/administrativeUnit.model.ts +0 -185
- package/projects/sigesp/src/lib/core/models/SPG/comprobantePresupuestario.model.ts +0 -148
- package/projects/sigesp/src/lib/core/models/SPG/configurationSPG.model.ts +0 -140
- package/projects/sigesp/src/lib/core/models/SPG/cuentaPresupuesto.model.ts +0 -194
- package/projects/sigesp/src/lib/core/models/SPG/estructuraPresupuestaria.model.ts +0 -261
- package/projects/sigesp/src/lib/core/models/SPG/expensiveAccount.model.ts +0 -104
- package/projects/sigesp/src/lib/core/models/SPG/fuenteFinanciamiento.model.ts +0 -54
- package/projects/sigesp/src/lib/core/models/SPG/incomeStructureAccount.model.ts +0 -88
- package/projects/sigesp/src/lib/core/models/SPG/organizationType.model.ts +0 -16
- package/projects/sigesp/src/lib/core/models/SSS/component.model.ts +0 -51
- package/projects/sigesp/src/lib/core/models/SSS/group.model.ts +0 -39
- package/projects/sigesp/src/lib/core/models/SSS/log.model.ts +0 -36
- package/projects/sigesp/src/lib/core/models/SSS/securityConfiguration.model.ts +0 -26
- package/projects/sigesp/src/lib/core/models/SSS/sistema.ts +0 -87
- package/projects/sigesp/src/lib/core/models/SSS/user.model.ts +0 -52
- package/projects/sigesp/src/lib/core/models/SSS/userDetail.model.ts +0 -84
- package/projects/sigesp/src/lib/core/models/SSS/userPermit.model.ts +0 -61
- package/projects/sigesp/src/lib/core/models/SSS/userRights.model.ts +0 -113
- package/projects/sigesp/src/lib/core/models/STB/MCargosAdicionales.ts +0 -97
- package/projects/sigesp/src/lib/core/models/STB/deduction.model.ts +0 -100
- package/projects/sigesp/src/lib/core/models/STB/deductionType.model.ts +0 -23
- package/projects/sigesp/src/lib/core/models/STB/unidadTributaria.model.ts +0 -25
- package/projects/sigesp/src/lib/core/models/basic-model.model.ts +0 -9
- package/projects/sigesp/src/lib/shared/components/catalogo/catalogo.component.html +0 -45
- package/projects/sigesp/src/lib/shared/components/catalogo/catalogo.component.scss +0 -82
- package/projects/sigesp/src/lib/shared/components/catalogo/catalogo.component.ts +0 -71
- package/projects/sigesp/src/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.html +0 -57
- package/projects/sigesp/src/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.scss +0 -82
- package/projects/sigesp/src/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.ts +0 -80
- package/projects/sigesp/src/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.html +0 -121
- package/projects/sigesp/src/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.scss +0 -81
- package/projects/sigesp/src/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.ts +0 -68
- package/projects/sigesp/src/lib/shared/components/confirm/confirm.component.html +0 -15
- package/projects/sigesp/src/lib/shared/components/confirm/confirm.component.scss +0 -37
- package/projects/sigesp/src/lib/shared/components/confirm/confirm.component.ts +0 -32
- package/projects/sigesp/src/lib/shared/components/icon/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 +0 -0
- package/projects/sigesp/src/lib/shared/components/icon/icon.component.html +0 -6
- package/projects/sigesp/src/lib/shared/components/icon/icon.component.scss +0 -22
- package/projects/sigesp/src/lib/shared/components/icon/icon.component.ts +0 -19
- package/projects/sigesp/src/lib/shared/components/table-select/table-select.component.html +0 -73
- package/projects/sigesp/src/lib/shared/components/table-select/table-select.component.scss +0 -86
- package/projects/sigesp/src/lib/shared/components/table-select/table-select.component.ts +0 -102
- package/projects/sigesp/src/lib/shared/material/customPaginator.ts +0 -22
- package/projects/sigesp/src/lib/shared/material/material.module.ts +0 -144
- package/projects/sigesp/src/lib/shared/pipes/iso-currency.pipe.ts +0 -44
- package/projects/sigesp/src/lib/shared/shared.module.ts +0 -41
- package/projects/sigesp/src/lib/sigesp.service.ts +0 -2446
- package/projects/sigesp/src/lib/validation.service.ts +0 -172
- package/projects/sigesp/src/public-api.ts +0 -488
- package/projects/sigesp/src/test.ts +0 -23
- package/projects/sigesp/tsconfig.lib.json +0 -27
- package/projects/sigesp/tsconfig.lib.prod.json +0 -6
- package/projects/sigesp/tsconfig.spec.json +0 -17
- package/projects/sigesp/tslint.json +0 -17
- package/src/app/app.component.html +0 -11
- package/src/app/app.component.scss +0 -0
- package/src/app/app.component.ts +0 -110
- package/src/app/app.module.ts +0 -22
- package/src/assets/.gitkeep +0 -0
- package/src/assets/icons/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2 +0 -0
- package/src/environments/environment.prod.ts +0 -3
- package/src/environments/environment.ts +0 -16
- package/src/favicon.ico +0 -0
- package/src/index.html +0 -15
- package/src/main.ts +0 -13
- package/src/polyfills.ts +0 -53
- package/src/styles.scss +0 -101
- package/src/test.ts +0 -22
- package/tsconfig.app.json +0 -18
- package/tsconfig.json +0 -36
- package/tsconfig.spec.json +0 -18
- package/tslint.json +0 -155
|
@@ -0,0 +1,1829 @@
|
|
|
1
|
+
import { MPrefijo } from './core/models/CFG/MPrefijo.model';
|
|
2
|
+
import { MEnterprise } from './core/models/CFG/Enterprise.model';
|
|
3
|
+
import { MPersonalNomina } from './core/models/SNO/MPersonalNomina.model';
|
|
4
|
+
import { MHojaTiempo } from './core/models/SNO/MHojaTiempo.model';
|
|
5
|
+
import { Injectable } from '@angular/core';
|
|
6
|
+
import { MUsuario } from './core/models/SSS/user.model';
|
|
7
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
8
|
+
import { throwError } from 'rxjs';
|
|
9
|
+
import { MProveedor } from './core/models/RPC/proveedores.model';
|
|
10
|
+
import { map, catchError, retry } from 'rxjs/operators';
|
|
11
|
+
import { MUsuarioPrefijo } from './core/models/CFG/userPrefix.model';
|
|
12
|
+
import { CatalogoComponent } from './shared/components/catalogo/catalogo.component';
|
|
13
|
+
import { MCuentaPresupuesto } from './core/models/SPG/cuentaPresupuesto.model';
|
|
14
|
+
import { MCuentaInstitucional } from './core/models/SCG/cuentaInstitucional.model';
|
|
15
|
+
import { MMoneda, MMonedaConfig } from './core/models/CFG/moneda.model';
|
|
16
|
+
import { MUnidadTributaria } from './core/models/STB/unidadTributaria.model';
|
|
17
|
+
import { ConfirmComponent } from './shared/components/confirm/confirm.component';
|
|
18
|
+
import { MConfiguracionSCG } from './core/models/SCG/configuracionSCG.model';
|
|
19
|
+
import { TableSelectComponent } from './shared/components/table-select/table-select.component';
|
|
20
|
+
import { MConfigurationSPG } from './core/models/SPG/configurationSPG.model';
|
|
21
|
+
import { MCentroCosto } from './core/models/SCG/centroCosto.model';
|
|
22
|
+
import { MFuenteFinanciamiento } from './core/models/SPG/fuenteFinanciamiento.model';
|
|
23
|
+
import { MCuentaEgresos } from './core/models/SPG/expensiveAccount.model';
|
|
24
|
+
import { CatalogoEstructurasComponent } from './shared/components/catalogo-estructuras/catalogo-estructuras.component';
|
|
25
|
+
import { CatalogoDobleInputComponent } from './shared/components/catalogo-doble-input/catalogo-doble-input.component';
|
|
26
|
+
import { MSistema, MUsuarioSistema } from './core/models/SSS/sistema';
|
|
27
|
+
import { MComprobantePresupuestarioEgresos, MComprobantePresupuestarioIngresos } from './core/models/SPG/comprobantePresupuestario.model';
|
|
28
|
+
import { MCuentaIngresos } from './core/models/SCG/IncomeAccount';
|
|
29
|
+
import { MIncomeStructureAccount } from './core/models/SPG/incomeStructureAccount.model';
|
|
30
|
+
import { MOrganizationType } from './core/models/SPG/organizationType.model';
|
|
31
|
+
import { MSpecialty } from './core/models/RPC/specialty.model';
|
|
32
|
+
import { MDocument } from './core/models/RPC/document.model';
|
|
33
|
+
import { MClasification } from './core/models/RPC/clasification.model';
|
|
34
|
+
import { MCountry, MState, MMunicipality, MParish, MCity, MCommunity } from './core/models/CFG/locations.model';
|
|
35
|
+
import { MProviderBeneficiary } from './core/models/RPC/providerBeneficiary.model';
|
|
36
|
+
import { MSigecofBank, MBank, MBankAccountType, MAgenciaBanco, MCuentaBanco } from './core/models/SCB/bank.model';
|
|
37
|
+
import { MConfigurationRPC } from './core/models/RPC/configuracionRPC.model';
|
|
38
|
+
import { MConfigSOC } from './core/models/SOC/configuracionSOC.model';
|
|
39
|
+
import { MDeductionType } from './core/models/STB/deductionType.model';
|
|
40
|
+
import { MCargo } from './core/models/SOC/charge.model';
|
|
41
|
+
import { MConceptoRetencion, MDeduction } from './core/models/STB/deduction.model';
|
|
42
|
+
import { MConfigSSS } from './core/models/SSS/securityConfiguration.model';
|
|
43
|
+
import { MAdministrativeUnit, MEstructuras } from './core/models/SPG/administrativeUnit.model';
|
|
44
|
+
import { MComponent } from './core/models/SSS/component.model';
|
|
45
|
+
import { MServiceCharge } from './core/models/SOC/serviceCharge.model';
|
|
46
|
+
import { MEmpresa } from './core/models/CFG/Empresa.model';
|
|
47
|
+
import { MConceptosCXP } from './core/models/CXP/MConceptosCXP.model';
|
|
48
|
+
import { MTipoDocumentoCXP } from './core/models/CXP/MTipoDocumentoCXP.model';
|
|
49
|
+
import { MConfiguracionSNO } from './core/models/SNO/MConfiguracionSNO.model';
|
|
50
|
+
import { MDefinicionNomina } from './core/models/SNO/MDefinicionNomina.model';
|
|
51
|
+
import { MAsignacionCargo } from './core/models/SNO/MAsignacionCargo.model';
|
|
52
|
+
import { MNominaSimple } from './core/models/SNO/MNominaSimple.model';
|
|
53
|
+
import { MPersonal } from './core/models/SNO/MPersonal.model';
|
|
54
|
+
import { MEntradaSuministros } from './core/models/SIV/MEntradaSuministro.model';
|
|
55
|
+
import Swal from 'sweetalert2';
|
|
56
|
+
import * as CryptoJS from 'crypto-js';
|
|
57
|
+
import { MTipoDepositos } from './core/models/SIV/MTipoDepositos.model';
|
|
58
|
+
import { MComunidad } from './core/models/CFG/comunidad.model';
|
|
59
|
+
import { MExchangeRate } from './core/models/CFG/TasaCambio.model';
|
|
60
|
+
import { MCargosAdicionales } from './core/models/STB/MCargosAdicionales';
|
|
61
|
+
import { MClient } from './core/models/SFV/MClienteModel';
|
|
62
|
+
import * as i0 from "@angular/core";
|
|
63
|
+
import * as i1 from "@angular/common/http";
|
|
64
|
+
import * as i2 from "@angular/material/dialog";
|
|
65
|
+
import * as i3 from "ngx-toastr";
|
|
66
|
+
export class SigespService {
|
|
67
|
+
// public URL: string = "http://192.168.1.67/sigesp_php";
|
|
68
|
+
// usuarioActivo: MUsuario = {
|
|
69
|
+
// conexionDB: {
|
|
70
|
+
// baseDeDatos: "db_sigesp_demov3",
|
|
71
|
+
// gestor: "postgres",
|
|
72
|
+
// login: "postgres",
|
|
73
|
+
// nombre: "SIGESP C.A, servidor 85 (SE PUEDE USAR)",
|
|
74
|
+
// password: "adminsigesp",
|
|
75
|
+
// puerto: "5432",
|
|
76
|
+
// servidor: "192.168.1.67",
|
|
77
|
+
// },
|
|
78
|
+
// empresa: {
|
|
79
|
+
// id: 1,
|
|
80
|
+
// periodoFiscal: "2019-01-01",
|
|
81
|
+
// titulo: "SIGESP C.A."
|
|
82
|
+
// },
|
|
83
|
+
// nombre: "SIGESP",
|
|
84
|
+
// token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJwYXNzd29yZF91c3UiOiIxMjM0NTY3OCIsImlkX2VtcHJlc2EiOiIxIiwidGl0ZW1wIjoiU0lHRVNQIEMuQS4iLCJwZXJmaXNjYWwiOiIyMDE5LTAxLTAxIiwibF91c3VhcmlvIjoiU0lHRVNQIiwic2Vydmlkb3IiOiIxOTIuMTY4LjEuNjciLCJwdWVydG8iOiI1NDMyIiwiYmFzZWRlZGF0b3MiOiJkYl9zaWdlc3BfZGVtb3YzIiwibG9naW4iOiJwb3N0Z3JlcyIsInBhc3N3b3JkIjoiYWRtaW5zaWdlc3AifQ.PISBSfueRAdsWsJ1AaGcVCgW-2aJkgtvLdsW0Bgo5ltyYowD8oy_nqK5sjE2URGk"
|
|
85
|
+
// }
|
|
86
|
+
// procede: string = 'SCGCMP';
|
|
87
|
+
// codsis: string = 'SCG';
|
|
88
|
+
constructor(http, dialog, toast) {
|
|
89
|
+
this.http = http;
|
|
90
|
+
this.dialog = dialog;
|
|
91
|
+
this.toast = toast;
|
|
92
|
+
this.usuarioActivo = null;
|
|
93
|
+
this.currentComponent = null;
|
|
94
|
+
this.userMenu = null;
|
|
95
|
+
this.ip_adress = '127.0.0.1';
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* @description Valida que selo se escriban guiones y 9
|
|
99
|
+
* @param event
|
|
100
|
+
*/
|
|
101
|
+
onlyGuionesAndNine(event) {
|
|
102
|
+
if (event.key === '-' || event.key === '9') {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* @description Actualiza el moncmp de sigesp_comprobante
|
|
109
|
+
*/
|
|
110
|
+
updateComprobanteAmount(amount, idComprobante) {
|
|
111
|
+
return this.http.put(`${this.URL}/dao/sig/comprobante_dao.php?monto=true`, {
|
|
112
|
+
moncmp: amount,
|
|
113
|
+
id_comprobante: idComprobante
|
|
114
|
+
}, {
|
|
115
|
+
headers: this.getHttpHeaders()
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @description Actualiza el comprobante prsupuestario de Egresos
|
|
120
|
+
* @param comprobante
|
|
121
|
+
*/
|
|
122
|
+
updateComprobantePresupuestarioEgresos(comprobante) {
|
|
123
|
+
return this.http.put(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, { ...comprobante, id: comprobante.id_dt_spgcmp }, { headers: this.getHttpHeaders() });
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* @description Obtiene el comprobante presupuestario de Egresos
|
|
127
|
+
*/
|
|
128
|
+
getComprobantePresupuestarioEgresos() {
|
|
129
|
+
return this.http.get(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, {
|
|
130
|
+
headers: this.getHttpHeaders()
|
|
131
|
+
}).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(element => new MComprobantePresupuestarioEgresos(element))));
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* @description Actualiza el comprobante prsupuestario de Ingresos
|
|
135
|
+
* @param comprobante
|
|
136
|
+
*/
|
|
137
|
+
updateComprobantePresupuestarioIngresos(comprobante) {
|
|
138
|
+
return this.http.put(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, { ...comprobante, id: comprobante.id_dt_spicmp }, { headers: this.getHttpHeaders() });
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* @description Obtiene el comprobante presupuestario de Ingresos
|
|
142
|
+
*/
|
|
143
|
+
getComprobantePresupuestarioIngresos() {
|
|
144
|
+
return this.http.get(`${this.URL}/dao/spi/comprobante_presupuestario_ingresos_dao.php`, {
|
|
145
|
+
headers: this.getHttpHeaders()
|
|
146
|
+
}).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(element => new MComprobantePresupuestarioIngresos(element))));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* @Actualiza la distribución de la cuenta de egreso
|
|
150
|
+
* @param distribution
|
|
151
|
+
*/
|
|
152
|
+
updateDistributionExpenseAccount(distribution) {
|
|
153
|
+
return this.http.put(`${this.URL}/dao/spg/cuentas_egresos_dao.php`, distribution, { headers: this.getHttpHeaders() });
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* @Actualiza la distribución de la cuenta de egreso
|
|
157
|
+
* @param distribution
|
|
158
|
+
*/
|
|
159
|
+
updateDistributionExpenseAccount2(distribution) {
|
|
160
|
+
return this.http.put(`${this.URL}/dao/spg/cuentas_egresos_dao.php`, distribution, { headers: this.getHttpHeaders() });
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* @Actualiza la distribución de la cuenta de Ingreso
|
|
164
|
+
* @param distribution
|
|
165
|
+
*/
|
|
166
|
+
updateDistributionIncomeAccount(distribution) {
|
|
167
|
+
return this.http.put(`${this.URL}/dao/spi/cuentas_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
168
|
+
.pipe(map((res) => {
|
|
169
|
+
if (res.success) {
|
|
170
|
+
res.data = new MCuentaIngresos(res.data);
|
|
171
|
+
}
|
|
172
|
+
return res;
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
updateDistributionIncomeAccount2(distribution) {
|
|
176
|
+
return this.http.put(`${this.URL}/dao/spi/cuentas_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
177
|
+
.pipe(map((res) => {
|
|
178
|
+
if (res.success) {
|
|
179
|
+
res.data = new MCuentaIngresos(res.data);
|
|
180
|
+
}
|
|
181
|
+
return res;
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @Actualiza la distribución de la cuenta de Ingreso de Estructura
|
|
186
|
+
* @param distribution
|
|
187
|
+
*/
|
|
188
|
+
updateDistributionIncomeStructureAccount(distribution, level) {
|
|
189
|
+
return this.http.put(`${this.URL}/dao/spi/cuenta_estructura_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
190
|
+
.pipe(map((res) => {
|
|
191
|
+
if (res.success) {
|
|
192
|
+
res.data = new MIncomeStructureAccount(res.data, level);
|
|
193
|
+
}
|
|
194
|
+
return res;
|
|
195
|
+
}));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* @description Obtiene el plan de cuentas
|
|
199
|
+
* @param level Número de niveles de la configuración
|
|
200
|
+
* @param id de la estructura el idEp3 o idEp5
|
|
201
|
+
* @return Observable<MCuentaEgresos[]>
|
|
202
|
+
*/
|
|
203
|
+
planInstitucionalSPG(tipo = 'plan', idEnterprise, periodoFiscal, idEP3o5, nivel, estatus = '') {
|
|
204
|
+
return this.http.get(`${this.URL}/dao/spg/cuentas_egresos_dao.php?tipo=${tipo}&e=${idEnterprise}&periodo=${periodoFiscal}&id=${idEP3o5}&nivel=${nivel}&est=${estatus}`, { headers: this.getHttpHeaders() })
|
|
205
|
+
.pipe(map((res) => res.data.map(element => new MCuentaEgresos(element))));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* @description Abre el catálogo de estructura presupuesaria
|
|
209
|
+
* @param data Data que se va a mostrar
|
|
210
|
+
* @param configuration Configuración de la estructura
|
|
211
|
+
* @return Promise<any>
|
|
212
|
+
* @author Miguel Ramírez
|
|
213
|
+
*/
|
|
214
|
+
openCatalogoEstructuraPresupuestaria(data, configuration) {
|
|
215
|
+
const catalogo = this.dialog.open(CatalogoEstructurasComponent, {
|
|
216
|
+
data: {
|
|
217
|
+
data,
|
|
218
|
+
configuration
|
|
219
|
+
},
|
|
220
|
+
width: '1000px',
|
|
221
|
+
maxHeight: '90vh'
|
|
222
|
+
});
|
|
223
|
+
return catalogo.afterClosed().toPromise();
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
*
|
|
227
|
+
* @param tipo {1,2,3,4,completa}
|
|
228
|
+
* @param idEnterprise
|
|
229
|
+
* @param periodoFiscal
|
|
230
|
+
* @param codigo {codigo de la estructura }
|
|
231
|
+
* @returns
|
|
232
|
+
*/
|
|
233
|
+
getBudgetStructureComplete(tipo = 'completa', idEnterprise, periodoFiscal, codigo = '') {
|
|
234
|
+
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria_dao.php?tipo=${tipo}&e=${idEnterprise}&per=${periodoFiscal}&cod=${codigo}`, { headers: this.getHttpHeaders() }).pipe(map((resp) => resp.data.map(e => new MEstructuras(e))));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* @description Obtiene las configuraciones de la estructura presupuestaria
|
|
238
|
+
* @return Observable<MConfigurationSPG[]>
|
|
239
|
+
* @author Miguel Ramírez
|
|
240
|
+
*/
|
|
241
|
+
getConfigurationSPG(idEnterprise, periodoFiscal) {
|
|
242
|
+
return this.http.get(`${this.URL}/dao/spg/configuracion_presupuestaria_dao.php?e=${idEnterprise}&periodo=${periodoFiscal}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => new MConfigurationSPG(resp.data[0])));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* @description Obtiene las configuraciones de los proveedores
|
|
246
|
+
* @return Observable<MConfigurationRPC[]>
|
|
247
|
+
* @author Carlos Albornoz
|
|
248
|
+
*/
|
|
249
|
+
getConfigurationRPC() {
|
|
250
|
+
return this.http.get(`${this.URL}/dao/rpc/proveedor_config_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
251
|
+
if (resp.success) {
|
|
252
|
+
resp.data = new MConfigurationRPC(resp.data);
|
|
253
|
+
}
|
|
254
|
+
return resp;
|
|
255
|
+
}));
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* @description Obtiene las MConfiguracionSNO de la nomina
|
|
259
|
+
* @return Observable<MConfiguracionSNO[]>
|
|
260
|
+
* @date 27-07-2021
|
|
261
|
+
*/
|
|
262
|
+
getConfigurationSNO(idEnterprise) {
|
|
263
|
+
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}&e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
264
|
+
if (resp.success) {
|
|
265
|
+
if (resp.data != null) {
|
|
266
|
+
resp.data = resp.data.map(e => new MConfiguracionSNO(e));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return resp;
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
dateToString(date) {
|
|
273
|
+
return `${date.getFullYear()}-${date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`}-${date.getDate() >= 10 ? date.getDate() : `0${date.getDate()}`}`;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* @description Obtiene las configuraciones de Seguridad
|
|
277
|
+
* @return Observable<IResponse>
|
|
278
|
+
* @author Carlos Albornoz
|
|
279
|
+
*/
|
|
280
|
+
getConfigSSS(idEnterprise = 0) {
|
|
281
|
+
return this.http.get(`${this.URL}/dao/sss/seguridad_config_dao.php?e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
282
|
+
if (resp.success) {
|
|
283
|
+
resp.data = new MConfigSSS(resp.data);
|
|
284
|
+
}
|
|
285
|
+
return resp;
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
getComponents(systemCode = null, permit) {
|
|
289
|
+
return this.http.get(`${this.URL}/dao/sss/componentes_dao.php?${systemCode ? `codsis=${systemCode}${permit ? `&permit=true` : ''}` : ''}`, { headers: this.getHttpHeaders() }).pipe(map(res => {
|
|
290
|
+
if (res.success) {
|
|
291
|
+
res.data = res.data.map(e => new MComponent(e));
|
|
292
|
+
}
|
|
293
|
+
return res;
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* @description Obtiene las fuentes de financiamiento
|
|
298
|
+
* @return Observable<MFuenteFinanciamiento[]>
|
|
299
|
+
* @author Miguel Ramírez
|
|
300
|
+
*/
|
|
301
|
+
getFuenteFinanciamiento(idEnterprise, periodoFiscal) {
|
|
302
|
+
return this.http.get(`${this.URL}/dao/spg/fuente_financiamiento_dao.php?e=${idEnterprise}&per=${periodoFiscal}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MFuenteFinanciamiento(element))));
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* @description Obtiene los centros de costo
|
|
306
|
+
* @return Observable<IResponse>
|
|
307
|
+
* modificado 28-12-2022
|
|
308
|
+
*/
|
|
309
|
+
getCentroCosto(tipo, idEnterprise, periodoFiscal) {
|
|
310
|
+
return this.http.get(`${this.URL}/dao/scg/centro_costo_dao.php?tipo=${tipo}&e=${idEnterprise}&periodo=${periodoFiscal}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
311
|
+
if (res.success) {
|
|
312
|
+
res.data = res.data.map(element => new MCentroCosto(element));
|
|
313
|
+
}
|
|
314
|
+
return res;
|
|
315
|
+
}));
|
|
316
|
+
}
|
|
317
|
+
getCentroCostoUnidadOrganizativa(tipo, idEnterprise, periodoFiscal, idUnidadAdministrativa) {
|
|
318
|
+
return this.http.get(`${this.URL}/dao/spg/unidad_administrativa_dao.php?tipo=${tipo}&e=${idEnterprise}&periodo=${periodoFiscal}&id=${idUnidadAdministrativa}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
319
|
+
if (res.success) {
|
|
320
|
+
res.data = res.data.map(element => new MCentroCosto(element));
|
|
321
|
+
}
|
|
322
|
+
return res;
|
|
323
|
+
}));
|
|
324
|
+
}
|
|
325
|
+
getEstructurasUnidadOrganizativa(tipo, idEnterprise, periodoFiscal, idUnidadAdministrativa) {
|
|
326
|
+
return this.http.get(`${this.URL}/dao/spg/unidad_administrativa_dao.php?tipo=${tipo}&e=${idEnterprise}&periodo=${periodoFiscal}&id=${idUnidadAdministrativa}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
327
|
+
if (res.success) {
|
|
328
|
+
res.data = res.data.map(element => new MEstructuras(element));
|
|
329
|
+
}
|
|
330
|
+
return res;
|
|
331
|
+
}));
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* @description Abre el dialog de checkks
|
|
335
|
+
* @param columns Columnas que va a tener la tabla
|
|
336
|
+
* @param title Título de la modal
|
|
337
|
+
* @param dataSource Data que s eva a mostrar en la tabla
|
|
338
|
+
*/
|
|
339
|
+
openDialogMultiSelect(
|
|
340
|
+
// columns: string[],
|
|
341
|
+
// title: string,
|
|
342
|
+
// dataSource: any[],
|
|
343
|
+
// columnNames?: string[]
|
|
344
|
+
columns, title, dataSource, columnNames = null, width = '1000px', options = {
|
|
345
|
+
disableClose: false,
|
|
346
|
+
hasBackdrop: false,
|
|
347
|
+
// disableMasterToggle: false
|
|
348
|
+
}) {
|
|
349
|
+
let dialogRef = this.dialog.open(TableSelectComponent, {
|
|
350
|
+
data: {
|
|
351
|
+
title: title,
|
|
352
|
+
columns: columns,
|
|
353
|
+
dataSource: dataSource,
|
|
354
|
+
columnNames,
|
|
355
|
+
// disableMasterToggle: options.disableMasterToggle
|
|
356
|
+
},
|
|
357
|
+
width: width,
|
|
358
|
+
maxHeight: '90vh',
|
|
359
|
+
hasBackdrop: options.hasBackdrop,
|
|
360
|
+
disableClose: options.disableClose
|
|
361
|
+
});
|
|
362
|
+
return dialogRef.afterClosed().toPromise();
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* @description Obtiene la configuración de SCG
|
|
366
|
+
* @return Observable<MConfiguracionSCG[]>
|
|
367
|
+
* @author Miguel Ramírez
|
|
368
|
+
* @modifit 25-07-2021
|
|
369
|
+
*/
|
|
370
|
+
getConfigurationSCG(lineaEmpresa, periodoFiscal) {
|
|
371
|
+
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php?tipo=${'default'}&e=${lineaEmpresa}&periodo=${periodoFiscal}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MConfiguracionSCG(element))));
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* @description Abre un dialog de confirmación
|
|
375
|
+
* @param title Título de la modal de confirm
|
|
376
|
+
* @param message Mensaje (opcional) para el ususario
|
|
377
|
+
* @return Promise<boolean>
|
|
378
|
+
* @author Miguel Ramírez
|
|
379
|
+
*/
|
|
380
|
+
openDialogConfirm(title, message) {
|
|
381
|
+
let dialogRef = this.dialog.open(ConfirmComponent, {
|
|
382
|
+
data: {
|
|
383
|
+
title: title,
|
|
384
|
+
message: (message) ? message : null
|
|
385
|
+
},
|
|
386
|
+
width: '1000px',
|
|
387
|
+
maxHeight: '90vh'
|
|
388
|
+
});
|
|
389
|
+
return dialogRef.afterClosed().toPromise();
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* @description Convierte el contenido de un AbstractControl en mayúscula (Usar en evento keyup)
|
|
393
|
+
* @param formGroup Formulario dónde se va a buscar el AbstractControl
|
|
394
|
+
* @param name Nombre del AbstractControl
|
|
395
|
+
* @return void
|
|
396
|
+
* @author Miguel Ramírez
|
|
397
|
+
*/
|
|
398
|
+
changeToUpperCase(formGroup, name) {
|
|
399
|
+
this.getAbstractControl(formGroup, name).setValue(this.getAbstractControl(formGroup, name).value.toUpperCase());
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* @description Obtiene el AbstractControl de un formulario
|
|
403
|
+
* @param formGroup Formulario donde se va a buscar el AbstractControl
|
|
404
|
+
* @param name Nombre del AbstractControl
|
|
405
|
+
* @return AbstractControl
|
|
406
|
+
* @author Miguel Ramírez
|
|
407
|
+
*/
|
|
408
|
+
getAbstractControl(formGroup, name) {
|
|
409
|
+
return formGroup.get(name);
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
413
|
+
* @param event Evento del teclado
|
|
414
|
+
* @return boolean
|
|
415
|
+
* @author Miguel Ramírez
|
|
416
|
+
* @modificado como onlyNumero para corregir codigo, usar currency-input si quiere usar decimales
|
|
417
|
+
*/
|
|
418
|
+
onlyDecimal(event) {
|
|
419
|
+
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
426
|
+
* @param event Evento del teclado
|
|
427
|
+
* @return boolean
|
|
428
|
+
* @author Miguel Ramírez
|
|
429
|
+
*/
|
|
430
|
+
onlyNumbers(event) {
|
|
431
|
+
// console.log(event);
|
|
432
|
+
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* @description Acepta solo numero, delete y backspace
|
|
439
|
+
* @param event Evento del teclado
|
|
440
|
+
* @return boolean
|
|
441
|
+
* @author Dimaly Crespo
|
|
442
|
+
*/
|
|
443
|
+
onlyNumbers2(event) {
|
|
444
|
+
if (!isNaN(+event.key) || event.keyCode == 8 || event.keyCode == 46) {
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
return false;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* @description Acepta solo numero,guiones, parentesis,espacios
|
|
451
|
+
* @param event Evento del teclado
|
|
452
|
+
* @return boolean
|
|
453
|
+
* @author Dimaly Crespo
|
|
454
|
+
*/
|
|
455
|
+
typeNumbersHyphen(event) {
|
|
456
|
+
if (!isNaN(+event.key) || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46
|
|
457
|
+
|| event.keyCode == 58 || event.keyCode == 57 || event.keyCode == 189) {
|
|
458
|
+
return true;
|
|
459
|
+
}
|
|
460
|
+
return false;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* @description Permite (a-z A-Z á-ú ñÑ üÜ ',.) que se escriban numeros en el input (Usar en keypress)
|
|
464
|
+
* @param event Evento del teclado
|
|
465
|
+
* @return boolean
|
|
466
|
+
* @date 14-05-2022
|
|
467
|
+
*
|
|
468
|
+
*/
|
|
469
|
+
typeName(event) {
|
|
470
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
471
|
+
|| (event.key >= 'á' && event.key <= 'ú') || event.key >= 'ü' || event.key >= 'Ü' || event.key == "'" || event.keyCode == 32
|
|
472
|
+
|| event.key == "." || event.key == "," || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
473
|
+
return true;
|
|
474
|
+
}
|
|
475
|
+
return false;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* @description Permite (0-9 a-z A-Z á-ú ñÑ üÜ ',.-_/:()%#º&$€£¥) que se escriban en el input (Usar en keypress)
|
|
479
|
+
* @param event Evento del teclado
|
|
480
|
+
* @return boolean
|
|
481
|
+
* @date 14-05-2022
|
|
482
|
+
*
|
|
483
|
+
*/
|
|
484
|
+
typeText(event) {
|
|
485
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
486
|
+
|| (event.key >= 'á' && event.key <= 'ú') || event.key == 'ü' || event.key == 'Ü' || event.key == "'" || isNaN(+event.key)
|
|
487
|
+
|| event.key == "." || event.key == "," || event.key == "&" || event.key == "_" || event.key == "-" || event.key == "#"
|
|
488
|
+
|| event.key == "º" || event.key == "$" || event.key == "(" || event.key == ")" || event.key == "%" || event.key == ' '
|
|
489
|
+
|| event.key == ':' || event.key == '/' || event.keyCode == 8364 || event.keyCode == 165 || event.keyCode == 163
|
|
490
|
+
|| event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
491
|
+
return true;
|
|
492
|
+
}
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* @description Permite (0-9 a-z A-Z ñÑ .-_) que se escriban en el input (Usar en keypress)
|
|
497
|
+
* @param event Evento del teclado
|
|
498
|
+
* @return boolean
|
|
499
|
+
* @date 14-05-2022
|
|
500
|
+
*/
|
|
501
|
+
typeCode(event) {
|
|
502
|
+
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
503
|
+
|| isNaN(+event.key) || event.key == "." || event.key == "_" || event.key == "-" || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
504
|
+
return true;
|
|
505
|
+
}
|
|
506
|
+
return false;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* @description Abre el dialog de las comunidades
|
|
510
|
+
* @return Promise<MComunidad>
|
|
511
|
+
* @author Miguel Ramírez
|
|
512
|
+
*/
|
|
513
|
+
async openDialogUnidadesTributarias() {
|
|
514
|
+
let udTributarias = await this.getUnidadesTributarias().toPromise();
|
|
515
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
516
|
+
data: {
|
|
517
|
+
columns: ['año', 'nro_decreto', 'fecha_decreto', 'entrada_videncia', 'publicacion_gaceta', 'nro_gaceta', 'valorut'],
|
|
518
|
+
title: 'Catálogo de Unidades Tributarias',
|
|
519
|
+
dataSource: udTributarias
|
|
520
|
+
},
|
|
521
|
+
width: '1000x',
|
|
522
|
+
maxHeight: '90vh'
|
|
523
|
+
});
|
|
524
|
+
return dialogRef.afterClosed().toPromise();
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* @description Obtiene las unidades tributarias
|
|
528
|
+
* @return Observable<any>
|
|
529
|
+
* @author Miguel Ramírez
|
|
530
|
+
*/
|
|
531
|
+
getUnidadesTributarias() {
|
|
532
|
+
const request = {
|
|
533
|
+
operacion: 'obtenerData',
|
|
534
|
+
sigesp_conexion: {
|
|
535
|
+
servidor: this.URL,
|
|
536
|
+
usuario: this.usuarioActivo.getInterface()
|
|
537
|
+
}
|
|
538
|
+
};
|
|
539
|
+
return this.http.post(`${this.URL}/dao/cfg/undtributaria_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MUnidadTributaria(element))));
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* @description Abre una modal génerica
|
|
543
|
+
* @param columns Columnas que va a tener la tabla
|
|
544
|
+
* @param title Título del dialog
|
|
545
|
+
* @param dataSource Data que se va a mostrar en la tabla
|
|
546
|
+
* @return Promise<any>
|
|
547
|
+
* @author Miguel Ramírez
|
|
548
|
+
*/
|
|
549
|
+
async openCatalogoGenerico(columns, title, dataSource, columnNames = null, width = '1000px', options = { disableClose: false, hasBackdrop: false }) {
|
|
550
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
551
|
+
data: {
|
|
552
|
+
columns,
|
|
553
|
+
title,
|
|
554
|
+
dataSource,
|
|
555
|
+
columnNames
|
|
556
|
+
},
|
|
557
|
+
width: width,
|
|
558
|
+
maxHeight: '90vh',
|
|
559
|
+
hasBackdrop: options.hasBackdrop ? options.hasBackdrop : false,
|
|
560
|
+
disableClose: options.disableClose ? options.disableClose : false,
|
|
561
|
+
});
|
|
562
|
+
return dialogRef.afterClosed().toPromise();
|
|
563
|
+
}
|
|
564
|
+
/**
|
|
565
|
+
* @description Abre una modal génerica con 2 inputs
|
|
566
|
+
* @param columns Columnas que va a tener la tabla
|
|
567
|
+
* @param title Título del dialog
|
|
568
|
+
* @param dataSource Data que se va a mostrar en la tabla
|
|
569
|
+
* @return Promise<any>
|
|
570
|
+
* @author Carlos Albornoz
|
|
571
|
+
*/
|
|
572
|
+
async openCatalogoDosInputs(columns, title, dataSource, filterData, columnNames = null, width = "1000px") {
|
|
573
|
+
let dialogRef = this.dialog.open(CatalogoDobleInputComponent, {
|
|
574
|
+
data: {
|
|
575
|
+
columns,
|
|
576
|
+
title,
|
|
577
|
+
dataSource,
|
|
578
|
+
columnNames,
|
|
579
|
+
filterData
|
|
580
|
+
},
|
|
581
|
+
width: width,
|
|
582
|
+
maxHeight: '90vh'
|
|
583
|
+
});
|
|
584
|
+
return dialogRef.afterClosed().toPromise();
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* @description Abre el dialog de las comunidades
|
|
588
|
+
* @return Promise<MComunidad>
|
|
589
|
+
* @author Miguel Ramírez
|
|
590
|
+
*/
|
|
591
|
+
async openDialogComunidad() {
|
|
592
|
+
let comunidades = await this.getComunidades().toPromise();
|
|
593
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
594
|
+
data: {
|
|
595
|
+
columns: ['prefijo', 'pais', 'estado', 'municipio', 'parroquia', 'codigo', 'comunidad'],
|
|
596
|
+
title: 'Catálogo de Comunidades',
|
|
597
|
+
dataSource: comunidades
|
|
598
|
+
},
|
|
599
|
+
width: '1000px',
|
|
600
|
+
maxHeight: '90vh'
|
|
601
|
+
});
|
|
602
|
+
return dialogRef.afterClosed().toPromise();
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* @description Obtiene las comunidades
|
|
606
|
+
* @return Observable<MComunidad[]>
|
|
607
|
+
* @author Miguel Ramírez
|
|
608
|
+
*/
|
|
609
|
+
getComunidades() {
|
|
610
|
+
const request = {
|
|
611
|
+
operacion: 'obtenerData',
|
|
612
|
+
sigesp_conexion: {
|
|
613
|
+
servidor: this.URL,
|
|
614
|
+
usuario: this.usuarioActivo.getInterface()
|
|
615
|
+
}
|
|
616
|
+
};
|
|
617
|
+
return this.http.post(`${this.URL}/dao/cfg/comunidades_dao.php`, request).pipe(map((resp) => resp.map(element => new MComunidad(element))));
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* @description Abre el dialog de las las monedas
|
|
621
|
+
* @return Promise<MMoneda>
|
|
622
|
+
* @author Miguel Ramírez
|
|
623
|
+
*/
|
|
624
|
+
async openDialogMonedas() {
|
|
625
|
+
let coins = await this.getMonedas('todas').toPromise();
|
|
626
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
627
|
+
data: {
|
|
628
|
+
columns: ['codigo', 'denominacion', 'codigoIso', 'simbolo'],
|
|
629
|
+
title: 'Catálogo de Monedas',
|
|
630
|
+
columnNames: ['código', 'denominación', 'iso', 'simbolo'],
|
|
631
|
+
dataSource: coins
|
|
632
|
+
},
|
|
633
|
+
width: '1000px',
|
|
634
|
+
maxHeight: '90vh'
|
|
635
|
+
});
|
|
636
|
+
return dialogRef.afterClosed().toPromise();
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* @description Obtiene las monedas
|
|
640
|
+
* @return Observable<MMoneda[]>
|
|
641
|
+
* @author Miguel Ramírez
|
|
642
|
+
* actualizado 4-12-2022
|
|
643
|
+
* @param tipo :string {'todas','uno','actual}
|
|
644
|
+
* @param id : number
|
|
645
|
+
* @returns
|
|
646
|
+
*/
|
|
647
|
+
getMonedas(tipo, id) {
|
|
648
|
+
return this.http.get(`${this.URL}/dao/cfg/moneda_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((resp) => resp.data.map(element => new MMoneda(element))));
|
|
649
|
+
}
|
|
650
|
+
/**
|
|
651
|
+
* @Description: Obtiene la tasa de cambio asociadas a uno o varias monedas
|
|
652
|
+
* @param tipo string
|
|
653
|
+
* @param id codigo moneda
|
|
654
|
+
* @returns array/null
|
|
655
|
+
* @tipo:all->todas, (moneda->una moneda id->id de moneda)
|
|
656
|
+
*/
|
|
657
|
+
getCurrencyExchangeRate(tipo = null, id) {
|
|
658
|
+
return this.http.get(`${this.URL}/dao/cfg/tasa_cambio_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((resp) => resp.data.map(element => new MExchangeRate(element))));
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* @description Abre el dialog de las las cuentas contables (Cuentas Institucionales)
|
|
662
|
+
* @return Promise<McuentaInstitucional>
|
|
663
|
+
* @author Miguel Ramírez
|
|
664
|
+
*/
|
|
665
|
+
async openDialogCuentasInstitucionales(idEnterprise, periodoFiscal) {
|
|
666
|
+
let accounts = await this.getCuentasInstitucionales(idEnterprise, periodoFiscal).toPromise();
|
|
667
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
668
|
+
data: {
|
|
669
|
+
columns: ['cuenta', 'denominacion'],
|
|
670
|
+
columnNames: ['cuenta', 'denominación'],
|
|
671
|
+
title: 'Catálogo de Plan de Cuenta Institucional',
|
|
672
|
+
dataSource: accounts
|
|
673
|
+
},
|
|
674
|
+
width: '1000px',
|
|
675
|
+
maxHeight: '90vh'
|
|
676
|
+
});
|
|
677
|
+
return dialogRef.afterClosed().toPromise();
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* @description Obtiene las cuentas contables (Cuentas Institucionales)
|
|
681
|
+
* @return Observable<MCuentaInstitucional[]>
|
|
682
|
+
* @author Miguel Ramírez
|
|
683
|
+
*/
|
|
684
|
+
getCuentasInstitucionales(idEnterprise, periodoFiscal, inventory) {
|
|
685
|
+
return this.http.get(`${this.URL}/dao/scg/cuentas_dao.php?e=${idEnterprise}&periodo=${periodoFiscal}${(inventory) ? '&inventory=true' : ''}`, { headers: this.getHttpHeaders() }).pipe(map((resp) => resp.data.map(element => new MCuentaInstitucional(element))));
|
|
686
|
+
}
|
|
687
|
+
/**
|
|
688
|
+
* @description Abre el dialog de las cuentas de presupuesto (Recursos y Egresos)
|
|
689
|
+
* @return Promise<MCuentaPresupuesto>
|
|
690
|
+
* @author Miguel Ramírez
|
|
691
|
+
*/
|
|
692
|
+
async openDialogCuentasPresupuesto(idEnterprise, periodoFiscal) {
|
|
693
|
+
let accounts = await this.getCuentasPresupuesto(idEnterprise, periodoFiscal).toPromise();
|
|
694
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
695
|
+
data: {
|
|
696
|
+
columnNames: ['cuenta', 'denominación'],
|
|
697
|
+
columns: ['cuenta', 'denominacion'],
|
|
698
|
+
title: 'Catálogo de Cuentas de Presupuesto',
|
|
699
|
+
dataSource: accounts
|
|
700
|
+
},
|
|
701
|
+
width: '1000px',
|
|
702
|
+
maxHeight: '90vh'
|
|
703
|
+
});
|
|
704
|
+
return dialogRef.afterClosed().toPromise();
|
|
705
|
+
}
|
|
706
|
+
/**
|
|
707
|
+
* @description Obtiene las cuentas de recursos y egresos
|
|
708
|
+
* @return Observable<MCuentaPresupuesto>
|
|
709
|
+
* @author Miguel Ramírez
|
|
710
|
+
* @param filter {numero,sno,C,egreso,ingreso}
|
|
711
|
+
* @param idEnterprise
|
|
712
|
+
* @param peridoFiscal
|
|
713
|
+
* @returns
|
|
714
|
+
*/
|
|
715
|
+
getCuentasPresupuesto(idEnterprise, peridoFiscal, filter = 'default') {
|
|
716
|
+
return this.http.get(`${this.URL}/dao/spg/plan_cuentas_recursos_egresos_dao.php?filter=${filter}&e=${idEnterprise}&per=${peridoFiscal}`, { headers: this.getHttpHeaders() }).pipe(map((res) => res.data.map(element => new MCuentaPresupuesto(element))));
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* @description Abre el cátalogo de cuentas de la tabla "spg_cuentas"
|
|
720
|
+
* @returns Promise<MCuentaEgresos>
|
|
721
|
+
* @author Carlos Albornoz
|
|
722
|
+
* @params presupuesto: Indica si se a trabajar con estructura de presupuesto o no
|
|
723
|
+
*/
|
|
724
|
+
async openCatalogoCuentasEgreso(idEnterprise, periodoFiscal, titulo, presupuesto = true, ancho = "1000px") {
|
|
725
|
+
let cuentas = [];
|
|
726
|
+
await this.getExpenseAccounts(idEnterprise, periodoFiscal).toPromise().then(res => {
|
|
727
|
+
cuentas = res;
|
|
728
|
+
cuentas = cuentas.filter(e => {
|
|
729
|
+
return e.status == "C";
|
|
730
|
+
}).map(e => {
|
|
731
|
+
e['provStatus'] = e.status == "C" ? "Movimientos" : "Totalizadora";
|
|
732
|
+
return e;
|
|
733
|
+
});
|
|
734
|
+
});
|
|
735
|
+
if (presupuesto) {
|
|
736
|
+
return this.openCatalogoDosInputs(["cuenta", "denominacion", "estructura", "provStatus"], titulo, cuentas, [{
|
|
737
|
+
placeholder: "Cuenta",
|
|
738
|
+
property: "cuenta"
|
|
739
|
+
}, {
|
|
740
|
+
placeholder: "Estructura",
|
|
741
|
+
property: "estructura"
|
|
742
|
+
}], ["Cuenta", "Denominación", "Estructura", "Estado"], ancho);
|
|
743
|
+
}
|
|
744
|
+
else {
|
|
745
|
+
let filteredAccounts = [];
|
|
746
|
+
cuentas.forEach(c => {
|
|
747
|
+
if (!filteredAccounts.find(e => e.cuenta == c.cuenta)) {
|
|
748
|
+
filteredAccounts.push(c);
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus"], titulo, filteredAccounts, ["Cuenta", "Denominación", "Estado"], ancho);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
getExpenseAccounts(idEnterprise, periodoFiscal, estatus) {
|
|
755
|
+
return this.http.get(`${this.URL}/dao/spg/cuentas_egresos_dao.php?e=${idEnterprise}&periodo=${periodoFiscal}&est=${estatus}`, { headers: this.getHttpHeaders() })
|
|
756
|
+
.pipe(map((res) => res.data.map(element => new MCuentaEgresos(element))));
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* @description Abre el cátalogo de cuentas de la tabla "scg_plan_unico_re"
|
|
760
|
+
* @returns Promise<MCuentaPresupuesto>
|
|
761
|
+
* @author Carlos Albornoz
|
|
762
|
+
* @params filtro: Indica bajo que parametros se va a filtrar el catalogo
|
|
763
|
+
*/
|
|
764
|
+
async openCatalogoCuentasPresuspuesto(titulo, idEnterprise, periodoFiscal, filtro = null, ancho = '1000px') {
|
|
765
|
+
let cuentas = [];
|
|
766
|
+
await this.getCuentasPresupuesto(idEnterprise, periodoFiscal).toPromise().then((res) => {
|
|
767
|
+
cuentas = res;
|
|
768
|
+
if (filtro) {
|
|
769
|
+
if (filtro.estado) {
|
|
770
|
+
cuentas = cuentas.filter(c => {
|
|
771
|
+
return c.status == filtro.estado;
|
|
772
|
+
});
|
|
773
|
+
}
|
|
774
|
+
if (filtro.tipo) {
|
|
775
|
+
cuentas = cuentas.filter(c => {
|
|
776
|
+
return c.tipo == filtro.tipo;
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
cuentas = cuentas.map(e => {
|
|
781
|
+
e['provStatus'] = e.status == "C" ? "Movimientos" : "Totalizadora";
|
|
782
|
+
e['provType'] = e.status == "R" ? "Recursos" : "Ingresos";
|
|
783
|
+
return e;
|
|
784
|
+
});
|
|
785
|
+
});
|
|
786
|
+
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus", "provType"], titulo, cuentas, ["Cuenta", "Denominación", "Estado", "Tipo"], ancho);
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* @description Abre el cátalogo de cuentas de la tabla "spi_cuentas"
|
|
790
|
+
* @returns Promise<MCuentaIngresos>
|
|
791
|
+
* @author Carlos Albornoz
|
|
792
|
+
* @params presupuesto: Indica si se a trabajar con estructura de presupuesto o no
|
|
793
|
+
*/
|
|
794
|
+
async openCatalogoCuentasIngreso(idEnterprise, periodoFiscal, nivel, idEP, titulo, ancho = "1000px", presupuesto = false) {
|
|
795
|
+
let cuentas = [];
|
|
796
|
+
await this.getIncomeAccounts('default', idEnterprise, periodoFiscal, nivel, idEP).toPromise().then((res) => {
|
|
797
|
+
cuentas = res.data;
|
|
798
|
+
cuentas = cuentas.filter(e => {
|
|
799
|
+
return e.estado == "C";
|
|
800
|
+
}).map(e => {
|
|
801
|
+
e['provStatus'] = e.estado == "C" ? "Movimientos" : "Totalizadora";
|
|
802
|
+
return e;
|
|
803
|
+
});
|
|
804
|
+
});
|
|
805
|
+
if (presupuesto) {
|
|
806
|
+
return this.openCatalogoDosInputs(["cuenta", "denominacion", "estructura", "provStatus"], titulo, cuentas, [{
|
|
807
|
+
placeholder: "Cuenta",
|
|
808
|
+
property: "cuenta"
|
|
809
|
+
}, {
|
|
810
|
+
placeholder: "Estructura",
|
|
811
|
+
property: "estructura"
|
|
812
|
+
}], ["Cuenta", "Denominación", "Estructura", "Estado"], ancho);
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
let filteredAccounts = [];
|
|
816
|
+
cuentas.forEach(c => {
|
|
817
|
+
if (!filteredAccounts.find(e => e.cuenta == c.cuenta)) {
|
|
818
|
+
filteredAccounts.push(c);
|
|
819
|
+
}
|
|
820
|
+
});
|
|
821
|
+
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus"], titulo, filteredAccounts, ["Cuenta", "Denominación", "Estado"], ancho);
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
getUnidadAdministrativa(tipo, idEnterprise, periodoFiscal, idUnidadOrganizativa) {
|
|
825
|
+
return this.http.get(`${this.URL}/dao/spg/unidad_administrativa_dao.php?tipo=${tipo}&e=${idEnterprise}&periodo=${periodoFiscal}&id=${idUnidadOrganizativa}`, { headers: this.getHttpHeaders() })
|
|
826
|
+
.pipe(map((res) => {
|
|
827
|
+
if (res.success) {
|
|
828
|
+
res.data = res.data.map(e => new MAdministrativeUnit(e));
|
|
829
|
+
}
|
|
830
|
+
return res;
|
|
831
|
+
}));
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* @description Obtiene los cargos de servicios
|
|
835
|
+
* @return Observable<IResponse>
|
|
836
|
+
* @author Carlos Albornoz
|
|
837
|
+
*/
|
|
838
|
+
getServiceCharges(serviceId = null) {
|
|
839
|
+
return this.http.get(`${this.URL}/dao/soc/servicio_cargo_dao.php${serviceId ? `?service_id=${serviceId}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
840
|
+
if (res.success) {
|
|
841
|
+
res.data = res.data.map(e => new MServiceCharge(e));
|
|
842
|
+
}
|
|
843
|
+
return res;
|
|
844
|
+
}));
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
847
|
+
* @description Obtiene los paises
|
|
848
|
+
* @return Observable<MCountry>
|
|
849
|
+
* @author Carlos Albornoz
|
|
850
|
+
* @modified 10-01-2022
|
|
851
|
+
* @param codigo: Codigo del pais
|
|
852
|
+
|
|
853
|
+
*/
|
|
854
|
+
getCountries(codigo) {
|
|
855
|
+
return this.http.get(`${this.URL}/dao/cfg/paises_dao.php?codigo=${codigo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MCountry(e))));
|
|
856
|
+
}
|
|
857
|
+
/**
|
|
858
|
+
* @description Obtiene los estados
|
|
859
|
+
* @return Observable<MState>
|
|
860
|
+
* @author Carlos Albornoz
|
|
861
|
+
* @modificado 4-12-2022
|
|
862
|
+
* @param codigo: Codigo del pais
|
|
863
|
+
*/
|
|
864
|
+
getStates(codigo) {
|
|
865
|
+
return this.http.get(`${this.URL}/dao/cfg/estados_dao.php?codigo=${codigo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MState(e))));
|
|
866
|
+
}
|
|
867
|
+
/**
|
|
868
|
+
* @description Obtiene los municipios
|
|
869
|
+
* @return Observable<MMunicipality>
|
|
870
|
+
* @author Carlos Albornoz
|
|
871
|
+
* @modificado 10-01-2022
|
|
872
|
+
* @param pais: Codigo del pais ,
|
|
873
|
+
* @param estado: Codigo del estado
|
|
874
|
+
* @actualizado 4-12-2022
|
|
875
|
+
*/
|
|
876
|
+
getMunicipalities(pais, estado) {
|
|
877
|
+
return this.http.get(`${this.URL}/dao/cfg/municipios_dao.php?pais=${pais}&estado=${estado}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MMunicipality(e))));
|
|
878
|
+
}
|
|
879
|
+
/**
|
|
880
|
+
* @description Obtiene las parroquias
|
|
881
|
+
* @return Observable<MParish>
|
|
882
|
+
* @author Carlos Albornoz
|
|
883
|
+
* @modificado 10-01-2022
|
|
884
|
+
* @param pais: Codigo del pais
|
|
885
|
+
* @param estado: Codigo del estado
|
|
886
|
+
* @param municipio:codigo Municipio
|
|
887
|
+
* @actualizado 4-12-2022
|
|
888
|
+
|
|
889
|
+
*/
|
|
890
|
+
getParishes(pais, estado, municipio) {
|
|
891
|
+
return this.http.get(`${this.URL}/dao/cfg/parroquias_dao.php?pais=${pais}&estado=${estado}&municipio=${municipio}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MParish(e))));
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* @description Obtiene las ciudades
|
|
895
|
+
* @return Observable<MParish>
|
|
896
|
+
* @author Carlos Albornoz
|
|
897
|
+
* @modificado 10-01-2022
|
|
898
|
+
* @param pais: Codigo del pais
|
|
899
|
+
* @param estado: Codigo del estado
|
|
900
|
+
|
|
901
|
+
|
|
902
|
+
*/
|
|
903
|
+
getCity(pais, estado) {
|
|
904
|
+
return this.http.get(`${this.URL}/dao/cfg/ciudades_dao.php?pais=${pais}&estado=${estado}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MCity(e))));
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* @description Obtiene las ciudades
|
|
908
|
+
* @return Observable<MParish>
|
|
909
|
+
* @author Dimaly Crespo
|
|
910
|
+
* @modificado 10-01-2022
|
|
911
|
+
* @param pais: Codigo del pais
|
|
912
|
+
|
|
913
|
+
*/
|
|
914
|
+
getCommunities(pais, estado, municipio, parroquia) {
|
|
915
|
+
return this.http.get(`${this.URL}/dao/cfg/comunidades_dao.php?pais=${pais}&estado=${estado}&municipio=${municipio}&parroquia=${parroquia}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MCommunity(e))));
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* @description Obtiene los sistemas activas
|
|
919
|
+
* @return Observable<MSistema>
|
|
920
|
+
* @author Carlos Albornoz
|
|
921
|
+
*/
|
|
922
|
+
getSistemas() {
|
|
923
|
+
return this.http.get(`${this.URL}/dao/sss/sistemas_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(e => new MSistema(e))));
|
|
924
|
+
}
|
|
925
|
+
/**
|
|
926
|
+
* @description Obtiene la moneda actual
|
|
927
|
+
* @return Observable<IResponse>
|
|
928
|
+
* @author Carlos Albornoz
|
|
929
|
+
* @actualizado: 4-12-20222
|
|
930
|
+
* @params id: id de la moneda,
|
|
931
|
+
* @params tipo: todas->obtiene todas las moneda, (uno-> obtiene una moneda + id)
|
|
932
|
+
* (mon:formato para inputCurrency + id )
|
|
933
|
+
*/
|
|
934
|
+
getCurrentCurrency(tipo = null, id) {
|
|
935
|
+
return this.http.get(`${this.URL}/dao/cfg/moneda_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
936
|
+
if (res.success) {
|
|
937
|
+
if (tipo == 'todas') {
|
|
938
|
+
res.data = res.data.map(e => new MMonedaConfig(e));
|
|
939
|
+
}
|
|
940
|
+
else {
|
|
941
|
+
res.data = new MMonedaConfig(res.data);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
return res;
|
|
945
|
+
}));
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* @description Obtiene la linea empresa
|
|
949
|
+
* @return Observable<IResponse>
|
|
950
|
+
* @author Dimaly Crespo
|
|
951
|
+
* @actualizado: 5-12-20222
|
|
952
|
+
*/
|
|
953
|
+
getEnterprise(tipo = null, id) {
|
|
954
|
+
return this.http.get(`${this.URL}/dao/cfg/enterprise_dao.php?tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
955
|
+
if (res.success) {
|
|
956
|
+
res.data = res.data.map(e => new MEnterprise(e));
|
|
957
|
+
}
|
|
958
|
+
return res;
|
|
959
|
+
}));
|
|
960
|
+
}
|
|
961
|
+
/**
|
|
962
|
+
* @description Obtiene los tipos de organizacion
|
|
963
|
+
* @return Observable<IResponse>
|
|
964
|
+
* @author Carlos Albornoz
|
|
965
|
+
*/
|
|
966
|
+
getOrganizationTypes() {
|
|
967
|
+
return this.http.get(`${this.URL}/dao/rpc/tipo_organizacion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
968
|
+
if (res.success) {
|
|
969
|
+
res.data = res.data.map(e => new MOrganizationType(e));
|
|
970
|
+
}
|
|
971
|
+
return res;
|
|
972
|
+
}));
|
|
973
|
+
}
|
|
974
|
+
/**
|
|
975
|
+
* @description Obtiene los tipos de organizacion
|
|
976
|
+
* @return Observable<IResponse>
|
|
977
|
+
* @author Carlos Albornoz
|
|
978
|
+
*/
|
|
979
|
+
getSpecialties() {
|
|
980
|
+
return this.http.get(`${this.URL}/dao/rpc/especialidad_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
981
|
+
if (res.success) {
|
|
982
|
+
res.data = res.data.map(e => new MSpecialty(e));
|
|
983
|
+
}
|
|
984
|
+
return res;
|
|
985
|
+
}));
|
|
986
|
+
}
|
|
987
|
+
/**
|
|
988
|
+
* @description Obtiene los documentos
|
|
989
|
+
* @return Observable<IResponse>
|
|
990
|
+
* @author Carlos Albornoz
|
|
991
|
+
*/
|
|
992
|
+
getDocuments() {
|
|
993
|
+
return this.http.get(`${this.URL}/dao/rpc/documento_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
994
|
+
if (res.success) {
|
|
995
|
+
res.data = res.data.map(e => new MDocument(e));
|
|
996
|
+
}
|
|
997
|
+
return res;
|
|
998
|
+
}));
|
|
999
|
+
}
|
|
1000
|
+
/**
|
|
1001
|
+
* @description Obtiene las clasificaciones
|
|
1002
|
+
* @return Observable<IResponse>
|
|
1003
|
+
* @author Carlos Albornoz
|
|
1004
|
+
*/
|
|
1005
|
+
getClasifications() {
|
|
1006
|
+
return this.http.get(`${this.URL}/dao/rpc/clasificacion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1007
|
+
if (res.success) {
|
|
1008
|
+
res.data = res.data.map(e => new MClasification(e));
|
|
1009
|
+
}
|
|
1010
|
+
return res;
|
|
1011
|
+
}));
|
|
1012
|
+
}
|
|
1013
|
+
/**
|
|
1014
|
+
* @description Obtiene el prefijo de los usuarios
|
|
1015
|
+
* @param procede De que módulo procede
|
|
1016
|
+
* @param codsis Código del sistema
|
|
1017
|
+
* @return Observable<MUsuarioPrefijo[]>
|
|
1018
|
+
* @author Carlos Albornoz
|
|
1019
|
+
*/
|
|
1020
|
+
getUserPrefix(filter = null, code = null, idEnterprise, periodo) {
|
|
1021
|
+
return this.http.get(`${this.URL}/dao/cfg/control_numero_dao.php${filter ? `?filter=${filter}&code=${code}&e=${idEnterprise}&periodo=${periodo}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1022
|
+
if (res.success) {
|
|
1023
|
+
res.data = res.data.map(e => new MUsuarioPrefijo(e));
|
|
1024
|
+
}
|
|
1025
|
+
return res;
|
|
1026
|
+
}));
|
|
1027
|
+
}
|
|
1028
|
+
/**
|
|
1029
|
+
* @description Obtiene los pefijo
|
|
1030
|
+
* @param procede De que módulo procede
|
|
1031
|
+
* @param codsis Código del sistema
|
|
1032
|
+
* @return Observable<MUsuarioPrefijo[]>
|
|
1033
|
+
* @author DimalyCrespo 17-12-2022
|
|
1034
|
+
*/
|
|
1035
|
+
getPrefix(filter = null, code = null) {
|
|
1036
|
+
return this.http.get(`${this.URL}/dao/cfg/control_numero_dao.php${filter ? `?filter=${filter}&code=${code}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1037
|
+
if (res.success) {
|
|
1038
|
+
res.data = res.data.map(e => new MPrefijo(e));
|
|
1039
|
+
}
|
|
1040
|
+
return res;
|
|
1041
|
+
}));
|
|
1042
|
+
}
|
|
1043
|
+
/**
|
|
1044
|
+
* @description Abre el dialog para buscar los proveedores
|
|
1045
|
+
* @return Promise<MProveedor>
|
|
1046
|
+
* @author Miguel Ramírez
|
|
1047
|
+
*/
|
|
1048
|
+
async openDialogProveedores(idEnterprise) {
|
|
1049
|
+
let proveedores = await this.getProveedores(idEnterprise).toPromise();
|
|
1050
|
+
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
1051
|
+
data: {
|
|
1052
|
+
columns: ['tipo', 'rif', 'nombre'],
|
|
1053
|
+
title: 'Catálogo de Proveedores y Beneficiarios',
|
|
1054
|
+
dataSource: proveedores
|
|
1055
|
+
},
|
|
1056
|
+
width: '450px',
|
|
1057
|
+
maxHeight: '90vh'
|
|
1058
|
+
});
|
|
1059
|
+
return dialogRef.afterClosed().toPromise();
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* @description Obtiene los proveedores
|
|
1063
|
+
* @return Observable<MProveedor[]>
|
|
1064
|
+
* @author Miguel Ramírez
|
|
1065
|
+
*/
|
|
1066
|
+
getProveedores(idEnterprise) {
|
|
1067
|
+
let request = {
|
|
1068
|
+
operacion: 'obtenerData',
|
|
1069
|
+
sigesp_conexion: {
|
|
1070
|
+
servidor: this.URL,
|
|
1071
|
+
usuario: this.usuarioActivo.getInterface()
|
|
1072
|
+
}
|
|
1073
|
+
};
|
|
1074
|
+
return this.http.post(`${this.URL}/dao/rpc/proveedor_beneficiario_dao.php?e=${idEnterprise}`, request).pipe(map((res) => res.map(element => new MProveedor(element))));
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* @description Obtiene los proveedores y beneficiarios
|
|
1078
|
+
* @Note Si quiere solo los datos basicos use los parametros ('S','P','N')
|
|
1079
|
+
* @return Observable<IResponse>
|
|
1080
|
+
* @author Carlos Albornoz
|
|
1081
|
+
* @type ={'P','B','S'}
|
|
1082
|
+
* @destination ={'P','B','C','A','N'}≈{Proveedor,Beneficiario,Contatista,Ambos,Ninguno}
|
|
1083
|
+
* @account ={'S','N'} para traer las cuentas bancarias del proveedor por defecto esta en N
|
|
1084
|
+
* @modificado 17-07-2023
|
|
1085
|
+
*/
|
|
1086
|
+
getProvidersAndBeneficiaries(type = 'default', idEnterprise, destination = null, account = 'N') {
|
|
1087
|
+
return this.http.get(`${this.URL}/dao/rpc/proveedor_beneficiario_dao.php${type ? `?provider_type=${type}` : ''}&e=${idEnterprise}&destination=${destination}&account=${account}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1088
|
+
if (res.success) {
|
|
1089
|
+
res.data = res.data.map(e => new MProviderBeneficiary(e));
|
|
1090
|
+
}
|
|
1091
|
+
return res;
|
|
1092
|
+
}));
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* @description Obtiene un Usuario segun su ID
|
|
1096
|
+
* @return Observable<IResponse>
|
|
1097
|
+
* @author Carlos Albornoz
|
|
1098
|
+
*/
|
|
1099
|
+
getUserById(id) {
|
|
1100
|
+
return this.http.get(`${this.URL}/dao/sss/usuario_dao.php?id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1101
|
+
if (res.success) {
|
|
1102
|
+
res.data = new MUsuario(res.data);
|
|
1103
|
+
}
|
|
1104
|
+
return res;
|
|
1105
|
+
}));
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* @description Obtiene los bancos
|
|
1109
|
+
* @return Observable<IResponse>
|
|
1110
|
+
* @author Carlos Albornoz
|
|
1111
|
+
*/
|
|
1112
|
+
getBanks(idEnterprise) {
|
|
1113
|
+
return this.http.get(`${this.URL}/dao/scb/banco_dao.php?e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1114
|
+
if (res.success) {
|
|
1115
|
+
res.data = res.data.map(e => new MBank(e));
|
|
1116
|
+
}
|
|
1117
|
+
return res;
|
|
1118
|
+
}));
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* @description Obtiene los tipos de cuenta bancarias
|
|
1122
|
+
* @return Observable<IResponse>
|
|
1123
|
+
* @author Carlos Albornoz
|
|
1124
|
+
*/
|
|
1125
|
+
getBankAccountTypes() {
|
|
1126
|
+
return this.http.get(`${this.URL}/dao/scb/banco_tipo_cuenta_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1127
|
+
if (res.success) {
|
|
1128
|
+
res.data = res.data.map(e => new MBankAccountType(e));
|
|
1129
|
+
}
|
|
1130
|
+
return res;
|
|
1131
|
+
}));
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* @description obtiene las cuenta segun el id
|
|
1135
|
+
* @param tipo {'banco', 'default'}
|
|
1136
|
+
* @param id para la opcion banco usar id=idBanco, opcion defaulf id=idEnterprise
|
|
1137
|
+
* @returns
|
|
1138
|
+
*/
|
|
1139
|
+
getAllBankAccount(tipo, id) {
|
|
1140
|
+
return this.http.get(`${this.URL}/dao/scb/cuenta_banco_dao.php?tipo=${tipo}&e=${id}`, { headers: this.getHttpHeaders() })
|
|
1141
|
+
.pipe(map((res) => {
|
|
1142
|
+
if (res.success) {
|
|
1143
|
+
res.data = res.data.map(element => new MCuentaBanco(element));
|
|
1144
|
+
}
|
|
1145
|
+
else {
|
|
1146
|
+
res.data = [];
|
|
1147
|
+
}
|
|
1148
|
+
return res;
|
|
1149
|
+
}));
|
|
1150
|
+
}
|
|
1151
|
+
/**
|
|
1152
|
+
* @description Obtiene los bancos sigecof
|
|
1153
|
+
* @return Observable<IResponse>
|
|
1154
|
+
* @author Carlos Albornoz
|
|
1155
|
+
*/
|
|
1156
|
+
getSigecofBanks() {
|
|
1157
|
+
return this.http.get(`${this.URL}/dao/cfg/banco_sigecof_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1158
|
+
if (res.success) {
|
|
1159
|
+
res.data = res.data.map(e => new MSigecofBank(e));
|
|
1160
|
+
}
|
|
1161
|
+
return res;
|
|
1162
|
+
}));
|
|
1163
|
+
}
|
|
1164
|
+
/**
|
|
1165
|
+
* @description Obtiene la configuracion de SOC
|
|
1166
|
+
* @return Observable<IResponse>
|
|
1167
|
+
* @author Carlos Albornoz
|
|
1168
|
+
*/
|
|
1169
|
+
getConfigSOC(idEnterprise) {
|
|
1170
|
+
return this.http.get(`${this.URL}/dao/soc/configuracion_dao.php?e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1171
|
+
if (res.success) {
|
|
1172
|
+
res.data = new MConfigSOC(res.data);
|
|
1173
|
+
}
|
|
1174
|
+
return res;
|
|
1175
|
+
}));
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* @description Obtiene los tipos de deduccion
|
|
1179
|
+
* @return Observable<IResponse>
|
|
1180
|
+
* @author Carlos Albornoz
|
|
1181
|
+
*/
|
|
1182
|
+
getDeductionTypes() {
|
|
1183
|
+
return this.http.get(`${this.URL}/dao/stb/tipo_deduccion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1184
|
+
if (res.success) {
|
|
1185
|
+
res.data = res.data.map(e => new MDeductionType(e));
|
|
1186
|
+
}
|
|
1187
|
+
return res;
|
|
1188
|
+
}));
|
|
1189
|
+
}
|
|
1190
|
+
getIncomeAccounts(tipo, idEnterprise, periodoFiscal, nivel = 0, idEP, estatus = '') {
|
|
1191
|
+
return this.http.get(`${this.URL}/dao/spi/cuentas_ingresos_dao.php?tipo=${tipo}&e=${idEnterprise}&per=${periodoFiscal}&niv=${nivel}&ep=${idEP}&est=${estatus}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1192
|
+
if (res.success) {
|
|
1193
|
+
res.data = res.data.map(e => new MCuentaIngresos(e));
|
|
1194
|
+
}
|
|
1195
|
+
return res;
|
|
1196
|
+
}));
|
|
1197
|
+
}
|
|
1198
|
+
getCharges(idEnterprise) {
|
|
1199
|
+
return this.http.get(`${this.URL}/dao/stb/cargos_dao.php?linea=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1200
|
+
if (res.success) {
|
|
1201
|
+
res.data = res.data.map(e => new MCargo(e));
|
|
1202
|
+
}
|
|
1203
|
+
return res;
|
|
1204
|
+
}));
|
|
1205
|
+
}
|
|
1206
|
+
getDeductions(idEnterprise) {
|
|
1207
|
+
return this.http.get(`${this.URL}/dao/stb/deducciones_dao.php?linea=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1208
|
+
if (res.success) {
|
|
1209
|
+
res.data = res.data.map(e => new MDeduction(e));
|
|
1210
|
+
}
|
|
1211
|
+
return res;
|
|
1212
|
+
}));
|
|
1213
|
+
}
|
|
1214
|
+
/**
|
|
1215
|
+
* @description Obtiene la los datos de Empresa
|
|
1216
|
+
* @return Observable<IResponse>
|
|
1217
|
+
* @author Dimaly Crespo
|
|
1218
|
+
*
|
|
1219
|
+
*/
|
|
1220
|
+
getCompany(tipo, id) {
|
|
1221
|
+
return this.http.get(`${this.URL}/dao/cfg/empresas_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1222
|
+
if (res.success) {
|
|
1223
|
+
res.data = res.data.map(e => new MEmpresa(e));
|
|
1224
|
+
}
|
|
1225
|
+
return res;
|
|
1226
|
+
}));
|
|
1227
|
+
}
|
|
1228
|
+
/**
|
|
1229
|
+
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1230
|
+
* @return Observable<IResponse>
|
|
1231
|
+
* @author Dimaly Crespo
|
|
1232
|
+
* @date 20-07-2021
|
|
1233
|
+
*/
|
|
1234
|
+
getTiposDocumetos(idEnterprise) {
|
|
1235
|
+
return this.http.get(`${this.URL}/dao/cxp/tipo_documento_dao.php?operacion=${'buscar'}&i=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1236
|
+
if (res.success) {
|
|
1237
|
+
res.data = res.data.map(e => new MTipoDocumentoCXP(e));
|
|
1238
|
+
}
|
|
1239
|
+
return res;
|
|
1240
|
+
}));
|
|
1241
|
+
}
|
|
1242
|
+
/**
|
|
1243
|
+
* @param get toma los valores: [ idOrdenCompra ,'recepcion','existen','codigo', 'ordenesSOC', 'op', 'art' ]
|
|
1244
|
+
* @param n codigo Documento Orden, se usa para obtener los detalles de la orden de compra, es obligatorio al combinar con la opcion get: idOrdenCompra
|
|
1245
|
+
* @description 'recepcion': Obtine las ordenes de suministro,
|
|
1246
|
+
* existe y codigo: Obtiene los codigos registrados,
|
|
1247
|
+
* ordenesSOC: obtiene las ordenes de compra,
|
|
1248
|
+
* op: obtiene las ordenes pendientes
|
|
1249
|
+
* art: obtiene los articulos
|
|
1250
|
+
* @return Observable<IResponse>
|
|
1251
|
+
* @date 3-10-2021
|
|
1252
|
+
* @returns
|
|
1253
|
+
*/
|
|
1254
|
+
getEntradaSuministros(get, n) {
|
|
1255
|
+
return this.http.get(`${this.URL}/dao/siv/entrada_suministro_dao.php?get=${get}&n=${n}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1256
|
+
if (res.success) {
|
|
1257
|
+
res.data = res.data.map(e => new MEntradaSuministros(e));
|
|
1258
|
+
}
|
|
1259
|
+
return res;
|
|
1260
|
+
}));
|
|
1261
|
+
}
|
|
1262
|
+
/**
|
|
1263
|
+
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1264
|
+
* @return Observable<IResponse>
|
|
1265
|
+
* @author Dimaly Crespo
|
|
1266
|
+
* @date 20-07-2021
|
|
1267
|
+
*/
|
|
1268
|
+
getConceptosCxP(idEnterprise) {
|
|
1269
|
+
return this.http.get(`${this.URL}/dao/cxp/concepto_dao.php?operacion=${'buscar'}&i=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1270
|
+
if (res.success) {
|
|
1271
|
+
res.data = res.data.map(e => new MConceptosCXP(e));
|
|
1272
|
+
}
|
|
1273
|
+
return res;
|
|
1274
|
+
}));
|
|
1275
|
+
}
|
|
1276
|
+
/**
|
|
1277
|
+
* @description Obtiene los los conceptos Retencion ISRL
|
|
1278
|
+
* @return Observable<IResponse>
|
|
1279
|
+
* @author Dimaly Crespo
|
|
1280
|
+
* @date 26-07-2021
|
|
1281
|
+
*/
|
|
1282
|
+
getConceptosRetencion(tipo, idTipoDeduccion) {
|
|
1283
|
+
return this.http.get(`${this.URL}/dao/stb/deducciones_dao.php?tipo=${tipo}&code=${idTipoDeduccion}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1284
|
+
if (res.success) {
|
|
1285
|
+
res.data = res.data.map(e => new MConceptoRetencion(e));
|
|
1286
|
+
}
|
|
1287
|
+
return res;
|
|
1288
|
+
}));
|
|
1289
|
+
}
|
|
1290
|
+
/**
|
|
1291
|
+
* @description Obtiene la configuración de RRHH y de SNO
|
|
1292
|
+
* @return Observable<IResponse>
|
|
1293
|
+
* @author Dimaly Crespo
|
|
1294
|
+
*/
|
|
1295
|
+
obtenerConfiguracionSNO(idEnterprise) {
|
|
1296
|
+
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1297
|
+
if (res.success) {
|
|
1298
|
+
if (res.data.length > 0) {
|
|
1299
|
+
res.data = res.data.map(e => new MConfiguracionSNO(e));
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
return res;
|
|
1303
|
+
}));
|
|
1304
|
+
}
|
|
1305
|
+
/**
|
|
1306
|
+
*
|
|
1307
|
+
* @param tipo ['default', 'uno', 'cargos','linea'] dafault:Todas las nominas, uno: una nomina,
|
|
1308
|
+
* 'cargos': nominas por cargos, 'linea': nominas activas por lineas
|
|
1309
|
+
* @param id : Para los tipo: uno y cargos el id es idNomina. Para linea: id es el idEnterprise
|
|
1310
|
+
* @returns array()
|
|
1311
|
+
* @description Obtiene las nominas registradas
|
|
1312
|
+
* @return Observable<IResponse>
|
|
1313
|
+
* @date 20-10-21
|
|
1314
|
+
* @actualizado 26-05-2024
|
|
1315
|
+
*
|
|
1316
|
+
*/
|
|
1317
|
+
getNomina(tipo, idEnterprise, id, act) {
|
|
1318
|
+
return this.http.get(`${this.URL}/dao/sno/definicion_nomina_dao.php?tipo=${tipo}&id=${id}&e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1319
|
+
if (res.success) {
|
|
1320
|
+
res.data = res.data.map(e => new MDefinicionNomina(e));
|
|
1321
|
+
}
|
|
1322
|
+
return res;
|
|
1323
|
+
}));
|
|
1324
|
+
}
|
|
1325
|
+
/**
|
|
1326
|
+
* @description Obtiene los cargos de las nomina
|
|
1327
|
+
* @param tipo ['codigo','default'] ->codigo: obtiene el proximo codigo. ->default: obtiene todos los cargos de la nomina
|
|
1328
|
+
* @param id id de la nomina
|
|
1329
|
+
* @returns array()
|
|
1330
|
+
*/
|
|
1331
|
+
getCargosNomina(tipo, id) {
|
|
1332
|
+
return this.http.get(`${this.URL}/dao/sno/asignacion_cargos_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1333
|
+
if (res.success) {
|
|
1334
|
+
res.data = res.data.map(e => new MAsignacionCargo(e));
|
|
1335
|
+
}
|
|
1336
|
+
return res;
|
|
1337
|
+
}));
|
|
1338
|
+
}
|
|
1339
|
+
/**
|
|
1340
|
+
* @description Obtiene un personal de la nómina
|
|
1341
|
+
* @return Observable<IResponse>
|
|
1342
|
+
* @author Dimaly Crespo
|
|
1343
|
+
*/
|
|
1344
|
+
getPersonalSRH(tipo, idEnterprise, id) {
|
|
1345
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?tipo=${tipo}&id=${id}&e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1346
|
+
if (res.success) {
|
|
1347
|
+
res.data = res.data.map(e => new MPersonal(e));
|
|
1348
|
+
}
|
|
1349
|
+
return res;
|
|
1350
|
+
}));
|
|
1351
|
+
}
|
|
1352
|
+
/**
|
|
1353
|
+
* @description Obtiene las agencia de banco
|
|
1354
|
+
* @return Observable<IResponse>
|
|
1355
|
+
* @author Dimaly Crespo
|
|
1356
|
+
*/
|
|
1357
|
+
getAgenciaBanco(tipo, idEnterprise, id) {
|
|
1358
|
+
return this.http.get(`${this.URL}/dao/scb/agencia_dao.php?code=${tipo}&id=${id}e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1359
|
+
if (res.success) {
|
|
1360
|
+
res.data = res.data.map(e => new MAgenciaBanco(e));
|
|
1361
|
+
}
|
|
1362
|
+
return res;
|
|
1363
|
+
}));
|
|
1364
|
+
}
|
|
1365
|
+
/**
|
|
1366
|
+
* @description Obtiene la hojas de tiempo
|
|
1367
|
+
* @return Observable<IResponse>
|
|
1368
|
+
* @author Dimaly Crespo
|
|
1369
|
+
*/
|
|
1370
|
+
getHojaTiempo(tipo, idPersonal, idNomina) {
|
|
1371
|
+
return this.http.get(`${this.URL}/dao/sno/hoja_tiempo_dao.php?idPersonal=${idPersonal}&idNomina=${idNomina}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1372
|
+
if (res.success) {
|
|
1373
|
+
res.data = res.data.map(e => new MHojaTiempo(e));
|
|
1374
|
+
}
|
|
1375
|
+
return res;
|
|
1376
|
+
}));
|
|
1377
|
+
}
|
|
1378
|
+
/**
|
|
1379
|
+
* @description Obtiene los clientes
|
|
1380
|
+
* @return Observable<IResponse>
|
|
1381
|
+
* @author Dimaly Crespo
|
|
1382
|
+
* @tipo [basico,codigo,cedula]
|
|
1383
|
+
*
|
|
1384
|
+
*/
|
|
1385
|
+
getCliente(tipo = 'default', id = 0, codigo = '', cedula = '') {
|
|
1386
|
+
return this.http.get(`${this.URL}/dao/sfv/client_dao.php?tipo=${tipo}&id=${id}&codigo=${codigo}&cedrifcli=${cedula}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1387
|
+
if (res.success) {
|
|
1388
|
+
res.data = res.data.map(e => new MClient(e));
|
|
1389
|
+
}
|
|
1390
|
+
return res;
|
|
1391
|
+
}));
|
|
1392
|
+
}
|
|
1393
|
+
/**
|
|
1394
|
+
* @description Valida si la fecha esta dentro del periodo fiscal y el mes esta abierto o cerrado
|
|
1395
|
+
* @return Observable<IResponse>
|
|
1396
|
+
* @param fecha: fecha a comparar
|
|
1397
|
+
* @param lineaEmpresa: linea empresa del documento
|
|
1398
|
+
* @param periodoFiscal : fecha del periodo a evaluar '1900-01-01'
|
|
1399
|
+
* @author Dimaly Crespo
|
|
1400
|
+
* @fecha 11-10-2023
|
|
1401
|
+
*
|
|
1402
|
+
*/
|
|
1403
|
+
getValidarPeriodo(fecha, periodoFiscal, lineaEmpresa) {
|
|
1404
|
+
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php?tipo=${'validaFecha'}&fecha=${fecha}&periodo=${periodoFiscal}&e=${lineaEmpresa}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res; }));
|
|
1405
|
+
}
|
|
1406
|
+
/**
|
|
1407
|
+
* @description Obtiene los periodo fiscales configurados en SCG y SPG menores o iguales al periodo fiscal actual.
|
|
1408
|
+
* @return Observable<IResponse>
|
|
1409
|
+
* @param lineaEmpresa: linea empresa del documento
|
|
1410
|
+
* @author Dimaly Crespo
|
|
1411
|
+
* @fecha 01-10-2024
|
|
1412
|
+
*/
|
|
1413
|
+
getPeriodosConfigurados(lineaEmpresa) {
|
|
1414
|
+
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php?tipo=${'periodoConfig'}&e=${lineaEmpresa}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res; }));
|
|
1415
|
+
}
|
|
1416
|
+
/**
|
|
1417
|
+
* @description Obtiene los periodo fiscales configurados en SCG y SPG menores al periodo fiscal actual y el inmediato.
|
|
1418
|
+
* @return Observable<IResponse>
|
|
1419
|
+
* @param lineaEmpresa: linea empresa del documento
|
|
1420
|
+
* @author Dimaly Crespo
|
|
1421
|
+
* @fecha 01-10-2024
|
|
1422
|
+
*/
|
|
1423
|
+
getPeriodosConfiguradosSCGSPG(lineaEmpresa) {
|
|
1424
|
+
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php?tipo=${'periodoSCGSPG'}&e=${lineaEmpresa}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res; }));
|
|
1425
|
+
}
|
|
1426
|
+
userHasRights(column) {
|
|
1427
|
+
return this.http.get(`${this.URL}/dao/sss/derechos_usuario_dao.php?idComponent=${this.currentComponent.id}&column=${column}`, { headers: this.getHttpHeaders() });
|
|
1428
|
+
}
|
|
1429
|
+
/**
|
|
1430
|
+
* @description Retorna los headers para hacer las peticiones
|
|
1431
|
+
* @params type: Tipo MIME permitido por defecto se toma application/json
|
|
1432
|
+
* @return HttpHeaders
|
|
1433
|
+
* @author Miguel Ramírez
|
|
1434
|
+
* @date-update: 15-06-2022
|
|
1435
|
+
*/
|
|
1436
|
+
getHttpHeaders(type) {
|
|
1437
|
+
!type ? type = 'application/json' : '';
|
|
1438
|
+
const headers = new HttpHeaders({
|
|
1439
|
+
'Content-Type': type,
|
|
1440
|
+
'Authorization': `${this.usuarioActivo.token}`
|
|
1441
|
+
});
|
|
1442
|
+
return headers;
|
|
1443
|
+
}
|
|
1444
|
+
/**
|
|
1445
|
+
* @description Obtiene el servidor guardado en el sessionStorage
|
|
1446
|
+
* @return string
|
|
1447
|
+
* @author Miguel Ramírez
|
|
1448
|
+
*/
|
|
1449
|
+
getServer() {
|
|
1450
|
+
return this.URL;
|
|
1451
|
+
}
|
|
1452
|
+
/**
|
|
1453
|
+
* @description Obtiene el usuario guardado en el sessionStorage
|
|
1454
|
+
* @return MUsuario
|
|
1455
|
+
* @author Miguel Ramírez
|
|
1456
|
+
*/
|
|
1457
|
+
async getUser() {
|
|
1458
|
+
let conexion = await (sessionStorage.getItem('user')) ? JSON.parse(atob(sessionStorage.getItem('user'))) : null;
|
|
1459
|
+
//console.log(conexion)
|
|
1460
|
+
// debugger
|
|
1461
|
+
if (conexion) {
|
|
1462
|
+
this.usuarioActivo = new MUsuario(conexion.usuario);
|
|
1463
|
+
this.URL = conexion.servidor;
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
/**
|
|
1467
|
+
* @description Muestra un toast de success
|
|
1468
|
+
* @param message Mensaje que se va a mostrar
|
|
1469
|
+
* @return void
|
|
1470
|
+
* @author Miguel Ramírez
|
|
1471
|
+
*/
|
|
1472
|
+
showToastSuccess(message) {
|
|
1473
|
+
this.toast.success(message);
|
|
1474
|
+
}
|
|
1475
|
+
/**
|
|
1476
|
+
* @description Muestra un toast de error
|
|
1477
|
+
* @param message Mensaje que se va a mostrar
|
|
1478
|
+
* @return void
|
|
1479
|
+
* @author Miguel Ramírez
|
|
1480
|
+
*/
|
|
1481
|
+
showToastError(message) {
|
|
1482
|
+
this.toast.error(message);
|
|
1483
|
+
}
|
|
1484
|
+
/**
|
|
1485
|
+
* @description Muestra un sweetalert2 de éxito
|
|
1486
|
+
* @param message Mensaje que se va a mostrar
|
|
1487
|
+
* @return void
|
|
1488
|
+
* @date 22-11-2021
|
|
1489
|
+
*/
|
|
1490
|
+
showToastSuccessSwal(message) {
|
|
1491
|
+
Swal.fire({
|
|
1492
|
+
icon: 'success',
|
|
1493
|
+
title: 'Éxito',
|
|
1494
|
+
text: message,
|
|
1495
|
+
});
|
|
1496
|
+
}
|
|
1497
|
+
/**
|
|
1498
|
+
* @description Muestra un sweetalert2 de error
|
|
1499
|
+
* @param message Mensaje que se va a mostrar
|
|
1500
|
+
* @return void
|
|
1501
|
+
* @date 22-11-2021
|
|
1502
|
+
*/
|
|
1503
|
+
showToastErrorSwal(message) {
|
|
1504
|
+
Swal.fire({
|
|
1505
|
+
icon: 'error',
|
|
1506
|
+
title: '¡Error!',
|
|
1507
|
+
text: message,
|
|
1508
|
+
});
|
|
1509
|
+
}
|
|
1510
|
+
/**
|
|
1511
|
+
* @description Guarda el usuario logueado en el SessionStorage
|
|
1512
|
+
* @param user Usuario que se va a guardar en el SessionStorage
|
|
1513
|
+
* @return void
|
|
1514
|
+
* @author Miguel Ramírez
|
|
1515
|
+
*/
|
|
1516
|
+
saveUser(data) {
|
|
1517
|
+
this.usuarioActivo = new MUsuario(data.usuario);
|
|
1518
|
+
this.URL = data.servidor;
|
|
1519
|
+
let encryptedUser = btoa(JSON.stringify(data));
|
|
1520
|
+
sessionStorage.setItem('user', encryptedUser);
|
|
1521
|
+
}
|
|
1522
|
+
/**
|
|
1523
|
+
* @description Sete a la url a la cual se le van a realizar peticiones al backEnd
|
|
1524
|
+
* @param url URl donde se van a realizar las peticiones
|
|
1525
|
+
* @return void
|
|
1526
|
+
* @author Miguel Ramírez
|
|
1527
|
+
*/
|
|
1528
|
+
setUrl(url) {
|
|
1529
|
+
this.URL = url;
|
|
1530
|
+
}
|
|
1531
|
+
/**
|
|
1532
|
+
* @description Inicializa el servicio de sigesp
|
|
1533
|
+
* @return void
|
|
1534
|
+
* @author Miguel Ramírez
|
|
1535
|
+
*/
|
|
1536
|
+
init() {
|
|
1537
|
+
// Verificamos si hay un usuario en la sessionStorage, esto es necesario para recargar la página
|
|
1538
|
+
if (sessionStorage.getItem('user')) {
|
|
1539
|
+
// console.log(sessionStorage.getItem('user'))
|
|
1540
|
+
this.getUser();
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
/**
|
|
1544
|
+
* @description Verifica si un usuario está logueado
|
|
1545
|
+
* @return Promise<boolean>
|
|
1546
|
+
* @author Miguel Ramírez
|
|
1547
|
+
*/
|
|
1548
|
+
async isLogged() {
|
|
1549
|
+
return new Promise((resolve, reject) => {
|
|
1550
|
+
if (sessionStorage.getItem('user')) {
|
|
1551
|
+
resolve(true);
|
|
1552
|
+
}
|
|
1553
|
+
else {
|
|
1554
|
+
resolve(false);
|
|
1555
|
+
}
|
|
1556
|
+
});
|
|
1557
|
+
}
|
|
1558
|
+
handlerError(error) {
|
|
1559
|
+
return throwError('Ocurrió un error');
|
|
1560
|
+
}
|
|
1561
|
+
/**
|
|
1562
|
+
* @description obtiene el personal segun filtro
|
|
1563
|
+
* @return Observable<IResponse>
|
|
1564
|
+
* @date 15-11-2021
|
|
1565
|
+
* @param tipo: valores ['catalogo','catalogoSno','default','nomina','responsables']
|
|
1566
|
+
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo' o 'catalogoSno'
|
|
1567
|
+
*/
|
|
1568
|
+
getPersonal(tipo, dato) {
|
|
1569
|
+
let cedula = '';
|
|
1570
|
+
let nombre = '';
|
|
1571
|
+
let apellido = '';
|
|
1572
|
+
let idEnterprise = 0;
|
|
1573
|
+
if (dato) {
|
|
1574
|
+
cedula = dato.cedula;
|
|
1575
|
+
nombre = dato.nombre;
|
|
1576
|
+
apellido = dato.apellido;
|
|
1577
|
+
idEnterprise = dato.idEnterprise;
|
|
1578
|
+
}
|
|
1579
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?tipo=${tipo}&cedula=${cedula}&nombre=${nombre}&apellido=${apellido}&e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1580
|
+
if (res.success) {
|
|
1581
|
+
res.data = res.data.map(e => new MPersonal(e));
|
|
1582
|
+
}
|
|
1583
|
+
return res;
|
|
1584
|
+
}));
|
|
1585
|
+
}
|
|
1586
|
+
/**
|
|
1587
|
+
* @description obtener personal Nomina segun filtro
|
|
1588
|
+
* @return Observable<IResponse>
|
|
1589
|
+
* @date 15-11-2021
|
|
1590
|
+
* * @param tipo: valores ['catalogo','default','nomina']
|
|
1591
|
+
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo'
|
|
1592
|
+
|
|
1593
|
+
*/
|
|
1594
|
+
getPersonalNomina(tipo, dato) {
|
|
1595
|
+
let cedula = '';
|
|
1596
|
+
let nombre = '';
|
|
1597
|
+
let apellido = '';
|
|
1598
|
+
let idEnterprise = 0;
|
|
1599
|
+
let idNomina = 0;
|
|
1600
|
+
if (dato) {
|
|
1601
|
+
cedula = dato.cedula;
|
|
1602
|
+
nombre = dato.nombre;
|
|
1603
|
+
apellido = dato.apellido;
|
|
1604
|
+
idEnterprise = dato.idEnterprise;
|
|
1605
|
+
idNomina = dato.idNomina;
|
|
1606
|
+
}
|
|
1607
|
+
return this.http.get(`${this.URL}/dao/sno/asignacion_personal_nomina_dao.php?
|
|
1608
|
+
tipo=${tipo}&cedula=${cedula}&nombre=${nombre}&apellido=${apellido}&idNomina=${idNomina}&idEnterprise=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1609
|
+
if (res.success) {
|
|
1610
|
+
res.data = res.data.map(e => new MPersonalNomina(e));
|
|
1611
|
+
}
|
|
1612
|
+
return res;
|
|
1613
|
+
}));
|
|
1614
|
+
}
|
|
1615
|
+
/**
|
|
1616
|
+
* @param idPersonal: id del personal
|
|
1617
|
+
* @param tipo: valores['nomina_personal']
|
|
1618
|
+
* @description Obtiene las nominas del personal resumida
|
|
1619
|
+
* @deprecated; 20-01-22
|
|
1620
|
+
* @returns
|
|
1621
|
+
*/
|
|
1622
|
+
getPersonalNominaResumida(idPersonal, tipo) {
|
|
1623
|
+
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?idPersonal=${idPersonal}&tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1624
|
+
if (res.success) {
|
|
1625
|
+
res.data = res.data.map(e => new MNominaSimple(e));
|
|
1626
|
+
}
|
|
1627
|
+
return res;
|
|
1628
|
+
}));
|
|
1629
|
+
}
|
|
1630
|
+
/**
|
|
1631
|
+
* @description Obtiene el Json Sistemas para el usuario definido segun su permisologia del Sistema
|
|
1632
|
+
* @return Json data
|
|
1633
|
+
* @author Ing. Dimaly Crespo
|
|
1634
|
+
*/
|
|
1635
|
+
getPerfilSistema(id_usuario) {
|
|
1636
|
+
return this.http.get(`${this.URL}/dao/sss/usuarios_sistemas_dao.php?id_usuario=${id_usuario}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1637
|
+
if (res.data.length > 0) {
|
|
1638
|
+
res.data = res.data.map(e => new MUsuarioSistema(e));
|
|
1639
|
+
}
|
|
1640
|
+
return res;
|
|
1641
|
+
}));
|
|
1642
|
+
}
|
|
1643
|
+
/**
|
|
1644
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1645
|
+
* @return Json data
|
|
1646
|
+
* @author Ing. Wilmer Briceno
|
|
1647
|
+
*/
|
|
1648
|
+
getPerfilNoComponent(id_usuario, sistema, nameComponent) {
|
|
1649
|
+
return this.http.get(`${this.URL}/dao/sss/derechos_usuario_dao.php?id_usuario=${id_usuario}&sistema=${sistema}&namecomponent=${nameComponent}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1650
|
+
return res;
|
|
1651
|
+
}));
|
|
1652
|
+
}
|
|
1653
|
+
/**
|
|
1654
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1655
|
+
* @return Json data
|
|
1656
|
+
* @author Ing. Wilmer Briceno
|
|
1657
|
+
*/
|
|
1658
|
+
getJsonMenu(id_usuario, sistema) {
|
|
1659
|
+
return this.http.get(`${this.URL}/dao/sss/menu_dao.php?id_usuario=${id_usuario}&sistema=${sistema}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1660
|
+
this.userMenu = res.data;
|
|
1661
|
+
return this.userMenu;
|
|
1662
|
+
}));
|
|
1663
|
+
}
|
|
1664
|
+
/**
|
|
1665
|
+
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1666
|
+
* @return Json data
|
|
1667
|
+
* @author Ing. Wilmer Briceno
|
|
1668
|
+
*/
|
|
1669
|
+
log(body) {
|
|
1670
|
+
return this.http.post(`${this.URL}/dao/sss/log_dao.php`, body, {
|
|
1671
|
+
headers: this.getHttpHeaders()
|
|
1672
|
+
}).pipe(map((res) => {
|
|
1673
|
+
return res;
|
|
1674
|
+
}));
|
|
1675
|
+
}
|
|
1676
|
+
/**
|
|
1677
|
+
* @name EncryptData
|
|
1678
|
+
* @description Enscripta una expresion data
|
|
1679
|
+
* @author Ing. Wilmer Briceño
|
|
1680
|
+
*/
|
|
1681
|
+
EncryptData(expresion) {
|
|
1682
|
+
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1683
|
+
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1684
|
+
let srcs = CryptoJS.enc.Utf8.parse(expresion);
|
|
1685
|
+
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1686
|
+
return encrypted.ciphertext.toString().toUpperCase();
|
|
1687
|
+
}
|
|
1688
|
+
/**
|
|
1689
|
+
* @name DecryptData
|
|
1690
|
+
* @description Desencripta una expresion data
|
|
1691
|
+
* @author Ing. Wilmer Briceño
|
|
1692
|
+
*/
|
|
1693
|
+
DecryptData(expresion) {
|
|
1694
|
+
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1695
|
+
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1696
|
+
let encryptedHexStr = CryptoJS.enc.Hex.parse(expresion);
|
|
1697
|
+
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
|
|
1698
|
+
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1699
|
+
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
|
|
1700
|
+
return decryptedStr.toString();
|
|
1701
|
+
}
|
|
1702
|
+
/**
|
|
1703
|
+
* @name getResponsePerfilToolbar
|
|
1704
|
+
* @description Metodo que obtiene una respuesta true o false basado en una estructura sring binanria segun
|
|
1705
|
+
* la posicion dada del toolbar. se pasa string binario que contiene 1 y 0 en representacion
|
|
1706
|
+
* de las propiestades administrador,consultar,ejecutar,imprimir etc ... cada posicion secuencial
|
|
1707
|
+
* si esta en 1 es true y 0 en false y devuleve el valor segun lo requiera el usuario:
|
|
1708
|
+
* stringbinario : '1011' y posicion es 2, por tanto se tare 0 y es false que representa opcion consultar.
|
|
1709
|
+
* Estructura string binario:
|
|
1710
|
+
* Posición :
|
|
1711
|
+
* 0. Administrador 6. Descargar 12. Reversar aprobar 18. Reversar anular contabilizado
|
|
1712
|
+
* 1. insertar 7. Ejecutar 13. Anular.
|
|
1713
|
+
* 2. Actualizar 8. Enviar 14. reversar anular
|
|
1714
|
+
* 3. consultar 9. Imprimir 15. contabilizar
|
|
1715
|
+
* 4. Eliminar 10. Visible 16. reversar contabilizar
|
|
1716
|
+
* 5. Anular 11. Aprobar 17. anular contabilizado
|
|
1717
|
+
*
|
|
1718
|
+
* @author Ing. Wilmer Briceño
|
|
1719
|
+
*/
|
|
1720
|
+
getResponsePerfilToolbar(stringbinario, position) {
|
|
1721
|
+
let binario = stringbinario.substring(position, position + 1);
|
|
1722
|
+
if (binario == "1") {
|
|
1723
|
+
return true;
|
|
1724
|
+
}
|
|
1725
|
+
return false;
|
|
1726
|
+
}
|
|
1727
|
+
/**
|
|
1728
|
+
* @description Obtiene el Ip del cliente
|
|
1729
|
+
* @return Json data
|
|
1730
|
+
* @author Ing. Wilmer Briceno
|
|
1731
|
+
*/
|
|
1732
|
+
getIPAddress() {
|
|
1733
|
+
return this.http.get("http://api.ipify.org/?format=json")
|
|
1734
|
+
.pipe(catchError((err) => {
|
|
1735
|
+
console.log('error caught in service');
|
|
1736
|
+
console.error(err);
|
|
1737
|
+
sessionStorage.setItem('ip_adress', '127.0.0.1');
|
|
1738
|
+
//Handle the error here
|
|
1739
|
+
return throwError(err); //Rethrow it back to component
|
|
1740
|
+
}));
|
|
1741
|
+
}
|
|
1742
|
+
/**
|
|
1743
|
+
* @description Obtiene el Ip del cliente
|
|
1744
|
+
* @return Json data
|
|
1745
|
+
* @author Ing. Wilmer Briceno
|
|
1746
|
+
*/
|
|
1747
|
+
setIpAdress() {
|
|
1748
|
+
this.getIPAddress().subscribe((resp) => {
|
|
1749
|
+
sessionStorage.setItem('ip_adress', resp.ip);
|
|
1750
|
+
this.ip_adress = resp.ip;
|
|
1751
|
+
});
|
|
1752
|
+
}
|
|
1753
|
+
/**
|
|
1754
|
+
* @description Obtiene el Ip del cliente
|
|
1755
|
+
* @return Json data
|
|
1756
|
+
* @author Ing. Wilmer Briceno
|
|
1757
|
+
*/
|
|
1758
|
+
getIpAdress() {
|
|
1759
|
+
this.ip_adress = sessionStorage.getItem('ip_adress');
|
|
1760
|
+
}
|
|
1761
|
+
/**
|
|
1762
|
+
* @description Obtiene el Ip del cliente
|
|
1763
|
+
* @return Json data
|
|
1764
|
+
* @dia 19-05-2022
|
|
1765
|
+
*/
|
|
1766
|
+
createAuditoria(sno) {
|
|
1767
|
+
let body = [];
|
|
1768
|
+
sno.forEach(e => { body.push(e.dataInteface()); });
|
|
1769
|
+
return this.http.post(`${this.URL}/dao/sno/seguridad_dao.php?`, body, { headers: this.getHttpHeaders() })
|
|
1770
|
+
.pipe(map((res) => { return res; }));
|
|
1771
|
+
}
|
|
1772
|
+
/**
|
|
1773
|
+
* @description Obtiene los tipos de depositos *
|
|
1774
|
+
* @param procede : procede del modulo
|
|
1775
|
+
* @param idMaterial : id del articulo
|
|
1776
|
+
* @param idUsuario : id usuario permitido
|
|
1777
|
+
* @returns
|
|
1778
|
+
* @author Dimaly Crespo
|
|
1779
|
+
* @date 23-01-2025
|
|
1780
|
+
*/
|
|
1781
|
+
getDepositType(procede, idMaterial, idEnterprise) {
|
|
1782
|
+
return this.http.get(`${this.URL}/dao/siv/catalogo_parametrizado_dao.php?get=${procede}&id=${idMaterial}&i=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1783
|
+
if (res.success) {
|
|
1784
|
+
res.data = res.data.map(e => new MTipoDepositos(e));
|
|
1785
|
+
}
|
|
1786
|
+
return res;
|
|
1787
|
+
}));
|
|
1788
|
+
}
|
|
1789
|
+
/**
|
|
1790
|
+
* @description Obtiene Cargos Adicionales *
|
|
1791
|
+
* @param tipo : one,default
|
|
1792
|
+
* @param id : id del cargo
|
|
1793
|
+
* @returns
|
|
1794
|
+
* @author Dimaly Crespo
|
|
1795
|
+
* @date 13-11-2022
|
|
1796
|
+
*/
|
|
1797
|
+
getCargosAdicionales(tipo, id) {
|
|
1798
|
+
return this.http.get(`${this.URL}/dao/stb/cargos_adicionales_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1799
|
+
if (res.success) {
|
|
1800
|
+
res.data = res.data.map(e => new MCargosAdicionales(e));
|
|
1801
|
+
}
|
|
1802
|
+
return res;
|
|
1803
|
+
}));
|
|
1804
|
+
}
|
|
1805
|
+
/**
|
|
1806
|
+
* @description Obtiene los release
|
|
1807
|
+
* @param tipo : release (obtiene el ultimo release del sistema),verificar(verifica si se ejecuto el ultimo release)
|
|
1808
|
+
* @param sistema : sistema
|
|
1809
|
+
* @param seccion : tipo 'RELEASE'
|
|
1810
|
+
* @returns string
|
|
1811
|
+
* @author Dimaly Crespo
|
|
1812
|
+
* @date 21-06-2024
|
|
1813
|
+
*/
|
|
1814
|
+
getVerificarRelease(tipo, sistema, seccion = null) {
|
|
1815
|
+
return this.http.get(`${this.URL}/dao/ins/instala_dao.php?tipo=${tipo}&sistema=${sistema}&seccion=${seccion}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res; }));
|
|
1816
|
+
}
|
|
1817
|
+
getReportePersonalizado(tipo = 'default', idEnterprise, sistema, caso) {
|
|
1818
|
+
return this.http.get(`${this.URL}/dao/cfg/configuracionErp_dao.php?tipo=${tipo}&e=${idEnterprise}&sis=${sistema}&cas=${caso}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res.data; }));
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
SigespService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SigespService, deps: [{ token: i1.HttpClient }, { token: i2.MatDialog }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1822
|
+
SigespService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SigespService, providedIn: 'root' });
|
|
1823
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SigespService, decorators: [{
|
|
1824
|
+
type: Injectable,
|
|
1825
|
+
args: [{
|
|
1826
|
+
providedIn: 'root'
|
|
1827
|
+
}]
|
|
1828
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.MatDialog }, { type: i3.ToastrService }]; } });
|
|
1829
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnZXNwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWdlc3Avc3JjL2xpYi9zaWdlc3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFpQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRixPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFB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LEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUc7ZUFDNUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7ZUFDN0csS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQU0sS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUssS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUcsS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHO2VBQzFHLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFNLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRztlQUMxRyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBRyxLQUFLLENBQUMsT0FBTyxJQUFFLElBQUksSUFBSyxLQUFLLENBQUMsT0FBTyxJQUFFLEdBQUcsSUFBRyxLQUFLLENBQUMsT0FBTyxJQUFFLEdBQUc7ZUFDbEcsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUssS0FBSyxDQUFD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RSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUUsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsR0FBRSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBRSxDQUFDO0lBQ3BGLENBQUM7OzBHQXR6RVksYUFBYTs4R0FBYixhQUFhLGNBRlosTUFBTTsyRkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1QcmVmaWpvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvTVByZWZpam8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW50ZXJwcmlzZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL0VudGVycHJpc2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGVyc29uYWxOb21pbmEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NUGVyc29uYWxOb21pbmEubW9kZWwnO1xyXG5pbXBvcnQgeyBNSG9qYVRpZW1wbyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Ib2phVGllbXBvLm1vZGVsJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNVXN1YXJpbyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1NTL3VzZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSVJlcXVlc3QgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9SZXF1ZXN0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNUHJvdmVlZG9yIH0gZnJvbSAnLi9jb3JlL21vZGVscy9SUEMvcHJvdmVlZG9yZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IsIHJldHJ5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNVXN1YXJpb1ByZWZpam8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL0NGRy91c2VyUHJlZml4Lm1vZGVsJztcclxuaW1wb3J0IHsgSUNhdGFsb2dvLCBmaWx0ZXJEYXRhIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ2F0YWxvZ28nO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0NvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY2F0YWxvZ28vY2F0YWxvZ28uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUN1ZW50YVByZXN1cHVlc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvY3VlbnRhUHJlc3VwdWVzdG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ3VlbnRhSW5zdGl0dWNpb25hbCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0NHL2N1ZW50YUluc3RpdHVjaW9uYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBNTW9uZWRhLCBNTW9uZWRhQ29uZmlnIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvbW9uZWRhLm1vZGVsJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBNVW5pZGFkVHJpYnV0YXJpYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL3VuaWRhZFRyaWJ1dGFyaWEubW9kZWwnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NvbmZpcm0vY29uZmlybS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNQ29uZmlndXJhY2lvblNDRyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0NHL2NvbmZpZ3VyYWNpb25TQ0cubW9kZWwnO1xyXG5pbXBvcnQgeyBJQ29uZXhpb24gfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9Vc3VhcmlvJztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL3RhYmxlLXNlbGVjdC90YWJsZS1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYXRpb25TUEcgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9jb25maWd1cmF0aW9uU1BHLm1vZGVsJztcclxuaW1wb3J0IHsgTUNlbnRyb0Nvc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvY2VudHJvQ29zdG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNRnVlbnRlRmluYW5jaWFtaWVudG8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9mdWVudGVGaW5hbmNpYW1pZW50by5tb2RlbCc7XHJcbmltcG9ydCB7IE1DdWVudGFFZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvZXhwZW5zaXZlQWNjb3VudC5tb2RlbCc7XHJcbmltcG9ydCB7IENhdGFsb2dvRXN0cnVjdHVyYXNDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzL2NhdGFsb2dvLWVzdHJ1Y3R1cmFzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElVcGRhdGVEaXN0cmlidXRpb24sIElVcGRhdGVEaXN0cmlidXRpb24yLCBJVXBkYXRlRGlzdHJpYnV0aW9uSW5ncmVzb3MsIElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvczIgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9DdWVudGFFZ3Jlc29zJztcclxuaW1wb3J0IHsgQ2F0YWxvZ29Eb2JsZUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9zaGFyZWQvY29tcG9uZW50cy9jYXRhbG9nby1kb2JsZS1pbnB1dC9jYXRhbG9nby1kb2JsZS1pbnB1dC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNU2lzdGVtYSwgTVVzdWFyaW9TaXN0ZW1hIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1Mvc2lzdGVtYSc7XHJcbmltcG9ydCB7IElDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcywgSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0NvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW8nO1xyXG5pbXBvcnQgeyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MsIE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9jb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvLm1vZGVsJztcclxuaW1wb3J0IHsgTUN1ZW50YUluZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvSW5jb21lQWNjb3VudCc7XHJcbmltcG9ydCB7IE1JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50IH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvaW5jb21lU3RydWN0dXJlQWNjb3VudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1Pcmdhbml6YXRpb25UeXBlIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvb3JnYW5pemF0aW9uVHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1TcGVjaWFsdHkgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9zcGVjaWFsdHkubW9kZWwnO1xyXG5pbXBvcnQgeyBNRG9jdW1lbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9kb2N1bWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1DbGFzaWZpY2F0aW9uIH0gZnJvbSAnLi9jb3JlL21vZGVscy9SUEMvY2xhc2lmaWNhdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IE1Db3VudHJ5LCBNU3RhdGUsIE1NdW5pY2lwYWxpdHksIE1QYXJpc2gsIE1DaXR5LCBNQ29tbXVuaXR5IH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvbG9jYXRpb25zLm1vZGVsJztcclxuaW1wb3J0IHsgTVByb3ZpZGVyQmVuZWZpY2lhcnkgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9wcm92aWRlckJlbmVmaWNpYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgTVNpZ2Vjb2ZCYW5rLCBNQmFuaywgTUJhbmtBY2NvdW50VHlwZSwgTUFnZW5jaWFCYW5jbywgTUN1ZW50YUJhbmNvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0IvYmFuay5tb2RlbCc7XHJcbmltcG9ydCB7IElSZXNwb25zZSB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL1Jlc3BvbnNlJztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYXRpb25SUEMgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9jb25maWd1cmFjaW9uUlBDLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbmZpZ1NPQyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU09DL2NvbmZpZ3VyYWNpb25TT0MubW9kZWwnO1xyXG5pbXBvcnQgeyBNRGVkdWN0aW9uVHlwZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL2RlZHVjdGlvblR5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ2FyZ28gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NPQy9jaGFyZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uY2VwdG9SZXRlbmNpb24sIE1EZWR1Y3Rpb24gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NUQi9kZWR1Y3Rpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlnU1NTIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TU1Mvc2VjdXJpdHlDb25maWd1cmF0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgTUFkbWluaXN0cmF0aXZlVW5pdCwgTUVzdHJ1Y3R1cmFzIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvYWRtaW5pc3RyYXRpdmVVbml0Lm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbXBvbmVudCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1NTL2NvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1Mb2cgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy9sb2cubW9kZWwnO1xyXG5pbXBvcnQgeyBNU2VydmljZUNoYXJnZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU09DL3NlcnZpY2VDaGFyZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW1wcmVzYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL0VtcHJlc2EubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uY2VwdG9zQ1hQIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DWFAvTUNvbmNlcHRvc0NYUC5tb2RlbCc7XHJcbmltcG9ydCB7IE1UaXBvRG9jdW1lbnRvQ1hQIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DWFAvTVRpcG9Eb2N1bWVudG9DWFAubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlndXJhY2lvblNOTyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Db25maWd1cmFjaW9uU05PLm1vZGVsJztcclxuaW1wb3J0IHsgTURlZmluaWNpb25Ob21pbmEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NRGVmaW5pY2lvbk5vbWluYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1Bc2lnbmFjaW9uQ2FyZ28gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NQXNpZ25hY2lvbkNhcmdvLm1vZGVsJztcclxuaW1wb3J0IHsgTU5vbWluYVNpbXBsZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Ob21pbmFTaW1wbGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGVyc29uYWwgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NUGVyc29uYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW50cmFkYVN1bWluaXN0cm9zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TSVYvTUVudHJhZGFTdW1pbmlzdHJvLm1vZGVsJztcclxuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInXHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7IFxyXG5pbXBvcnQgeyBNU25vTG9nIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTUF1ZGl0b3JpYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1UaXBvRGVwb3NpdG9zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TSVYvTVRpcG9EZXBvc2l0b3MubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29tdW5pZGFkIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvY29tdW5pZGFkLm1vZGVsJztcclxuaW1wb3J0IHsgTUV4Y2hhbmdlUmF0ZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL1Rhc2FDYW1iaW8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ2FyZ29zQWRpY2lvbmFsZXN9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL01DYXJnb3NBZGljaW9uYWxlcyc7XHJcbmltcG9ydCB7IE1DbGllbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NGVi9NQ2xpZW50ZU1vZGVsJztcclxuXHJcbiAgXHJcbiAgQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgU2lnZXNwU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIHVzdWFyaW9BY3Rpdm86IE1Vc3VhcmlvID0gbnVsbDtcclxuICAgIHB1YmxpYyBVUkw6IHN0cmluZztcclxuICAgIHB1YmxpYyBjdXJyZW50Q29tcG9uZW50OiBNQ29tcG9uZW50ID0gbnVsbDtcclxuICAgIHB1YmxpYyB1c2VyTWVudSAgPSBudWxsOyBcclxuICAgIHB1YmxpYyBpcF9hZHJlc3MgPSAnMTI3LjAuMC4xJztcclxuICAgIC8vIHB1YmxpYyBVUkw6IHN0cmluZyA9IFwiaHR0cDovLzE5Mi4xNjguMS42Ny9zaWdlc3BfcGhwXCI7XHJcbiAgICAvLyB1c3VhcmlvQWN0aXZvOiBNVXN1YXJpbyA9IHtcclxuICAgIC8vICAgY29uZXhpb25EQjoge1xyXG4gICAgLy8gICAgIGJhc2VEZURhdG9zOiBcImRiX3NpZ2VzcF9kZW1vdjNcIixcclxuICAgIC8vICAgICBnZXN0b3I6IFwicG9zdGdyZXNcIixcclxuICAgIC8vICAgICBsb2dpbjogXCJwb3N0Z3Jlc1wiLFxyXG4gICAgLy8gICAgIG5vbWJyZTogXCJTSUdFU1AgQy5BLCBzZXJ2aWRvciA4NSAoU0UgUFVFREUgVVNBUilcIixcclxuICAgIC8vICAgICBwYXNzd29yZDogXCJhZG1pbnNpZ2VzcFwiLFxyXG4gICAgLy8gICAgIHB1ZXJ0bzogXCI1NDMyXCIsXHJcbiAgICAvLyAgICAgc2Vydmlkb3I6IFwiMTkyLjE2OC4xLjY3XCIsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVtcHJlc2E6IHtcclxuICAgIC8vICAgICBpZDogMSxcclxuICAgIC8vICAgICBwZXJpb2RvRmlzY2FsOiBcIjIwMTktMDEtMDFcIixcclxuICAgIC8vICAgICB0aXR1bG86IFwiU0lHRVNQIEMuQS5cIlxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBub21icmU6IFwiU0lHRVNQXCIsXHJcbiAgICAvLyAgIHRva2VuOiBcImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVek00TkNKOS5leUp3WVhOemQyOXlaRjkxYzNVaU9pSXhNak0wTlRZM09DSXNJbWxrWDJWdGNISmxjMkVpT2lJeElpd2lkR2wwWlcxd0lqb2lVMGxIUlZOUUlFTXVRUzRpTENKd1pYSm1hWE5qWVd3aU9pSXlNREU1TFRBeExUQXhJaXdpYkY5MWMzVmhjbWx2SWpvaVUwbEhSVk5RSWl3aWMyVnlkbWxrYjNJaU9pSXhPVEl1TVRZNExqRXVOamNpTENKd2RXVnlkRzhpT2lJMU5ETXlJaXdpWW1GelpXUmxaR0YwYjNNaU9pSmtZbDl6YVdkbGMzQmZaR1Z0YjNZeklpd2liRzluYVc0aU9pSndiM04wWjNKbGN5SXNJbkJoYzNOM2IzSmtJam9pWVdSdGFXNXphV2RsYzNBaWZRLlBJU0JTZnVlUkFkc1dzSjFBYUdjVkNnVy0yYUprZ3R2TGRzVzBCZ281bHR5WW93RDhveV9ucUs1c2pFMlVSR2tcIlxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJvY2VkZTogc3RyaW5nID0gJ1NDR0NNUCc7XHJcbiAgICAvLyBjb2RzaXM6IHN0cmluZyA9ICdTQ0cnO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgdG9hc3Q6IFRvYXN0clNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZhbGlkYSBxdWUgc2VsbyBzZSBlc2NyaWJhbiBndWlvbmVzIHkgOVxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5R3Vpb25lc0FuZE5pbmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnLScgfHwgZXZlbnQua2V5ID09PSAnOScpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgZWwgbW9uY21wIGRlIHNpZ2VzcF9jb21wcm9iYW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQ29tcHJvYmFudGVBbW91bnQoYW1vdW50OiBudW1iZXIsIGlkQ29tcHJvYmFudGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oYCR7dGhpcy5VUkx9L2Rhby9zaWcvY29tcHJvYmFudGVfZGFvLnBocD9tb250bz10cnVlYCwge1xyXG4gICAgICAgIG1vbmNtcDogYW1vdW50LFxyXG4gICAgICAgIGlkX2NvbXByb2JhbnRlOiBpZENvbXByb2JhbnRlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKClcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIGVsIGNvbXByb2JhbnRlIHByc3VwdWVzdGFyaW8gZGUgRWdyZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbXByb2JhbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcyhjb21wcm9iYW50ZTogSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55PihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19lZ3Jlc29zX2Rhby5waHBgLFxyXG4gICAgICB7IC4uLmNvbXByb2JhbnRlLCBpZDogY29tcHJvYmFudGUuaWRfZHRfc3BnY21wIH0sIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgY29tcHJvYmFudGUgcHJlc3VwdWVzdGFyaW8gZGUgRWdyZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MoKTogT2JzZXJ2YWJsZTxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3NbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9fZWdyZXNvc19kYW8ucGhwYCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSBlbCBjb21wcm9iYW50ZSBwcnN1cHVlc3RhcmlvIGRlIEluZ3Jlc29zXHJcbiAgICAgKiBAcGFyYW0gY29tcHJvYmFudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyhjb21wcm9iYW50ZTogSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9fZWdyZXNvc19kYW8ucGhwYCxcclxuICAgICAgeyAuLi5jb21wcm9iYW50ZSwgaWQ6IGNvbXByb2JhbnRlLmlkX2R0X3NwaWNtcCB9LCB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIGNvbXByb2JhbnRlIHByZXN1cHVlc3RhcmlvIGRlIEluZ3Jlc29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MoKTogT2JzZXJ2YWJsZTxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19pbmdyZXNvc19kYW8ucGhwYCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgZWdyZXNvXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25FeHBlbnNlQWNjb3VudChkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb24pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocGAsIGRpc3RyaWJ1dGlvbixcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pO1xyXG4gICAgfVxyXG5cclxuICAgICAgIC8qKlxyXG4gICAgICogQEFjdHVhbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGN1ZW50YSBkZSBlZ3Jlc29cclxuICAgICAqIEBwYXJhbSBkaXN0cmlidXRpb25cclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIHVwZGF0ZURpc3RyaWJ1dGlvbkV4cGVuc2VBY2NvdW50MihkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb24yW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2N1ZW50YXNfZWdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KTtcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQEFjdHVhbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGN1ZW50YSBkZSBJbmdyZXNvXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jdWVudGFzX2luZ3Jlc29zX2Rhby5waHBgLCBkaXN0cmlidXRpb24sXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IG5ldyBNQ3VlbnRhSW5ncmVzb3MocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVBY2NvdW50MihkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvczJbXSk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUN1ZW50YUluZ3Jlc29zKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgSW5ncmVzbyBkZSBFc3RydWN0dXJhXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zLCBsZXZlbDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jdWVudGFfZXN0cnVjdHVyYV9pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUluY29tZVN0cnVjdHVyZUFjY291bnQocmVzLmRhdGEsIGxldmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHBsYW4gZGUgY3VlbnRhc1xyXG4gICAgICogQHBhcmFtIGxldmVsIE7Dum1lcm8gZGUgbml2ZWxlcyBkZSBsYSBjb25maWd1cmFjacOzblxyXG4gICAgICogQHBhcmFtIGlkIGRlIGxhIGVzdHJ1Y3R1cmEgZWwgaWRFcDMgbyBpZEVwNVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwbGFuSW5zdGl0dWNpb25hbFNQRyh0aXBvOnN0cmluZz0ncGxhbicsaWRFbnRlcnByaXNlOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlciwgaWRFUDNvNTpudW1iZXIsbml2ZWw6bnVtYmVyLGVzdGF0dXM6c3RyaW5nPScnKTogT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YUVncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY3VlbnRhc19lZ3Jlc29zX2Rhby5waHA/dGlwbz0ke3RpcG99JmU9JHtpZEVudGVycHJpc2V9JnBlcmlvZG89JHtwZXJpb2RvRmlzY2FsfSZpZD0ke2lkRVAzbzV9Jm5pdmVsPSR7bml2ZWx9JmVzdD0ke2VzdGF0dXN9YCxcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOmFueSkgPT4gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DdWVudGFFZ3Jlc29zKGVsZW1lbnQpKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjYXTDoWxvZ28gZGUgZXN0cnVjdHVyYSBwcmVzdXB1ZXNhcmlhXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXJcclxuICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIENvbmZpZ3VyYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkNhdGFsb2dvRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhKGRhdGE6IGFueVtdLCBjb25maWd1cmF0aW9uOiBNQ29uZmlndXJhdGlvblNQRyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGNvbnN0IGNhdGFsb2dvID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0VzdHJ1Y3R1cmFzQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiAnMTAwMHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGNhdGFsb2dvLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgLyoqXHJcbiAgICAqIFxyXG4gICAgKiBAcGFyYW0gdGlwbyB7MSwyLDMsNCxjb21wbGV0YX1cclxuICAgICogQHBhcmFtIGlkRW50ZXJwcmlzZSBcclxuICAgICogQHBhcmFtIHBlcmlvZG9GaXNjYWwgXHJcbiAgICAqIEBwYXJhbSBjb2RpZ28ge2NvZGlnbyBkZSBsYSBlc3RydWN0dXJhIH1cclxuICAgICogQHJldHVybnMgXHJcbiAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZUNvbXBsZXRlKHRpcG86c3RyaW5nPSdjb21wbGV0YScsaWRFbnRlcnByaXNlOm51bWJlciwgcGVyaW9kb0Zpc2NhbDpudW1iZXIsY29kaWdvOnN0cmluZz0nJyApOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhc1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Fc3RydWN0dXJhc1tdPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhX2Rhby5waHA/dGlwbz0ke3RpcG99JmU9JHtpZEVudGVycHJpc2V9JnBlcj0ke3BlcmlvZG9GaXNjYWx9JmNvZD0ke2NvZGlnb31gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgICBcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlID0+IG5ldyBNRXN0cnVjdHVyYXMoZSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbmZpZ3VyYWNpb25lcyBkZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbmZpZ3VyYXRpb25TUEdbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uU1BHKGlkRW50ZXJwcmlzZTpudW1iZXIsIHBlcmlvZG9GaXNjYWw6bnVtYmVyKTogT2JzZXJ2YWJsZTxNQ29uZmlndXJhdGlvblNQRz4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbmZpZ3VyYXRpb25TUEc+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2NvbmZpZ3VyYWNpb25fcHJlc3VwdWVzdGFyaWFfZGFvLnBocD9lPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiBuZXcgTUNvbmZpZ3VyYXRpb25TUEcocmVzcC5kYXRhWzBdKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbmZpZ3VyYWNpb25lcyBkZSBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29uZmlndXJhdGlvblJQQ1tdPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ3VyYXRpb25SUEMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db25maWd1cmF0aW9uUlBDPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfY29uZmlnX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlc3AuZGF0YSA9IG5ldyBNQ29uZmlndXJhdGlvblJQQyhyZXNwLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgTUNvbmZpZ3VyYWNpb25TTk8gZGUgbGEgbm9taW5hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TTk9bXT5cclxuICAgICAqIEBkYXRlIDI3LTA3LTIwMjFcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uU05PKGlkRW50ZXJwcmlzZTpudW1iZXIpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9jb25maWd1cmFjaW9uX2Rhby5waHA/dGlwbz0keydjb25maWd1cmFjaW9uJ30mZT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGlmKHJlc3AuZGF0YSAhPW51bGwpe1xyXG4gICAgICAgICAgICAgIHJlc3AuZGF0YSA9IHJlc3AuZGF0YS5tYXAoZSA9PiBuZXcgTUNvbmZpZ3VyYWNpb25TTk8oZSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBkYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZ3tcclxuICAgICAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtcclxuICAgICAgICBkYXRlLmdldE1vbnRoKCkgKyAxID49IDEwID8gZGF0ZS5nZXRNb250aCgpICsgMSA6IGAwJHtkYXRlLmdldE1vbnRoKCkgKyAxfWBcclxuICAgICAgfS0ke1xyXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpID49IDEwID8gZGF0ZS5nZXREYXRlKCkgOiBgMCR7ZGF0ZS5nZXREYXRlKCl9YFxyXG4gICAgICB9YFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbmZpZ3VyYWNpb25lcyBkZSBTZWd1cmlkYWRcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlnU1NTKGlkRW50ZXJwcmlzZTpudW1iZXI9MCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3NzL3NlZ3VyaWRhZF9jb25maWdfZGFvLnBocD9lPSR7aWRFbnRlcnByaXNlfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzcC5kYXRhID0gbmV3IE1Db25maWdTU1MocmVzcC5kYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc3BcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRzKHN5c3RlbUNvZGU6IHN0cmluZyA9IG51bGwsIHBlcm1pdDogYm9vbGVhbik6IE9ic2VydmFibGU8SVJlc3BvbnNlPntcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zc3MvY29tcG9uZW50ZXNfZGFvLnBocD8ke3N5c3RlbUNvZGUgPyBgY29kc2lzPSR7c3lzdGVtQ29kZX0ke1xyXG4gICAgICAgICAgcGVybWl0ID8gYCZwZXJtaXQ9dHJ1ZWAgOiAnJ1xyXG4gICAgICAgIH1gIDogJyd9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9XHJcbiAgICAgICkucGlwZShcclxuICBcclxuICAgICAgICBtYXAocmVzID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ29tcG9uZW50KGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGZ1ZW50ZXMgZGUgZmluYW5jaWFtaWVudG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGdWVudGVGaW5hbmNpYW1pZW50byhpZEVudGVycHJpc2U6bnVtYmVyLHBlcmlvZG9GaXNjYWw6bnVtYmVyKTogT2JzZXJ2YWJsZTxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZnVlbnRlX2ZpbmFuY2lhbWllbnRvX2Rhby5waHA/ZT0ke2lkRW50ZXJwcmlzZX0mcGVyPSR7cGVyaW9kb0Zpc2NhbH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1GdWVudGVGaW5hbmNpYW1pZW50byhlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNlbnRyb3MgZGUgY29zdG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBtb2RpZmljYWRvIDI4LTEyLTIwMjJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENlbnRyb0Nvc3RvKHRpcG86c3RyaW5nLGlkRW50ZXJwcmlzZTpudW1iZXIscGVyaW9kb0Zpc2NhbDpudW1iZXIpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NnL2NlbnRyb19jb3N0b19kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH1gLCBcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX1cclxuICAgICAgKS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ2VudHJvQ29zdG8oZWxlbWVudCkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2VudHJvQ29zdG9VbmlkYWRPcmdhbml6YXRpdmEodGlwbzpzdHJpbmcsaWRFbnRlcnByaXNlOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlcixpZFVuaWRhZEFkbWluaXN0cmF0aXZhOm51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvdW5pZGFkX2FkbWluaXN0cmF0aXZhX2Rhby5waHA/dGlwbz0ke3RpcG99JmU9JHtpZEVudGVycHJpc2V9JnBlcmlvZG89JHtwZXJpb2RvRmlzY2FsfSZpZD0ke2lkVW5pZGFkQWRtaW5pc3RyYXRpdmF9YCwgXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUNlbnRyb0Nvc3RvKGVsZW1lbnQpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVzdHJ1Y3R1cmFzVW5pZGFkT3JnYW5pemF0aXZhKHRpcG86c3RyaW5nLGlkRW50ZXJwcmlzZTpudW1iZXIscGVyaW9kb0Zpc2NhbDpudW1iZXIsaWRVbmlkYWRBZG1pbmlzdHJhdGl2YTpudW1iZXIpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3BnL3VuaWRhZF9hZG1pbmlzdHJhdGl2YV9kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH0maWQ9JHtpZFVuaWRhZEFkbWluaXN0cmF0aXZhfWAsIFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhcyhlbGVtZW50KSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGNoZWNra3NcclxuICAgICAqIEBwYXJhbSBjb2x1bW5zIENvbHVtbmFzIHF1ZSB2YSBhIHRlbmVyIGxhIHRhYmxhXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZSBsYSBtb2RhbFxyXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgRGF0YSBxdWUgcyBldmEgYSBtb3N0cmFyIGVuIGxhIHRhYmxhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuRGlhbG9nTXVsdGlTZWxlY3QoXHJcbiAgICAgIC8vIGNvbHVtbnM6IHN0cmluZ1tdLCBcclxuICAgICAgLy8gdGl0bGU6IHN0cmluZywgXHJcbiAgICAgIC8vIGRhdGFTb3VyY2U6IGFueVtdLFxyXG4gICAgICAvLyBjb2x1bW5OYW1lcz86IHN0cmluZ1tdXHJcbiAgICAgIGNvbHVtbnM6IHN0cmluZ1tdLCBcclxuICAgICAgdGl0bGU6IHN0cmluZywgXHJcbiAgICAgIGRhdGFTb3VyY2U6IGFueVtdLCBcclxuICAgICAgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gbnVsbCwgXHJcbiAgICAgIHdpZHRoOiBzdHJpbmcgPSAnMTAwMHB4JyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGhhc0JhY2tkcm9wPzogYm9vbGVhbixcclxuICAgICAgICBkaXNhYmxlQ2xvc2U/OiBib29sZWFuLFxyXG4gICAgICAgLy8gZGlzYWJsZU1hc3RlclRvZ2dsZT86IGJvb2xlYW5cclxuICAgICAgfSA9IHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLCBcclxuICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsIFxyXG4gICAgICAvLyAgZGlzYWJsZU1hc3RlclRvZ2dsZTogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUYWJsZVNlbGVjdENvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBkYXRhU291cmNlLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXMsXHJcbiAgICAgICAgIC8vIGRpc2FibGVNYXN0ZXJUb2dnbGU6IG9wdGlvbnMuZGlzYWJsZU1hc3RlclRvZ2dsZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnLFxyXG4gICAgICAgIGhhc0JhY2tkcm9wOiBvcHRpb25zLmhhc0JhY2tkcm9wLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogb3B0aW9ucy5kaXNhYmxlQ2xvc2VcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiBcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBjb25maWd1cmFjacOzbiBkZSBTQ0dcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29uZmlndXJhY2lvblNDR1tdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqIEBtb2RpZml0IDI1LTA3LTIwMjFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ3VyYXRpb25TQ0cobGluZWFFbXByZXNhOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlcik6IE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TQ0dbXT4geyAgICAgIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29uZmlndXJhY2lvblNDR1tdPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jb25maWd1cmFjaW9uX2NvbnRhYmlsaWRhZF9kYW8ucGhwP3RpcG89JHsnZGVmYXVsdCd9JmU9JHtsaW5lYUVtcHJlc2F9JnBlcmlvZG89JHtwZXJpb2RvRmlzY2FsfWAsXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29uZmlndXJhY2lvblNDRyhlbGVtZW50KSkpXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIHVuIGRpYWxvZyBkZSBjb25maXJtYWNpw7NuXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZSBsYSBtb2RhbCBkZSBjb25maXJtXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZW5zYWplIChvcGNpb25hbCkgcGFyYSBlbCB1c3VzYXJpb1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPGJvb2xlYW4+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkRpYWxvZ0NvbmZpcm0odGl0bGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgbWVzc2FnZTogKG1lc3NhZ2UpID8gbWVzc2FnZSA6IG51bGxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiAnMTAwMHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBDb252aWVydGUgZWwgY29udGVuaWRvIGRlIHVuIEFic3RyYWN0Q29udHJvbCBlbiBtYXnDunNjdWxhIChVc2FyIGVuIGV2ZW50byBrZXl1cClcclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgRm9ybXVsYXJpbyBkw7NuZGUgc2UgdmEgYSBidXNjYXIgZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBOb21icmUgZGVsIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2hhbmdlVG9VcHBlckNhc2UoZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nZXRBYnN0cmFjdENvbnRyb2woZm9ybUdyb3VwLCBuYW1lKS5zZXRWYWx1ZSh0aGlzLmdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXAsIG5hbWUpLnZhbHVlLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgQWJzdHJhY3RDb250cm9sIGRlIHVuIGZvcm11bGFyaW9cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgRm9ybXVsYXJpbyBkb25kZSBzZSB2YSBhIGJ1c2NhciBlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEBwYXJhbSBuYW1lIE5vbWJyZSBkZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcmV0dXJuIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAsIG5hbWU6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgIHJldHVybiBmb3JtR3JvdXAuZ2V0KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFByZXZpZW5lIHF1ZSBzZSBlc2NyaWJhbiBsZXRyYXMgZW4gZWwgaW5wdXQgKFVzYXIgZW4ga2V5cHJlc3MpXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKiBAbW9kaWZpY2FkbyBjb21vIG9ubHlOdW1lcm8gcGFyYSBjb3JyZWdpciBjb2RpZ28sIHVzYXIgY3VycmVuY3ktaW5wdXQgc2kgcXVpZXJlIHVzYXIgZGVjaW1hbGVzIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25seURlY2ltYWwoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIWlzTmFOKCtldmVudC5rZXkpICYmIGV2ZW50LmtleUNvZGUgIT0gMzIpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmllbmUgcXVlIHNlIGVzY3JpYmFuIGxldHJhcyBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ubHlOdW1iZXJzKGV2ZW50PzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgICAgaWYgKCFpc05hTigrZXZlbnQua2V5KSAmJiBldmVudC5rZXlDb2RlICE9IDMyKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY2VwdGEgc29sbyBudW1lcm8sIGRlbGV0ZSB5IGJhY2tzcGFjZVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ubHlOdW1iZXJzMihldmVudD86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoIWlzTmFOKCtldmVudC5rZXkpICB8fCBldmVudC5rZXlDb2RlID09IDggfHwgZXZlbnQua2V5Q29kZSA9PSA0Nikge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWNlcHRhIHNvbG8gbnVtZXJvLGd1aW9uZXMsIHBhcmVudGVzaXMsZXNwYWNpb3NcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICBwdWJsaWMgdHlwZU51bWJlcnNIeXBoZW4oZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgaWYgKCFpc05hTigrZXZlbnQua2V5KSB8fCBldmVudC5rZXlDb2RlID09IDggfHwgIGV2ZW50LmtleUNvZGUgPT0gMzIgIHx8IGV2ZW50LmtleUNvZGUgPT0gNDYgXHJcbiAgICAgIHx8IGV2ZW50LmtleUNvZGUgPT0gNTggfHwgZXZlbnQua2V5Q29kZSA9PSA1NyB8fCBldmVudC5rZXlDb2RlID09IDE4OSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUGVybWl0ZSAoYS16IEEtWiDDoS3DuiDDscORIMO8w5wgJywuKSBxdWUgc2UgZXNjcmliYW4gbnVtZXJvcyBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGRhdGUgMTQtMDUtMjAyMlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIHR5cGVOYW1lKGV2ZW50PzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKChldmVudC5rZXk+PSdhJyAmJiBldmVudC5rZXk8PSd6JykgIHx8IChldmVudC5rZXk+PSdBJyAmJiBldmVudC5rZXk8PSdaJykgfHwgIGV2ZW50LmtleT09XCLDsVwiIHx8ICBldmVudC5rZXk9PVwiw5FcIiBcclxuICAgICAgICAgIHx8IChldmVudC5rZXk+PSfDoScgJiYgZXZlbnQua2V5PD0nw7onKSB8fCBldmVudC5rZXk+PSfDvCcgIHx8IGV2ZW50LmtleT49J8OcJyAgfHwgZXZlbnQua2V5PT1cIidcIiAgfHwgZXZlbnQua2V5Q29kZT09MzIgXHJcbiAgICAgICAgICB8fCAgZXZlbnQua2V5PT1cIi5cIiB8fCAgZXZlbnQua2V5PT1cIixcIiB8fCBldmVudC5rZXlDb2RlID09IDggfHwgIGV2ZW50LmtleUNvZGUgPT0gMzIgIHx8IGV2ZW50LmtleUNvZGUgPT0gNDYgICl7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQZXJtaXRlICgwLTkgYS16IEEtWiDDoS3DuiDDscORIMO8w5wgJywuLV8vOigpJSPCuiYk4oKswqPCpSkgcXVlIHNlIGVzY3JpYmFuICBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGRhdGUgMTQtMDUtMjAyMlxyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIHR5cGVUZXh0KGV2ZW50PzogYW55KTogYm9vbGVhbiB7ICAgICAgXHJcbiAgICAgICAgaWYgKChldmVudC5rZXk+PSdhJyAgJiYgZXZlbnQua2V5PD0neicpIHx8IChldmVudC5rZXk+PSdBJyAmJiBldmVudC5rZXk8PSdaJykgfHwgZXZlbnQua2V5PT1cIsOxXCIgfHwgZXZlbnQua2V5PT1cIsORXCIgXHJcbiAgICAgICAgICB8fCAoZXZlbnQua2V5Pj0nw6EnICYmIGV2ZW50LmtleTw9J8O6JykgfHwgZXZlbnQua2V5PT0nw7wnIHx8IGV2ZW50LmtleT09J8OcJyB8fCBldmVudC5rZXk9PVwiJ1wiIHx8IGlzTmFOKCtldmVudC5rZXkpIFxyXG4gICAgICAgICAgfHwgZXZlbnQua2V5PT1cIi5cIiAgfHwgIGV2ZW50LmtleT09XCIsXCIgfHwgZXZlbnQua2V5PT1cIiZcIiB8fCAgZXZlbnQua2V5PT1cIl9cInx8IGV2ZW50LmtleT09XCItXCIgfHwgZXZlbnQua2V5PT1cIiNcIlxyXG4gICAgICAgICAgfHwgZXZlbnQua2V5PT1cIsK6XCIgIHx8ICBldmVudC5rZXk9PVwiJFwiIHx8IGV2ZW50LmtleT09XCIoXCIgfHwgZXZlbnQua2V5PT1cIilcIiB8fCBldmVudC5rZXk9PVwiJVwiIHx8IGV2ZW50LmtleT09JyAnXHJcbiAgICAgICAgICB8fCBldmVudC5rZXk9PSc6JyAgfHxldmVudC5rZXk9PScvJ3x8IGV2ZW50LmtleUNvZGU9PTgzNjQgfHwgIGV2ZW50LmtleUNvZGU9PTE2NSB8fGV2ZW50LmtleUNvZGU9PTE2MyBcclxuICAgICAgICAgIHx8IGV2ZW50LmtleUNvZGUgPT0gOCB8fCAgZXZlbnQua2V5Q29kZSA9PSAzMiAgfHwgZXZlbnQua2V5Q29kZSA9PSA0NiApe1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQZXJtaXRlICgwLTkgYS16IEEtWiDDscORIC4tXykgcXVlIHNlIGVzY3JpYmFuICBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGRhdGUgMTQtMDUtMjAyMlxyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgdHlwZUNvZGUoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoKGV2ZW50LmtleT49J2EnICAmJiBldmVudC5rZXk8PSd6JykgfHwgKGV2ZW50LmtleT49J0EnICYmIGV2ZW50LmtleTw9J1onKSAgfHwgZXZlbnQua2V5PT1cIsOxXCIgfHwgZXZlbnQua2V5PT1cIsORXCIgXHJcbiAgICAgICAgICB8fGlzTmFOKCtldmVudC5rZXkpIHx8IGV2ZW50LmtleT09XCIuXCIgfHwgIGV2ZW50LmtleT09XCJfXCIgfHwgZXZlbnQua2V5PT1cIi1cIiB8fCBldmVudC5rZXlDb2RlID09IDggfHwgIGV2ZW50LmtleUNvZGUgPT0gMzIgIHx8IGV2ZW50LmtleUNvZGUgPT0gNDYgKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBmYWxzZTsgICAgICBcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Db211bmlkYWQ+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ1VuaWRhZGVzVHJpYnV0YXJpYXMoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgbGV0IHVkVHJpYnV0YXJpYXM6IE1VbmlkYWRUcmlidXRhcmlhW10gPSBhd2FpdCB0aGlzLmdldFVuaWRhZGVzVHJpYnV0YXJpYXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2HDsW8nLCAnbnJvX2RlY3JldG8nLCAnZmVjaGFfZGVjcmV0bycsICdlbnRyYWRhX3ZpZGVuY2lhJywgJ3B1YmxpY2FjaW9uX2dhY2V0YScsICducm9fZ2FjZXRhJywgJ3ZhbG9ydXQnXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIFVuaWRhZGVzIFRyaWJ1dGFyaWFzJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHVkVHJpYnV0YXJpYXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzEwMDB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIHVuaWRhZGVzIHRyaWJ1dGFyaWFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFVuaWRhZGVzVHJpYnV0YXJpYXMoKTogT2JzZXJ2YWJsZTxNVW5pZGFkVHJpYnV0YXJpYVtdPiB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TVVuaWRhZFRyaWJ1dGFyaWFbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvdW5kdHJpYnV0YXJpYV9kYW8ucGhwYCwgcmVxdWVzdCkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueVtdKSA9PiByZXNwLm1hcChlbGVtZW50ID0+IG5ldyBNVW5pZGFkVHJpYnV0YXJpYShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSB1bmEgbW9kYWwgZ8OpbmVyaWNhXHJcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBDb2x1bW5hcyBxdWUgdmEgYSB0ZW5lciBsYSB0YWJsYVxyXG4gICAgICogQHBhcmFtIHRpdGxlIFTDrXR1bG8gZGVsIGRpYWxvZ1xyXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgRGF0YSBxdWUgc2UgdmEgYSBtb3N0cmFyIGVuIGxhIHRhYmxhXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0dlbmVyaWNvKFxyXG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXSwgXHJcbiAgICAgIHRpdGxlOiBzdHJpbmcsIFxyXG4gICAgICBkYXRhU291cmNlOiBhbnlbXSwgXHJcbiAgICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IG51bGwsIFxyXG4gICAgICB3aWR0aDogc3RyaW5nID0gJzEwMDBweCcsXHJcbiAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICBoYXNCYWNrZHJvcD86IGJvb2xlYW4sXHJcbiAgICAgICAgZGlzYWJsZUNsb3NlPzogYm9vbGVhblxyXG4gICAgICB9ID0ge2Rpc2FibGVDbG9zZTogZmFsc2UsIGhhc0JhY2tkcm9wOiBmYWxzZX1cclxuICAgICk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnLFxyXG4gICAgICAgIGhhc0JhY2tkcm9wOiBvcHRpb25zLmhhc0JhY2tkcm9wID8gb3B0aW9ucy5oYXNCYWNrZHJvcCA6IGZhbHNlLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogb3B0aW9ucy5kaXNhYmxlQ2xvc2UgPyBvcHRpb25zLmRpc2FibGVDbG9zZSA6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgdW5hIG1vZGFsIGfDqW5lcmljYSBjb24gMiBpbnB1dHNcclxuICAgICAqIEBwYXJhbSBjb2x1bW5zIENvbHVtbmFzIHF1ZSB2YSBhIHRlbmVyIGxhIHRhYmxhXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZWwgZGlhbG9nXHJcbiAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXIgZW4gbGEgdGFibGFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNhdGFsb2dvRG9zSW5wdXRzKFxyXG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXSxcclxuICAgICAgdGl0bGU6IHN0cmluZywgXHJcbiAgICAgIGRhdGFTb3VyY2U6IGFueVtdLCBcclxuICAgICAgZmlsdGVyRGF0YTogZmlsdGVyRGF0YVtdLFxyXG4gICAgICBjb2x1bW5OYW1lczogc3RyaW5nW10gPSBudWxsLFxyXG4gICAgICB3aWR0aDogc3RyaW5nID0gXCIxMDAwcHhcIlxyXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Eb2JsZUlucHV0Q29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzLFxyXG4gICAgICAgICAgZmlsdGVyRGF0YVxyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Db211bmlkYWQ+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ0NvbXVuaWRhZCgpOiBQcm9taXNlPE1Db211bmlkYWQ+IHtcclxuICAgICAgbGV0IGNvbXVuaWRhZGVzOiBNQ29tdW5pZGFkW10gPSBhd2FpdCB0aGlzLmdldENvbXVuaWRhZGVzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydwcmVmaWpvJywgJ3BhaXMnLCAnZXN0YWRvJywgJ211bmljaXBpbycsICdwYXJyb3F1aWEnLCAnY29kaWdvJywgJ2NvbXVuaWRhZCddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgQ29tdW5pZGFkZXMnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogY29tdW5pZGFkZXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzEwMDBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db211bmlkYWRbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb211bmlkYWRlcygpOiBPYnNlcnZhYmxlPE1Db211bmlkYWRbXT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0OiBJUmVxdWVzdCA9IHtcclxuICAgICAgICBvcGVyYWNpb246ICdvYnRlbmVyRGF0YScsXHJcbiAgICAgICAgc2lnZXNwX2NvbmV4aW9uOiB7XHJcbiAgICAgICAgICBzZXJ2aWRvcjogdGhpcy5VUkwsXHJcbiAgICAgICAgICB1c3VhcmlvOiB0aGlzLnVzdWFyaW9BY3Rpdm8uZ2V0SW50ZXJmYWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE1Db211bmlkYWRbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29tdW5pZGFkZXNfZGFvLnBocGAsIHJlcXVlc3QpLnBpcGUoICAgICBcclxuICAgICAgICBtYXAoKHJlc3A6IGFueVtdKSA9PiByZXNwLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tdW5pZGFkKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgbGFzIG1vbmVkYXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNTW9uZWRhPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dNb25lZGFzKCk6IFByb21pc2U8TU1vbmVkYT4ge1xyXG4gICAgICBsZXQgY29pbnM6IE1Nb25lZGFbXSA9IGF3YWl0IHRoaXMuZ2V0TW9uZWRhcygndG9kYXMnKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2NvZGlnbycsICdkZW5vbWluYWNpb24nLCAnY29kaWdvSXNvJywgJ3NpbWJvbG8nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIE1vbmVkYXMnLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY8OzZGlnbycsICdkZW5vbWluYWNpw7NuJywgJ2lzbycsICdzaW1ib2xvJ10sXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBjb2luc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwMHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgbW9uZWRhc1xyXG4gICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNTW9uZWRhW10+XHJcbiAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgKiBhY3R1YWxpemFkbyA0LTEyLTIwMjJcclxuICAgKiBAcGFyYW0gdGlwbyA6c3RyaW5nIHsndG9kYXMnLCd1bm8nLCdhY3R1YWx9XHJcbiAgICogQHBhcmFtIGlkIDogbnVtYmVyXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovIFxyXG4gICAgXHJcbiAgICBcclxuICAgIHB1YmxpYyBnZXRNb25lZGFzKHRpcG86c3RyaW5nLGlkPzpudW1iZXIpOiBPYnNlcnZhYmxlPE1Nb25lZGFbXT4geyAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Nb25lZGFbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvbW9uZWRhX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KS5waXBlKCAgICAgIFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Nb25lZGEoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBEZXNjcmlwdGlvbjogT2J0aWVuZSBsYSB0YXNhIGRlIGNhbWJpbyBhc29jaWFkYXMgYSB1bm8gbyB2YXJpYXMgbW9uZWRhc1xyXG4gICAgICogQHBhcmFtIHRpcG8gc3RyaW5nXHJcbiAgICAgKiBAcGFyYW0gaWQgY29kaWdvIG1vbmVkYVxyXG4gICAgICogQHJldHVybnMgYXJyYXkvbnVsbFxyXG4gICAgICogQHRpcG86YWxsLT50b2RhcywgKG1vbmVkYS0+dW5hIG1vbmVkYSBpZC0+aWQgZGUgbW9uZWRhKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VycmVuY3lFeGNoYW5nZVJhdGUodGlwbzogJ2FsbCd8ICdtb25lZGEnPSBudWxsLCBpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxNRXhjaGFuZ2VSYXRlW10+IHsgICAgIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNRXhjaGFuZ2VSYXRlW10+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL3Rhc2FfY2FtYmlvX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KS5waXBlKCAgICAgICAgXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUV4Y2hhbmdlUmF0ZShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGxhcyBjdWVudGFzIGNvbnRhYmxlcyAoQ3VlbnRhcyBJbnN0aXR1Y2lvbmFsZXMpXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TWN1ZW50YUluc3RpdHVjaW9uYWw+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ0N1ZW50YXNJbnN0aXR1Y2lvbmFsZXMoaWRFbnRlcnByaXNlOm51bWJlciwgcGVyaW9kb0Zpc2NhbDpudW1iZXIpOiBQcm9taXNlPE1DdWVudGFJbnN0aXR1Y2lvbmFsPiB7XHJcbiAgICAgIGxldCBhY2NvdW50czogTUN1ZW50YUluc3RpdHVjaW9uYWxbXSA9IGF3YWl0IHRoaXMuZ2V0Q3VlbnRhc0luc3RpdHVjaW9uYWxlcyhpZEVudGVycHJpc2UsIHBlcmlvZG9GaXNjYWwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2lvbiddLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2nDs24nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIFBsYW4gZGUgQ3VlbnRhIEluc3RpdHVjaW9uYWwnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogYWNjb3VudHNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzEwMDBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIGNvbnRhYmxlcyAoQ3VlbnRhcyBJbnN0aXR1Y2lvbmFsZXMpXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUN1ZW50YUluc3RpdHVjaW9uYWxbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdWVudGFzSW5zdGl0dWNpb25hbGVzKGlkRW50ZXJwcmlzZTpudW1iZXIsIHBlcmlvZG9GaXNjYWw6bnVtYmVyLCBpbnZlbnRvcnk/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxNQ3VlbnRhSW5zdGl0dWNpb25hbFtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1DdWVudGFJbnN0aXR1Y2lvbmFsW10+KGAke3RoaXMuVVJMfS9kYW8vc2NnL2N1ZW50YXNfZGFvLnBocD9lPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH0keyhpbnZlbnRvcnkpPyAnJmludmVudG9yeT10cnVlJyA6ICcnfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUluc3RpdHVjaW9uYWwoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjdWVudGFzIGRlIHByZXN1cHVlc3RvIChSZWN1cnNvcyB5IEVncmVzb3MpXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUN1ZW50YVByZXN1cHVlc3RvPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dDdWVudGFzUHJlc3VwdWVzdG8oaWRFbnRlcnByaXNlOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlcik6IFByb21pc2U8TUN1ZW50YVByZXN1cHVlc3RvPiB7XHJcbiAgICAgIGxldCBhY2NvdW50czogTUN1ZW50YVByZXN1cHVlc3RvW10gPSBhd2FpdCB0aGlzLmdldEN1ZW50YXNQcmVzdXB1ZXN0byhpZEVudGVycHJpc2UscGVyaW9kb0Zpc2NhbCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2nDs24nXSxcclxuICAgICAgICAgIGNvbHVtbnM6IFsnY3VlbnRhJywgJ2Rlbm9taW5hY2lvbiddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgQ3VlbnRhcyBkZSBQcmVzdXB1ZXN0bycsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBhY2NvdW50c1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnMTAwMHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgIFxyXG4gICAgfVxyXG5cclxuICAgLyoqICAgIFxyXG4gICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY3VlbnRhcyBkZSByZWN1cnNvcyB5IGVncmVzb3NcclxuICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFQcmVzdXB1ZXN0bz5cclxuICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXogICAgICAgICBcclxuICAgICogQHBhcmFtIGZpbHRlciB7bnVtZXJvLHNubyxDLGVncmVzbyxpbmdyZXNvfVxyXG4gICAgKiBAcGFyYW0gaWRFbnRlcnByaXNlIFxyXG4gICAgKiBAcGFyYW0gcGVyaWRvRmlzY2FsIFxyXG4gICAgKiBAcmV0dXJucyBcclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q3VlbnRhc1ByZXN1cHVlc3RvKGlkRW50ZXJwcmlzZTpudW1iZXIscGVyaWRvRmlzY2FsOm51bWJlcixmaWx0ZXI6c3RyaW5nPSdkZWZhdWx0Jyk6IE9ic2VydmFibGU8TUN1ZW50YVByZXN1cHVlc3RvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YVByZXN1cHVlc3RvPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9wbGFuX2N1ZW50YXNfcmVjdXJzb3NfZWdyZXNvc19kYW8ucGhwP2ZpbHRlcj0ke2ZpbHRlcn0mZT0ke2lkRW50ZXJwcmlzZX0mcGVyPSR7cGVyaWRvRmlzY2FsfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhUHJlc3VwdWVzdG8oZWxlbWVudCkpKSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgY8OhdGFsb2dvIGRlIGN1ZW50YXMgZGUgbGEgdGFibGEgXCJzcGdfY3VlbnRhc1wiXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPE1DdWVudGFFZ3Jlc29zPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBwYXJhbXMgcHJlc3VwdWVzdG86IEluZGljYSBzaSBzZSBhIHRyYWJhamFyIGNvbiBlc3RydWN0dXJhIGRlIHByZXN1cHVlc3RvIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0N1ZW50YXNFZ3Jlc28oaWRFbnRlcnByaXNlOm51bWJlciwgcGVyaW9kb0Zpc2NhbDpudW1iZXIsdGl0dWxvOiBzdHJpbmcsIHByZXN1cHVlc3RvOiBib29sZWFuID0gdHJ1ZSxhbmNobzogc3RyaW5nID0gXCIxMDAwcHhcIik6IFByb21pc2U8TUN1ZW50YUVncmVzb3M+e1xyXG4gICAgICBsZXQgY3VlbnRhczogTUN1ZW50YUVncmVzb3NbXSA9IFtdO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEV4cGVuc2VBY2NvdW50cyhpZEVudGVycHJpc2UscGVyaW9kb0Zpc2NhbCkudG9Qcm9taXNlKCkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGN1ZW50YXMgPSByZXNcclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZS5zdGF0dXMgPT0gXCJDXCJcclxuICAgICAgICB9KS5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLnN0YXR1cyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChwcmVzdXB1ZXN0bykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0Rvc0lucHV0cyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJlc3RydWN0dXJhXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgY3VlbnRhcyxcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkN1ZW50YVwiLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJjdWVudGFcIlxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJFc3RydWN0dXJhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImVzdHJ1Y3R1cmFcIlxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0cnVjdHVyYVwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEFjY291bnRzOiBNQ3VlbnRhRWdyZXNvc1tdID0gW107XHJcbiAgICAgICAgY3VlbnRhcy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgaWYgKCFmaWx0ZXJlZEFjY291bnRzLmZpbmQoZSA9PiBlLmN1ZW50YSA9PSBjLmN1ZW50YSkpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWRBY2NvdW50cy5wdXNoKGMpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVuQ2F0YWxvZ29HZW5lcmljbyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgZmlsdGVyZWRBY2NvdW50cyxcclxuICAgICAgICAgIFtcIkN1ZW50YVwiLCBcIkRlbm9taW5hY2nDs25cIiwgXCJFc3RhZG9cIl0sXHJcbiAgICAgICAgICBhbmNob1xyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRFeHBlbnNlQWNjb3VudHMoaWRFbnRlcnByaXNlOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlcixlc3RhdHVzPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+e1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ3VlbnRhRWdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocD9lPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH0mZXN0PSR7ZXN0YXR1c31gLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUVncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG5cclxuICAgXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGPDoXRhbG9nbyBkZSBjdWVudGFzIGRlIGxhIHRhYmxhIFwic2NnX3BsYW5fdW5pY29fcmVcIlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICogQHBhcmFtcyBmaWx0cm86IEluZGljYSBiYWpvIHF1ZSBwYXJhbWV0cm9zIHNlIHZhIGEgZmlsdHJhciBlbCBjYXRhbG9nb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNhdGFsb2dvQ3VlbnRhc1ByZXN1c3B1ZXN0byggICAgICBcclxuICAgICAgdGl0dWxvOiBzdHJpbmcsICAgXHJcbiAgICAgIGlkRW50ZXJwcmlzZTpudW1iZXIsXHJcbiAgICAgIHBlcmlvZG9GaXNjYWw6bnVtYmVyLCAgIFxyXG4gICAgICBmaWx0cm86IGZpbHRyb0N1ZW50YXNQcmVzdXB1ZXN0byA9IG51bGwsXHJcbiAgICAgIGFuY2hvOiBzdHJpbmcgPSAnMTAwMHB4JywgICAgIFxyXG4gICAgKTogUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+IHtcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFQcmVzdXB1ZXN0b1tdID0gW107XHJcbiAgICAgIFxyXG4gICAgICBhd2FpdCB0aGlzLmdldEN1ZW50YXNQcmVzdXB1ZXN0byhpZEVudGVycHJpc2UscGVyaW9kb0Zpc2NhbCkudG9Qcm9taXNlKCkudGhlbigocmVzKSA9PiB7XHJcbiAgICAgICAgY3VlbnRhcyA9IHJlcztcclxuICAgICAgICBpZiAoZmlsdHJvKSB7XHJcbiAgICAgICAgICBpZiAoZmlsdHJvLmVzdGFkbykge1xyXG4gICAgICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoYyA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGMuc3RhdHVzID09IGZpbHRyby5lc3RhZG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChmaWx0cm8udGlwbykge1xyXG4gICAgICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoYyA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGMudGlwbyA9PSBmaWx0cm8udGlwb1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLnN0YXR1cyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIGVbJ3Byb3ZUeXBlJ10gPSBlLnN0YXR1cyA9PSBcIlJcIiA/IFwiUmVjdXJzb3NcIiA6IFwiSW5ncmVzb3NcIlxyXG4gICAgICAgICAgcmV0dXJuIGVcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm4gdGhpcy5vcGVuQ2F0YWxvZ29HZW5lcmljbyhcclxuICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiLFwicHJvdlR5cGVcIl0sXHJcbiAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgIGN1ZW50YXMsXHJcbiAgICAgICAgW1wiQ3VlbnRhXCIsXCJEZW5vbWluYWNpw7NuXCIsXCJFc3RhZG9cIixcIlRpcG9cIl0sXHJcbiAgICAgICAgYW5jaG9cclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgY8OhdGFsb2dvIGRlIGN1ZW50YXMgZGUgbGEgdGFibGEgXCJzcGlfY3VlbnRhc1wiXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPE1DdWVudGFJbmdyZXNvcz5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAcGFyYW1zIHByZXN1cHVlc3RvOiBJbmRpY2Egc2kgc2UgYSB0cmFiYWphciBjb24gZXN0cnVjdHVyYSBkZSBwcmVzdXB1ZXN0byBvIG5vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29DdWVudGFzSW5ncmVzbyhpZEVudGVycHJpc2U6bnVtYmVyLHBlcmlvZG9GaXNjYWw6bnVtYmVyLG5pdmVsOm51bWJlcixpZEVQOm51bWJlcix0aXR1bG86IHN0cmluZyxhbmNobzogc3RyaW5nID0gXCIxMDAwcHhcIiwgcHJlc3VwdWVzdG86Ym9vbGVhbj1mYWxzZVxyXG4gICAgKTogUHJvbWlzZTxNQ3VlbnRhSW5ncmVzb3M+e1xyXG4gICAgICBsZXQgY3VlbnRhczogTUN1ZW50YUluZ3Jlc29zW10gPSBbXTtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRJbmNvbWVBY2NvdW50cygnZGVmYXVsdCcsaWRFbnRlcnByaXNlLHBlcmlvZG9GaXNjYWwsbml2ZWwsaWRFUCkudG9Qcm9taXNlKCkudGhlbigocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjdWVudGFzID0gcmVzLmRhdGFcclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZS5lc3RhZG8gPT0gXCJDXCJcclxuICAgICAgICB9KS5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLmVzdGFkbyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChwcmVzdXB1ZXN0bykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0Rvc0lucHV0cyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJlc3RydWN0dXJhXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgY3VlbnRhcyxcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkN1ZW50YVwiLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJjdWVudGFcIlxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJFc3RydWN0dXJhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImVzdHJ1Y3R1cmFcIlxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0cnVjdHVyYVwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEFjY291bnRzOiBNQ3VlbnRhSW5ncmVzb3NbXSA9IFtdO1xyXG4gICAgICAgIGN1ZW50YXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgIGlmICghZmlsdGVyZWRBY2NvdW50cy5maW5kKGUgPT4gZS5jdWVudGEgPT0gYy5jdWVudGEpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMucHVzaChjKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiXSxcclxuICAgICAgICAgIHRpdHVsbyxcclxuICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMsXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGdldFVuaWRhZEFkbWluaXN0cmF0aXZhKHRpcG8/OnN0cmluZyxpZEVudGVycHJpc2U/Om51bWJlcixwZXJpb2RvRmlzY2FsPzpudW1iZXIsaWRVbmlkYWRPcmdhbml6YXRpdmE/Om51bWJlcil7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3BnL3VuaWRhZF9hZG1pbmlzdHJhdGl2YV9kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH0maWQ9JHtpZFVuaWRhZE9yZ2FuaXphdGl2YX1gLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUFkbWluaXN0cmF0aXZlVW5pdChlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pIFxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNhcmdvcyBkZSBzZXJ2aWNpb3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2VydmljZUNoYXJnZXMoc2VydmljZUlkOm51bWJlciA9IG51bGwpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc29jL3NlcnZpY2lvX2NhcmdvX2Rhby5waHAke1xyXG4gICAgICAgIHNlcnZpY2VJZCA/IGA/c2VydmljZV9pZD0ke3NlcnZpY2VJZH1gIDogJydcclxuICAgICAgfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TZXJ2aWNlQ2hhcmdlKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHBhaXNlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Db3VudHJ5PlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBtb2RpZmllZCAxMC0wMS0yMDIyXHJcbiAgICAgKiBAcGFyYW0gY29kaWdvOiBDb2RpZ28gZGVsIHBhaXNcclxuXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIGdldENvdW50cmllcyhjb2RpZ28/OnN0cmluZyk6IE9ic2VydmFibGU8TUNvdW50cnlbXT4ge1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db3VudHJ5PihgJHt0aGlzLlVSTH0vZGFvL2NmZy9wYWlzZXNfZGFvLnBocD9jb2RpZ289JHtjb2RpZ299YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ291bnRyeShlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvKipcclxuICAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGVzdGFkb3NcclxuICAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1TdGF0ZT5cclxuICAgICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAgICogQG1vZGlmaWNhZG8gNC0xMi0yMDIyXHJcbiAgICAgICAqIEBwYXJhbSBjb2RpZ286IENvZGlnbyBkZWwgcGFpc1xyXG4gICAgICAgKi9cclxuICAgICAgcHVibGljIGdldFN0YXRlcyhjb2RpZ28/OnN0cmluZyk6IE9ic2VydmFibGU8TVN0YXRlW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNU3RhdGU+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2VzdGFkb3NfZGFvLnBocD9jb2RpZ289JHtjb2RpZ299YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU3RhdGUoZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBtdW5pY2lwaW9zXHJcbiAgICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNTXVuaWNpcGFsaXR5PlxyXG4gICAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICAgKiBAbW9kaWZpY2FkbyAxMC0wMS0yMDIyXHJcbiAgICAgICAqIEBwYXJhbSBwYWlzOiBDb2RpZ28gZGVsIHBhaXMgLFxyXG4gICAgICAgKiBAcGFyYW0gZXN0YWRvOiBDb2RpZ28gZGVsIGVzdGFkb1xyXG4gICAgICAgKiBAYWN0dWFsaXphZG8gNC0xMi0yMDIyXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0TXVuaWNpcGFsaXRpZXMocGFpcz86c3RyaW5nLGVzdGFkbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxNTXVuaWNpcGFsaXR5W10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNTXVuaWNpcGFsaXR5PihgJHt0aGlzLlVSTH0vZGFvL2NmZy9tdW5pY2lwaW9zX2Rhby5waHA/cGFpcz0ke3BhaXN9JmVzdGFkbz0ke2VzdGFkb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1NdW5pY2lwYWxpdHkoZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBwYXJyb3F1aWFzIFxyXG4gICAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVBhcmlzaD5cclxuICAgICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAgICogQG1vZGlmaWNhZG8gMTAtMDEtMjAyMlxyXG4gICAgICAgKiBAcGFyYW0gcGFpczogQ29kaWdvIGRlbCBwYWlzXHJcbiAgICAgICAqIEBwYXJhbSBlc3RhZG86IENvZGlnbyBkZWwgZXN0YWRvXHJcbiAgICAgICAqIEBwYXJhbSBtdW5pY2lwaW86Y29kaWdvIE11bmljaXBpb1xyXG4gICAgICAgKiBAYWN0dWFsaXphZG8gNC0xMi0yMDIyXHJcblxyXG4gICAgICAgKi9cclxuICAgICAgcHVibGljIGdldFBhcmlzaGVzKHBhaXM/OnN0cmluZyxlc3RhZG8/OnN0cmluZyxtdW5pY2lwaW8/OnN0cmluZyk6IE9ic2VydmFibGU8TVBhcmlzaFtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TVBhcmlzaD4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvcGFycm9xdWlhc19kYW8ucGhwP3BhaXM9JHtwYWlzfSZlc3RhZG89JHtlc3RhZG99Jm11bmljaXBpbz0ke211bmljaXBpb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QYXJpc2goZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjaXVkYWRlc1xyXG4gICAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVBhcmlzaD5cclxuICAgICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAgICogQG1vZGlmaWNhZG8gMTAtMDEtMjAyMlxyXG4gICAgICAgKiBAcGFyYW0gcGFpczogQ29kaWdvIGRlbCBwYWlzXHJcbiAgICAgICAqIEBwYXJhbSBlc3RhZG86IENvZGlnbyBkZWwgZXN0YWRvXHJcblxyXG5cclxuICAgICAgICovXHJcbiAgICAgICAgcHVibGljIGdldENpdHkocGFpcz86c3RyaW5nLGVzdGFkbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxNQ2l0eVtdPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNpdHk+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2NpdWRhZGVzX2Rhby5waHA/cGFpcz0ke3BhaXN9JmVzdGFkbz0ke2VzdGFkb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DaXR5KGUpKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNpdWRhZGVzXHJcbiAgICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUGFyaXNoPlxyXG4gICAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAgICogQG1vZGlmaWNhZG8gMTAtMDEtMjAyMlxyXG4gICAgICAgKiBAcGFyYW0gcGFpczogQ29kaWdvIGRlbCBwYWlzXHJcblxyXG4gICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgZ2V0Q29tbXVuaXRpZXMocGFpcz86c3RyaW5nLGVzdGFkbz86c3RyaW5nLCBtdW5pY2lwaW8/OnN0cmluZyxwYXJyb3F1aWE/OnN0cmluZyk6IE9ic2VydmFibGU8TUNvbW11bml0eVtdPiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29tbXVuaXR5PihgJHt0aGlzLlVSTH0vZGFvL2NmZy9jb211bmlkYWRlc19kYW8ucGhwP3BhaXM9JHtwYWlzfSZlc3RhZG89JHtlc3RhZG99Jm11bmljaXBpbz0ke211bmljaXBpb30mcGFycm9xdWlhPSR7cGFycm9xdWlhfWAsXHJcbiAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ29tbXVuaXR5KGUpKSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3Mgc2lzdGVtYXMgYWN0aXZhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1TaXN0ZW1hPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpc3RlbWFzKCk6IE9ic2VydmFibGU8TVNpc3RlbWFbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNU2lzdGVtYT4oYCR7dGhpcy5VUkx9L2Rhby9zc3Mvc2lzdGVtYXNfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TaXN0ZW1hKGUpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIG1vbmVkYSBhY3R1YWxcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICogQGFjdHVhbGl6YWRvOiA0LTEyLTIwMjIyXHJcbiAgICAgKiBAcGFyYW1zIGlkOiBpZCBkZSBsYSBtb25lZGEsXHJcbiAgICAgKiBAcGFyYW1zIHRpcG86IHRvZGFzLT5vYnRpZW5lIHRvZGFzIGxhcyBtb25lZGEsICh1bm8tPiBvYnRpZW5lIHVuYSBtb25lZGEgKyBpZClcclxuICAgICAqIChtb246Zm9ybWF0byBwYXJhIGlucHV0Q3VycmVuY3kgKyBpZCApXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdXJyZW50Q3VycmVuY3kodGlwbzondG9kYXMnfCd1bm8nfCdtb24nPW51bGwsaWQ/Om51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvbW9uZWRhX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgICAgXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGlmKHRpcG89PSd0b2Rhcycpe1xyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Nb25lZGFDb25maWcoZSkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Nb25lZGFDb25maWcocmVzLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGxpbmVhIGVtcHJlc2FcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqIEBhY3R1YWxpemFkbzogNS0xMi0yMDIyMlxyXG4gICAgICovXHJcbiAgICAgICAgIHB1YmxpYyBnZXRFbnRlcnByaXNlKHRpcG86J2xpbmVhJyB8J3Byb2Nlc28nfCdkZWZhdWx0Jz1udWxsICxpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvZW50ZXJwcmlzZV9kYW8ucGhwP3RpcG89JHt0aXBvfWAsXHJcbiAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1FbnRlcnByaXNlKGUpKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgb3JnYW5pemFjaW9uXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE9yZ2FuaXphdGlvblR5cGVzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvdGlwb19vcmdhbml6YWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Pcmdhbml6YXRpb25UeXBlKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBvcmdhbml6YWNpb25cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U3BlY2lhbHRpZXMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9lc3BlY2lhbGlkYWRfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TcGVjaWFsdHkoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGRvY3VtZW50b3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0RG9jdW1lbnRzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvZG9jdW1lbnRvX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRG9jdW1lbnQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNsYXNpZmljYWNpb25lc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDbGFzaWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL2NsYXNpZmljYWNpb25fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DbGFzaWZpY2F0aW9uKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHByZWZpam8gZGUgbG9zIHVzdWFyaW9zXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VkZSBEZSBxdWUgbcOzZHVsbyBwcm9jZWRlXHJcbiAgICAgKiBAcGFyYW0gY29kc2lzIEPDs2RpZ28gZGVsIHNpc3RlbWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNVXN1YXJpb1ByZWZpam9bXT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVc2VyUHJlZml4KGZpbHRlcjogJ2RldGFpbCcgPSBudWxsLCBjb2RlOiBzdHJpbmcgPSBudWxsLCBpZEVudGVycHJpc2U6bnVtYmVyLCBwZXJpb2RvOm51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29udHJvbF9udW1lcm9fZGFvLnBocCR7XHJcbiAgICAgICAgZmlsdGVyID8gYD9maWx0ZXI9JHtmaWx0ZXJ9JmNvZGU9JHtjb2RlfSZlPSR7aWRFbnRlcnByaXNlfSZwZXJpb2RvPSR7cGVyaW9kb31gIDogJydcclxuICAgICAgfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Vc3VhcmlvUHJlZmlqbyhlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHBlZmlqb1xyXG4gICAgICogQHBhcmFtIHByb2NlZGUgRGUgcXVlIG3Ds2R1bG8gcHJvY2VkZVxyXG4gICAgICogQHBhcmFtIGNvZHNpcyBDw7NkaWdvIGRlbCBzaXN0ZW1hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVVzdWFyaW9QcmVmaWpvW10+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseUNyZXNwbyAxNy0xMi0yMDIyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcmVmaXgoZmlsdGVyOiAnYWxsJyB8ICdvbmUnID0gbnVsbCwgY29kZTogc3RyaW5nID0gbnVsbCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2NvbnRyb2xfbnVtZXJvX2Rhby5waHAke1xyXG4gICAgICAgIGZpbHRlciA/IGA/ZmlsdGVyPSR7ZmlsdGVyfSZjb2RlPSR7Y29kZX1gIDogJydcclxuICAgICAgfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QcmVmaWpvKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBwYXJhIGJ1c2NhciBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNUHJvdmVlZG9yPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dQcm92ZWVkb3JlcyhpZEVudGVycHJpc2U6bnVtYmVyKTogUHJvbWlzZTxNUHJvdmVlZG9yPiB7XHJcbiAgICAgIGxldCBwcm92ZWVkb3JlczogTVByb3ZlZWRvcltdID0gYXdhaXQgdGhpcy5nZXRQcm92ZWVkb3JlcyhpZEVudGVycHJpc2UpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsndGlwbycsICdyaWYnLCAnbm9tYnJlJ10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBQcm92ZWVkb3JlcyB5IEJlbmVmaWNpYXJpb3MnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogcHJvdmVlZG9yZXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBwcm92ZWVkb3Jlc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Qcm92ZWVkb3JbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQcm92ZWVkb3JlcyhpZEVudGVycHJpc2U6bnVtYmVyKTogT2JzZXJ2YWJsZTxNUHJvdmVlZG9yW10+IHtcclxuICAgICAgbGV0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TVByb3ZlZWRvcltdPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfYmVuZWZpY2lhcmlvX2Rhby5waHA/ZT0ke2lkRW50ZXJwcmlzZX1gLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZWxlbWVudCA9PiBuZXcgTVByb3ZlZWRvcihlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgeSBiZW5lZmljaWFyaW9zXHJcbiAgICAgKiBATm90ZSBTaSBxdWllcmUgc29sbyBsb3MgZGF0b3MgYmFzaWNvcyB1c2UgbG9zIHBhcmFtZXRyb3MgKCdTJywnUCcsJ04nKVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAdHlwZSA9eydQJywnQicsJ1MnfVxyXG4gICAgICogQGRlc3RpbmF0aW9uID17J1AnLCdCJywnQycsJ0EnLCdOJ33iiYh7UHJvdmVlZG9yLEJlbmVmaWNpYXJpbyxDb250YXRpc3RhLEFtYm9zLE5pbmd1bm99XHJcbiAgICAgKiBAYWNjb3VudCA9eydTJywnTid9IHBhcmEgdHJhZXIgbGFzIGN1ZW50YXMgYmFuY2FyaWFzIGRlbCBwcm92ZWVkb3IgcG9yIGRlZmVjdG8gZXN0YSBlbiBOXHJcbiAgICAgKiBAbW9kaWZpY2FkbyAxNy0wNy0yMDIzXHJcbiAgICAgKi9cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJvdmlkZXJzQW5kQmVuZWZpY2lhcmllcyh0eXBlOiBzdHJpbmcgPSdkZWZhdWx0JywgaWRFbnRlcnByaXNlOm51bWJlcixkZXN0aW5hdGlvbjpzdHJpbmc9bnVsbCwgYWNjb3VudDpzdHJpbmc9J04nKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfYmVuZWZpY2lhcmlvX2Rhby5waHAke3R5cGUgPyBgP3Byb3ZpZGVyX3R5cGU9JHt0eXBlfWAgIDogJyd9JmU9JHtpZEVudGVycHJpc2V9JmRlc3RpbmF0aW9uPSR7ZGVzdGluYXRpb259JmFjY291bnQ9JHthY2NvdW50fWAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNUHJvdmlkZXJCZW5lZmljaWFyeShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgdW4gVXN1YXJpbyBzZWd1biBzdSBJRFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRVc2VyQnlJZChpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nzcy91c3VhcmlvX2Rhby5waHA/aWQ9JHtpZH1gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTVVzdWFyaW8ocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGJhbmNvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCYW5rcyhpZEVudGVycHJpc2U/Om51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2IvYmFuY29fZGFvLnBocD9lPSR7aWRFbnRlcnByaXNlfWAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQmFuayhlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgY3VlbnRhIGJhbmNhcmlhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCYW5rQWNjb3VudFR5cGVzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2IvYmFuY29fdGlwb19jdWVudGFfZGFvLnBocGAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQmFua0FjY291bnRUeXBlKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gb2J0aWVuZSBsYXMgY3VlbnRhIHNlZ3VuIGVsIGlkXHJcbiAgICAgKiBAcGFyYW0gdGlwbyB7J2JhbmNvJywgJ2RlZmF1bHQnfVxyXG4gICAgICogQHBhcmFtIGlkIHBhcmEgbGEgb3BjaW9uIGJhbmNvIHVzYXIgaWQ9aWRCYW5jbywgb3BjaW9uIGRlZmF1bGYgaWQ9aWRFbnRlcnByaXNlXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFsbEJhbmtBY2NvdW50KHRpcG86c3RyaW5nLGlkOm51bWJlcil7ICAgICAgICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zY2IvY3VlbnRhX2JhbmNvX2Rhby5waHA/dGlwbz0ke3RpcG99JmU9JHtpZH1gLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUJhbmNvKGVsZW1lbnQpKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gW107XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgICAgfSkgXHJcbiAgICAgIClcclxuICAgIH0gXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgYmFuY29zIHNpZ2Vjb2ZcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2lnZWNvZkJhbmtzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvYmFuY29fc2lnZWNvZl9kYW8ucGhwYCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TaWdlY29mQmFuayhlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBjb25maWd1cmFjaW9uIGRlIFNPQ1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb25maWdTT0MoaWRFbnRlcnByaXNlOm51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zb2MvY29uZmlndXJhY2lvbl9kYW8ucGhwP2U9JHtpZEVudGVycHJpc2V9YCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Db25maWdTT0MocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGRlZHVjY2lvblxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZWR1Y3Rpb25UeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3RiL3RpcG9fZGVkdWNjaW9uX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRGVkdWN0aW9uVHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBwdWJsaWMgZ2V0SW5jb21lQWNjb3VudHModGlwbzpzdHJpbmcsaWRFbnRlcnByaXNlOm51bWJlcixwZXJpb2RvRmlzY2FsOm51bWJlcixuaXZlbD0wLGlkRVA/Om51bWJlcixlc3RhdHVzOnN0cmluZz0nJyk6IE9ic2VydmFibGU8YW55PntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWRFbnRlcnByaXNlfSZwZXI9JHtwZXJpb2RvRmlzY2FsfSZuaXY9JHtuaXZlbH0mZXA9JHtpZEVQfSZlc3Q9JHtlc3RhdHVzfWAsXHJcbiAgICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSkucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ3VlbnRhSW5ncmVzb3MoZSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2hhcmdlcyhpZEVudGVycHJpc2U6bnVtYmVyKXtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zdGIvY2FyZ29zX2Rhby5waHA/bGluZWE9JHtpZEVudGVycHJpc2V9YCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DYXJnbyhlKSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZWR1Y3Rpb25zKGlkRW50ZXJwcmlzZTpudW1iZXIpe1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3RiL2RlZHVjY2lvbmVzX2Rhby5waHA/bGluZWE9JHtpZEVudGVycHJpc2V9YCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1EZWR1Y3Rpb24oZSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGxvcyBkYXRvcyBkZSBFbXByZXNhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRDb21wYW55KHRpcG8/OnN0cmluZyxpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9lbXByZXNhc19kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICBcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUVtcHJlc2EoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgZG9jdW1lbnRvcyByZWdpc3RyYWRvcyBlbiBDWFBcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqIEBkYXRlIDIwLTA3LTIwMjFcclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0VGlwb3NEb2N1bWV0b3MoaWRFbnRlcnByaXNlOm51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL2N4cC90aXBvX2RvY3VtZW50b19kYW8ucGhwP29wZXJhY2lvbj0keydidXNjYXInfSZpPSR7aWRFbnRlcnByaXNlfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVRpcG9Eb2N1bWVudG9DWFAoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAgKiBAcGFyYW0gZ2V0IHRvbWEgbG9zIHZhbG9yZXM6IFsgaWRPcmRlbkNvbXByYSAsJ3JlY2VwY2lvbicsJ2V4aXN0ZW4nLCdjb2RpZ28nLCAnb3JkZW5lc1NPQycsICdvcCcsICdhcnQnIF1cclxuICAgICAgKiBAcGFyYW0gbiBjb2RpZ28gRG9jdW1lbnRvIE9yZGVuLCBzZSB1c2EgcGFyYSBvYnRlbmVyIGxvcyBkZXRhbGxlcyBkZSBsYSBvcmRlbiBkZSBjb21wcmEsIGVzIG9ibGlnYXRvcmlvIGFsIGNvbWJpbmFyIGNvbiBsYSBvcGNpb24gZ2V0OiBpZE9yZGVuQ29tcHJhXHJcbiAgICAgICogQGRlc2NyaXB0aW9uICdyZWNlcGNpb24nOiBPYnRpbmUgbGFzIG9yZGVuZXMgZGUgc3VtaW5pc3RybyxcclxuICAgICAgKiBleGlzdGUgeSBjb2RpZ286IE9idGllbmUgbG9zIGNvZGlnb3MgcmVnaXN0cmFkb3MsIFxyXG4gICAgICAqIG9yZGVuZXNTT0M6IG9idGllbmUgbGFzIG9yZGVuZXMgZGUgY29tcHJhLFxyXG4gICAgICAqIG9wOiBvYnRpZW5lIGxhcyBvcmRlbmVzIHBlbmRpZW50ZXNcclxuICAgICAgKiBhcnQ6IG9idGllbmUgbG9zIGFydGljdWxvcyBcclxuICAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICAqIEBkYXRlIDMtMTAtMjAyMVxyXG4gICAgICAqIEByZXR1cm5zIFxyXG4gICAgICAqL1xyXG4gICAgICAgcHVibGljIGdldEVudHJhZGFTdW1pbmlzdHJvcyhnZXQ6YW55LCBuPzpzdHJpbmcpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zaXYvZW50cmFkYV9zdW1pbmlzdHJvX2Rhby5waHA/Z2V0PSR7Z2V0fSZuPSR7bn1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRW50cmFkYVN1bWluaXN0cm9zKGUpKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBkb2N1bWVudG9zIHJlZ2lzdHJhZG9zIGVuIENYUFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGRhdGUgMjAtMDctMjAyMVxyXG4gICAgICovXHJcblxyXG4gICAgICBwdWJsaWMgZ2V0Q29uY2VwdG9zQ3hQKGlkRW50ZXJwcmlzZTpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jeHAvY29uY2VwdG9fZGFvLnBocD9vcGVyYWNpb249JHsnYnVzY2FyJ30maT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db25jZXB0b3NDWFAoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBsb3MgY29uY2VwdG9zIFJldGVuY2lvbiBJU1JMXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAZGF0ZSAyNi0wNy0yMDIxXHJcbiAgICAgKi9cclxuXHJcbiAgICAgICAgcHVibGljIGdldENvbmNlcHRvc1JldGVuY2lvbih0aXBvOnN0cmluZyxpZFRpcG9EZWR1Y2Npb246bnVtYmVyKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zdGIvZGVkdWNjaW9uZXNfZGFvLnBocD90aXBvPSR7dGlwb30mY29kZT0ke2lkVGlwb0RlZHVjY2lvbn1gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db25jZXB0b1JldGVuY2lvbihlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBjb25maWd1cmFjacOzbiBkZSBSUkhIIHkgZGUgU05PXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIG9idGVuZXJDb25maWd1cmFjaW9uU05PKGlkRW50ZXJwcmlzZTpudW1iZXIpe1xyXG4gICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2NvbmZpZ3VyYWNpb25fZGFvLnBocD90aXBvPSR7J2NvbmZpZ3VyYWNpb24nfWU9JHtpZEVudGVycHJpc2V9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7IFxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNvbmZpZ3VyYWNpb25TTk8oZSkpOyAgXHJcbiAgICAgICAgICAgICAgICB9ICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgLyoqXHJcbiAgICAgICogXHJcbiAgICAgICogQHBhcmFtIHRpcG8gWydkZWZhdWx0JywgJ3VubycsICdjYXJnb3MnLCdsaW5lYSddIGRhZmF1bHQ6VG9kYXMgbGFzIG5vbWluYXMsIHVubzogdW5hIG5vbWluYSwgXHJcbiAgICAgICogICAnY2FyZ29zJzogbm9taW5hcyBwb3IgY2FyZ29zLCAnbGluZWEnOiBub21pbmFzIGFjdGl2YXMgcG9yIGxpbmVhc1xyXG4gICAgICAqIEBwYXJhbSBpZCA6IFBhcmEgbG9zIHRpcG86IHVubyB5IGNhcmdvcyBlbCBpZCBlcyBpZE5vbWluYS4gUGFyYSBsaW5lYTogaWQgZXMgZWwgaWRFbnRlcnByaXNlXHJcbiAgICAgICogQHJldHVybnMgYXJyYXkoKSAgICAgIFxyXG4gICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBub21pbmFzIHJlZ2lzdHJhZGFzXHJcbiAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAgKiBAZGF0ZSAyMC0xMC0yMVxyXG4gICAgICAqIEBhY3R1YWxpemFkbyAyNi0wNS0yMDI0XHJcbiAgICAgICpcclxuICAgICAqLyAgICAgXHJcblxyXG4gICAgICAgcHVibGljIGdldE5vbWluYSh0aXBvOnN0cmluZyxpZEVudGVycHJpc2U6bnVtYmVyLGlkPzpudW1iZXIsYWN0PzpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vZGVmaW5pY2lvbl9ub21pbmFfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH0mZT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTURlZmluaWNpb25Ob21pbmEoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgLyoqXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBjYXJnb3MgZGUgbGFzIG5vbWluYVxyXG4gICAgKiBAcGFyYW0gdGlwbyBbJ2NvZGlnbycsJ2RlZmF1bHQnXSAtPmNvZGlnbzogb2J0aWVuZSBlbCBwcm94aW1vIGNvZGlnby4gLT5kZWZhdWx0OiBvYnRpZW5lIHRvZG9zIGxvcyBjYXJnb3MgZGUgbGEgbm9taW5hXHJcbiAgICAqIEBwYXJhbSBpZCBpZCBkZSBsYSBub21pbmFcclxuICAgICogQHJldHVybnMgYXJyYXkoKVxyXG4gICAgKi9cclxuICAgICAgcHVibGljIGdldENhcmdvc05vbWluYSh0aXBvOnN0cmluZyxpZD86bnVtYmVyKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2FzaWduYWNpb25fY2FyZ29zX2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQXNpZ25hY2lvbkNhcmdvKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gIFxyXG4gICAgICBcclxuICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSB1biBwZXJzb25hbCBkZSBsYSBuw7NtaW5hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgIHB1YmxpYyBnZXRQZXJzb25hbFNSSCh0aXBvOnN0cmluZyxpZEVudGVycHJpc2U6bnVtYmVyLGlkPzpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vcGVyc29uYWxfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH0mZT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QZXJzb25hbChlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9IFxyXG5cclxuICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgYWdlbmNpYSBkZSBiYW5jb1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0QWdlbmNpYUJhbmNvKHRpcG86c3RyaW5nLGlkRW50ZXJwcmlzZT86bnVtYmVyLCBpZD86bnVtYmVyKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2FnZW5jaWFfZGFvLnBocD9jb2RlPSR7dGlwb30maWQ9JHtpZH1lPSR7aWRFbnRlcnByaXNlfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUFnZW5jaWFCYW5jbyhlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgaG9qYXMgZGUgdGllbXBvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgICAgICBwdWJsaWMgZ2V0SG9qYVRpZW1wbyh0aXBvOnN0cmluZyxpZFBlcnNvbmFsPzpudW1iZXIsaWROb21pbmE/Om51bWJlcil7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vaG9qYV90aWVtcG9fZGFvLnBocD9pZFBlcnNvbmFsPSR7aWRQZXJzb25hbH0maWROb21pbmE9JHtpZE5vbWluYX1gLFxyXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Ib2phVGllbXBvKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSAgICAgICAgIFxyXG4gICAgICAgICBcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNsaWVudGVzIFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQHRpcG8gW2Jhc2ljbyxjb2RpZ28sY2VkdWxhXVxyXG4gICAgICogXHJcbiAgICAgKi9cclxuXHJcbiAgICBwdWJsaWMgZ2V0Q2xpZW50ZSh0aXBvOiBzdHJpbmcgPSdkZWZhdWx0JywgaWQ6bnVtYmVyPTAsIGNvZGlnbzpzdHJpbmc9JycsIGNlZHVsYTpzdHJpbmc9JycpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2Z2L2NsaWVudF9kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfSZjb2RpZ289JHtjb2RpZ299JmNlZHJpZmNsaT0ke2NlZHVsYX1gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgICAgXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1DbGllbnQoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZhbGlkYSBzaSBsYSBmZWNoYSBlc3RhIGRlbnRybyBkZWwgcGVyaW9kbyBmaXNjYWwgeSBlbCBtZXMgZXN0YSBhYmllcnRvIG8gY2VycmFkb1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBwYXJhbSBmZWNoYTogZmVjaGEgYSBjb21wYXJhclxyXG4gICAgICogQHBhcmFtIGxpbmVhRW1wcmVzYTogbGluZWEgZW1wcmVzYSBkZWwgZG9jdW1lbnRvXHJcbiAgICAgKiBAcGFyYW0gcGVyaW9kb0Zpc2NhbCA6IGZlY2hhIGRlbCBwZXJpb2RvIGEgZXZhbHVhciAnMTkwMC0wMS0wMSdcclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGZlY2hhIDExLTEwLTIwMjNcclxuICAgICAqIFxyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0VmFsaWRhclBlcmlvZG8oZmVjaGE6c3RyaW5nLCBwZXJpb2RvRmlzY2FsOnN0cmluZywgbGluZWFFbXByZXNhOm51bWJlcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jb25maWd1cmFjaW9uX2NvbnRhYmlsaWRhZF9kYW8ucGhwP3RpcG89JHsndmFsaWRhRmVjaGEnfSZmZWNoYT0ke2ZlY2hhfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH0mZT0ke2xpbmVhRW1wcmVzYX1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4geyByZXR1cm4gcmVzO30pKTtcclxuICAgICAgfSBcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcGVyaW9kbyBmaXNjYWxlcyBjb25maWd1cmFkb3MgZW4gU0NHIHkgU1BHIG1lbm9yZXMgbyBpZ3VhbGVzIGFsIHBlcmlvZG8gZmlzY2FsIGFjdHVhbC5cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAcGFyYW0gbGluZWFFbXByZXNhOiBsaW5lYSBlbXByZXNhIGRlbCBkb2N1bWVudG9cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGZlY2hhIDAxLTEwLTIwMjQgICAgXHJcbiAgICAgKi9cclxuICAgICAgcHVibGljIGdldFBlcmlvZG9zQ29uZmlndXJhZG9zKGxpbmVhRW1wcmVzYTpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY29uZmlndXJhY2lvbl9jb250YWJpbGlkYWRfZGFvLnBocD90aXBvPSR7J3BlcmlvZG9Db25maWcnfSZlPSR7bGluZWFFbXByZXNhfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShtYXAoKHJlczogYW55KSA9PiB7IHJldHVybiByZXM7fSkpO1xyXG4gICAgICB9IFxyXG5cclxuXHJcbiAgICAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHBlcmlvZG8gZmlzY2FsZXMgY29uZmlndXJhZG9zIGVuIFNDRyB5IFNQRyBtZW5vcmVzIGFsIHBlcmlvZG8gZmlzY2FsIGFjdHVhbCB5IGVsIGlubWVkaWF0by5cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAcGFyYW0gbGluZWFFbXByZXNhOiBsaW5lYSBlbXByZXNhIGRlbCBkb2N1bWVudG9cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGZlY2hhIDAxLTEwLTIwMjQgICAgXHJcbiAgICAgKi9cclxuICAgICAgICAgcHVibGljIGdldFBlcmlvZG9zQ29uZmlndXJhZG9zU0NHU1BHKGxpbmVhRW1wcmVzYTpudW1iZXIpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jb25maWd1cmFjaW9uX2NvbnRhYmlsaWRhZF9kYW8ucGhwP3RpcG89JHsncGVyaW9kb1NDR1NQRyd9JmU9JHtsaW5lYUVtcHJlc2F9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4geyByZXR1cm4gcmVzO30pKTtcclxuICAgICAgICB9IFxyXG5cclxuXHJcbiAgICBwdWJsaWMgdXNlckhhc1JpZ2h0cyhjb2x1bW46J2FkbWluaXN0cmFkb3InIHwgJ2luc2VydGFyJyB8ICdhY3R1YWxpemFyJyB8ICdjb25zdWx0YXInIFxyXG4gICAgfCAnZWxpbWluYXInIHwgJ2FudWxhcicgfCdkZXNjYXJnYXInIHwgJ2VqZWN1dGFyX19wcm9jZXNhcl8nIHwgJ2ltcHJpbWlyJyBcclxuICAgIHwgJ2Vudmlhcl9fY29ycmVvXycgfCAndmlzaWJsZScpe1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3Nzcy9kZXJlY2hvc191c3VhcmlvX2Rhby5waHA/aWRDb21wb25lbnQ9JHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudENvbXBvbmVudC5pZFxyXG4gICAgICAgIH0mY29sdW1uPSR7Y29sdW1ufWAsIFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH1cclxuICAgICAgKVxyXG5cclxuICAgIH1cclxuXHJcbiAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgbG9zIGhlYWRlcnMgcGFyYSBoYWNlciBsYXMgcGV0aWNpb25lc1xyXG4gICAgICogQHBhcmFtcyB0eXBlOiBUaXBvIE1JTUUgcGVybWl0aWRvIHBvciBkZWZlY3RvIHNlIHRvbWEgYXBwbGljYXRpb24vanNvblxyXG4gICAgICogQHJldHVybiBIdHRwSGVhZGVyc1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqIEBkYXRlLXVwZGF0ZTogMTUtMDYtMjAyMiBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEh0dHBIZWFkZXJzKHR5cGU/OnN0cmluZyk6IEh0dHBIZWFkZXJzIHsgXHJcbiAgICAgICF0eXBlPyB0eXBlPSdhcHBsaWNhdGlvbi9qc29uJzonJzsgICAgICBcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHR5cGUsXHJcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgJHt0aGlzLnVzdWFyaW9BY3Rpdm8udG9rZW59YFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBzZXJ2aWRvciBndWFyZGFkbyBlbiBlbCBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHJldHVybiBzdHJpbmdcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTZXJ2ZXIoKTogc3RyaW5nIHtcclxuICAgICAgcmV0dXJuIHRoaXMuVVJMO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgdXN1YXJpbyBndWFyZGFkbyBlbiBlbCBzZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHJldHVybiBNVXN1YXJpb1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldFVzZXIoKSB7XHJcbiAgICAgIGxldCBjb25leGlvbjogSUNvbmV4aW9uID0gYXdhaXQgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSkgPyBKU09OLnBhcnNlKGF0b2Ioc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSkgOiBudWxsO1xyXG4gICAgICAvL2NvbnNvbGUubG9nKGNvbmV4aW9uKVxyXG4gICAgICAvLyBkZWJ1Z2dlclxyXG4gICAgICBpZiAoY29uZXhpb24pIHtcclxuICAgICAgICB0aGlzLnVzdWFyaW9BY3Rpdm8gPSBuZXcgTVVzdWFyaW8oY29uZXhpb24udXN1YXJpbyk7XHJcbiAgICAgICAgdGhpcy5VUkwgPSBjb25leGlvbi5zZXJ2aWRvcjtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIHVuIHRvYXN0IGRlIHN1Y2Nlc3NcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1RvYXN0U3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gdG9hc3QgZGUgZXJyb3JcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvd1RvYXN0RXJyb3IobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMudG9hc3QuZXJyb3IobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBNdWVzdHJhIHVuIHN3ZWV0YWxlcnQyIGRlIMOpeGl0b1xyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBkYXRlIDIyLTExLTIwMjFcclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIHNob3dUb2FzdFN1Y2Nlc3NTd2FsKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICBpY29uOiAnc3VjY2VzcycsXHJcbiAgICAgICAgICB0aXRsZTogJ8OJeGl0bycsXHJcbiAgICAgICAgICB0ZXh0OiBtZXNzYWdlLCAgXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgXHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gc3dlZXRhbGVydDIgZGUgZXJyb3JcclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgcXVlIHNlIHZhIGEgbW9zdHJhclxyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAZGF0ZSAyMi0xMS0yMDIxXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93VG9hc3RFcnJvclN3YWwobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIFN3YWwuZmlyZSh7XHJcbiAgICAgICAgaWNvbjogJ2Vycm9yJyxcclxuICAgICAgICB0aXRsZTogJ8KhRXJyb3IhJyxcclxuICAgICAgICB0ZXh0OiBtZXNzYWdlLCAgXHJcbiAgICAgICAgICAgICBcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBHdWFyZGEgZWwgdXN1YXJpbyBsb2d1ZWFkbyBlbiBlbCBTZXNzaW9uU3RvcmFnZVxyXG4gICAgICogQHBhcmFtIHVzZXIgVXN1YXJpbyBxdWUgc2UgdmEgYSBndWFyZGFyIGVuIGVsIFNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzYXZlVXNlcihkYXRhOiBJQ29uZXhpb24pOiB2b2lkIHtcclxuICAgICAgdGhpcy51c3VhcmlvQWN0aXZvID0gbmV3IE1Vc3VhcmlvKGRhdGEudXN1YXJpbyk7XHJcbiAgICAgIHRoaXMuVVJMID0gZGF0YS5zZXJ2aWRvcjtcclxuICAgICAgbGV0IGVuY3J5cHRlZFVzZXI6IHN0cmluZyA9IGJ0b2EoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCd1c2VyJywgZW5jcnlwdGVkVXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0ZSBhIGxhIHVybCBhIGxhIGN1YWwgc2UgbGUgdmFuIGEgcmVhbGl6YXIgcGV0aWNpb25lcyBhbCBiYWNrRW5kXHJcbiAgICAgKiBAcGFyYW0gdXJsIFVSbCBkb25kZSBzZSB2YW4gYSByZWFsaXphciBsYXMgcGV0aWNpb25lc1xyXG4gICAgICogQHJldHVybiB2b2lkXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgIHRoaXMuVVJMID0gdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEluaWNpYWxpemEgZWwgc2VydmljaW8gZGUgc2lnZXNwXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbml0KCk6IHZvaWQge1xyXG4gICAgICAvLyBWZXJpZmljYW1vcyBzaSBoYXkgdW4gdXN1YXJpbyBlbiBsYSBzZXNzaW9uU3RvcmFnZSwgZXN0byBlcyBuZWNlc2FyaW8gcGFyYSByZWNhcmdhciBsYSBww6FnaW5hXHJcbiAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpXHJcbiAgICAgICAgdGhpcy5nZXRVc2VyKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBWZXJpZmljYSBzaSB1biB1c3VhcmlvIGVzdMOhIGxvZ3VlYWRvXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBpc0xvZ2dlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlckVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IGFueSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdPY3VycmnDsyB1biBlcnJvcicpXHJcbiAgICB9XHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBvYnRpZW5lIGVsIHBlcnNvbmFsIHNlZ3VuIGZpbHRyb1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBkYXRlIDE1LTExLTIwMjFcclxuICAgICAqIEBwYXJhbSB0aXBvOiB2YWxvcmVzIFsnY2F0YWxvZ28nLCdjYXRhbG9nb1NubycsJ2RlZmF1bHQnLCdub21pbmEnLCdyZXNwb25zYWJsZXMnXVxyXG4gICAgICogQHBhcmFtcyBkYXRvOm9iamVjdCB7bm9tYnJlOnN0cmluZywgYXBlbGxpZG86c3RyaW5nLCBjZWR1bGEuc3RyaW5nfSB1c2UgcGFyYSBsYSBvcGNpb24gJ2NhdGFsb2dvJyBvICdjYXRhbG9nb1NubydcclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIGdldFBlcnNvbmFsKHRpcG86c3RyaW5nLCBkYXRvPzphbnkpe1xyXG4gICAgICAgICAgbGV0IGNlZHVsYT0nJztcclxuICAgICAgICAgIGxldCBub21icmU9Jyc7XHJcbiAgICAgICAgICBsZXQgYXBlbGxpZG89Jyc7XHJcbiAgICAgICAgICBsZXQgaWRFbnRlcnByaXNlPTA7XHJcbiAgICAgICAgaWYoZGF0byl7XHJcbiAgICAgICAgICBjZWR1bGE9ZGF0by5jZWR1bGFcclxuICAgICAgICAgIG5vbWJyZT1kYXRvLm5vbWJyZVxyXG4gICAgICAgICAgYXBlbGxpZG89ZGF0by5hcGVsbGlkb1xyXG4gICAgICAgICAgaWRFbnRlcnByaXNlPWRhdG8uaWRFbnRlcnByaXNlXHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9wZXJzb25hbF9kYW8ucGhwP3RpcG89JHt0aXBvfSZjZWR1bGE9JHtjZWR1bGF9Jm5vbWJyZT0ke25vbWJyZX0mYXBlbGxpZG89JHthcGVsbGlkb30mZT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QZXJzb25hbChlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9IFxyXG5cclxuICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gb2J0ZW5lciBwZXJzb25hbCBOb21pbmEgc2VndW4gZmlsdHJvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGRhdGUgMTUtMTEtMjAyMVxyXG4gICAgICogKiBAcGFyYW0gdGlwbzogdmFsb3JlcyBbJ2NhdGFsb2dvJywnZGVmYXVsdCcsJ25vbWluYSddXHJcbiAgICAgKiBAcGFyYW1zIGRhdG86b2JqZWN0IHtub21icmU6c3RyaW5nLCBhcGVsbGlkbzpzdHJpbmcsIGNlZHVsYS5zdHJpbmd9IHVzZSBwYXJhIGxhIG9wY2lvbiAnY2F0YWxvZ28nXHJcblxyXG4gICAgICovXHJcbiAgICAgICAgcHVibGljIGdldFBlcnNvbmFsTm9taW5hKHRpcG86c3RyaW5nLGRhdG8/OmFueSl7XHJcbiAgICAgICAgICBsZXQgY2VkdWxhPScnO1xyXG4gICAgICAgICAgbGV0IG5vbWJyZT0nJztcclxuICAgICAgICAgIGxldCBhcGVsbGlkbz0nJztcclxuICAgICAgICAgIGxldCBpZEVudGVycHJpc2U9MDtcclxuICAgICAgICAgIGxldCBpZE5vbWluYT0wO1xyXG4gICAgICAgIGlmKGRhdG8pe1xyXG4gICAgICAgICAgY2VkdWxhPWRhdG8uY2VkdWxhXHJcbiAgICAgICAgICBub21icmU9ZGF0by5ub21icmVcclxuICAgICAgICAgIGFwZWxsaWRvPWRhdG8uYXBlbGxpZG9cclxuICAgICAgICAgIGlkRW50ZXJwcmlzZT1kYXRvLmlkRW50ZXJwcmlzZVxyXG4gICAgICAgICAgaWROb21pbmE9ZGF0by5pZE5vbWluYVxyXG4gICAgICAgIH0gICAgICAgIFxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9hc2lnbmFjaW9uX3BlcnNvbmFsX25vbWluYV9kYW8ucGhwP1xyXG4gICAgICAgICAgdGlwbz0ke3RpcG99JmNlZHVsYT0ke2NlZHVsYX0mbm9tYnJlPSR7bm9tYnJlfSZhcGVsbGlkbz0ke2FwZWxsaWRvfSZpZE5vbWluYT0ke2lkTm9taW5hfSZpZEVudGVycHJpc2U9JHtpZEVudGVycHJpc2V9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgICBcclxuICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNUGVyc29uYWxOb21pbmEoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSBpZFBlcnNvbmFsOiBpZCBkZWwgcGVyc29uYWxcclxuICAgKiBAcGFyYW0gdGlwbzogdmFsb3Jlc1snbm9taW5hX3BlcnNvbmFsJ10gXHJcbiAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIG5vbWluYXMgZGVsIHBlcnNvbmFsIHJlc3VtaWRhXHJcbiAgICogQGRlcHJlY2F0ZWQ7IDIwLTAxLTIyXHJcbiAgICogQHJldHVybnMgXHJcbiAgICovXHJcbiAgXHJcbiAgcHVibGljIGdldFBlcnNvbmFsTm9taW5hUmVzdW1pZGEoaWRQZXJzb25hbDpudW1iZXIsdGlwbzpzdHJpbmcpe1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL3BlcnNvbmFsX2Rhby5waHA/aWRQZXJzb25hbD0ke2lkUGVyc29uYWx9JnRpcG89JHt0aXBvfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgIFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Ob21pbmFTaW1wbGUoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIFNpc3RlbWFzIHBhcmEgZWwgdXN1YXJpbyBkZWZpbmlkbyBzZWd1biBzdSBwZXJtaXNvbG9naWEgZGVsIFNpc3RlbWFcclxuICAgICAgICogQHJldHVybiBKc29uIGRhdGFcclxuICAgICAgICogQGF1dGhvciBJbmcuIERpbWFseSBDcmVzcG9cclxuICAgICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0UGVyZmlsU2lzdGVtYShpZF91c3VhcmlvOm51bWJlciApe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3NzL3VzdWFyaW9zX3Npc3RlbWFzX2Rhby5waHA/aWRfdXN1YXJpbz0ke2lkX3VzdWFyaW99YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgICAgICBcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHsgXHJcbiAgICAgICAgICAgIGlmKHJlcy5kYXRhLmxlbmd0aD4wKXtcclxuICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNVXN1YXJpb1Npc3RlbWEoZSkpOyAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlczsgICAgIFxyXG4gICAgICAgICAgIH0pXHJcbiAgICAgICAgICBcclxuICAgICAgICApO1xyXG4gICAgICBcclxuICAgfVxyXG5cclxuICBcclxuICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIE1lbnUgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICAgICovXHJcbiAgICAgICAgICBwdWJsaWMgZ2V0UGVyZmlsTm9Db21wb25lbnQoaWRfdXN1YXJpbzpudW1iZXIsc2lzdGVtYTpzdHJpbmcsIG5hbWVDb21wb25lbnQ6IHN0cmluZyApe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLlVSTH0vZGFvL3Nzcy9kZXJlY2hvc191c3VhcmlvX2Rhby5waHA/aWRfdXN1YXJpbz0ke2lkX3VzdWFyaW99JnNpc3RlbWE9JHtzaXN0ZW1hfSZuYW1lY29tcG9uZW50PSR7bmFtZUNvbXBvbmVudH1gLFxyXG4gICAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgICAgICBcclxuICAgICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICBcclxuICAgICAgIH1cclxuICBcclxuICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIE1lbnUgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICAgICovXHJcbiAgICAgICAgcHVibGljIGdldEpzb25NZW51KGlkX3VzdWFyaW86bnVtYmVyLHNpc3RlbWE6c3RyaW5nKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3NzL21lbnVfZGFvLnBocD9pZF91c3VhcmlvPSR7aWRfdXN1YXJpb30mc2lzdGVtYT0ke3Npc3RlbWF9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgIFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7IFxyXG4gICAgICAgICAgICAgICB0aGlzLnVzZXJNZW51ID0gcmVzLmRhdGE7XHJcbiAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVzZXJNZW51O1xyXG4gICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAgLyoqXHJcbiAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSnNvbiBNZW51IHBhcmEgZWwgdXN1YXJpbyBkZWZpbmlkbyBzZWd1biBzdSBwZXJtaXNvbG9naWEgZGVsIFNpc3RlbWFcclxuICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICAgICAqL1xyXG4gICAgICBwdWJsaWMgbG9nKGJvZHk6IE1Mb2cgKXsgIFxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zc3MvbG9nX2Rhby5waHBgLCBib2R5ICwge1xyXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICAgIH0pLnBpcGUoICBcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHsgIFxyXG4gICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcbiAgICBcclxuICAgIH1cclxuXHJcbiAgXHJcbiAgICAgICAgXHJcbiAgIC8qKlxyXG4gICAgKiBAbmFtZSBFbmNyeXB0RGF0YVxyXG4gICAgKiBAZGVzY3JpcHRpb24gRW5zY3JpcHRhIHVuYSBleHByZXNpb24gZGF0YVxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlw7FvXHJcbiAgICAqL1xyXG4gICAgcHVibGljIEVuY3J5cHREYXRhKCBleHByZXNpb24gOiBzdHJpbmcpe1xyXG4gICAgICAgY29uc3Qga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UgKFwiMDEyMzQ1Njc4OVNJR0VTUFwiKTsgLy8gbsO6bWVybyBoZXhhZGVjaW1hbCBkZSAxNiBkw61naXRvcyBjb21vIGNsYXZlXHJcbiAgICAgICBjb25zdCBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlICgnU0lHRVNQMDEyMzQ1Njc4OScpOyAvLyBOw7ptZXJvIGhleGFkZWNpbWFsIGNvbW8gZGVzcGxhemFtaWVudG8gZGUgY2xhdmVcclxuICAgICAgIGxldCBzcmNzID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoZXhwcmVzaW9uKTtcclxuICAgICAgIGxldCBlbmNyeXB0ZWQgPSBDcnlwdG9KUy5BRVMuZW5jcnlwdChzcmNzLCBrZXksIHsgaXY6IGl2LCBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQywgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3IH0pO1xyXG4gICAgICAgcmV0dXJuIGVuY3J5cHRlZC5jaXBoZXJ0ZXh0LnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcclxuICAgIH1cclxuIFxyXG4gICAgLyoqXHJcbiAgICAqIEBuYW1lIERlY3J5cHREYXRhXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBEZXNlbmNyaXB0YSB1bmEgZXhwcmVzaW9uIGRhdGFcclxuICAgICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZcOxb1xyXG4gICAgKi9cclxuICAgIHB1YmxpYyBEZWNyeXB0RGF0YSggZXhwcmVzaW9uIDogc3RyaW5nKXtcclxuICAgICAgIGNvbnN0IGtleSA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlIChcIjAxMjM0NTY3ODlTSUdFU1BcIik7IC8vIG7Dum1lcm8gaGV4YWRlY2ltYWwgZGUgMTYgZMOtZ2l0b3MgY29tbyBjbGF2ZVxyXG4gICAgICAgY29uc3QgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSAoJ1NJR0VTUDAxMjM0NTY3ODknKTsgLy8gTsO6bWVybyBoZXhhZGVjaW1hbCBjb21vIGRlc3BsYXphbWllbnRvIGRlIGNsYXZlXHJcbiAgICAgICBsZXQgZW5jcnlwdGVkSGV4U3RyID0gQ3J5cHRvSlMuZW5jLkhleC5wYXJzZShleHByZXNpb24pO1xyXG4gICAgICAgbGV0IHNyY3MgPSBDcnlwdG9KUy5lbmMuQmFzZTY0LnN0cmluZ2lmeShlbmNyeXB0ZWRIZXhTdHIpO1xyXG4gICAgICAgbGV0IGRlY3J5cHQgPSBDcnlwdG9KUy5BRVMuZGVjcnlwdChzcmNzLCBrZXksIHsgaXY6IGl2LCBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQywgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3IH0pO1xyXG4gICAgICAgbGV0IGRlY3J5cHRlZFN0ciA9IGRlY3J5cHQudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xyXG4gICAgICAgcmV0dXJuIGRlY3J5cHRlZFN0ci50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gXHJcbiBcclxuICAgIC8qKlxyXG4gICAgKiBAbmFtZSBnZXRSZXNwb25zZVBlcmZpbFRvb2xiYXJcclxuICAgICogQGRlc2NyaXB0aW9uIE1ldG9kbyBxdWUgb2J0aWVuZSB1bmEgcmVzcHVlc3RhIHRydWUgbyBmYWxzZSBiYXNhZG8gZW4gdW5hIGVzdHJ1Y3R1cmEgc3JpbmcgYmluYW5yaWEgc2VndW4gXHJcbiAgICAqICAgICAgICAgICAgICBsYSBwb3NpY2lvbiBkYWRhIGRlbCB0b29sYmFyLiBzZSBwYXNhIHN0cmluZyBiaW5hcmlvIHF1ZSBjb250aWVuZSAxIHkgMCBlbiByZXByZXNlbnRhY2lvbiBcclxuICAgICogICAgICAgICAgICAgIGRlIGxhcyBwcm9waWVzdGFkZXMgYWRtaW5pc3RyYWRvcixjb25zdWx0YXIsZWplY3V0YXIsaW1wcmltaXIgZXRjIC4uLiBjYWRhIHBvc2ljaW9uIHNlY3VlbmNpYWwgXHJcbiAgICAqICAgICAgICAgICAgICBzaSBlc3RhIGVuIDEgZXMgdHJ1ZSB5IDAgZW4gZmFsc2UgeSBkZXZ1bGV2ZSBlbCB2YWxvciBzZWd1biBsbyByZXF1aWVyYSBlbCB1c3VhcmlvOlxyXG4gICAgKiAgICAgICAgICAgICAgc3RyaW5nYmluYXJpbyA6ICcxMDExJyB5IHBvc2ljaW9uIGVzIDIsIHBvciB0YW50byBzZSB0YXJlIDAgeSBlcyBmYWxzZSBxdWUgcmVwcmVzZW50YSBvcGNpb24gY29uc3VsdGFyLlxyXG4gICAgKiAgICAgICAgICAgICAgRXN0cnVjdHVyYSBzdHJpbmcgYmluYXJpbzpcclxuICAgICogICAgICAgICAgICAgIFBvc2ljacOzbiA6XHJcbiAgICAqICAgICAgICAgICAgICAwLiAgQWRtaW5pc3RyYWRvciAgICAgICAgNi4gIERlc2NhcmdhciAgICAgIDEyLiBSZXZlcnNhciBhcHJvYmFyICAgICAgMTguIFJldmVyc2FyIGFudWxhciBjb250YWJpbGl6YWRvXHJcbiAgICAqICAgICAgICAgICAgICAxLiAgaW5zZXJ0YXIgICAgICAgICAgICAgNy4gIEVqZWN1dGFyICAgICAgIDEzLiBBbnVsYXIuXHJcbiAgICAqICAgICAgICAgICAgICAyLiAgQWN0dWFsaXphciAgICAgICAgICAgOC4gIEVudmlhciAgICAgICAgIDE0LiByZXZlcnNhciBhbnVsYXJcclxuICAgICogICAgICAgICAgICAgIDMuICBjb25zdWx0YXIgICAgICAgICAgICA5LiBJbXByaW1pciAgICAgICAgMTUuIGNvbnRhYmlsaXphclxyXG4gICAgKiAgICAgICAgICAgICAgNC4gIEVsaW1pbmFyICAgICAgICAgICAgIDEwLiBWaXNpYmxlICAgICAgICAxNi4gcmV2ZXJzYXIgY29udGFiaWxpemFyXHJcbiAgICAqICAgICAgICAgICAgICA1LiAgQW51bGFyICAgICAgICAgICAgICAgMTEuIEFwcm9iYXIgICAgICAgIDE3LiBhbnVsYXIgY29udGFiaWxpemFkbyAgICAgICBcclxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZcOxb1xyXG4gICAgKi9cclxuICAgICBwdWJsaWMgZ2V0UmVzcG9uc2VQZXJmaWxUb29sYmFyKCBzdHJpbmdiaW5hcmlvIDogc3RyaW5nLCBwb3NpdGlvbiA6IG51bWJlciApe1xyXG4gICAgICAgICAgbGV0IGJpbmFyaW8gPSBzdHJpbmdiaW5hcmlvLnN1YnN0cmluZyhwb3NpdGlvbixwb3NpdGlvbisxKSA7XHJcbiAgICAgICAgICBpZiAoYmluYXJpbz09XCIxXCIpe1xyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlOyBcclxuICAgICAgICAgIH0gICBcclxuICAgICAgICAgIHJldHVybiBmYWxzZTsgXHJcbiAgICAgfVxyXG5cclxuIC8qKlxyXG4gICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAgICovXHJcbiAgcHVibGljIGdldElQQWRkcmVzcygpeyAgXHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoXCJodHRwOi8vYXBpLmlwaWZ5Lm9yZy8/Zm9ybWF0PWpzb25cIikgXHJcbiAgICAucGlwZShcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIGNhdWdodCBpbiBzZXJ2aWNlJylcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnaXBfYWRyZXNzJywgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIC8vSGFuZGxlIHRoZSBlcnJvciBoZXJlXHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycik7ICAgIC8vUmV0aHJvdyBpdCBiYWNrIHRvIGNvbXBvbmVudFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIFxyXG4gIH1cclxuIC8qKlxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSXAgZGVsIGNsaWVudGVcclxuICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlbm9cclxuICAqL1xyXG4gIHB1YmxpYyBzZXRJcEFkcmVzcygpe1xyXG4gICAgdGhpcy5nZXRJUEFkZHJlc3MoKS5zdWJzY3JpYmUoIChyZXNwOiBhbnkpICAgPT4ge1xyXG4gICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdpcF9hZHJlc3MnLCByZXNwLmlwKTtcclxuICAgICAgICAgdGhpcy5pcF9hZHJlc3MgPSByZXNwLmlwO1xyXG4gICAgfSk7ICBcclxuICB9IFxyXG4gLyoqXHJcbiAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICogQHJldHVybiBKc29uIGRhdGFcclxuICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICovXHJcbiAgcHVibGljIGdldElwQWRyZXNzKCl7XHJcbiAgICB0aGlzLmlwX2FkcmVzcyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2lwX2FkcmVzcycpOyAgXHJcbiAgfSBcclxuXHJcbiAgIC8qKlxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgSXAgZGVsIGNsaWVudGVcclxuICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgKiBAZGlhIDE5LTA1LTIwMjJcclxuICAqLyAgXHJcblxyXG4gICAgcHVibGljIGNyZWF0ZUF1ZGl0b3JpYShzbm86TVNub0xvZ1tdKXtcclxuICAgICAgbGV0IGJvZHk9W107XHJcbiAgICAgIHNuby5mb3JFYWNoKGU9PiB7Ym9keS5wdXNoKGUuZGF0YUludGVmYWNlKCkpfSk7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL3NlZ3VyaWRhZF9kYW8ucGhwP2AsYm9keSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7cmV0dXJuIHJlczt9KVxyXG4gICAgICApO1xyXG4gICAgfSAgXHJcblxyXG4gLyoqICBcclxuICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyB0aXBvcyBkZSBkZXBvc2l0b3MgICogXHJcbiAgKiBAcGFyYW0gcHJvY2VkZSA6IHByb2NlZGUgZGVsIG1vZHVsb1xyXG4gICogQHBhcmFtIGlkTWF0ZXJpYWwgOiBpZCBkZWwgYXJ0aWN1bG9cclxuICAqIEBwYXJhbSBpZFVzdWFyaW8gOiBpZCB1c3VhcmlvIHBlcm1pdGlkb1xyXG4gICogQHJldHVybnMgXHJcbiAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAqIEBkYXRlIDIzLTAxLTIwMjVcclxuICAqLyAgICAgIFxyXG4gIHB1YmxpYyBnZXREZXBvc2l0VHlwZShwcm9jZWRlOnN0cmluZyxpZE1hdGVyaWFsOm51bWJlcixpZEVudGVycHJpc2U6bnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zaXYvY2F0YWxvZ29fcGFyYW1ldHJpemFkb19kYW8ucGhwP2dldD0ke3Byb2NlZGV9JmlkPSR7aWRNYXRlcmlhbH0maT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgIFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1UaXBvRGVwb3NpdG9zKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiAgXHJcbiAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBDYXJnb3MgQWRpY2lvbmFsZXMgICogXHJcbiAgKiBAcGFyYW0gdGlwbyA6IG9uZSxkZWZhdWx0XHJcbiAgKiBAcGFyYW0gaWQgOiBpZCBkZWwgY2FyZ28gXHJcbiAgKiBAcmV0dXJucyBcclxuICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICogQGRhdGUgMTMtMTEtMjAyMlxyXG4gICovICAgICAgXHJcbiAgcHVibGljIGdldENhcmdvc0FkaWNpb25hbGVzKHRpcG86c3RyaW5nLGlkPzpudW1iZXIpe1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3N0Yi9jYXJnb3NfYWRpY2lvbmFsZXNfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgXHJcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNhcmdvc0FkaWNpb25hbGVzKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogIFxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHJlbGVhc2UgXHJcbiAgKiBAcGFyYW0gdGlwbyA6IHJlbGVhc2UgKG9idGllbmUgZWwgdWx0aW1vIHJlbGVhc2UgZGVsIHNpc3RlbWEpLHZlcmlmaWNhcih2ZXJpZmljYSBzaSBzZSBlamVjdXRvIGVsIHVsdGltbyByZWxlYXNlKVxyXG4gICogQHBhcmFtIHNpc3RlbWEgOiBzaXN0ZW1hIFxyXG4gICogQHBhcmFtIHNlY2Npb24gOiB0aXBvICdSRUxFQVNFJyBcclxuICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgKiBAZGF0ZSAyMS0wNi0yMDI0XHJcbiAgKi8gICAgICBcclxuICBwdWJsaWMgZ2V0VmVyaWZpY2FyUmVsZWFzZSh0aXBvOnN0cmluZyxzaXN0ZW1hOnN0cmluZyxzZWNjaW9uOnN0cmluZz1udWxsKXtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9pbnMvaW5zdGFsYV9kYW8ucGhwP3RpcG89JHt0aXBvfSZzaXN0ZW1hPSR7c2lzdGVtYX0mc2VjY2lvbj0ke3NlY2Npb259YCxcclxuICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgIFxyXG4gICAgICBtYXAoKHJlczogYW55KSA9PiB7cmV0dXJuIHJlczt9KVxyXG4gICAgKTtcclxuICB9ICAgICAgIFxyXG5cclxuXHJcbiAgcHVibGljIGdldFJlcG9ydGVQZXJzb25hbGl6YWRvKHRpcG86c3RyaW5nPSdkZWZhdWx0JyxpZEVudGVycHJpc2U6bnVtYmVyLHNpc3RlbWE6c3RyaW5nLGNhc286c3RyaW5nKXtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29uZmlndXJhY2lvbkVycF9kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWRFbnRlcnByaXNlfSZzaXM9JHtzaXN0ZW1hfSZjYXM9JHtjYXNvfWAsXHJcbiAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCBtYXAoKHJlczogYW55KSA9PiB7cmV0dXJuIHJlcy5kYXRhO30pICk7XHJcbiAgfSAgICAgICBcclxufVxyXG5cclxuXHJcbiAgXHJcbmludGVyZmFjZSBmaWx0cm9DdWVudGFzUHJlc3VwdWVzdG8ge1xyXG4gIHRpcG8/OiAnRScgfCAnUicsXHJcbiAgZXN0YWRvPzogJ0MnIHwgJ1MnXHJcbn1cclxuXHJcblxyXG4iXX0=
|