sigesp 0.9.104-20240402 → 1.0.0-20240419
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 +360 -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 +27 -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 +151 -0
- package/esm2020/lib/core/models/CFG/Enterprise.model.mjs +70 -0
- package/esm2020/lib/core/models/CFG/MPrefijo.model.mjs +64 -0
- package/esm2020/lib/core/models/CFG/Procede.model.mjs +31 -0
- package/esm2020/lib/core/models/CFG/TasaCambio.model.mjs +34 -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 +46 -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 +164 -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 +83 -0
- package/esm2020/lib/core/models/SCG/accountMarriage.model.mjs +29 -0
- package/esm2020/lib/core/models/SCG/centroCosto.model.mjs +65 -0
- package/esm2020/lib/core/models/SCG/configuracionSCG.model.mjs +169 -0
- package/esm2020/lib/core/models/SCG/cuentaInstitucional.model.mjs +89 -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 +61 -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 +205 -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 +101 -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 +234 -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 +404 -0
- package/esm2020/lib/core/models/SNO/MConstanteNomina.model.mjs +67 -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 +343 -0
- package/esm2020/lib/core/models/SNO/MDefinicionesBasicas.model.mjs +84 -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 +119 -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 +47 -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 +86 -0
- package/esm2020/lib/core/models/SNO/MPeriodoNomina.model.mjs +95 -0
- package/esm2020/lib/core/models/SNO/MPermisos.model.mjs +68 -0
- package/esm2020/lib/core/models/SNO/MPersonal.model.mjs +626 -0
- package/esm2020/lib/core/models/SNO/MPersonalJubilado.model.mjs +64 -0
- package/esm2020/lib/core/models/SNO/MPersonalNomina.model.mjs +313 -0
- package/esm2020/lib/core/models/SNO/MPlanHorario.model.mjs +116 -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 +66 -0
- package/esm2020/lib/core/models/SOC/clause.model.mjs +31 -0
- package/esm2020/lib/core/models/SOC/clauseModality.model.mjs +35 -0
- package/esm2020/lib/core/models/SOC/configuracionSOC.model.mjs +62 -0
- package/esm2020/lib/core/models/SOC/service.model.mjs +46 -0
- package/esm2020/lib/core/models/SOC/serviceCharge.model.mjs +37 -0
- package/esm2020/lib/core/models/SOC/serviceType.model.mjs +31 -0
- package/esm2020/lib/core/models/SPG/UnidadAdministradoraCentral.mjs +43 -0
- package/esm2020/lib/core/models/SPG/administrativeUnit.model.mjs +112 -0
- package/esm2020/lib/core/models/SPG/comprobantePresupuestario.model.mjs +51 -0
- package/esm2020/lib/core/models/SPG/configurationSPG.model.mjs +59 -0
- package/esm2020/lib/core/models/SPG/cuentaPresupuesto.model.mjs +120 -0
- package/esm2020/lib/core/models/SPG/estructuraPresupuestaria.model.mjs +176 -0
- package/esm2020/lib/core/models/SPG/expensiveAccount.model.mjs +108 -0
- package/esm2020/lib/core/models/SPG/fuenteFinanciamiento.model.mjs +31 -0
- package/esm2020/lib/core/models/SPG/incomeStructureAccount.model.mjs +81 -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 +71 -0
- package/esm2020/lib/core/models/SSS/user.model.mjs +32 -0
- package/esm2020/lib/core/models/SSS/userDetail.model.mjs +73 -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 +84 -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 +72 -0
- package/esm2020/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.mjs +83 -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 +2050 -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.js → sigesp.mjs} +524 -286
- package/fesm2015/sigesp.mjs.map +1 -0
- package/fesm2020/sigesp.mjs +14485 -0
- package/fesm2020/sigesp.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/app/app.component.d.ts +3 -0
- package/lib/app/app.module.d.ts +8 -0
- package/lib/core/models/SNO/MAuditoria.model.d.ts +1 -1
- package/lib/core/models/SNO/MFamiliares.model.d.ts +2 -2
- package/lib/shared/components/catalogo/catalogo.component.d.ts +4 -1
- package/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.d.ts +3 -0
- package/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.d.ts +4 -1
- package/lib/shared/components/confirm/confirm.component.d.ts +3 -0
- package/lib/shared/components/icon/icon.component.d.ts +3 -0
- package/lib/shared/components/table-select/table-select.component.d.ts +4 -1
- package/lib/shared/material/material.module.d.ts +46 -0
- package/lib/shared/pipes/iso-currency.pipe.d.ts +3 -0
- package/lib/shared/shared.module.d.ts +14 -0
- package/lib/sigesp.service.d.ts +6 -3
- package/lib/validation.service.d.ts +3 -0
- package/package.json +23 -11
- package/public-api.d.ts +8 -0
- package/bundles/sigesp.umd.js +0 -15577
- package/bundles/sigesp.umd.js.map +0 -1
- package/bundles/sigesp.umd.min.js +0 -2
- package/bundles/sigesp.umd.min.js.map +0 -1
- package/esm2015/lib/app/app.component.js +0 -15
- package/esm2015/lib/app/app.module.js +0 -23
- package/esm2015/lib/core/interfaces/Auditoria.js +0 -49
- package/esm2015/lib/core/interfaces/Banco.js +0 -2
- package/esm2015/lib/core/interfaces/Catalogo.js +0 -2
- package/esm2015/lib/core/interfaces/CentroCosto.js +0 -2
- package/esm2015/lib/core/interfaces/Clasificacion.js +0 -2
- package/esm2015/lib/core/interfaces/Cliente.js +0 -2
- package/esm2015/lib/core/interfaces/ComprobantePresupuestario.js +0 -2
- package/esm2015/lib/core/interfaces/Comunidad.js +0 -2
- package/esm2015/lib/core/interfaces/Configuracion.js +0 -2
- package/esm2015/lib/core/interfaces/ConfiguracionRPC.js +0 -2
- package/esm2015/lib/core/interfaces/ConfiguracionSCG.js +0 -2
- package/esm2015/lib/core/interfaces/ConfigurationSPG.js +0 -2
- package/esm2015/lib/core/interfaces/Constantes.js +0 -360
- package/esm2015/lib/core/interfaces/CuentaEgresos.js +0 -2
- package/esm2015/lib/core/interfaces/CuentaIngreso.js +0 -2
- package/esm2015/lib/core/interfaces/CuentaIngresoEstructura.js +0 -2
- package/esm2015/lib/core/interfaces/CuentaInstitucional.js +0 -2
- package/esm2015/lib/core/interfaces/CuentaPresupuesto.js +0 -2
- package/esm2015/lib/core/interfaces/CuentasPorPagar.js +0 -2
- package/esm2015/lib/core/interfaces/Documento.js +0 -2
- package/esm2015/lib/core/interfaces/EntradaSuministro.js +0 -2
- package/esm2015/lib/core/interfaces/Especialidad.js +0 -2
- package/esm2015/lib/core/interfaces/EstructuraPresupuestaria.js +0 -2
- package/esm2015/lib/core/interfaces/FuenteFinanciamiento.js +0 -2
- package/esm2015/lib/core/interfaces/IBancoCuentasPorPagar.js +0 -2
- package/esm2015/lib/core/interfaces/ITipoDepositos.js +0 -2
- package/esm2015/lib/core/interfaces/Integracion.js +0 -2
- package/esm2015/lib/core/interfaces/Lugares.js +0 -2
- package/esm2015/lib/core/interfaces/Moneda.js +0 -2
- package/esm2015/lib/core/interfaces/Nomina.js +0 -27
- package/esm2015/lib/core/interfaces/PlanUnicoCuenta.js +0 -2
- package/esm2015/lib/core/interfaces/Presupuesto.js +0 -2
- package/esm2015/lib/core/interfaces/Proveedor.js +0 -2
- package/esm2015/lib/core/interfaces/RecursosHumanos.js +0 -4
- package/esm2015/lib/core/interfaces/Request.js +0 -2
- package/esm2015/lib/core/interfaces/Response.js +0 -2
- package/esm2015/lib/core/interfaces/Seguridad.js +0 -2
- package/esm2015/lib/core/interfaces/Servicios.js +0 -2
- package/esm2015/lib/core/interfaces/Sistema.js +0 -2
- package/esm2015/lib/core/interfaces/Tributos.js +0 -2
- package/esm2015/lib/core/interfaces/UnidadTributaria.js +0 -2
- package/esm2015/lib/core/interfaces/Usuario.js +0 -2
- package/esm2015/lib/core/interfaces/UsuarioPrefijo.js +0 -2
- package/esm2015/lib/core/models/CFG/Empresa.model.js +0 -151
- package/esm2015/lib/core/models/CFG/Enterprise.model.js +0 -70
- package/esm2015/lib/core/models/CFG/MPrefijo.model.js +0 -64
- package/esm2015/lib/core/models/CFG/Procede.model.js +0 -31
- package/esm2015/lib/core/models/CFG/TasaCambio.model.js +0 -34
- package/esm2015/lib/core/models/CFG/comunidad.model.js +0 -22
- package/esm2015/lib/core/models/CFG/locations.model.js +0 -170
- package/esm2015/lib/core/models/CFG/moneda.model.js +0 -72
- package/esm2015/lib/core/models/CFG/userPrefix.model.js +0 -46
- package/esm2015/lib/core/models/CXP/MConceptosCXP.model.js +0 -34
- package/esm2015/lib/core/models/CXP/MTipoDocumentoCXP.model.js +0 -44
- package/esm2015/lib/core/models/RPC/clasification.model.js +0 -16
- package/esm2015/lib/core/models/RPC/configuracionRPC.model.js +0 -23
- package/esm2015/lib/core/models/RPC/document.model.js +0 -16
- package/esm2015/lib/core/models/RPC/proveedores.model.js +0 -9
- package/esm2015/lib/core/models/RPC/providerBeneficiary.model.js +0 -164
- package/esm2015/lib/core/models/RPC/specialty.model.js +0 -12
- package/esm2015/lib/core/models/SCB/bank.model.js +0 -181
- package/esm2015/lib/core/models/SCG/IncomeAccount.js +0 -83
- package/esm2015/lib/core/models/SCG/accountMarriage.model.js +0 -29
- package/esm2015/lib/core/models/SCG/centroCosto.model.js +0 -65
- package/esm2015/lib/core/models/SCG/configuracionSCG.model.js +0 -169
- package/esm2015/lib/core/models/SCG/cuentaInstitucional.model.js +0 -89
- package/esm2015/lib/core/models/SCG/planUnicoCuenta.model.js +0 -17
- package/esm2015/lib/core/models/SFV/MClienteModel.js +0 -116
- package/esm2015/lib/core/models/SIV/MDetaContable.model.js +0 -62
- package/esm2015/lib/core/models/SIV/MDetaEntrada.model.js +0 -94
- package/esm2015/lib/core/models/SIV/MEntradaSuministro.model.js +0 -132
- package/esm2015/lib/core/models/SIV/MTipoDepositos.model.js +0 -61
- package/esm2015/lib/core/models/SNO/MAnticipoPrestaciones.model.js +0 -100
- package/esm2015/lib/core/models/SNO/MArchivoTxtCampo.model.js +0 -61
- package/esm2015/lib/core/models/SNO/MArchivosTxt.model.js +0 -41
- package/esm2015/lib/core/models/SNO/MAsignacionCargo.model.js +0 -205
- package/esm2015/lib/core/models/SNO/MAspectoEvaluacion.model.js +0 -90
- package/esm2015/lib/core/models/SNO/MAuditoria.model.js +0 -61
- package/esm2015/lib/core/models/SNO/MBeneficiario.model.js +0 -137
- package/esm2015/lib/core/models/SNO/MCargaFamiliar.model.js +0 -52
- package/esm2015/lib/core/models/SNO/MCargaMasiva.model.js +0 -34
- package/esm2015/lib/core/models/SNO/MCargosPersonal.model.js +0 -101
- package/esm2015/lib/core/models/SNO/MClasificacionObrero.mdel.js +0 -46
- package/esm2015/lib/core/models/SNO/MCodigoUnicoRac.model.js +0 -39
- package/esm2015/lib/core/models/SNO/MComponete.model.js +0 -38
- package/esm2015/lib/core/models/SNO/MConceptoVacaciones.model.js +0 -85
- package/esm2015/lib/core/models/SNO/MConceptosNomina.model.js +0 -234
- package/esm2015/lib/core/models/SNO/MConceptosPersonalNomina.model.js +0 -97
- package/esm2015/lib/core/models/SNO/MConcursante.model.js +0 -317
- package/esm2015/lib/core/models/SNO/MConcurso.model.js +0 -246
- package/esm2015/lib/core/models/SNO/MConfiguracionSNO.model.js +0 -404
- package/esm2015/lib/core/models/SNO/MConstanteNomina.model.js +0 -67
- package/esm2015/lib/core/models/SNO/MConstantePersonalNomina.model.js +0 -79
- package/esm2015/lib/core/models/SNO/MDedicacion.model.js +0 -35
- package/esm2015/lib/core/models/SNO/MDefinicionNomina.model.js +0 -343
- package/esm2015/lib/core/models/SNO/MDefinicionesBasicas.model.js +0 -84
- package/esm2015/lib/core/models/SNO/MDeudaAnterior.model.js +0 -40
- package/esm2015/lib/core/models/SNO/MEncargaduria.model.js +0 -138
- package/esm2015/lib/core/models/SNO/MEscalaEvaluacion.model.js +0 -38
- package/esm2015/lib/core/models/SNO/MEscalaEvaluacionDt.model.js +0 -37
- package/esm2015/lib/core/models/SNO/MEstructuraOrganizativa.model.js +0 -119
- package/esm2015/lib/core/models/SNO/MFamiliares.model.js +0 -86
- package/esm2015/lib/core/models/SNO/MFeriados.model.js +0 -43
- package/esm2015/lib/core/models/SNO/MFideicomiso.model.js +0 -406
- package/esm2015/lib/core/models/SNO/MFormacionAcademica.model.js +0 -49
- package/esm2015/lib/core/models/SNO/MGrado.model.js +0 -47
- package/esm2015/lib/core/models/SNO/MHojaTiempo.model.js +0 -117
- package/esm2015/lib/core/models/SNO/MImpuestoSobreRenta.model.js +0 -73
- package/esm2015/lib/core/models/SNO/MMetodoBanco.model.js +0 -105
- package/esm2015/lib/core/models/SNO/MNominaSimple.model.js +0 -86
- package/esm2015/lib/core/models/SNO/MPeriodoNomina.model.js +0 -95
- package/esm2015/lib/core/models/SNO/MPermisos.model.js +0 -68
- package/esm2015/lib/core/models/SNO/MPersonal.model.js +0 -626
- package/esm2015/lib/core/models/SNO/MPersonalJubilado.model.js +0 -64
- package/esm2015/lib/core/models/SNO/MPersonalNomina.model.js +0 -313
- package/esm2015/lib/core/models/SNO/MPlanHorario.model.js +0 -116
- package/esm2015/lib/core/models/SNO/MPlantillaConstancia.model.js +0 -31
- package/esm2015/lib/core/models/SNO/MPrestamo.model.js +0 -221
- package/esm2015/lib/core/models/SNO/MPrimaGrados.model.js +0 -43
- package/esm2015/lib/core/models/SNO/MPrimasConcepto.model.js +0 -43
- package/esm2015/lib/core/models/SNO/MRango.model.js +0 -43
- package/esm2015/lib/core/models/SNO/MReportesRRHH.js +0 -402
- package/esm2015/lib/core/models/SNO/MRequisitosConcursante.model.js +0 -46
- package/esm2015/lib/core/models/SNO/MRequisitosConcursos.model.js +0 -37
- package/esm2015/lib/core/models/SNO/MRequisitosMinimos.model.js +0 -113
- package/esm2015/lib/core/models/SNO/MSalarioHistorico.model.js +0 -70
- package/esm2015/lib/core/models/SNO/MSolicitudEmpleo.model.js +0 -121
- package/esm2015/lib/core/models/SNO/MTablaVacaciones.model.js +0 -57
- package/esm2015/lib/core/models/SNO/MTablaVacacionesPeriodo.model.js +0 -40
- package/esm2015/lib/core/models/SNO/MTabulador.model.js +0 -96
- package/esm2015/lib/core/models/SNO/MTipoEvaluacion.model.js +0 -75
- package/esm2015/lib/core/models/SNO/MTipoPersonal.model.js +0 -34
- package/esm2015/lib/core/models/SNO/MTiposEnfermedad.model.js +0 -37
- package/esm2015/lib/core/models/SNO/MTrabajoAnterior.model.js +0 -65
- package/esm2015/lib/core/models/SNO/MUbicacionFisica.model.js +0 -61
- package/esm2015/lib/core/models/SNO/MVacacionesPersonal.model.js +0 -115
- package/esm2015/lib/core/models/SOC/charge.model.js +0 -66
- package/esm2015/lib/core/models/SOC/clause.model.js +0 -31
- package/esm2015/lib/core/models/SOC/clauseModality.model.js +0 -35
- package/esm2015/lib/core/models/SOC/configuracionSOC.model.js +0 -62
- package/esm2015/lib/core/models/SOC/service.model.js +0 -46
- package/esm2015/lib/core/models/SOC/serviceCharge.model.js +0 -37
- package/esm2015/lib/core/models/SOC/serviceType.model.js +0 -31
- package/esm2015/lib/core/models/SPG/UnidadAdministradoraCentral.js +0 -43
- package/esm2015/lib/core/models/SPG/administrativeUnit.model.js +0 -112
- package/esm2015/lib/core/models/SPG/comprobantePresupuestario.model.js +0 -51
- package/esm2015/lib/core/models/SPG/configurationSPG.model.js +0 -59
- package/esm2015/lib/core/models/SPG/cuentaPresupuesto.model.js +0 -120
- package/esm2015/lib/core/models/SPG/estructuraPresupuestaria.model.js +0 -176
- package/esm2015/lib/core/models/SPG/expensiveAccount.model.js +0 -108
- package/esm2015/lib/core/models/SPG/fuenteFinanciamiento.model.js +0 -31
- package/esm2015/lib/core/models/SPG/incomeStructureAccount.model.js +0 -81
- package/esm2015/lib/core/models/SPG/organizationType.model.js +0 -12
- package/esm2015/lib/core/models/SSS/component.model.js +0 -44
- package/esm2015/lib/core/models/SSS/group.model.js +0 -30
- package/esm2015/lib/core/models/SSS/log.model.js +0 -29
- package/esm2015/lib/core/models/SSS/securityConfiguration.model.js +0 -20
- package/esm2015/lib/core/models/SSS/sistema.js +0 -71
- package/esm2015/lib/core/models/SSS/user.model.js +0 -32
- package/esm2015/lib/core/models/SSS/userDetail.model.js +0 -73
- package/esm2015/lib/core/models/SSS/userPermit.model.js +0 -47
- package/esm2015/lib/core/models/SSS/userRights.model.js +0 -104
- package/esm2015/lib/core/models/STB/MCargosAdicionales.js +0 -84
- package/esm2015/lib/core/models/STB/deduction.model.js +0 -90
- package/esm2015/lib/core/models/STB/deductionType.model.js +0 -20
- package/esm2015/lib/core/models/STB/unidadTributaria.model.js +0 -14
- package/esm2015/lib/core/models/basic-model.model.js +0 -8
- package/esm2015/lib/shared/components/catalogo/catalogo.component.js +0 -59
- package/esm2015/lib/shared/components/catalogo-doble-input/catalogo-doble-input.component.js +0 -70
- package/esm2015/lib/shared/components/catalogo-estructuras/catalogo-estructuras.component.js +0 -62
- package/esm2015/lib/shared/components/confirm/confirm.component.js +0 -30
- package/esm2015/lib/shared/components/icon/icon.component.js +0 -20
- package/esm2015/lib/shared/components/table-select/table-select.component.js +0 -85
- package/esm2015/lib/shared/material/customPaginator.js +0 -24
- package/esm2015/lib/shared/material/material.module.js +0 -145
- package/esm2015/lib/shared/pipes/iso-currency.pipe.js +0 -39
- package/esm2015/lib/shared/shared.module.js +0 -51
- package/esm2015/lib/sigesp.service.js +0 -2084
- package/esm2015/lib/validation.service.js +0 -130
- package/esm2015/public-api.js +0 -148
- package/esm2015/sigesp.js +0 -15
- package/fesm2015/sigesp.js.map +0 -1
- package/sigesp.d.ts +0 -32
- package/sigesp.metadata.json +0 -1
|
@@ -1,2084 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { MPrefijo } from './core/models/CFG/MPrefijo.model';
|
|
3
|
-
import { MEnterprise } from './core/models/CFG/Enterprise.model';
|
|
4
|
-
import { MPersonalNomina } from './core/models/SNO/MPersonalNomina.model';
|
|
5
|
-
import { MHojaTiempo } from './core/models/SNO/MHojaTiempo.model';
|
|
6
|
-
import { Injectable } from '@angular/core';
|
|
7
|
-
import { MUsuario } from './core/models/SSS/user.model';
|
|
8
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
9
|
-
import { throwError } from 'rxjs';
|
|
10
|
-
import { MProveedor } from './core/models/RPC/proveedores.model';
|
|
11
|
-
import { map, catchError, retry } from 'rxjs/operators';
|
|
12
|
-
import { MatDialog } from '@angular/material/dialog';
|
|
13
|
-
import { MUsuarioPrefijo } from './core/models/CFG/userPrefix.model';
|
|
14
|
-
import { CatalogoComponent } from './shared/components/catalogo/catalogo.component';
|
|
15
|
-
import { MCuentaPresupuesto } from './core/models/SPG/cuentaPresupuesto.model';
|
|
16
|
-
import { MCuentaInstitucional } from './core/models/SCG/cuentaInstitucional.model';
|
|
17
|
-
import { MMoneda, MMonedaConfig } from './core/models/CFG/moneda.model';
|
|
18
|
-
import { ToastrService } from 'ngx-toastr';
|
|
19
|
-
import { MUnidadTributaria } from './core/models/STB/unidadTributaria.model';
|
|
20
|
-
import { ConfirmComponent } from './shared/components/confirm/confirm.component';
|
|
21
|
-
import { MConfiguracionSCG } from './core/models/SCG/configuracionSCG.model';
|
|
22
|
-
import { MPlanUnicoCuenta } from './core/models/SCG/planUnicoCuenta.model';
|
|
23
|
-
import { TableSelectComponent } from './shared/components/table-select/table-select.component';
|
|
24
|
-
import { MConfigurationSPG } from './core/models/SPG/configurationSPG.model';
|
|
25
|
-
import { MEstructuraPresupuestariaOne, MEstructuraPresupuestariaTwo, MEstructuraPresupuestariaThree, MEstructuraPresupuestariaFour, MEstructuraPresupuestariaFiveComplete, MEstructuraPresupuestariaFive, MAllStructure } from './core/models/SPG/estructuraPresupuestaria.model';
|
|
26
|
-
import { MCentroCosto, MUsuarioCentroCosto } from './core/models/SCG/centroCosto.model';
|
|
27
|
-
import { MFuenteFinanciamiento } from './core/models/SPG/fuenteFinanciamiento.model';
|
|
28
|
-
import { MCuentaEgresos } from './core/models/SPG/expensiveAccount.model';
|
|
29
|
-
import { CatalogoEstructurasComponent } from './shared/components/catalogo-estructuras/catalogo-estructuras.component';
|
|
30
|
-
import { CatalogoDobleInputComponent } from './shared/components/catalogo-doble-input/catalogo-doble-input.component';
|
|
31
|
-
import { MSistema, MUsuarioSistema } from './core/models/SSS/sistema';
|
|
32
|
-
import { MComprobantePresupuestarioEgresos, MComprobantePresupuestarioIngresos } from './core/models/SPG/comprobantePresupuestario.model';
|
|
33
|
-
import { MCuentaIngresos } from './core/models/SCG/IncomeAccount';
|
|
34
|
-
import { MIncomeStructureAccount } from './core/models/SPG/incomeStructureAccount.model';
|
|
35
|
-
import { MOrganizationType } from './core/models/SPG/organizationType.model';
|
|
36
|
-
import { MSpecialty } from './core/models/RPC/specialty.model';
|
|
37
|
-
import { MDocument } from './core/models/RPC/document.model';
|
|
38
|
-
import { MClasification } from './core/models/RPC/clasification.model';
|
|
39
|
-
import { MCountry, MState, MMunicipality, MParish, MCity, MCommunity } from './core/models/CFG/locations.model';
|
|
40
|
-
import { MProviderBeneficiary } from './core/models/RPC/providerBeneficiary.model';
|
|
41
|
-
import { MSigecofBank, MBank, MBankAccountType, MAgenciaBanco, MCuentaBanco } from './core/models/SCB/bank.model';
|
|
42
|
-
import { MConfigurationRPC } from './core/models/RPC/configuracionRPC.model';
|
|
43
|
-
import { MConfigSOC } from './core/models/SOC/configuracionSOC.model';
|
|
44
|
-
import { MDeductionType } from './core/models/STB/deductionType.model';
|
|
45
|
-
import { MCargo } from './core/models/SOC/charge.model';
|
|
46
|
-
import { MConceptoRetencion, MDeduction } from './core/models/STB/deduction.model';
|
|
47
|
-
import { MConfigSSS } from './core/models/SSS/securityConfiguration.model';
|
|
48
|
-
import { MAdministrativeUnit } from './core/models/SPG/administrativeUnit.model';
|
|
49
|
-
import { MComponent } from './core/models/SSS/component.model';
|
|
50
|
-
import { MServiceCharge } from './core/models/SOC/serviceCharge.model';
|
|
51
|
-
import { MEmpresa } from './core/models/CFG/Empresa.model';
|
|
52
|
-
import { MConceptosCXP } from './core/models/CXP/MConceptosCXP.model';
|
|
53
|
-
import { MTipoDocumentoCXP } from './core/models/CXP/MTipoDocumentoCXP.model';
|
|
54
|
-
import { MConfiguracionSNO } from './core/models/SNO/MConfiguracionSNO.model';
|
|
55
|
-
import { MDefinicionNomina } from './core/models/SNO/MDefinicionNomina.model';
|
|
56
|
-
import { MAsignacionCargo } from './core/models/SNO/MAsignacionCargo.model';
|
|
57
|
-
import { MNominaSimple } from './core/models/SNO/MNominaSimple.model';
|
|
58
|
-
import { MPersonal } from './core/models/SNO/MPersonal.model';
|
|
59
|
-
import { MEntradaSuministros } from './core/models/SIV/MEntradaSuministro.model';
|
|
60
|
-
import Swal from 'sweetalert2';
|
|
61
|
-
import * as CryptoJS from 'crypto-js';
|
|
62
|
-
import { MTipoDepositos } from './core/models/SIV/MTipoDepositos.model';
|
|
63
|
-
import { MComunidad } from './core/models/CFG/comunidad.model';
|
|
64
|
-
import { MExchangeRate } from './core/models/CFG/TasaCambio.model';
|
|
65
|
-
import { MCargosAdicionales } from './core/models/STB/MCargosAdicionales';
|
|
66
|
-
import { MClient } from './core/models/SFV/MClienteModel';
|
|
67
|
-
import * as i0 from "@angular/core";
|
|
68
|
-
import * as i1 from "@angular/common/http";
|
|
69
|
-
import * as i2 from "@angular/material/dialog";
|
|
70
|
-
import * as i3 from "ngx-toastr";
|
|
71
|
-
export class SigespService {
|
|
72
|
-
// public URL: string = "http://192.168.1.67/sigesp_php";
|
|
73
|
-
// usuarioActivo: MUsuario = {
|
|
74
|
-
// conexionDB: {
|
|
75
|
-
// baseDeDatos: "db_sigesp_demov3",
|
|
76
|
-
// gestor: "postgres",
|
|
77
|
-
// login: "postgres",
|
|
78
|
-
// nombre: "SIGESP C.A, servidor 85 (SE PUEDE USAR)",
|
|
79
|
-
// password: "adminsigesp",
|
|
80
|
-
// puerto: "5432",
|
|
81
|
-
// servidor: "192.168.1.67",
|
|
82
|
-
// },
|
|
83
|
-
// empresa: {
|
|
84
|
-
// id: 1,
|
|
85
|
-
// periodoFiscal: "2019-01-01",
|
|
86
|
-
// titulo: "SIGESP C.A."
|
|
87
|
-
// },
|
|
88
|
-
// nombre: "SIGESP",
|
|
89
|
-
// token: "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJwYXNzd29yZF91c3UiOiIxMjM0NTY3OCIsImlkX2VtcHJlc2EiOiIxIiwidGl0ZW1wIjoiU0lHRVNQIEMuQS4iLCJwZXJmaXNjYWwiOiIyMDE5LTAxLTAxIiwibF91c3VhcmlvIjoiU0lHRVNQIiwic2Vydmlkb3IiOiIxOTIuMTY4LjEuNjciLCJwdWVydG8iOiI1NDMyIiwiYmFzZWRlZGF0b3MiOiJkYl9zaWdlc3BfZGVtb3YzIiwibG9naW4iOiJwb3N0Z3JlcyIsInBhc3N3b3JkIjoiYWRtaW5zaWdlc3AifQ.PISBSfueRAdsWsJ1AaGcVCgW-2aJkgtvLdsW0Bgo5ltyYowD8oy_nqK5sjE2URGk"
|
|
90
|
-
// }
|
|
91
|
-
// procede: string = 'SCGCMP';
|
|
92
|
-
// codsis: string = 'SCG';
|
|
93
|
-
constructor(http, dialog, toast) {
|
|
94
|
-
this.http = http;
|
|
95
|
-
this.dialog = dialog;
|
|
96
|
-
this.toast = toast;
|
|
97
|
-
this.usuarioActivo = null;
|
|
98
|
-
this.currentComponent = null;
|
|
99
|
-
this.userMenu = null;
|
|
100
|
-
this.ip_adress = '127.0.0.1';
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* @description Valida que selo se escriban guiones y 9
|
|
104
|
-
* @param event
|
|
105
|
-
*/
|
|
106
|
-
onlyGuionesAndNine(event) {
|
|
107
|
-
if (event.key === '-' || event.key === '9') {
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* @description Actualiza el moncmp de sigesp_comprobante
|
|
114
|
-
*/
|
|
115
|
-
updateComprobanteAmount(amount, idComprobante) {
|
|
116
|
-
return this.http.put(`${this.URL}/dao/sigesp/comprobante_dao.php?monto=true`, {
|
|
117
|
-
moncmp: amount,
|
|
118
|
-
id_comprobante: idComprobante
|
|
119
|
-
}, {
|
|
120
|
-
headers: this.getHttpHeaders()
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* @description Actualiza el comprobante prsupuestario de Egresos
|
|
125
|
-
* @param comprobante
|
|
126
|
-
*/
|
|
127
|
-
updateComprobantePresupuestarioEgresos(comprobante) {
|
|
128
|
-
return this.http.put(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, Object.assign(Object.assign({}, comprobante), { id: comprobante.id_dt_spgcmp }), { headers: this.getHttpHeaders() });
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* @description Obtiene el comprobante presupuestario de Egresos
|
|
132
|
-
*/
|
|
133
|
-
getComprobantePresupuestarioEgresos() {
|
|
134
|
-
return this.http.get(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, {
|
|
135
|
-
headers: this.getHttpHeaders()
|
|
136
|
-
}).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(element => new MComprobantePresupuestarioEgresos(element))));
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* @description Actualiza el comprobante prsupuestario de Ingresos
|
|
140
|
-
* @param comprobante
|
|
141
|
-
*/
|
|
142
|
-
updateComprobantePresupuestarioIngresos(comprobante) {
|
|
143
|
-
return this.http.put(`${this.URL}/dao/spg/comprobante_presupuestario_egresos_dao.php`, Object.assign(Object.assign({}, comprobante), { id: comprobante.id_dt_spicmp }), { headers: this.getHttpHeaders() });
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* @description Obtiene el comprobante presupuestario de Ingresos
|
|
147
|
-
*/
|
|
148
|
-
getComprobantePresupuestarioIngresos() {
|
|
149
|
-
return this.http.get(`${this.URL}/dao/spi/comprobante_presupuestario_ingresos_dao.php`, {
|
|
150
|
-
headers: this.getHttpHeaders()
|
|
151
|
-
}).pipe(retry(3), catchError(this.handlerError), map((res) => res.data.map(element => new MComprobantePresupuestarioIngresos(element))));
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* @Actualiza la distribución de la cuenta de egreso
|
|
155
|
-
* @param distribution
|
|
156
|
-
*/
|
|
157
|
-
updateDistributionExpenseAccount(distribution) {
|
|
158
|
-
return this.http.put(`${this.URL}/dao/spg/cuentas_egresos_dao.php`, distribution, { headers: this.getHttpHeaders() });
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* @Actualiza la distribución de la cuenta de egreso
|
|
162
|
-
* @param distribution
|
|
163
|
-
*/
|
|
164
|
-
updateDistributionExpenseAccount2(distribution) {
|
|
165
|
-
return this.http.put(`${this.URL}/dao/spg/cuentas_egresos_dao.php`, distribution, { headers: this.getHttpHeaders() });
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* @Actualiza la distribución de la cuenta de Ingreso
|
|
169
|
-
* @param distribution
|
|
170
|
-
*/
|
|
171
|
-
updateDistributionIncomeAccount(distribution) {
|
|
172
|
-
return this.http.put(`${this.URL}/dao/spi/cuentas_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
173
|
-
.pipe(map((res) => {
|
|
174
|
-
if (res.success) {
|
|
175
|
-
res.data = new MCuentaIngresos(res.data);
|
|
176
|
-
}
|
|
177
|
-
return res;
|
|
178
|
-
}));
|
|
179
|
-
}
|
|
180
|
-
updateDistributionIncomeAccount2(distribution) {
|
|
181
|
-
return this.http.put(`${this.URL}/dao/spi/cuentas_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
182
|
-
.pipe(map((res) => {
|
|
183
|
-
if (res.success) {
|
|
184
|
-
res.data = new MCuentaIngresos(res.data);
|
|
185
|
-
}
|
|
186
|
-
return res;
|
|
187
|
-
}));
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* @Actualiza la distribución de la cuenta de Ingreso de Estructura
|
|
191
|
-
* @param distribution
|
|
192
|
-
*/
|
|
193
|
-
updateDistributionIncomeStructureAccount(distribution, level) {
|
|
194
|
-
return this.http.put(`${this.URL}/dao/spi/cuenta_estructura_ingresos_dao.php`, distribution, { headers: this.getHttpHeaders() })
|
|
195
|
-
.pipe(map((res) => {
|
|
196
|
-
if (res.success) {
|
|
197
|
-
res.data = new MIncomeStructureAccount(res.data, level);
|
|
198
|
-
}
|
|
199
|
-
return res;
|
|
200
|
-
}));
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* @description Obtiene las cuentas por nivel de las cuenats de egresos
|
|
204
|
-
* @param level Número de niveles de la configuración
|
|
205
|
-
* @param id id del nivel 3 o 5 que se va a buscar
|
|
206
|
-
* @return Observable<MCuentaEgresos[]>
|
|
207
|
-
*/
|
|
208
|
-
getExpenseAccountsForLevel(level, id) {
|
|
209
|
-
return this.http.get(`${this.URL}/dao/spg/cuentas_egresos_dao.php?level=${level}&id=${id}`, { headers: this.getHttpHeaders() })
|
|
210
|
-
.pipe(map((res) => res.data.map(element => new MCuentaEgresos(element))));
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* @description Abre el catálogo de estructura presupuesaria
|
|
214
|
-
* @param data Data que se va a mostrar
|
|
215
|
-
* @param configuration Configuración de la estructura
|
|
216
|
-
* @return Promise<any>
|
|
217
|
-
* @author Miguel Ramírez
|
|
218
|
-
*/
|
|
219
|
-
openCatalogoEstructuraPresupuestaria(data, configuration) {
|
|
220
|
-
const catalogo = this.dialog.open(CatalogoEstructurasComponent, {
|
|
221
|
-
data: {
|
|
222
|
-
data,
|
|
223
|
-
configuration
|
|
224
|
-
},
|
|
225
|
-
width: '450px',
|
|
226
|
-
maxHeight: '90vh'
|
|
227
|
-
});
|
|
228
|
-
return catalogo.afterClosed().toPromise();
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* @description Obtiene las cuentas de egresos
|
|
232
|
-
* @param onlyAvailable
|
|
233
|
-
* @return Observable<MCuentaEgresos[]>
|
|
234
|
-
*/
|
|
235
|
-
getExpenseAccounts(onlyAvailable = false) {
|
|
236
|
-
return this.http.get(`${this.URL}/dao/spg/cuentas_egresos_dao.php${onlyAvailable ? '?available=true' : ''}`, { headers: this.getHttpHeaders() })
|
|
237
|
-
.pipe(map((res) => res.data.map(element => new MCuentaEgresos(element))));
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* @description Obtiene todas las estructuras presupuetsarias de las 5 tablas
|
|
241
|
-
* @return Promise<MAllStructure>
|
|
242
|
-
* @author Miguel Ramírez
|
|
243
|
-
*/
|
|
244
|
-
getAllBudgetStructure() {
|
|
245
|
-
return new Promise((resolve, reject) => {
|
|
246
|
-
this.getBudgetStructureOne().subscribe(structureOne => {
|
|
247
|
-
this.getBudgetStructureTwoAll().subscribe(structureTwo => {
|
|
248
|
-
this.getBudgetStructureThree().subscribe(structureThree => {
|
|
249
|
-
this.getBudgetStructureFour().subscribe(structureFour => {
|
|
250
|
-
this.getBudgetStructureFiveByIdEp4().subscribe(structureFive => {
|
|
251
|
-
resolve(new MAllStructure({
|
|
252
|
-
structureOne,
|
|
253
|
-
structureTwo,
|
|
254
|
-
structureThree,
|
|
255
|
-
structureFour,
|
|
256
|
-
structureFive
|
|
257
|
-
}));
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* @description Obtiene la estructura completa dependiendo de la configuración
|
|
267
|
-
* @return Promise<any[]>
|
|
268
|
-
* @author Miguel Ramírez
|
|
269
|
-
* @type= {}
|
|
270
|
-
*/
|
|
271
|
-
getBudgetStructureComplete(nivel, tipo) {
|
|
272
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
273
|
-
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
|
|
274
|
-
let data = [];
|
|
275
|
-
yield this.getBudgetStructureFive(nivel, tipo).subscribe(result => {
|
|
276
|
-
data.push(...result);
|
|
277
|
-
});
|
|
278
|
-
// await this.getBudgetStructureThreeComplete(3).subscribe(result => {
|
|
279
|
-
// data.push(...result)
|
|
280
|
-
// })
|
|
281
|
-
yield resolve(data);
|
|
282
|
-
}));
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* @description Elimina una o varias estructuras presupuestarias
|
|
287
|
-
* @param idStructures Id de las estructuras presupuestarias 5 que van a ser eliminadas
|
|
288
|
-
* @return Observable<any>
|
|
289
|
-
* @author Miguel Ramírez
|
|
290
|
-
*/
|
|
291
|
-
deleteBudgetStructureFive(idStructures) {
|
|
292
|
-
return this.http.request('delete', `${this.URL}/dao/spg/estructura_presupuestaria5_dao.php`, { body: idStructures, headers: this.getHttpHeaders() });
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* @description Actualiza una o varias estructuras 4
|
|
296
|
-
* @param structures Estructuras presupuestarias que van a ser actualizadas
|
|
297
|
-
* @return Observable<any>
|
|
298
|
-
* @author Miguel Ramírez
|
|
299
|
-
*/
|
|
300
|
-
updateBudgetStructureFive(structures) {
|
|
301
|
-
return this.http.put(`${this.URL}/dao/spg/estructura_presupuestaria5_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* @description Agrega una o varias estructuras presupuestarias 4
|
|
305
|
-
* @param structures Las estructuras que van a ser registradas
|
|
306
|
-
* @return Observable<any>
|
|
307
|
-
* @author Miguel Ramírez
|
|
308
|
-
*/
|
|
309
|
-
setBudgetStructureFive(structures) {
|
|
310
|
-
return this.http.post(`${this.URL}/dao/spg/estructura_presupuestaria5_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* @description Obtiene toda la estructura presupuestaria 5
|
|
314
|
-
* @return Observable<MEstructuraPresupuestariaFive[]>
|
|
315
|
-
* @author Miguel Ramírez
|
|
316
|
-
* @params tipo:"sss"
|
|
317
|
-
*/
|
|
318
|
-
getBudgetStructureFive(level = null, tipo = '') {
|
|
319
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria5_dao.php?complete=true&tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(map((resp) => resp.data.map(e => new MEstructuraPresupuestariaFiveComplete(e, level))));
|
|
320
|
-
}
|
|
321
|
-
/**
|
|
322
|
-
* @description Obtiene la estructura presupuestaria 5 por el Id de la estructura 4
|
|
323
|
-
* @param idEp4 id de la estructura presupuestaria 4
|
|
324
|
-
*/
|
|
325
|
-
getBudgetStructureFiveByIdEp4(idEp4) {
|
|
326
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria5_dao.php${idEp4 ? `?id_ep4=${idEp4}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MEstructuraPresupuestariaFive(element))));
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* @description Elimina una o varias estructuras presupuestarias
|
|
330
|
-
* @param idStructures Id de las estructuras presupuestarias 3 que vana ser eliminadas
|
|
331
|
-
* @return Observable<any>
|
|
332
|
-
* @author Miguel Ramírez
|
|
333
|
-
*/
|
|
334
|
-
deleteBudgetStructureFour(idStructures) {
|
|
335
|
-
return this.http.request('delete', `${this.URL}/dao/spg/estructura_presupuestaria4_dao.php`, { body: idStructures, headers: this.getHttpHeaders() });
|
|
336
|
-
}
|
|
337
|
-
/**
|
|
338
|
-
* @description Actualiza una o varias estructuras 4
|
|
339
|
-
* @param structures Estructuras presupuestarias que van a ser actualizadas
|
|
340
|
-
* @return Observable<any>
|
|
341
|
-
* @author Miguel Ramírez
|
|
342
|
-
*/
|
|
343
|
-
updateBudgetStructureFour(structures) {
|
|
344
|
-
return this.http.put(`${this.URL}/dao/spg/estructura_presupuestaria4_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* @description Agrega una o varias estructuras presupuestarias 4
|
|
348
|
-
* @param structures Las estructuras que van a ser registradas
|
|
349
|
-
* @return Observable<any>
|
|
350
|
-
* @author Miguel Ramírez
|
|
351
|
-
*/
|
|
352
|
-
setBudgetStructureFour(structures) {
|
|
353
|
-
return this.http.post(`${this.URL}/dao/spg/estructura_presupuestaria4_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* @description Obtiene las estructuras presupuestarias 4
|
|
357
|
-
* @param idEp3 Id de la estructura presupuestaria 3
|
|
358
|
-
* @return Observable<MEstructurapresupuestaria[]>
|
|
359
|
-
* @author Miguel Ramírez
|
|
360
|
-
*/
|
|
361
|
-
getBudgetStructureFour(idEp3) {
|
|
362
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria4_dao.php${idEp3 ? `?id_ep3=${idEp3}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MEstructuraPresupuestariaFour(element))));
|
|
363
|
-
}
|
|
364
|
-
/**
|
|
365
|
-
* @description Elimina una o varias estructuras presupuestarias
|
|
366
|
-
* @param idStructures Id de las estructuras presupuestarias 3 que vana ser eliminadas
|
|
367
|
-
* @return Observable<any>
|
|
368
|
-
* @author Miguel Ramírez
|
|
369
|
-
*/
|
|
370
|
-
deleteBudgetStructureThree(idStructures) {
|
|
371
|
-
return this.http.request('delete', `${this.URL}/dao/spg/estructura_presupuestaria3_dao.php`, { body: idStructures, headers: this.getHttpHeaders() });
|
|
372
|
-
}
|
|
373
|
-
/**
|
|
374
|
-
* @description Actualiza una o varias estructuras 3
|
|
375
|
-
* @param structures Estructuras presupuestarias que van a ser actualizadas
|
|
376
|
-
* @return Observable<any>
|
|
377
|
-
* @author Miguel Ramírez
|
|
378
|
-
*/
|
|
379
|
-
updateBudgetStructureThree(structures) {
|
|
380
|
-
return this.http.put(`${this.URL}/dao/spg/estructura_presupuestaria3_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* @description Agrega una o varias estructuras presupuestarias 3
|
|
384
|
-
* @param structures Las estructuras que van a ser registradas
|
|
385
|
-
* @return Observable<any>
|
|
386
|
-
* @author Miguel Ramírez
|
|
387
|
-
*/
|
|
388
|
-
setBudgetStructureThree(structures) {
|
|
389
|
-
return this.http.post(`${this.URL}/dao/spg/estructura_presupuestaria3_dao.php`, structures, { headers: this.getHttpHeaders() });
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* @description Se trae la estructura presupuestaria completa hasta el nivel 3
|
|
393
|
-
* @return Observable<any[]>
|
|
394
|
-
* @author Miguel Ramírez
|
|
395
|
-
*/
|
|
396
|
-
getBudgetStructureThreeComplete(level) {
|
|
397
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria3_dao.php?complete=true`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MEstructuraPresupuestariaFiveComplete(element, level))));
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* @description Obtiene las estructuras presupuestarias 3
|
|
401
|
-
* @param idEp2 Id de la estructura presupuestaria 2
|
|
402
|
-
* @return Observable<MEstructurapresupuestaria[]>
|
|
403
|
-
* @author Miguel Ramírez
|
|
404
|
-
*/
|
|
405
|
-
getBudgetStructureThree(idEp2) {
|
|
406
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria3_dao.php${idEp2 ? `?id_ep2=${idEp2}` : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MEstructuraPresupuestariaThree(element))));
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* @description Elimina una o varias estructuras presupuestarias uno
|
|
410
|
-
* @param idStructures Id de la o las estructuras presupuestarias que van a ser eliminadas
|
|
411
|
-
* @return Observable<any>
|
|
412
|
-
* @author Miguel Ramírez
|
|
413
|
-
*/
|
|
414
|
-
deleteBudgetStructureTwo(idStructures) {
|
|
415
|
-
return this.http.request('delete', `${this.URL}/dao/spg/estructura_presupuestaria2_dao.php`, { body: idStructures, headers: this.getHttpHeaders() });
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* @description Actualiza una estructura presupuestaria dos
|
|
419
|
-
* @param structure Estructura presupuestaria uno que se va a actualizar
|
|
420
|
-
* @return Observable<any>
|
|
421
|
-
*/
|
|
422
|
-
updateBudgetStructureTwo(structure) {
|
|
423
|
-
return this.http.put(`${this.URL}/dao/spg/estructura_presupuestaria2_dao.php`, structure, { headers: this.getHttpHeaders() });
|
|
424
|
-
}
|
|
425
|
-
/**
|
|
426
|
-
* @description Registra las estructuras presupuestrias dos en la base de datos
|
|
427
|
-
* @param budgetStructures Array de estructuras presupuestaria que se van a registrar
|
|
428
|
-
* @return Observable<any>
|
|
429
|
-
* @author Miguel Ramírez
|
|
430
|
-
*/
|
|
431
|
-
setBudgetStructureTwo(budgetStructures) {
|
|
432
|
-
return this.http.post(`${this.URL}/dao/spg/estructura_presupuestaria2_dao.php`, budgetStructures, { headers: this.getHttpHeaders() });
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* @description Obtiene la estructura presupuestaria
|
|
436
|
-
* @return Observable<MEstructuraPresupuestaria[]>
|
|
437
|
-
* @author Miguel Ramírez
|
|
438
|
-
*/
|
|
439
|
-
getBudgetStructureTwo(idEp1) {
|
|
440
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria2_dao.php?id_ep1=${idEp1}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map(((resp) => resp.data.map(element => new MEstructuraPresupuestariaTwo(element)))));
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* @description Obtiene la estructura presupuestaria
|
|
444
|
-
* @return Observable<MEstructuraPresupuestaria[]>
|
|
445
|
-
* @author Miguel Ramírez
|
|
446
|
-
*/
|
|
447
|
-
getBudgetStructureTwoAll() {
|
|
448
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria2_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map(((resp) => resp.data.map(element => new MEstructuraPresupuestariaTwo(element)))));
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* @description Elimina una o varias estructuras presupuestarias uno
|
|
452
|
-
* @param idStructures Id de la o las estructuras presupuestarias que van a ser eliminadas
|
|
453
|
-
* @return Observable<any>
|
|
454
|
-
* @author Miguel Ramírez
|
|
455
|
-
*/
|
|
456
|
-
deleteBudgetStructureOne(idStructures) {
|
|
457
|
-
return this.http.request('delete', `${this.URL}/dao/spg/estructura_presupuestaria1_dao.php`, { body: idStructures, headers: this.getHttpHeaders() });
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* @description Actualiza una estructura presupuestaria uno
|
|
461
|
-
* @param structure Estructura presupuestaria uno que se va a actualizar
|
|
462
|
-
* @return Observable<any>
|
|
463
|
-
*/
|
|
464
|
-
updateBudgetStructureOne(structure) {
|
|
465
|
-
return this.http.put(`${this.URL}/dao/spg/estructura_presupuestaria1_dao.php`, structure, { headers: this.getHttpHeaders() });
|
|
466
|
-
}
|
|
467
|
-
/**
|
|
468
|
-
* @description Registra las estructuras presupuestrias en la base de datos
|
|
469
|
-
* @param budgetStructures Array de estructuras presupuestaria que s evan a registrar
|
|
470
|
-
* @return Observable<any>
|
|
471
|
-
* @author Miguel Ramírez
|
|
472
|
-
*/
|
|
473
|
-
setBudgetStructureOne(budgetStructures) {
|
|
474
|
-
return this.http.post(`${this.URL}/dao/spg/estructura_presupuestaria1_dao.php`, budgetStructures, { headers: this.getHttpHeaders() });
|
|
475
|
-
}
|
|
476
|
-
/**
|
|
477
|
-
* @description Obtiene la estructura presupuestaria
|
|
478
|
-
* @return Observable<MEstructuraPresupuestaria[]>
|
|
479
|
-
* @author Miguel Ramírez
|
|
480
|
-
*/
|
|
481
|
-
getBudgetStructureOne() {
|
|
482
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria1_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map(((resp) => resp.data.map(element => new MEstructuraPresupuestariaOne(element)))));
|
|
483
|
-
}
|
|
484
|
-
/**
|
|
485
|
-
* @description Obtiene las configuraciones de la estructura presupuestaria
|
|
486
|
-
* @return Observable<MConfigurationSPG[]>
|
|
487
|
-
* @author Miguel Ramírez
|
|
488
|
-
*/
|
|
489
|
-
getConfigurationSPG() {
|
|
490
|
-
return this.http.get(`${this.URL}/dao/spg/estructura_presupuestaria_config_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => new MConfigurationSPG(resp.data[0])));
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* @description Obtiene las configuraciones de los proveedores
|
|
494
|
-
* @return Observable<MConfigurationRPC[]>
|
|
495
|
-
* @author Carlos Albornoz
|
|
496
|
-
*/
|
|
497
|
-
getConfigurationRPC() {
|
|
498
|
-
return this.http.get(`${this.URL}/dao/rpc/proveedor_config_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
499
|
-
if (resp.success) {
|
|
500
|
-
resp.data = new MConfigurationRPC(resp.data);
|
|
501
|
-
}
|
|
502
|
-
return resp;
|
|
503
|
-
}));
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* @description Obtiene las MConfiguracionSNO de la nomina
|
|
507
|
-
* @return Observable<MConfiguracionSNO[]>
|
|
508
|
-
* @date 27-07-2021
|
|
509
|
-
*/
|
|
510
|
-
getConfigurationSNO() {
|
|
511
|
-
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
512
|
-
if (resp.success) {
|
|
513
|
-
if (resp.data != null) {
|
|
514
|
-
resp.data = resp.data.map(e => new MConfiguracionSNO(e));
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
resp.data = [];
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
return resp;
|
|
521
|
-
}));
|
|
522
|
-
}
|
|
523
|
-
dateToString(date) {
|
|
524
|
-
return `${date.getFullYear()}-${date.getMonth() + 1 >= 10 ? date.getMonth() + 1 : `0${date.getMonth() + 1}`}-${date.getDate() >= 10 ? date.getDate() : `0${date.getDate()}`}`;
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* @description Obtiene las configuraciones de Seguridad
|
|
528
|
-
* @return Observable<IResponse>
|
|
529
|
-
* @author Carlos Albornoz
|
|
530
|
-
*/
|
|
531
|
-
getConfigSSS() {
|
|
532
|
-
return this.http.get(`${this.URL}/dao/sss/seguridad_config_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => {
|
|
533
|
-
if (resp.success) {
|
|
534
|
-
resp.data = new MConfigSSS(resp.data);
|
|
535
|
-
}
|
|
536
|
-
return resp;
|
|
537
|
-
}));
|
|
538
|
-
}
|
|
539
|
-
getComponents(systemCode = null, permit) {
|
|
540
|
-
return this.http.get(`${this.URL}/dao/sss/componentes_dao.php?${systemCode ? `codsis=${systemCode}${permit ? `&permit=true` : ''}` : ''}`, { headers: this.getHttpHeaders() }).pipe(map(res => {
|
|
541
|
-
if (res.success) {
|
|
542
|
-
res.data = res.data.map(e => new MComponent(e));
|
|
543
|
-
}
|
|
544
|
-
return res;
|
|
545
|
-
}));
|
|
546
|
-
}
|
|
547
|
-
/**
|
|
548
|
-
* @description Obtiene las fuentes de financiamiento
|
|
549
|
-
* @return Observable<MFuenteFinanciamiento[]>
|
|
550
|
-
* @author Miguel Ramírez
|
|
551
|
-
*/
|
|
552
|
-
getFuenteFinanciamiento() {
|
|
553
|
-
return this.http.get(`${this.URL}/dao/spg/fuente_financiamiento_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MFuenteFinanciamiento(element))));
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* @description Obtiene los centros de costo
|
|
557
|
-
* @return Observable<MCentroCosto[]>
|
|
558
|
-
* @author Miguel Ramírez
|
|
559
|
-
* @param id:idusurio o id del ecntro de costo
|
|
560
|
-
* modificado 28-12-2022
|
|
561
|
-
*/
|
|
562
|
-
getCentroCosto(tipo = null, id) {
|
|
563
|
-
return this.http.get(`${this.URL}/dao/scg/centro_costo_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MCentroCosto(element))));
|
|
564
|
-
}
|
|
565
|
-
/**
|
|
566
|
-
* @description Obtiene los centros de costo
|
|
567
|
-
* @return Observable<IResponse>
|
|
568
|
-
* @author Carlos Albornoz
|
|
569
|
-
*/
|
|
570
|
-
getCostCenters() {
|
|
571
|
-
return this.http.get(`${this.URL}/dao/scg/centro_costo_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
572
|
-
if (res.success) {
|
|
573
|
-
res.data = res.data.map(element => new MCentroCosto(element));
|
|
574
|
-
}
|
|
575
|
-
return res;
|
|
576
|
-
}));
|
|
577
|
-
}
|
|
578
|
-
getUserCostCenters(codigo) {
|
|
579
|
-
return this.http.get(`${this.URL}/dao/scg/centro_costo_usuario_dao.php?codigo=${codigo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
580
|
-
if (res.success) {
|
|
581
|
-
res.data = res.data.map(element => new MUsuarioCentroCosto(element));
|
|
582
|
-
}
|
|
583
|
-
return res;
|
|
584
|
-
}));
|
|
585
|
-
}
|
|
586
|
-
/**
|
|
587
|
-
* @description Abre el dialog de checkks
|
|
588
|
-
* @param columns Columnas que va a tener la tabla
|
|
589
|
-
* @param title Título de la modal
|
|
590
|
-
* @param dataSource Data que s eva a mostrar en la tabla
|
|
591
|
-
*/
|
|
592
|
-
openDialogMultiSelect(
|
|
593
|
-
// columns: string[],
|
|
594
|
-
// title: string,
|
|
595
|
-
// dataSource: any[],
|
|
596
|
-
// columnNames?: string[]
|
|
597
|
-
columns, title, dataSource, columnNames = null, width = '450px', options = {
|
|
598
|
-
disableClose: false,
|
|
599
|
-
hasBackdrop: false,
|
|
600
|
-
}) {
|
|
601
|
-
let dialogRef = this.dialog.open(TableSelectComponent, {
|
|
602
|
-
data: {
|
|
603
|
-
title: title,
|
|
604
|
-
columns: columns,
|
|
605
|
-
dataSource: dataSource,
|
|
606
|
-
columnNames,
|
|
607
|
-
},
|
|
608
|
-
width: width,
|
|
609
|
-
maxHeight: '90vh',
|
|
610
|
-
hasBackdrop: options.hasBackdrop,
|
|
611
|
-
disableClose: options.disableClose
|
|
612
|
-
});
|
|
613
|
-
return dialogRef.afterClosed().toPromise();
|
|
614
|
-
}
|
|
615
|
-
/**
|
|
616
|
-
* @description Abre el dialog de las comunidades
|
|
617
|
-
* @return Promise<MPlanUnicoCuenta>
|
|
618
|
-
* @author Miguel Ramírez
|
|
619
|
-
*/
|
|
620
|
-
openDialogPlanUnicoCuentas() {
|
|
621
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
622
|
-
let planes = yield this.getListadoPLanUnicoCuentas().toPromise();
|
|
623
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
624
|
-
data: {
|
|
625
|
-
columns: ['cuenta', 'denominacion'],
|
|
626
|
-
columnNames: ['cuenta', 'denominación'],
|
|
627
|
-
title: 'Catálogo de Plan de Cuentas Géneral',
|
|
628
|
-
dataSource: planes
|
|
629
|
-
},
|
|
630
|
-
width: '450px',
|
|
631
|
-
maxHeight: '90vh'
|
|
632
|
-
});
|
|
633
|
-
return dialogRef.afterClosed().toPromise();
|
|
634
|
-
});
|
|
635
|
-
}
|
|
636
|
-
/**
|
|
637
|
-
* @description Obtiene el listado del plan único de cuentas
|
|
638
|
-
* @return Observable<MplanUnicoCuenta[]>
|
|
639
|
-
* @author Miguel Ramírez
|
|
640
|
-
*/
|
|
641
|
-
getListadoPLanUnicoCuentas() {
|
|
642
|
-
return this.http.get(`${this.URL}/dao/scg/plan_unico_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MPlanUnicoCuenta(element))));
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* @description Obtiene la configuración de SCG
|
|
646
|
-
* @return Observable<MConfiguracionSCG[]>
|
|
647
|
-
* @author Miguel Ramírez
|
|
648
|
-
* @modifit 25-07-2021
|
|
649
|
-
*/
|
|
650
|
-
getConfigurationSCG() {
|
|
651
|
-
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MConfiguracionSCG(element))));
|
|
652
|
-
}
|
|
653
|
-
/**
|
|
654
|
-
* @description Abre un dialog de confirmación
|
|
655
|
-
* @param title Título de la modal de confirm
|
|
656
|
-
* @param message Mensaje (opcional) para el ususario
|
|
657
|
-
* @return Promise<boolean>
|
|
658
|
-
* @author Miguel Ramírez
|
|
659
|
-
*/
|
|
660
|
-
openDialogConfirm(title, message) {
|
|
661
|
-
let dialogRef = this.dialog.open(ConfirmComponent, {
|
|
662
|
-
data: {
|
|
663
|
-
title: title,
|
|
664
|
-
message: (message) ? message : null
|
|
665
|
-
},
|
|
666
|
-
width: '450px',
|
|
667
|
-
maxHeight: '90vh'
|
|
668
|
-
});
|
|
669
|
-
return dialogRef.afterClosed().toPromise();
|
|
670
|
-
}
|
|
671
|
-
/**
|
|
672
|
-
* @description Convierte el contenido de un AbstractControl en mayúscula (Usar en evento keyup)
|
|
673
|
-
* @param formGroup Formulario dónde se va a buscar el AbstractControl
|
|
674
|
-
* @param name Nombre del AbstractControl
|
|
675
|
-
* @return void
|
|
676
|
-
* @author Miguel Ramírez
|
|
677
|
-
*/
|
|
678
|
-
changeToUpperCase(formGroup, name) {
|
|
679
|
-
this.getAbstractControl(formGroup, name).setValue(this.getAbstractControl(formGroup, name).value.toUpperCase());
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* @description Obtiene el AbstractControl de un formulario
|
|
683
|
-
* @param formGroup Formulario donde se va a buscar el AbstractControl
|
|
684
|
-
* @param name Nombre del AbstractControl
|
|
685
|
-
* @return AbstractControl
|
|
686
|
-
* @author Miguel Ramírez
|
|
687
|
-
*/
|
|
688
|
-
getAbstractControl(formGroup, name) {
|
|
689
|
-
return formGroup.get(name);
|
|
690
|
-
}
|
|
691
|
-
/**
|
|
692
|
-
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
693
|
-
* @param event Evento del teclado
|
|
694
|
-
* @return boolean
|
|
695
|
-
* @author Miguel Ramírez
|
|
696
|
-
* @modificado como onlyNumero para corregir codigo, usar currency-input si quiere usar decimales
|
|
697
|
-
*/
|
|
698
|
-
onlyDecimal(event) {
|
|
699
|
-
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
700
|
-
return true;
|
|
701
|
-
}
|
|
702
|
-
return false;
|
|
703
|
-
}
|
|
704
|
-
/**
|
|
705
|
-
* @description Previene que se escriban letras en el input (Usar en keypress)
|
|
706
|
-
* @param event Evento del teclado
|
|
707
|
-
* @return boolean
|
|
708
|
-
* @author Miguel Ramírez
|
|
709
|
-
*/
|
|
710
|
-
onlyNumbers(event) {
|
|
711
|
-
// console.log(event);
|
|
712
|
-
if (!isNaN(+event.key) && event.keyCode != 32) {
|
|
713
|
-
return true;
|
|
714
|
-
}
|
|
715
|
-
return false;
|
|
716
|
-
}
|
|
717
|
-
/**
|
|
718
|
-
* @description Acepta solo numero, delete y backspace
|
|
719
|
-
* @param event Evento del teclado
|
|
720
|
-
* @return boolean
|
|
721
|
-
* @author Dimaly Crespo
|
|
722
|
-
*/
|
|
723
|
-
onlyNumbers2(event) {
|
|
724
|
-
if (!isNaN(+event.key) || event.keyCode == 8 || event.keyCode == 46) {
|
|
725
|
-
return true;
|
|
726
|
-
}
|
|
727
|
-
return false;
|
|
728
|
-
}
|
|
729
|
-
/**
|
|
730
|
-
* @description Acepta solo numero,guiones, parentesis,espacios
|
|
731
|
-
* @param event Evento del teclado
|
|
732
|
-
* @return boolean
|
|
733
|
-
* @author Dimaly Crespo
|
|
734
|
-
*/
|
|
735
|
-
typeNumbersHyphen(event) {
|
|
736
|
-
if (!isNaN(+event.key) || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46
|
|
737
|
-
|| event.keyCode == 58 || event.keyCode == 57 || event.keyCode == 189) {
|
|
738
|
-
return true;
|
|
739
|
-
}
|
|
740
|
-
return false;
|
|
741
|
-
}
|
|
742
|
-
/**
|
|
743
|
-
* @description Permite (a-z A-Z á-ú ñÑ üÜ ',.) que se escriban numeros en el input (Usar en keypress)
|
|
744
|
-
* @param event Evento del teclado
|
|
745
|
-
* @return boolean
|
|
746
|
-
* @date 14-05-2022
|
|
747
|
-
*
|
|
748
|
-
*/
|
|
749
|
-
typeName(event) {
|
|
750
|
-
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
751
|
-
|| (event.key >= 'á' && event.key <= 'ú') || event.key >= 'ü' || event.key >= 'Ü' || event.key == "'" || event.keyCode == 32
|
|
752
|
-
|| event.key == "." || event.key == "," || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
753
|
-
return true;
|
|
754
|
-
}
|
|
755
|
-
return false;
|
|
756
|
-
}
|
|
757
|
-
/**
|
|
758
|
-
* @description Permite (0-9 a-z A-Z á-ú ñÑ üÜ ',.-_/:()%#º&$€£¥) que se escriban en el input (Usar en keypress)
|
|
759
|
-
* @param event Evento del teclado
|
|
760
|
-
* @return boolean
|
|
761
|
-
* @date 14-05-2022
|
|
762
|
-
*
|
|
763
|
-
*/
|
|
764
|
-
typeText(event) {
|
|
765
|
-
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
766
|
-
|| (event.key >= 'á' && event.key <= 'ú') || event.key == 'ü' || event.key == 'Ü' || event.key == "'" || isNaN(+event.key)
|
|
767
|
-
|| event.key == "." || event.key == "," || event.key == "&" || event.key == "_" || event.key == "-" || event.key == "#"
|
|
768
|
-
|| event.key == "º" || event.key == "$" || event.key == "(" || event.key == ")" || event.key == "%" || event.key == ' '
|
|
769
|
-
|| event.key == ':' || event.key == '/' || event.keyCode == 8364 || event.keyCode == 165 || event.keyCode == 163
|
|
770
|
-
|| event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
771
|
-
return true;
|
|
772
|
-
}
|
|
773
|
-
return false;
|
|
774
|
-
}
|
|
775
|
-
/**
|
|
776
|
-
* @description Permite (0-9 a-z A-Z ñÑ .-_) que se escriban en el input (Usar en keypress)
|
|
777
|
-
* @param event Evento del teclado
|
|
778
|
-
* @return boolean
|
|
779
|
-
* @date 14-05-2022
|
|
780
|
-
*/
|
|
781
|
-
typeCode(event) {
|
|
782
|
-
if ((event.key >= 'a' && event.key <= 'z') || (event.key >= 'A' && event.key <= 'Z') || event.key == "ñ" || event.key == "Ñ"
|
|
783
|
-
|| isNaN(+event.key) || event.key == "." || event.key == "_" || event.key == "-" || event.keyCode == 8 || event.keyCode == 32 || event.keyCode == 46) {
|
|
784
|
-
return true;
|
|
785
|
-
}
|
|
786
|
-
return false;
|
|
787
|
-
}
|
|
788
|
-
/**
|
|
789
|
-
* @description Abre el dialog de las comunidades
|
|
790
|
-
* @return Promise<MComunidad>
|
|
791
|
-
* @author Miguel Ramírez
|
|
792
|
-
*/
|
|
793
|
-
openDialogUnidadesTributarias() {
|
|
794
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
795
|
-
let udTributarias = yield this.getUnidadesTributarias().toPromise();
|
|
796
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
797
|
-
data: {
|
|
798
|
-
columns: ['año', 'nro_decreto', 'fecha_decreto', 'entrada_videncia', 'publicacion_gaceta', 'nro_gaceta', 'valorut'],
|
|
799
|
-
title: 'Catálogo de Unidades Tributarias',
|
|
800
|
-
dataSource: udTributarias
|
|
801
|
-
},
|
|
802
|
-
width: '450px',
|
|
803
|
-
maxHeight: '90vh'
|
|
804
|
-
});
|
|
805
|
-
return dialogRef.afterClosed().toPromise();
|
|
806
|
-
});
|
|
807
|
-
}
|
|
808
|
-
/**
|
|
809
|
-
* @description Obtiene las unidades tributarias
|
|
810
|
-
* @return Observable<any>
|
|
811
|
-
* @author Miguel Ramírez
|
|
812
|
-
*/
|
|
813
|
-
getUnidadesTributarias() {
|
|
814
|
-
const request = {
|
|
815
|
-
operacion: 'obtenerData',
|
|
816
|
-
sigesp_conexion: {
|
|
817
|
-
servidor: this.URL,
|
|
818
|
-
usuario: this.usuarioActivo.getInterface()
|
|
819
|
-
}
|
|
820
|
-
};
|
|
821
|
-
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))));
|
|
822
|
-
}
|
|
823
|
-
/**
|
|
824
|
-
* @description Abre una modal génerica
|
|
825
|
-
* @param columns Columnas que va a tener la tabla
|
|
826
|
-
* @param title Título del dialog
|
|
827
|
-
* @param dataSource Data que se va a mostrar en la tabla
|
|
828
|
-
* @return Promise<any>
|
|
829
|
-
* @author Miguel Ramírez
|
|
830
|
-
*/
|
|
831
|
-
openCatalogoGenerico(columns, title, dataSource, columnNames = null, width = '450px', options = { disableClose: false, hasBackdrop: false }) {
|
|
832
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
833
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
834
|
-
data: {
|
|
835
|
-
columns,
|
|
836
|
-
title,
|
|
837
|
-
dataSource,
|
|
838
|
-
columnNames
|
|
839
|
-
},
|
|
840
|
-
width: width,
|
|
841
|
-
maxHeight: '90vh',
|
|
842
|
-
hasBackdrop: options.hasBackdrop ? options.hasBackdrop : false,
|
|
843
|
-
disableClose: options.disableClose ? options.disableClose : false,
|
|
844
|
-
});
|
|
845
|
-
return dialogRef.afterClosed().toPromise();
|
|
846
|
-
});
|
|
847
|
-
}
|
|
848
|
-
/**
|
|
849
|
-
* @description Abre una modal génerica con 2 inputs
|
|
850
|
-
* @param columns Columnas que va a tener la tabla
|
|
851
|
-
* @param title Título del dialog
|
|
852
|
-
* @param dataSource Data que se va a mostrar en la tabla
|
|
853
|
-
* @return Promise<any>
|
|
854
|
-
* @author Carlos Albornoz
|
|
855
|
-
*/
|
|
856
|
-
openCatalogoDosInputs(columns, title, dataSource, filterData, columnNames = null, width = "450px") {
|
|
857
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
858
|
-
let dialogRef = this.dialog.open(CatalogoDobleInputComponent, {
|
|
859
|
-
data: {
|
|
860
|
-
columns,
|
|
861
|
-
title,
|
|
862
|
-
dataSource,
|
|
863
|
-
columnNames,
|
|
864
|
-
filterData
|
|
865
|
-
},
|
|
866
|
-
width: width,
|
|
867
|
-
maxHeight: '90vh'
|
|
868
|
-
});
|
|
869
|
-
return dialogRef.afterClosed().toPromise();
|
|
870
|
-
});
|
|
871
|
-
}
|
|
872
|
-
/**
|
|
873
|
-
* @description Abre el dialog de las comunidades
|
|
874
|
-
* @return Promise<MComunidad>
|
|
875
|
-
* @author Miguel Ramírez
|
|
876
|
-
*/
|
|
877
|
-
openDialogComunidad() {
|
|
878
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
879
|
-
let comunidades = yield this.getComunidades().toPromise();
|
|
880
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
881
|
-
data: {
|
|
882
|
-
columns: ['prefijo', 'pais', 'estado', 'municipio', 'parroquia', 'codigo', 'comunidad'],
|
|
883
|
-
title: 'Catálogo de Comunidades',
|
|
884
|
-
dataSource: comunidades
|
|
885
|
-
},
|
|
886
|
-
width: '450px',
|
|
887
|
-
maxHeight: '90vh'
|
|
888
|
-
});
|
|
889
|
-
return dialogRef.afterClosed().toPromise();
|
|
890
|
-
});
|
|
891
|
-
}
|
|
892
|
-
/**
|
|
893
|
-
* @description Obtiene las comunidades
|
|
894
|
-
* @return Observable<MComunidad[]>
|
|
895
|
-
* @author Miguel Ramírez
|
|
896
|
-
*/
|
|
897
|
-
getComunidades() {
|
|
898
|
-
const request = {
|
|
899
|
-
operacion: 'obtenerData',
|
|
900
|
-
sigesp_conexion: {
|
|
901
|
-
servidor: this.URL,
|
|
902
|
-
usuario: this.usuarioActivo.getInterface()
|
|
903
|
-
}
|
|
904
|
-
};
|
|
905
|
-
return this.http.post(`${this.URL}/dao/cfg/comunidades_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.map(element => new MComunidad(element))));
|
|
906
|
-
}
|
|
907
|
-
/**
|
|
908
|
-
* @description Abre el dialog de las las monedas
|
|
909
|
-
* @return Promise<MMoneda>
|
|
910
|
-
* @author Miguel Ramírez
|
|
911
|
-
*/
|
|
912
|
-
openDialogMonedas() {
|
|
913
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
914
|
-
let coins = yield this.getMonedas('todas').toPromise();
|
|
915
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
916
|
-
data: {
|
|
917
|
-
columns: ['codigo', 'denominacion', 'codigoIso', 'simbolo'],
|
|
918
|
-
title: 'Catálogo de Monedas',
|
|
919
|
-
columnNames: ['código', 'denominación', 'iso', 'simbolo'],
|
|
920
|
-
dataSource: coins
|
|
921
|
-
},
|
|
922
|
-
width: '450px',
|
|
923
|
-
maxHeight: '90vh'
|
|
924
|
-
});
|
|
925
|
-
return dialogRef.afterClosed().toPromise();
|
|
926
|
-
});
|
|
927
|
-
}
|
|
928
|
-
/**
|
|
929
|
-
* @description Obtiene las monedas
|
|
930
|
-
* @return Observable<MMoneda[]>
|
|
931
|
-
* @author Miguel Ramírez
|
|
932
|
-
* actualizado 4-12-2022
|
|
933
|
-
* @param tipo :string {'todas','uno','actual}
|
|
934
|
-
* @param id : number
|
|
935
|
-
* @returns
|
|
936
|
-
*/
|
|
937
|
-
getMonedas(tipo, id) {
|
|
938
|
-
return this.http.get(`${this.URL}/dao/cfg/moneda_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MMoneda(element))));
|
|
939
|
-
}
|
|
940
|
-
/**
|
|
941
|
-
* @Description: Obtiene la tasa de cambio asociadas a uno o varias monedas
|
|
942
|
-
* @param tipo string
|
|
943
|
-
* @param id codigo moneda
|
|
944
|
-
* @returns array/null
|
|
945
|
-
* @tipo:all->todas, (moneda->una moneda id->id de moneda)
|
|
946
|
-
*/
|
|
947
|
-
getCurrencyExchangeRate(tipo = null, id) {
|
|
948
|
-
return this.http.get(`${this.URL}/dao/cfg/tasa_cambio_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MExchangeRate(element))));
|
|
949
|
-
}
|
|
950
|
-
/**
|
|
951
|
-
* @description Abre el dialog de las las cuentas contables (Cuentas Institucionales)
|
|
952
|
-
* @return Promise<McuentaInstitucional>
|
|
953
|
-
* @author Miguel Ramírez
|
|
954
|
-
*/
|
|
955
|
-
openDialogCuentasInstitucionales() {
|
|
956
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
957
|
-
let accounts = yield this.getCuentasInstitucionales().toPromise();
|
|
958
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
959
|
-
data: {
|
|
960
|
-
columns: ['cuenta', 'denominacion'],
|
|
961
|
-
columnNames: ['cuenta', 'denominación'],
|
|
962
|
-
title: 'Catálogo de plan de cuenta institucional',
|
|
963
|
-
dataSource: accounts
|
|
964
|
-
},
|
|
965
|
-
width: '800px',
|
|
966
|
-
maxHeight: '90vh'
|
|
967
|
-
});
|
|
968
|
-
return dialogRef.afterClosed().toPromise();
|
|
969
|
-
});
|
|
970
|
-
}
|
|
971
|
-
/**
|
|
972
|
-
* @description Obtiene las cuentas contables (Cuentas Institucionales)
|
|
973
|
-
* @return Observable<MCuentaInstitucional[]>
|
|
974
|
-
* @author Miguel Ramírez
|
|
975
|
-
*/
|
|
976
|
-
getCuentasInstitucionales(inventory) {
|
|
977
|
-
return this.http.get(`${this.URL}/dao/scg/cuentas_dao.php${(inventory) ? '?inventory=true' : ''}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((resp) => resp.data.map(element => new MCuentaInstitucional(element))));
|
|
978
|
-
}
|
|
979
|
-
/**
|
|
980
|
-
* @description Abre el dialog de las cuentas de presupuesto (Recursos y Egresos)
|
|
981
|
-
* @return Promise<MCuentaPresupuesto>
|
|
982
|
-
* @author Miguel Ramírez
|
|
983
|
-
*/
|
|
984
|
-
openDialogCuentasPresupuesto() {
|
|
985
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
986
|
-
let accounts = yield this.getCuentasPresupuesto().toPromise();
|
|
987
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
988
|
-
data: {
|
|
989
|
-
columnNames: ['cuenta', 'denominación'],
|
|
990
|
-
columns: ['cuenta', 'denominacion'],
|
|
991
|
-
title: 'Catálogo de Cuentas de Presupuesto',
|
|
992
|
-
dataSource: accounts
|
|
993
|
-
},
|
|
994
|
-
width: '450px',
|
|
995
|
-
maxHeight: '90vh'
|
|
996
|
-
});
|
|
997
|
-
return dialogRef.afterClosed().toPromise();
|
|
998
|
-
});
|
|
999
|
-
}
|
|
1000
|
-
/**
|
|
1001
|
-
* @description Obtiene las cuentas de recursos y egresos
|
|
1002
|
-
* @return Observable<MCuentaPresupuesto>
|
|
1003
|
-
* @author Miguel Ramírez
|
|
1004
|
-
*/
|
|
1005
|
-
getCuentasPresupuesto(filter) {
|
|
1006
|
-
return this.http.get(`${this.URL}/dao/scg/plan_unico_cuentas_dao.php?filter=${filter}`, { headers: this.getHttpHeaders() }).pipe(map((res) => res.data.map(element => new MCuentaPresupuesto(element))));
|
|
1007
|
-
}
|
|
1008
|
-
/**
|
|
1009
|
-
* @description Abre el cátalogo de cuentas de la tabla "scg_plan_unico_re"
|
|
1010
|
-
* @returns Promise<MCuentaPresupuesto>
|
|
1011
|
-
* @author Carlos Albornoz
|
|
1012
|
-
* @params filtro: Indica bajo que parametros se va a filtrar el catalogo
|
|
1013
|
-
*/
|
|
1014
|
-
openCatalogoCuentasPresuspuesto(titulo, filtro = null, ancho = '750px') {
|
|
1015
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1016
|
-
let cuentas = [];
|
|
1017
|
-
yield this.getCuentasPresupuesto().toPromise().then((res) => {
|
|
1018
|
-
cuentas = res;
|
|
1019
|
-
if (filtro) {
|
|
1020
|
-
if (filtro.estado) {
|
|
1021
|
-
cuentas = cuentas.filter(c => {
|
|
1022
|
-
return c.status == filtro.estado;
|
|
1023
|
-
});
|
|
1024
|
-
}
|
|
1025
|
-
if (filtro.tipo) {
|
|
1026
|
-
cuentas = cuentas.filter(c => {
|
|
1027
|
-
return c.tipo == filtro.tipo;
|
|
1028
|
-
});
|
|
1029
|
-
}
|
|
1030
|
-
}
|
|
1031
|
-
cuentas = cuentas.map(e => {
|
|
1032
|
-
e['provStatus'] = e.status == "C" ? "Movimientos" : "Totalizadora";
|
|
1033
|
-
e['provType'] = e.status == "R" ? "Recursos" : "Ingresos";
|
|
1034
|
-
return e;
|
|
1035
|
-
});
|
|
1036
|
-
});
|
|
1037
|
-
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus", "provType"], titulo, cuentas, ["Cuenta", "Denominación", "Estado", "Tipo"], ancho);
|
|
1038
|
-
});
|
|
1039
|
-
}
|
|
1040
|
-
/**
|
|
1041
|
-
* @description Abre el cátalogo de cuentas de la tabla "spg_cuentas"
|
|
1042
|
-
* @returns Promise<MCuentaEgresos>
|
|
1043
|
-
* @author Carlos Albornoz
|
|
1044
|
-
* @params presupuesto: Indica si se a trabajar con estructura de presupuesto o no
|
|
1045
|
-
*/
|
|
1046
|
-
openCatalogoCuentasEgreso(titulo, presupuesto = true, ancho = "750px") {
|
|
1047
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1048
|
-
let cuentas = [];
|
|
1049
|
-
yield this.getExpenseAccounts().toPromise().then(res => {
|
|
1050
|
-
cuentas = res;
|
|
1051
|
-
cuentas = cuentas.filter(e => {
|
|
1052
|
-
return e.status == "C";
|
|
1053
|
-
}).map(e => {
|
|
1054
|
-
e['provStatus'] = e.status == "C" ? "Movimientos" : "Totalizadora";
|
|
1055
|
-
return e;
|
|
1056
|
-
});
|
|
1057
|
-
});
|
|
1058
|
-
if (presupuesto) {
|
|
1059
|
-
return this.openCatalogoDosInputs(["cuenta", "denominacion", "estructura", "provStatus"], titulo, cuentas, [{
|
|
1060
|
-
placeholder: "Cuenta",
|
|
1061
|
-
property: "cuenta"
|
|
1062
|
-
}, {
|
|
1063
|
-
placeholder: "Estructura",
|
|
1064
|
-
property: "estructura"
|
|
1065
|
-
}], ["Cuenta", "Denominación", "Estructura", "Estado"], ancho);
|
|
1066
|
-
}
|
|
1067
|
-
else {
|
|
1068
|
-
let filteredAccounts = [];
|
|
1069
|
-
cuentas.forEach(c => {
|
|
1070
|
-
if (!filteredAccounts.find(e => e.cuenta == c.cuenta)) {
|
|
1071
|
-
filteredAccounts.push(c);
|
|
1072
|
-
}
|
|
1073
|
-
});
|
|
1074
|
-
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus"], titulo, filteredAccounts, ["Cuenta", "Denominación", "Estado"], ancho);
|
|
1075
|
-
}
|
|
1076
|
-
});
|
|
1077
|
-
}
|
|
1078
|
-
/**
|
|
1079
|
-
* @description Abre el cátalogo de cuentas de la tabla "spi_cuentas"
|
|
1080
|
-
* @returns Promise<MCuentaIngresos>
|
|
1081
|
-
* @author Carlos Albornoz
|
|
1082
|
-
* @params presupuesto: Indica si se a trabajar con estructura de presupuesto o no
|
|
1083
|
-
*/
|
|
1084
|
-
openCatalogoCuentasIngreso(titulo, presupuesto = true, ancho = "750px") {
|
|
1085
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1086
|
-
let cuentas = [];
|
|
1087
|
-
yield this.getIncomeAccounts().toPromise().then((res) => {
|
|
1088
|
-
cuentas = res.data;
|
|
1089
|
-
cuentas = cuentas.filter(e => {
|
|
1090
|
-
return e.estado == "C";
|
|
1091
|
-
}).map(e => {
|
|
1092
|
-
e['provStatus'] = e.estado == "C" ? "Movimientos" : "Totalizadora";
|
|
1093
|
-
return e;
|
|
1094
|
-
});
|
|
1095
|
-
});
|
|
1096
|
-
if (presupuesto) {
|
|
1097
|
-
return this.openCatalogoDosInputs(["cuenta", "denominacion", "estructura", "provStatus"], titulo, cuentas, [{
|
|
1098
|
-
placeholder: "Cuenta",
|
|
1099
|
-
property: "cuenta"
|
|
1100
|
-
}, {
|
|
1101
|
-
placeholder: "Estructura",
|
|
1102
|
-
property: "estructura"
|
|
1103
|
-
}], ["Cuenta", "Denominación", "Estructura", "Estado"], ancho);
|
|
1104
|
-
}
|
|
1105
|
-
else {
|
|
1106
|
-
let filteredAccounts = [];
|
|
1107
|
-
cuentas.forEach(c => {
|
|
1108
|
-
if (!filteredAccounts.find(e => e.cuenta == c.cuenta)) {
|
|
1109
|
-
filteredAccounts.push(c);
|
|
1110
|
-
}
|
|
1111
|
-
});
|
|
1112
|
-
return this.openCatalogoGenerico(["cuenta", "denominacion", "provStatus"], titulo, filteredAccounts, ["Cuenta", "Denominación", "Estado"], ancho);
|
|
1113
|
-
}
|
|
1114
|
-
});
|
|
1115
|
-
}
|
|
1116
|
-
getUnidadAdministrativa(tipo) {
|
|
1117
|
-
return this.http.get(`${this.URL}/dao/spg/unidad_administrativa_dao.php?tipo=${tipo}`, { headers: this.getHttpHeaders() })
|
|
1118
|
-
.pipe(map((res) => {
|
|
1119
|
-
if (res.success) {
|
|
1120
|
-
res.data = res.data.map(e => new MAdministrativeUnit(e));
|
|
1121
|
-
}
|
|
1122
|
-
return res;
|
|
1123
|
-
}));
|
|
1124
|
-
}
|
|
1125
|
-
/**
|
|
1126
|
-
* @description Obtiene los cargos de servicios
|
|
1127
|
-
* @return Observable<IResponse>
|
|
1128
|
-
* @author Carlos Albornoz
|
|
1129
|
-
*/
|
|
1130
|
-
getServiceCharges(serviceId = null) {
|
|
1131
|
-
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) => {
|
|
1132
|
-
if (res.success) {
|
|
1133
|
-
res.data = res.data.map(e => new MServiceCharge(e));
|
|
1134
|
-
}
|
|
1135
|
-
return res;
|
|
1136
|
-
}));
|
|
1137
|
-
}
|
|
1138
|
-
/**
|
|
1139
|
-
* @description Obtiene los paises
|
|
1140
|
-
* @return Observable<MCountry>
|
|
1141
|
-
* @author Carlos Albornoz
|
|
1142
|
-
* @modified 10-01-2022
|
|
1143
|
-
* @param codigo: Codigo del pais
|
|
1144
|
-
|
|
1145
|
-
*/
|
|
1146
|
-
getCountries(codigo) {
|
|
1147
|
-
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))));
|
|
1148
|
-
}
|
|
1149
|
-
/**
|
|
1150
|
-
* @description Obtiene los estados
|
|
1151
|
-
* @return Observable<MState>
|
|
1152
|
-
* @author Carlos Albornoz
|
|
1153
|
-
* @modificado 4-12-2022
|
|
1154
|
-
* @param codigo: Codigo del pais
|
|
1155
|
-
*/
|
|
1156
|
-
getStates(codigo) {
|
|
1157
|
-
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))));
|
|
1158
|
-
}
|
|
1159
|
-
/**
|
|
1160
|
-
* @description Obtiene los municipios
|
|
1161
|
-
* @return Observable<MMunicipality>
|
|
1162
|
-
* @author Carlos Albornoz
|
|
1163
|
-
* @modificado 10-01-2022
|
|
1164
|
-
* @param pais: Codigo del pais ,
|
|
1165
|
-
* @param estado: Codigo del estado
|
|
1166
|
-
* @actualizado 4-12-2022
|
|
1167
|
-
*/
|
|
1168
|
-
getMunicipalities(pais, estado) {
|
|
1169
|
-
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))));
|
|
1170
|
-
}
|
|
1171
|
-
/**
|
|
1172
|
-
* @description Obtiene las parroquias
|
|
1173
|
-
* @return Observable<MParish>
|
|
1174
|
-
* @author Carlos Albornoz
|
|
1175
|
-
* @modificado 10-01-2022
|
|
1176
|
-
* @param pais: Codigo del pais
|
|
1177
|
-
* @param estado: Codigo del estado
|
|
1178
|
-
* @param municipio:codigo Municipio
|
|
1179
|
-
* @actualizado 4-12-2022
|
|
1180
|
-
|
|
1181
|
-
*/
|
|
1182
|
-
getParishes(pais, estado, municipio) {
|
|
1183
|
-
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))));
|
|
1184
|
-
}
|
|
1185
|
-
/**
|
|
1186
|
-
* @description Obtiene las ciudades
|
|
1187
|
-
* @return Observable<MParish>
|
|
1188
|
-
* @author Carlos Albornoz
|
|
1189
|
-
* @modificado 10-01-2022
|
|
1190
|
-
* @param pais: Codigo del pais
|
|
1191
|
-
* @param estado: Codigo del estado
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
*/
|
|
1195
|
-
getCity(pais, estado) {
|
|
1196
|
-
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))));
|
|
1197
|
-
}
|
|
1198
|
-
/**
|
|
1199
|
-
* @description Obtiene las ciudades
|
|
1200
|
-
* @return Observable<MParish>
|
|
1201
|
-
* @author Dimaly Crespo
|
|
1202
|
-
* @modificado 10-01-2022
|
|
1203
|
-
* @param pais: Codigo del pais
|
|
1204
|
-
|
|
1205
|
-
*/
|
|
1206
|
-
getCommunities(pais, estado, municipio, parroquia) {
|
|
1207
|
-
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))));
|
|
1208
|
-
}
|
|
1209
|
-
/**
|
|
1210
|
-
* @description Obtiene los sistemas activas
|
|
1211
|
-
* @return Observable<MSistema>
|
|
1212
|
-
* @author Carlos Albornoz
|
|
1213
|
-
*/
|
|
1214
|
-
getSistemas() {
|
|
1215
|
-
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))));
|
|
1216
|
-
}
|
|
1217
|
-
/**
|
|
1218
|
-
* @description Obtiene la moneda actual
|
|
1219
|
-
* @return Observable<IResponse>
|
|
1220
|
-
* @author Carlos Albornoz
|
|
1221
|
-
* @actualizado: 4-12-20222
|
|
1222
|
-
* @params id: id de la moneda,
|
|
1223
|
-
* @params tipo: todas->obtiene todas las moneda, (uno-> obtiene una moneda + id)
|
|
1224
|
-
* (mon:formato para inputCurrency + id )
|
|
1225
|
-
*/
|
|
1226
|
-
getCurrentCurrency(tipo = null, id) {
|
|
1227
|
-
return this.http.get(`${this.URL}/dao/cfg/moneda_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1228
|
-
if (res.success) {
|
|
1229
|
-
res.data = new MMonedaConfig(res.data);
|
|
1230
|
-
}
|
|
1231
|
-
return res;
|
|
1232
|
-
}));
|
|
1233
|
-
}
|
|
1234
|
-
/**
|
|
1235
|
-
* @description Obtiene la linea empresa
|
|
1236
|
-
* @return Observable<IResponse>
|
|
1237
|
-
* @author Dimaly Crespo
|
|
1238
|
-
* @actualizado: 5-12-20222
|
|
1239
|
-
*/
|
|
1240
|
-
getEnterprise(tipo = null, id) {
|
|
1241
|
-
return this.http.get(`${this.URL}/dao/cfg/enterprise_dao.php?tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1242
|
-
if (res.success) {
|
|
1243
|
-
res.data = res.data.map(e => new MEnterprise(e));
|
|
1244
|
-
}
|
|
1245
|
-
return res;
|
|
1246
|
-
}));
|
|
1247
|
-
}
|
|
1248
|
-
/**
|
|
1249
|
-
* @description Obtiene los tipos de organizacion
|
|
1250
|
-
* @return Observable<IResponse>
|
|
1251
|
-
* @author Carlos Albornoz
|
|
1252
|
-
*/
|
|
1253
|
-
getOrganizationTypes() {
|
|
1254
|
-
return this.http.get(`${this.URL}/dao/rpc/tipo_organizacion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1255
|
-
if (res.success) {
|
|
1256
|
-
res.data = res.data.map(e => new MOrganizationType(e));
|
|
1257
|
-
}
|
|
1258
|
-
return res;
|
|
1259
|
-
}));
|
|
1260
|
-
}
|
|
1261
|
-
/**
|
|
1262
|
-
* @description Obtiene los tipos de organizacion
|
|
1263
|
-
* @return Observable<IResponse>
|
|
1264
|
-
* @author Carlos Albornoz
|
|
1265
|
-
*/
|
|
1266
|
-
getSpecialties() {
|
|
1267
|
-
return this.http.get(`${this.URL}/dao/rpc/especialidad_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1268
|
-
if (res.success) {
|
|
1269
|
-
res.data = res.data.map(e => new MSpecialty(e));
|
|
1270
|
-
}
|
|
1271
|
-
return res;
|
|
1272
|
-
}));
|
|
1273
|
-
}
|
|
1274
|
-
/**
|
|
1275
|
-
* @description Obtiene los documentos
|
|
1276
|
-
* @return Observable<IResponse>
|
|
1277
|
-
* @author Carlos Albornoz
|
|
1278
|
-
*/
|
|
1279
|
-
getDocuments() {
|
|
1280
|
-
return this.http.get(`${this.URL}/dao/rpc/documento_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1281
|
-
if (res.success) {
|
|
1282
|
-
res.data = res.data.map(e => new MDocument(e));
|
|
1283
|
-
}
|
|
1284
|
-
return res;
|
|
1285
|
-
}));
|
|
1286
|
-
}
|
|
1287
|
-
/**
|
|
1288
|
-
* @description Obtiene las clasificaciones
|
|
1289
|
-
* @return Observable<IResponse>
|
|
1290
|
-
* @author Carlos Albornoz
|
|
1291
|
-
*/
|
|
1292
|
-
getClasifications() {
|
|
1293
|
-
return this.http.get(`${this.URL}/dao/rpc/clasificacion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1294
|
-
if (res.success) {
|
|
1295
|
-
res.data = res.data.map(e => new MClasification(e));
|
|
1296
|
-
}
|
|
1297
|
-
return res;
|
|
1298
|
-
}));
|
|
1299
|
-
}
|
|
1300
|
-
/**
|
|
1301
|
-
* @description Obtiene el prefijo de los usuarios
|
|
1302
|
-
* @param procede De que módulo procede
|
|
1303
|
-
* @param codsis Código del sistema
|
|
1304
|
-
* @return Observable<MUsuarioPrefijo[]>
|
|
1305
|
-
* @author Carlos Albornoz
|
|
1306
|
-
*/
|
|
1307
|
-
getUserPrefix(filter = null, code = null) {
|
|
1308
|
-
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) => {
|
|
1309
|
-
if (res.success) {
|
|
1310
|
-
res.data = res.data.map(e => new MUsuarioPrefijo(e));
|
|
1311
|
-
}
|
|
1312
|
-
return res;
|
|
1313
|
-
}));
|
|
1314
|
-
}
|
|
1315
|
-
/**
|
|
1316
|
-
* @description Obtiene los pefijo
|
|
1317
|
-
* @param procede De que módulo procede
|
|
1318
|
-
* @param codsis Código del sistema
|
|
1319
|
-
* @return Observable<MUsuarioPrefijo[]>
|
|
1320
|
-
* @author DimalyCrespo 17-12-2022
|
|
1321
|
-
*/
|
|
1322
|
-
getPrefix(filter = null, code = null) {
|
|
1323
|
-
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) => {
|
|
1324
|
-
if (res.success) {
|
|
1325
|
-
res.data = res.data.map(e => new MPrefijo(e));
|
|
1326
|
-
}
|
|
1327
|
-
return res;
|
|
1328
|
-
}));
|
|
1329
|
-
}
|
|
1330
|
-
/**
|
|
1331
|
-
* @description Abre el dialog para buscar los proveedores
|
|
1332
|
-
* @return Promise<MProveedor>
|
|
1333
|
-
* @author Miguel Ramírez
|
|
1334
|
-
*/
|
|
1335
|
-
openDialogProveedores() {
|
|
1336
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1337
|
-
let proveedores = yield this.getProveedores().toPromise();
|
|
1338
|
-
let dialogRef = this.dialog.open(CatalogoComponent, {
|
|
1339
|
-
data: {
|
|
1340
|
-
columns: ['tipo', 'rif', 'nombre'],
|
|
1341
|
-
title: 'Catálogo de Proveedores y Beneficiarios',
|
|
1342
|
-
dataSource: proveedores
|
|
1343
|
-
},
|
|
1344
|
-
width: '450px',
|
|
1345
|
-
maxHeight: '90vh'
|
|
1346
|
-
});
|
|
1347
|
-
return dialogRef.afterClosed().toPromise();
|
|
1348
|
-
});
|
|
1349
|
-
}
|
|
1350
|
-
/**
|
|
1351
|
-
* @description Obtiene los proveedores
|
|
1352
|
-
* @return Observable<MProveedor[]>
|
|
1353
|
-
* @author Miguel Ramírez
|
|
1354
|
-
*/
|
|
1355
|
-
getProveedores() {
|
|
1356
|
-
let request = {
|
|
1357
|
-
operacion: 'obtenerData',
|
|
1358
|
-
sigesp_conexion: {
|
|
1359
|
-
servidor: this.URL,
|
|
1360
|
-
usuario: this.usuarioActivo.getInterface()
|
|
1361
|
-
}
|
|
1362
|
-
};
|
|
1363
|
-
return this.http.post(`${this.URL}/dao/rpc/proveedor_beneficiario_dao.php`, request).pipe(retry(3), catchError(this.handlerError), map((res) => res.map(element => new MProveedor(element))));
|
|
1364
|
-
}
|
|
1365
|
-
/**
|
|
1366
|
-
* @description Obtiene los proveedores y beneficiarios
|
|
1367
|
-
* @Note Si quiere solo los datos basicos use los parametros ('S','P','N')
|
|
1368
|
-
* @return Observable<IResponse>
|
|
1369
|
-
* @author Carlos Albornoz
|
|
1370
|
-
* @type ={'P','B','S'}
|
|
1371
|
-
* @destination ={'P','B','C','A','N'}≈{Proveedor,Beneficiario,Contatista,Ambos,Ninguno}
|
|
1372
|
-
* @account ={'S','N'} para traer las cuentas bancarias del proveedor por defecto esta en N
|
|
1373
|
-
* @modificado 17-07-2023
|
|
1374
|
-
*/
|
|
1375
|
-
getProvidersAndBeneficiaries(type = 'default', destination = null, account = 'N') {
|
|
1376
|
-
return this.http.get(`${this.URL}/dao/rpc/proveedor_beneficiario_dao.php${type ? `?provider_type=${type}` : ''}&destination=${destination}&account=${account}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1377
|
-
if (res.success) {
|
|
1378
|
-
res.data = res.data.map(e => new MProviderBeneficiary(e));
|
|
1379
|
-
}
|
|
1380
|
-
return res;
|
|
1381
|
-
}));
|
|
1382
|
-
}
|
|
1383
|
-
/**
|
|
1384
|
-
* @description Obtiene un Usuario segun su ID
|
|
1385
|
-
* @return Observable<IResponse>
|
|
1386
|
-
* @author Carlos Albornoz
|
|
1387
|
-
*/
|
|
1388
|
-
getUserById(id) {
|
|
1389
|
-
return this.http.get(`${this.URL}/dao/sss/usuario_dao.php?id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1390
|
-
if (res.success) {
|
|
1391
|
-
res.data = new MUsuario(res.data);
|
|
1392
|
-
}
|
|
1393
|
-
return res;
|
|
1394
|
-
}));
|
|
1395
|
-
}
|
|
1396
|
-
/**
|
|
1397
|
-
* @description Obtiene los bancos
|
|
1398
|
-
* @return Observable<IResponse>
|
|
1399
|
-
* @author Carlos Albornoz
|
|
1400
|
-
*/
|
|
1401
|
-
getBanks(idEnterprise) {
|
|
1402
|
-
return this.http.get(`${this.URL}/dao/scb/banco_dao.php?e=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1403
|
-
if (res.success) {
|
|
1404
|
-
res.data = res.data.map(e => new MBank(e));
|
|
1405
|
-
}
|
|
1406
|
-
return res;
|
|
1407
|
-
}));
|
|
1408
|
-
}
|
|
1409
|
-
/**
|
|
1410
|
-
* @description Obtiene los tipos de cuenta bancarias
|
|
1411
|
-
* @return Observable<IResponse>
|
|
1412
|
-
* @author Carlos Albornoz
|
|
1413
|
-
*/
|
|
1414
|
-
getBankAccountTypes() {
|
|
1415
|
-
return this.http.get(`${this.URL}/dao/scb/banco_tipo_cuenta_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1416
|
-
if (res.success) {
|
|
1417
|
-
res.data = res.data.map(e => new MBankAccountType(e));
|
|
1418
|
-
}
|
|
1419
|
-
return res;
|
|
1420
|
-
}));
|
|
1421
|
-
}
|
|
1422
|
-
/**
|
|
1423
|
-
* @description obtiene las cuenta segun el id
|
|
1424
|
-
* @param tipo {'banco', 'default'}
|
|
1425
|
-
* @param id para la opcion banco usar id=idBanco, opcion defaulf id=idEnterprise
|
|
1426
|
-
* @returns
|
|
1427
|
-
*/
|
|
1428
|
-
getAllBankAccount(tipo, id) {
|
|
1429
|
-
return this.http.get(`${this.URL}/dao/scb/cuenta_banco_dao.php?tipo=${tipo}&e=${id}`, { headers: this.getHttpHeaders() })
|
|
1430
|
-
.pipe(map((res) => {
|
|
1431
|
-
if (res.success) {
|
|
1432
|
-
res.data = res.data.map(element => new MCuentaBanco(element));
|
|
1433
|
-
}
|
|
1434
|
-
else {
|
|
1435
|
-
res.data = [];
|
|
1436
|
-
}
|
|
1437
|
-
return res;
|
|
1438
|
-
}));
|
|
1439
|
-
}
|
|
1440
|
-
/**
|
|
1441
|
-
* @description Obtiene los bancos sigecof
|
|
1442
|
-
* @return Observable<IResponse>
|
|
1443
|
-
* @author Carlos Albornoz
|
|
1444
|
-
*/
|
|
1445
|
-
getSigecofBanks() {
|
|
1446
|
-
return this.http.get(`${this.URL}/dao/sigesp/banco_sigecof_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1447
|
-
if (res.success) {
|
|
1448
|
-
res.data = res.data.map(e => new MSigecofBank(e));
|
|
1449
|
-
}
|
|
1450
|
-
return res;
|
|
1451
|
-
}));
|
|
1452
|
-
}
|
|
1453
|
-
/**
|
|
1454
|
-
* @description Obtiene la configuracion de SOC
|
|
1455
|
-
* @return Observable<IResponse>
|
|
1456
|
-
* @author Carlos Albornoz
|
|
1457
|
-
*/
|
|
1458
|
-
getConfigSOC() {
|
|
1459
|
-
return this.http.get(`${this.URL}/dao/soc/configuracion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1460
|
-
if (res.success) {
|
|
1461
|
-
res.data = new MConfigSOC(res.data);
|
|
1462
|
-
}
|
|
1463
|
-
return res;
|
|
1464
|
-
}));
|
|
1465
|
-
}
|
|
1466
|
-
/**
|
|
1467
|
-
* @description Obtiene los tipos de deduccion
|
|
1468
|
-
* @return Observable<IResponse>
|
|
1469
|
-
* @author Carlos Albornoz
|
|
1470
|
-
*/
|
|
1471
|
-
getDeductionTypes() {
|
|
1472
|
-
return this.http.get(`${this.URL}/dao/stb/tipo_deduccion_dao.php`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1473
|
-
if (res.success) {
|
|
1474
|
-
res.data = res.data.map(e => new MDeductionType(e));
|
|
1475
|
-
}
|
|
1476
|
-
return res;
|
|
1477
|
-
}));
|
|
1478
|
-
}
|
|
1479
|
-
getIncomeAccounts(onlyAvailable = false) {
|
|
1480
|
-
return this.http.get(`${this.URL}/dao/spi/cuentas_ingresos_dao.php${onlyAvailable ? '?available=true' : ''}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1481
|
-
if (res.success) {
|
|
1482
|
-
res.data = res.data.map(e => new MCuentaIngresos(e));
|
|
1483
|
-
}
|
|
1484
|
-
return res;
|
|
1485
|
-
}));
|
|
1486
|
-
}
|
|
1487
|
-
getCharges() {
|
|
1488
|
-
return this.http.get(`${this.URL}/dao/stb/cargos_dao.php`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1489
|
-
if (res.success) {
|
|
1490
|
-
res.data = res.data.map(e => new MCargo(e));
|
|
1491
|
-
}
|
|
1492
|
-
return res;
|
|
1493
|
-
}));
|
|
1494
|
-
}
|
|
1495
|
-
getDeductions() {
|
|
1496
|
-
return this.http.get(`${this.URL}/dao/stb/deducciones_dao.php`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1497
|
-
if (res.success) {
|
|
1498
|
-
res.data = res.data.map(e => new MDeduction(e));
|
|
1499
|
-
}
|
|
1500
|
-
return res;
|
|
1501
|
-
}));
|
|
1502
|
-
}
|
|
1503
|
-
/**
|
|
1504
|
-
* @description Obtiene la los datos de Empresa
|
|
1505
|
-
* @return Observable<IResponse>
|
|
1506
|
-
* @author Dimaly Crespo
|
|
1507
|
-
*
|
|
1508
|
-
*/
|
|
1509
|
-
getCompany(tipo, id) {
|
|
1510
|
-
return this.http.get(`${this.URL}/dao/cfg/empresas_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1511
|
-
if (res.success) {
|
|
1512
|
-
res.data = res.data.map(e => new MEmpresa(e));
|
|
1513
|
-
}
|
|
1514
|
-
return res;
|
|
1515
|
-
}));
|
|
1516
|
-
}
|
|
1517
|
-
/**
|
|
1518
|
-
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1519
|
-
* @return Observable<IResponse>
|
|
1520
|
-
* @author Dimaly Crespo
|
|
1521
|
-
* @date 20-07-2021
|
|
1522
|
-
*/
|
|
1523
|
-
getTiposDocumetos() {
|
|
1524
|
-
return this.http.get(`${this.URL}/dao/cxp/tipo_documento_dao.php?operacion=${'buscar'}&existen=${'existen'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1525
|
-
if (res.success) {
|
|
1526
|
-
res.data = res.data.map(e => new MTipoDocumentoCXP(e));
|
|
1527
|
-
}
|
|
1528
|
-
return res;
|
|
1529
|
-
}));
|
|
1530
|
-
}
|
|
1531
|
-
/**
|
|
1532
|
-
* @param get toma los valores: [ idOrdenCompra ,'recepcion','existen','codigo', 'ordenesSOC', 'op', 'art' ]
|
|
1533
|
-
* @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
|
|
1534
|
-
* @description 'recepcion': Obtine las ordenes de suministro,
|
|
1535
|
-
* existe y codigo: Obtiene los codigos registrados,
|
|
1536
|
-
* ordenesSOC: obtiene las ordenes de compra,
|
|
1537
|
-
* op: obtiene las ordenes pendientes
|
|
1538
|
-
* art: obtiene los articulos
|
|
1539
|
-
* @return Observable<IResponse>
|
|
1540
|
-
* @date 3-10-2021
|
|
1541
|
-
* @returns
|
|
1542
|
-
*/
|
|
1543
|
-
getEntradaSuministros(get, n) {
|
|
1544
|
-
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) => {
|
|
1545
|
-
if (res.success) {
|
|
1546
|
-
res.data = res.data.map(e => new MEntradaSuministros(e));
|
|
1547
|
-
}
|
|
1548
|
-
return res;
|
|
1549
|
-
}));
|
|
1550
|
-
}
|
|
1551
|
-
/**
|
|
1552
|
-
* @description Obtiene los tipos de documentos registrados en CXP
|
|
1553
|
-
* @return Observable<IResponse>
|
|
1554
|
-
* @author Dimaly Crespo
|
|
1555
|
-
* @date 20-07-2021
|
|
1556
|
-
*/
|
|
1557
|
-
getConceptosCxP() {
|
|
1558
|
-
return this.http.get(`${this.URL}/dao/cxp/concepto_dao.php?operacion=${'buscar'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1559
|
-
if (res.success) {
|
|
1560
|
-
res.data = res.data.map(e => new MConceptosCXP(e));
|
|
1561
|
-
}
|
|
1562
|
-
return res;
|
|
1563
|
-
}));
|
|
1564
|
-
}
|
|
1565
|
-
/**
|
|
1566
|
-
* @description Obtiene los los conceptos Retencion ISRL
|
|
1567
|
-
* @return Observable<IResponse>
|
|
1568
|
-
* @author Dimaly Crespo
|
|
1569
|
-
* @date 26-07-2021
|
|
1570
|
-
*/
|
|
1571
|
-
getConceptosRetencion() {
|
|
1572
|
-
return this.http.get(`${this.URL}/dao/stb/deducciones_dao.php?code=${'conceptos'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1573
|
-
if (res.success) {
|
|
1574
|
-
res.data = res.data.map(e => new MConceptoRetencion(e));
|
|
1575
|
-
}
|
|
1576
|
-
return res;
|
|
1577
|
-
}));
|
|
1578
|
-
}
|
|
1579
|
-
/**
|
|
1580
|
-
* @description Obtiene la configuración de RRHH y de SNO
|
|
1581
|
-
* @return Observable<IResponse>
|
|
1582
|
-
* @author Dimaly Crespo
|
|
1583
|
-
*/
|
|
1584
|
-
obtenerConfiguracionSNO() {
|
|
1585
|
-
return this.http.get(`${this.URL}/dao/sno/configuracion_dao.php?tipo=${'configuracion'}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1586
|
-
if (res.success) {
|
|
1587
|
-
if (res.data.length > 0) {
|
|
1588
|
-
res.data = res.data.map(e => new MConfiguracionSNO(e));
|
|
1589
|
-
}
|
|
1590
|
-
}
|
|
1591
|
-
return res;
|
|
1592
|
-
}));
|
|
1593
|
-
}
|
|
1594
|
-
/**
|
|
1595
|
-
*
|
|
1596
|
-
* @param tipo ['default', 'uno', 'cargos'] dafault:Todas las nominas, uno: una nomina, 'cargos': nominas por cargos
|
|
1597
|
-
* @param id :id de la nomina. Campo requerido para uno y cargos
|
|
1598
|
-
* @returns array()
|
|
1599
|
-
* @description Obtiene las nominas registradas
|
|
1600
|
-
* @return Observable<IResponse>
|
|
1601
|
-
* @date 20-10-21
|
|
1602
|
-
*
|
|
1603
|
-
*/
|
|
1604
|
-
getNomina(tipo, id) {
|
|
1605
|
-
return this.http.get(`${this.URL}/dao/sno/definicion_nomina_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1606
|
-
if (res.success) {
|
|
1607
|
-
res.data = res.data.map(e => new MDefinicionNomina(e));
|
|
1608
|
-
}
|
|
1609
|
-
return res;
|
|
1610
|
-
}));
|
|
1611
|
-
}
|
|
1612
|
-
/**
|
|
1613
|
-
* @description Obtiene los cargos de las nomina
|
|
1614
|
-
* @param tipo ['codigo','default'] ->codigo: obtiene el proximo codigo. ->default: obtiene todos los cargos de la nomina
|
|
1615
|
-
* @param id id de la nomina
|
|
1616
|
-
* @returns array()
|
|
1617
|
-
*/
|
|
1618
|
-
getCargosNomina(tipo, id) {
|
|
1619
|
-
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) => {
|
|
1620
|
-
if (res.success) {
|
|
1621
|
-
res.data = res.data.map(e => new MAsignacionCargo(e));
|
|
1622
|
-
}
|
|
1623
|
-
return res;
|
|
1624
|
-
}));
|
|
1625
|
-
}
|
|
1626
|
-
/**
|
|
1627
|
-
* @description Obtiene un personal de la nómina
|
|
1628
|
-
* @return Observable<IResponse>
|
|
1629
|
-
* @author Dimaly Crespo
|
|
1630
|
-
*/
|
|
1631
|
-
getPersonalSRH(tipo, id) {
|
|
1632
|
-
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1633
|
-
if (res.success) {
|
|
1634
|
-
res.data = res.data.map(e => new MPersonal(e));
|
|
1635
|
-
}
|
|
1636
|
-
return res;
|
|
1637
|
-
}));
|
|
1638
|
-
}
|
|
1639
|
-
/**
|
|
1640
|
-
* @description Obtiene las agencia de banco
|
|
1641
|
-
* @return Observable<IResponse>
|
|
1642
|
-
* @author Dimaly Crespo
|
|
1643
|
-
*/
|
|
1644
|
-
getAgenciaBanco(tipo, id) {
|
|
1645
|
-
return this.http.get(`${this.URL}/dao/scb/agencia_dao.php?code=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(retry(3), catchError(this.handlerError), map((res) => {
|
|
1646
|
-
if (res.success) {
|
|
1647
|
-
res.data = res.data.map(e => new MAgenciaBanco(e));
|
|
1648
|
-
}
|
|
1649
|
-
return res;
|
|
1650
|
-
}));
|
|
1651
|
-
}
|
|
1652
|
-
/**
|
|
1653
|
-
* @description Obtiene la hojas de tiempo
|
|
1654
|
-
* @return Observable<IResponse>
|
|
1655
|
-
* @author Dimaly Crespo
|
|
1656
|
-
*/
|
|
1657
|
-
getHojaTiempo(tipo, idPersonal, idNomina) {
|
|
1658
|
-
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) => {
|
|
1659
|
-
if (res.success) {
|
|
1660
|
-
res.data = res.data.map(e => new MHojaTiempo(e));
|
|
1661
|
-
}
|
|
1662
|
-
return res;
|
|
1663
|
-
}));
|
|
1664
|
-
}
|
|
1665
|
-
/**
|
|
1666
|
-
* @description Obtiene los clientes
|
|
1667
|
-
* @return Observable<IResponse>
|
|
1668
|
-
* @author Dimaly Crespo
|
|
1669
|
-
* @tipo [basico,codigo,cedula]
|
|
1670
|
-
*
|
|
1671
|
-
*/
|
|
1672
|
-
getCliente(tipo = 'default', id = 0, codigo = '', cedula = '') {
|
|
1673
|
-
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) => {
|
|
1674
|
-
if (res.success) {
|
|
1675
|
-
res.data = res.data.map(e => new MClient(e));
|
|
1676
|
-
}
|
|
1677
|
-
return res;
|
|
1678
|
-
}));
|
|
1679
|
-
}
|
|
1680
|
-
/**
|
|
1681
|
-
* @description Valida si la fecha esta dentro del periodo fiscal y el mes esta abierto o cerrado
|
|
1682
|
-
* @return Observable<IResponse>
|
|
1683
|
-
* @author Dimaly Crespo
|
|
1684
|
-
* @author 11-10-2023
|
|
1685
|
-
*/
|
|
1686
|
-
getValidarPeriodo(fecha, periodoFiscal) {
|
|
1687
|
-
return this.http.get(`${this.URL}/dao/scg/configuracion_contabilidad_dao.php?fecha=${fecha}&periodo=${periodoFiscal}`, { headers: this.getHttpHeaders() }).pipe(map((res) => { return res; }));
|
|
1688
|
-
}
|
|
1689
|
-
userHasRights(column) {
|
|
1690
|
-
return this.http.get(`${this.URL}/dao/sss/derechos_usuario_dao.php?idComponent=${this.currentComponent.id}&column=${column}`, { headers: this.getHttpHeaders() });
|
|
1691
|
-
}
|
|
1692
|
-
/**
|
|
1693
|
-
* @description Retorna los headers para hacer las peticiones
|
|
1694
|
-
* @params type: Tipo MIME permitido por defecto se toma application/json
|
|
1695
|
-
* @return HttpHeaders
|
|
1696
|
-
* @author Miguel Ramírez
|
|
1697
|
-
* @date-update: 15-06-2022
|
|
1698
|
-
*/
|
|
1699
|
-
getHttpHeaders(type) {
|
|
1700
|
-
!type ? type = 'application/json' : '';
|
|
1701
|
-
const headers = new HttpHeaders({
|
|
1702
|
-
'Content-Type': type,
|
|
1703
|
-
'Authorization': `${this.usuarioActivo.token}`
|
|
1704
|
-
});
|
|
1705
|
-
return headers;
|
|
1706
|
-
}
|
|
1707
|
-
/**
|
|
1708
|
-
* @description Obtiene el servidor guardado en el sessionStorage
|
|
1709
|
-
* @return string
|
|
1710
|
-
* @author Miguel Ramírez
|
|
1711
|
-
*/
|
|
1712
|
-
getServer() {
|
|
1713
|
-
return this.URL;
|
|
1714
|
-
}
|
|
1715
|
-
/**
|
|
1716
|
-
* @description Obtiene el usuario guardado en el sessionStorage
|
|
1717
|
-
* @return MUsuario
|
|
1718
|
-
* @author Miguel Ramírez
|
|
1719
|
-
*/
|
|
1720
|
-
getUser() {
|
|
1721
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1722
|
-
let conexion = (yield (sessionStorage.getItem('user'))) ? JSON.parse(atob(sessionStorage.getItem('user'))) : null;
|
|
1723
|
-
//console.log(conexion)
|
|
1724
|
-
// debugger
|
|
1725
|
-
if (conexion) {
|
|
1726
|
-
this.usuarioActivo = new MUsuario(conexion.usuario);
|
|
1727
|
-
this.URL = conexion.servidor;
|
|
1728
|
-
}
|
|
1729
|
-
});
|
|
1730
|
-
}
|
|
1731
|
-
/**
|
|
1732
|
-
* @description Muestra un toast de success
|
|
1733
|
-
* @param message Mensaje que se va a mostrar
|
|
1734
|
-
* @return void
|
|
1735
|
-
* @author Miguel Ramírez
|
|
1736
|
-
*/
|
|
1737
|
-
showToastSuccess(message) {
|
|
1738
|
-
this.toast.success(message);
|
|
1739
|
-
}
|
|
1740
|
-
/**
|
|
1741
|
-
* @description Muestra un toast de error
|
|
1742
|
-
* @param message Mensaje que se va a mostrar
|
|
1743
|
-
* @return void
|
|
1744
|
-
* @author Miguel Ramírez
|
|
1745
|
-
*/
|
|
1746
|
-
showToastError(message) {
|
|
1747
|
-
this.toast.error(message);
|
|
1748
|
-
}
|
|
1749
|
-
/**
|
|
1750
|
-
* @description Muestra un sweetalert2 de éxito
|
|
1751
|
-
* @param message Mensaje que se va a mostrar
|
|
1752
|
-
* @return void
|
|
1753
|
-
* @date 22-11-2021
|
|
1754
|
-
*/
|
|
1755
|
-
showToastSuccessSwal(message) {
|
|
1756
|
-
Swal.fire({
|
|
1757
|
-
icon: 'success',
|
|
1758
|
-
title: 'Éxito',
|
|
1759
|
-
text: message,
|
|
1760
|
-
});
|
|
1761
|
-
}
|
|
1762
|
-
/**
|
|
1763
|
-
* @description Muestra un sweetalert2 de error
|
|
1764
|
-
* @param message Mensaje que se va a mostrar
|
|
1765
|
-
* @return void
|
|
1766
|
-
* @date 22-11-2021
|
|
1767
|
-
*/
|
|
1768
|
-
showToastErrorSwal(message) {
|
|
1769
|
-
Swal.fire({
|
|
1770
|
-
icon: 'error',
|
|
1771
|
-
title: '¡Error!',
|
|
1772
|
-
text: message,
|
|
1773
|
-
});
|
|
1774
|
-
}
|
|
1775
|
-
/**
|
|
1776
|
-
* @description Guarda el usuario logueado en el SessionStorage
|
|
1777
|
-
* @param user Usuario que se va a guardar en el SessionStorage
|
|
1778
|
-
* @return void
|
|
1779
|
-
* @author Miguel Ramírez
|
|
1780
|
-
*/
|
|
1781
|
-
saveUser(data) {
|
|
1782
|
-
this.usuarioActivo = new MUsuario(data.usuario);
|
|
1783
|
-
this.URL = data.servidor;
|
|
1784
|
-
let encryptedUser = btoa(JSON.stringify(data));
|
|
1785
|
-
sessionStorage.setItem('user', encryptedUser);
|
|
1786
|
-
}
|
|
1787
|
-
/**
|
|
1788
|
-
* @description Sete a la url a la cual se le van a realizar peticiones al backEnd
|
|
1789
|
-
* @param url URl donde se van a realizar las peticiones
|
|
1790
|
-
* @return void
|
|
1791
|
-
* @author Miguel Ramírez
|
|
1792
|
-
*/
|
|
1793
|
-
setUrl(url) {
|
|
1794
|
-
this.URL = url;
|
|
1795
|
-
}
|
|
1796
|
-
/**
|
|
1797
|
-
* @description Inicializa el servicio de sigesp
|
|
1798
|
-
* @return void
|
|
1799
|
-
* @author Miguel Ramírez
|
|
1800
|
-
*/
|
|
1801
|
-
init() {
|
|
1802
|
-
// Verificamos si hay un usuario en la sessionStorage, esto es necesario para recargar la página
|
|
1803
|
-
if (sessionStorage.getItem('user')) {
|
|
1804
|
-
// console.log(sessionStorage.getItem('user'))
|
|
1805
|
-
this.getUser();
|
|
1806
|
-
}
|
|
1807
|
-
}
|
|
1808
|
-
/**
|
|
1809
|
-
* @description Verifica si un usuario está logueado
|
|
1810
|
-
* @return Promise<boolean>
|
|
1811
|
-
* @author Miguel Ramírez
|
|
1812
|
-
*/
|
|
1813
|
-
isLogged() {
|
|
1814
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
1815
|
-
return new Promise((resolve, reject) => {
|
|
1816
|
-
if (sessionStorage.getItem('user')) {
|
|
1817
|
-
resolve(true);
|
|
1818
|
-
}
|
|
1819
|
-
else {
|
|
1820
|
-
resolve(false);
|
|
1821
|
-
}
|
|
1822
|
-
});
|
|
1823
|
-
});
|
|
1824
|
-
}
|
|
1825
|
-
handlerError(error) {
|
|
1826
|
-
return throwError('Ocurrió un error');
|
|
1827
|
-
}
|
|
1828
|
-
/**
|
|
1829
|
-
* @description obtiene el personal segun filtro
|
|
1830
|
-
* @return Observable<IResponse>
|
|
1831
|
-
* @date 15-11-2021
|
|
1832
|
-
* @param tipo: valores ['catalogo','catalogoSno','default','nomina','responsables']
|
|
1833
|
-
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo' o 'catalogoSno'
|
|
1834
|
-
*/
|
|
1835
|
-
getPersonal(tipo, dato) {
|
|
1836
|
-
let cedula = '';
|
|
1837
|
-
let nombre = '';
|
|
1838
|
-
let apellido = '';
|
|
1839
|
-
let idEnterprise = 0;
|
|
1840
|
-
if (dato) {
|
|
1841
|
-
cedula = dato.cedula;
|
|
1842
|
-
nombre = dato.nombre;
|
|
1843
|
-
apellido = dato.apellido;
|
|
1844
|
-
idEnterprise = dato.idEnterprise;
|
|
1845
|
-
}
|
|
1846
|
-
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) => {
|
|
1847
|
-
if (res.success) {
|
|
1848
|
-
res.data = res.data.map(e => new MPersonal(e));
|
|
1849
|
-
}
|
|
1850
|
-
return res;
|
|
1851
|
-
}));
|
|
1852
|
-
}
|
|
1853
|
-
/**
|
|
1854
|
-
* @description obtener personal Nomina segun filtro
|
|
1855
|
-
* @return Observable<IResponse>
|
|
1856
|
-
* @date 15-11-2021
|
|
1857
|
-
* * @param tipo: valores ['catalogo','default','nomina']
|
|
1858
|
-
* @params dato:object {nombre:string, apellido:string, cedula.string} use para la opcion 'catalogo'
|
|
1859
|
-
|
|
1860
|
-
*/
|
|
1861
|
-
getPersonalNomina(tipo, dato) {
|
|
1862
|
-
let cedula = '';
|
|
1863
|
-
let nombre = '';
|
|
1864
|
-
let apellido = '';
|
|
1865
|
-
let idEnterprise = 0;
|
|
1866
|
-
let idNomina = 0;
|
|
1867
|
-
if (dato) {
|
|
1868
|
-
cedula = dato.cedula;
|
|
1869
|
-
nombre = dato.nombre;
|
|
1870
|
-
apellido = dato.apellido;
|
|
1871
|
-
idEnterprise = dato.idEnterprise;
|
|
1872
|
-
idNomina = dato.idNomina;
|
|
1873
|
-
}
|
|
1874
|
-
return this.http.get(`${this.URL}/dao/sno/asignacion_personal_nomina_dao.php?
|
|
1875
|
-
tipo=${tipo}&cedula=${cedula}&nombre=${nombre}&apellido=${apellido}&idNomina=${idNomina}&idEnterprise=${idEnterprise}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1876
|
-
if (res.success) {
|
|
1877
|
-
res.data = res.data.map(e => new MPersonalNomina(e));
|
|
1878
|
-
}
|
|
1879
|
-
return res;
|
|
1880
|
-
}));
|
|
1881
|
-
}
|
|
1882
|
-
/**
|
|
1883
|
-
* @param idPersonal: id del personal
|
|
1884
|
-
* @param tipo: valores['nomina_personal']
|
|
1885
|
-
* @description Obtiene las nominas del personal resumida
|
|
1886
|
-
* @deprecated; 20-01-22
|
|
1887
|
-
* @returns
|
|
1888
|
-
*/
|
|
1889
|
-
getPersonalNominaResumida(idPersonal, tipo) {
|
|
1890
|
-
return this.http.get(`${this.URL}/dao/sno/personal_dao.php?idPersonal=${idPersonal}&tipo=${tipo}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1891
|
-
if (res.success) {
|
|
1892
|
-
res.data = res.data.map(e => new MNominaSimple(e));
|
|
1893
|
-
}
|
|
1894
|
-
return res;
|
|
1895
|
-
}));
|
|
1896
|
-
}
|
|
1897
|
-
/**
|
|
1898
|
-
* @description Obtiene el Json Sistemas para el usuario definido segun su permisologia del Sistema
|
|
1899
|
-
* @return Json data
|
|
1900
|
-
* @author Ing. Dimaly Crespo
|
|
1901
|
-
*/
|
|
1902
|
-
getPerfilSistema(id_usuario) {
|
|
1903
|
-
return this.http.get(`${this.URL}/dao/sss/usuarios_sistemas_dao.php?id_usuario=${id_usuario}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1904
|
-
if (res.data.length > 0) {
|
|
1905
|
-
res.data = res.data.map(e => new MUsuarioSistema(e));
|
|
1906
|
-
}
|
|
1907
|
-
return res;
|
|
1908
|
-
}));
|
|
1909
|
-
}
|
|
1910
|
-
/**
|
|
1911
|
-
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1912
|
-
* @return Json data
|
|
1913
|
-
* @author Ing. Wilmer Briceno
|
|
1914
|
-
*/
|
|
1915
|
-
getPerfilNoComponent(id_usuario, sistema, nameComponent) {
|
|
1916
|
-
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) => {
|
|
1917
|
-
return res;
|
|
1918
|
-
}));
|
|
1919
|
-
}
|
|
1920
|
-
/**
|
|
1921
|
-
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1922
|
-
* @return Json data
|
|
1923
|
-
* @author Ing. Wilmer Briceno
|
|
1924
|
-
*/
|
|
1925
|
-
getJsonMenu(id_usuario, sistema) {
|
|
1926
|
-
return this.http.get(`${this.URL}/dao/sss/menu_dao.php?id_usuario=${id_usuario}&sistema=${sistema}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
1927
|
-
this.userMenu = res.data;
|
|
1928
|
-
return this.userMenu;
|
|
1929
|
-
}));
|
|
1930
|
-
}
|
|
1931
|
-
/**
|
|
1932
|
-
* @description Obtiene el Json Menu para el usuario definido segun su permisologia del Sistema
|
|
1933
|
-
* @return Json data
|
|
1934
|
-
* @author Ing. Wilmer Briceno
|
|
1935
|
-
*/
|
|
1936
|
-
log(body) {
|
|
1937
|
-
return this.http.post(`${this.URL}/dao/sss/log_dao.php`, body, {
|
|
1938
|
-
headers: this.getHttpHeaders()
|
|
1939
|
-
}).pipe(map((res) => {
|
|
1940
|
-
return res;
|
|
1941
|
-
}));
|
|
1942
|
-
}
|
|
1943
|
-
/**
|
|
1944
|
-
* @name EncryptData
|
|
1945
|
-
* @description Enscripta una expresion data
|
|
1946
|
-
* @author Ing. Wilmer Briceño
|
|
1947
|
-
*/
|
|
1948
|
-
EncryptData(expresion) {
|
|
1949
|
-
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1950
|
-
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1951
|
-
let srcs = CryptoJS.enc.Utf8.parse(expresion);
|
|
1952
|
-
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1953
|
-
return encrypted.ciphertext.toString().toUpperCase();
|
|
1954
|
-
}
|
|
1955
|
-
/**
|
|
1956
|
-
* @name DecryptData
|
|
1957
|
-
* @description Desencripta una expresion data
|
|
1958
|
-
* @author Ing. Wilmer Briceño
|
|
1959
|
-
*/
|
|
1960
|
-
DecryptData(expresion) {
|
|
1961
|
-
const key = CryptoJS.enc.Utf8.parse("0123456789SIGESP"); // número hexadecimal de 16 dígitos como clave
|
|
1962
|
-
const iv = CryptoJS.enc.Utf8.parse('SIGESP0123456789'); // Número hexadecimal como desplazamiento de clave
|
|
1963
|
-
let encryptedHexStr = CryptoJS.enc.Hex.parse(expresion);
|
|
1964
|
-
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
|
|
1965
|
-
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
|
|
1966
|
-
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
|
|
1967
|
-
return decryptedStr.toString();
|
|
1968
|
-
}
|
|
1969
|
-
/**
|
|
1970
|
-
* @name getResponsePerfilToolbar
|
|
1971
|
-
* @description Metodo que obtiene una respuesta true o false basado en una estructura sring binanria segun
|
|
1972
|
-
* la posicion dada del toolbar. se pasa string binario que contiene 1 y 0 en representacion
|
|
1973
|
-
* de las propiestades administrador,consultar,ejecutar,imprimir etc ... cada posicion secuencial
|
|
1974
|
-
* si esta en 1 es true y 0 en false y devuleve el valor segun lo requiera el usuario:
|
|
1975
|
-
* stringbinario : '1011' y posicion es 2, por tanto se tare 0 y es false que representa opcion consultar.
|
|
1976
|
-
* Estructura string binario:
|
|
1977
|
-
* Posición :
|
|
1978
|
-
* 0. Administrador 6. Descargar 12. Reversar aprobar 18. Reversar anular contabilizado
|
|
1979
|
-
* 1. insertar 7. Ejecutar 13. Anular.
|
|
1980
|
-
* 2. Actualizar 8. Enviar 14. reversar anular
|
|
1981
|
-
* 3. consultar 9. Imprimir 15. contabilizar
|
|
1982
|
-
* 4. Eliminar 10. Visible 16. reversar contabilizar
|
|
1983
|
-
* 5. Anular 11. Aprobar 17. anular contabilizado
|
|
1984
|
-
*
|
|
1985
|
-
* @author Ing. Wilmer Briceño
|
|
1986
|
-
*/
|
|
1987
|
-
getResponsePerfilToolbar(stringbinario, position) {
|
|
1988
|
-
let binario = stringbinario.substring(position, position + 1);
|
|
1989
|
-
if (binario == "1") {
|
|
1990
|
-
return true;
|
|
1991
|
-
}
|
|
1992
|
-
return false;
|
|
1993
|
-
}
|
|
1994
|
-
/**
|
|
1995
|
-
* @description Obtiene el Ip del cliente
|
|
1996
|
-
* @return Json data
|
|
1997
|
-
* @author Ing. Wilmer Briceno
|
|
1998
|
-
*/
|
|
1999
|
-
getIPAddress() {
|
|
2000
|
-
return this.http.get("http://api.ipify.org/?format=json")
|
|
2001
|
-
.pipe(catchError((err) => {
|
|
2002
|
-
console.log('error caught in service');
|
|
2003
|
-
console.error(err);
|
|
2004
|
-
sessionStorage.setItem('ip_adress', '127.0.0.1');
|
|
2005
|
-
//Handle the error here
|
|
2006
|
-
return throwError(err); //Rethrow it back to component
|
|
2007
|
-
}));
|
|
2008
|
-
}
|
|
2009
|
-
/**
|
|
2010
|
-
* @description Obtiene el Ip del cliente
|
|
2011
|
-
* @return Json data
|
|
2012
|
-
* @author Ing. Wilmer Briceno
|
|
2013
|
-
*/
|
|
2014
|
-
setIpAdress() {
|
|
2015
|
-
this.getIPAddress().subscribe((resp) => {
|
|
2016
|
-
sessionStorage.setItem('ip_adress', resp.ip);
|
|
2017
|
-
this.ip_adress = resp.ip;
|
|
2018
|
-
});
|
|
2019
|
-
}
|
|
2020
|
-
/**
|
|
2021
|
-
* @description Obtiene el Ip del cliente
|
|
2022
|
-
* @return Json data
|
|
2023
|
-
* @author Ing. Wilmer Briceno
|
|
2024
|
-
*/
|
|
2025
|
-
getIpAdress() {
|
|
2026
|
-
this.ip_adress = sessionStorage.getItem('ip_adress');
|
|
2027
|
-
}
|
|
2028
|
-
/**
|
|
2029
|
-
* @description Obtiene el Ip del cliente
|
|
2030
|
-
* @return Json data
|
|
2031
|
-
* @dia 19-05-2022
|
|
2032
|
-
*/
|
|
2033
|
-
createAuditoria(sno) {
|
|
2034
|
-
let body = [];
|
|
2035
|
-
sno.forEach(e => { body.push(e.dataInteface()); });
|
|
2036
|
-
return this.http.post(`${this.URL}/dao/sno/seguridad_dao.php?`, body, { headers: this.getHttpHeaders() })
|
|
2037
|
-
.pipe(map((res) => { return res; }));
|
|
2038
|
-
}
|
|
2039
|
-
/**
|
|
2040
|
-
* @description Obtiene los tipos de depositos *
|
|
2041
|
-
* @param procede : procede del modulo
|
|
2042
|
-
* @param idArticulo : id del articulo
|
|
2043
|
-
* @param idUsuario : id usuario permitido
|
|
2044
|
-
* @returns
|
|
2045
|
-
* @author Javier Tovar
|
|
2046
|
-
* @date 23-11-2022
|
|
2047
|
-
*/
|
|
2048
|
-
getDepositType(procede, idArticulo, idUsuario) {
|
|
2049
|
-
return this.http.get(`${this.URL}/dao/siv/catalogo_parametrizado_dao.php?get=${procede}&id=${idArticulo}&i=${idUsuario}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
2050
|
-
if (res.success) {
|
|
2051
|
-
res.data = res.data.map(e => new MTipoDepositos(e));
|
|
2052
|
-
}
|
|
2053
|
-
return res;
|
|
2054
|
-
}));
|
|
2055
|
-
}
|
|
2056
|
-
/**
|
|
2057
|
-
* @description Obtiene Cargos Adicionales *
|
|
2058
|
-
* @param tipo : one,default
|
|
2059
|
-
* @param id : id del cargo
|
|
2060
|
-
* @returns
|
|
2061
|
-
* @author Dimaly Crespo
|
|
2062
|
-
* @date 13-11-2022
|
|
2063
|
-
*/
|
|
2064
|
-
getCargosAdicionales(tipo, id) {
|
|
2065
|
-
return this.http.get(`${this.URL}/dao/stb/cargos_adicionales_dao.php?tipo=${tipo}&id=${id}`, { headers: this.getHttpHeaders() }).pipe(map((res) => {
|
|
2066
|
-
if (res.success) {
|
|
2067
|
-
res.data = res.data.map(e => new MCargosAdicionales(e));
|
|
2068
|
-
}
|
|
2069
|
-
return res;
|
|
2070
|
-
}));
|
|
2071
|
-
}
|
|
2072
|
-
}
|
|
2073
|
-
SigespService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SigespService_Factory() { return new SigespService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.MatDialog), i0.ɵɵinject(i3.ToastrService)); }, token: SigespService, providedIn: "root" });
|
|
2074
|
-
SigespService.decorators = [
|
|
2075
|
-
{ type: Injectable, args: [{
|
|
2076
|
-
providedIn: 'root'
|
|
2077
|
-
},] }
|
|
2078
|
-
];
|
|
2079
|
-
SigespService.ctorParameters = () => [
|
|
2080
|
-
{ type: HttpClient },
|
|
2081
|
-
{ type: MatDialog },
|
|
2082
|
-
{ type: ToastrService }
|
|
2083
|
-
];
|
|
2084
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnZXNwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiQzovQXBwU2Vydi93d3cvc2lnZXNwX21vZHVsb3Mvc2lnZXNwX2NvcmUvcHJvamVjdHMvc2lnZXNwL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9zaWdlc3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWpGLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FB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LENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUc7ZUFDOUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxPQUFPLElBQUUsRUFBRTtlQUMvRyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRztZQUM5RyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0g7Ozs7OztPQU1HO0lBQ00sUUFBUSxDQUFDLEtBQVc7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFLLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRztlQUM1RyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztlQUM3RyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBTSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBRyxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFFLEdBQUc7ZUFDMUcsS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQU0sS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHO2VBQzFHLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFHLEtBQUssQ0FBQyxPQUFPLElBQUUsSUFBSSxJQUFLLEtBQUssQ0FBQyxPQUFPLElBQUUsR0FBRyxJQUFHLEtBQUssQ0FBQyxPQUFPLElBQUUsR0FBRztlQUNsRyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsSUFBSyxLQUFLLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRTtZQUN2RSxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7O0tBS0M7SUFDTyxRQUFRLENBQUMsS0FBVztRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUssS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUUsR0FBRyxDQUFDLElBQUssS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBRSxHQUFH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Q0FBQyxHQUFHLENBQVksR0FBRyxJQUFJLENBQUMsR0FBRyw0Q0FBNEMsSUFBSSxPQUFPLEVBQUUsRUFBRSxFQUN0RyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDdEMsR0FBRyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDZixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7Ozs7WUFobkZBLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBekVNLFVBQVU7WUFLVixTQUFTO1lBT1QsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1QcmVmaWpvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvTVByZWZpam8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW50ZXJwcmlzZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL0VudGVycHJpc2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGVyc29uYWxOb21pbmEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NUGVyc29uYWxOb21pbmEubW9kZWwnO1xyXG5pbXBvcnQgeyBNSG9qYVRpZW1wbyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Ib2phVGllbXBvLm1vZGVsJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNVXN1YXJpbyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1NTL3VzZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSVJlcXVlc3QgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9SZXF1ZXN0JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBNUHJvdmVlZG9yIH0gZnJvbSAnLi9jb3JlL21vZGVscy9SUEMvcHJvdmVlZG9yZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IsIHJldHJ5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNVXN1YXJpb1ByZWZpam8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL0NGRy91c2VyUHJlZml4Lm1vZGVsJztcclxuaW1wb3J0IHsgSUNhdGFsb2dvLCBmaWx0ZXJEYXRhIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ2F0YWxvZ28nO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0NvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY2F0YWxvZ28vY2F0YWxvZ28uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUN1ZW50YVByZXN1cHVlc3RvIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvY3VlbnRhUHJlc3VwdWVzdG8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ3VlbnRhSW5zdGl0dWNpb25hbCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU0NHL2N1ZW50YUluc3RpdHVjaW9uYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBNTW9uZWRhLCBNTW9uZWRhQ29uZmlnIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvbW9uZWRhLm1vZGVsJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBNVW5pZGFkVHJpYnV0YXJpYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL3VuaWRhZFRyaWJ1dGFyaWEubW9kZWwnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQ29uZmlybUNvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY29uZmlybS9jb25maXJtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1Db25maWd1cmFjaW9uU0NHIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TQ0cvY29uZmlndXJhY2lvblNDRy5tb2RlbCc7XHJcbmltcG9ydCB7IE1QbGFuVW5pY29DdWVudGEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NDRy9wbGFuVW5pY29DdWVudGEubW9kZWwnO1xyXG5pbXBvcnQgeyBJQ29uZXhpb24gfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9Vc3VhcmlvJztcclxuaW1wb3J0IHsgVGFibGVTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL3RhYmxlLXNlbGVjdC90YWJsZS1zZWxlY3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTUNvbmZpZ3VyYXRpb25TUEcgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9jb25maWd1cmF0aW9uU1BHLm1vZGVsJztcclxuaW1wb3J0IHsgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZSwgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3bywgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlLCBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRm91ciwgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZSwgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmUsIE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUaHJlZUNvbXBsZXRlLCBNQWxsU3RydWN0dXJlIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvZXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhLm1vZGVsJztcclxuaW1wb3J0IHsgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZSwgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3bywgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlLCBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRm91ciwgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZSwgSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmUgfSBmcm9tICcuL2NvcmUvaW50ZXJmYWNlcy9Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWEnO1xyXG5pbXBvcnQgeyBNQ2VudHJvQ29zdG8sIE1Vc3VhcmlvQ2VudHJvQ29zdG8gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NDRy9jZW50cm9Db3N0by5tb2RlbCc7XHJcbmltcG9ydCB7IE1GdWVudGVGaW5hbmNpYW1pZW50byB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1BHL2Z1ZW50ZUZpbmFuY2lhbWllbnRvLm1vZGVsJztcclxuaW1wb3J0IHsgTUN1ZW50YUVncmVzb3MgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9leHBlbnNpdmVBY2NvdW50Lm1vZGVsJztcclxuaW1wb3J0IHsgQ2F0YWxvZ29Fc3RydWN0dXJhc0NvbXBvbmVudCB9IGZyb20gJy4vc2hhcmVkL2NvbXBvbmVudHMvY2F0YWxvZ28tZXN0cnVjdHVyYXMvY2F0YWxvZ28tZXN0cnVjdHVyYXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSVVwZGF0ZURpc3RyaWJ1dGlvbiwgSVVwZGF0ZURpc3RyaWJ1dGlvbjIsIElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvcywgSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zMiB9IGZyb20gJy4vY29yZS9pbnRlcmZhY2VzL0N1ZW50YUVncmVzb3MnO1xyXG5pbXBvcnQgeyBDYXRhbG9nb0RvYmxlSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL3NoYXJlZC9jb21wb25lbnRzL2NhdGFsb2dvLWRvYmxlLWlucHV0L2NhdGFsb2dvLWRvYmxlLWlucHV0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1TaXN0ZW1hLCBNVXN1YXJpb1Npc3RlbWEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy9zaXN0ZW1hJztcclxuaW1wb3J0IHsgSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zLCBJQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpbyc7XHJcbmltcG9ydCB7IE1Db21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcywgTUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1BHL2NvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ3VlbnRhSW5ncmVzb3MgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NDRy9JbmNvbWVBY2NvdW50JztcclxuaW1wb3J0IHsgTUluY29tZVN0cnVjdHVyZUFjY291bnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9pbmNvbWVTdHJ1Y3R1cmVBY2NvdW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTU9yZ2FuaXphdGlvblR5cGUgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NQRy9vcmdhbml6YXRpb25UeXBlLm1vZGVsJztcclxuaW1wb3J0IHsgTVNwZWNpYWx0eSB9IGZyb20gJy4vY29yZS9tb2RlbHMvUlBDL3NwZWNpYWx0eS5tb2RlbCc7XHJcbmltcG9ydCB7IE1Eb2N1bWVudCB9IGZyb20gJy4vY29yZS9tb2RlbHMvUlBDL2RvY3VtZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgTUNsYXNpZmljYXRpb24gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1JQQy9jbGFzaWZpY2F0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgTUNvdW50cnksIE1TdGF0ZSwgTU11bmljaXBhbGl0eSwgTVBhcmlzaCwgTUNpdHksIE1Db21tdW5pdHkgfSBmcm9tICcuL2NvcmUvbW9kZWxzL0NGRy9sb2NhdGlvbnMubW9kZWwnO1xyXG5pbXBvcnQgeyBNUHJvdmlkZXJCZW5lZmljaWFyeSB9IGZyb20gJy4vY29yZS9tb2RlbHMvUlBDL3Byb3ZpZGVyQmVuZWZpY2lhcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBNU2lnZWNvZkJhbmssIE1CYW5rLCBNQmFua0FjY291bnRUeXBlLCBNQWdlbmNpYUJhbmNvLCBNQ3VlbnRhQmFuY28gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NDQi9iYW5rLm1vZGVsJztcclxuaW1wb3J0IHsgSVJlc3BvbnNlIH0gZnJvbSAnLi9jb3JlL2ludGVyZmFjZXMvUmVzcG9uc2UnO1xyXG5pbXBvcnQgeyBNQ29uZmlndXJhdGlvblJQQyB9IGZyb20gJy4vY29yZS9tb2RlbHMvUlBDL2NvbmZpZ3VyYWNpb25SUEMubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlnU09DIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TT0MvY29uZmlndXJhY2lvblNPQy5tb2RlbCc7XHJcbmltcG9ydCB7IE1EZWR1Y3Rpb25UeXBlIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TVEIvZGVkdWN0aW9uVHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1DYXJnbyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU09DL2NoYXJnZS5tb2RlbCc7XHJcbmltcG9ydCB7IE1Db25jZXB0b1JldGVuY2lvbiwgTURlZHVjdGlvbiB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL2RlZHVjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IE1Db25maWdTU1MgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy9zZWN1cml0eUNvbmZpZ3VyYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQWRtaW5pc3RyYXRpdmVVbml0IH0gZnJvbSAnLi9jb3JlL21vZGVscy9TUEcvYWRtaW5pc3RyYXRpdmVVbml0Lm1vZGVsJztcclxuaW1wb3J0IHsgTUNvbXBvbmVudCB9IGZyb20gJy4vY29yZS9tb2RlbHMvU1NTL2NvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IE1Mb2cgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NTUy9sb2cubW9kZWwnO1xyXG5pbXBvcnQgeyBNU2VydmljZUNoYXJnZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU09DL3NlcnZpY2VDaGFyZ2UubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW1wcmVzYSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL0VtcHJlc2EubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uY2VwdG9zQ1hQIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DWFAvTUNvbmNlcHRvc0NYUC5tb2RlbCc7XHJcbmltcG9ydCB7IE1UaXBvRG9jdW1lbnRvQ1hQIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DWFAvTVRpcG9Eb2N1bWVudG9DWFAubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29uZmlndXJhY2lvblNOTyB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Db25maWd1cmFjaW9uU05PLm1vZGVsJztcclxuaW1wb3J0IHsgTURlZmluaWNpb25Ob21pbmEgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NRGVmaW5pY2lvbk5vbWluYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1Bc2lnbmFjaW9uQ2FyZ28gfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NQXNpZ25hY2lvbkNhcmdvLm1vZGVsJztcclxuaW1wb3J0IHsgTU5vbWluYVNpbXBsZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvU05PL01Ob21pbmFTaW1wbGUubW9kZWwnO1xyXG5pbXBvcnQgeyBNUGVyc29uYWwgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NOTy9NUGVyc29uYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBNRW50cmFkYVN1bWluaXN0cm9zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TSVYvTUVudHJhZGFTdW1pbmlzdHJvLm1vZGVsJztcclxuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInXHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7IFxyXG5pbXBvcnQgeyBNU25vTG9nIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TTk8vTUF1ZGl0b3JpYS5tb2RlbCc7XHJcbmltcG9ydCB7IE1UaXBvRGVwb3NpdG9zIH0gZnJvbSAnLi9jb3JlL21vZGVscy9TSVYvTVRpcG9EZXBvc2l0b3MubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ29tdW5pZGFkIH0gZnJvbSAnLi9jb3JlL21vZGVscy9DRkcvY29tdW5pZGFkLm1vZGVsJztcclxuaW1wb3J0IHsgTUV4Y2hhbmdlUmF0ZSB9IGZyb20gJy4vY29yZS9tb2RlbHMvQ0ZHL1Rhc2FDYW1iaW8ubW9kZWwnO1xyXG5pbXBvcnQgeyBNQ2FyZ29zQWRpY2lvbmFsZXN9IGZyb20gJy4vY29yZS9tb2RlbHMvU1RCL01DYXJnb3NBZGljaW9uYWxlcyc7XHJcbmltcG9ydCB7IE1DbGllbnQgfSBmcm9tICcuL2NvcmUvbW9kZWxzL1NGVi9NQ2xpZW50ZU1vZGVsJztcclxuXHJcbiAgXHJcbiAgQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbiAgfSlcclxuICBleHBvcnQgY2xhc3MgU2lnZXNwU2VydmljZSB7XHJcblxyXG4gICAgcHVibGljIHVzdWFyaW9BY3Rpdm86IE1Vc3VhcmlvID0gbnVsbDtcclxuICAgIHB1YmxpYyBVUkw6IHN0cmluZztcclxuICAgIHB1YmxpYyBjdXJyZW50Q29tcG9uZW50OiBNQ29tcG9uZW50ID0gbnVsbDtcclxuICAgIHB1YmxpYyB1c2VyTWVudSAgPSBudWxsOyBcclxuICAgIHB1YmxpYyBpcF9hZHJlc3MgPSAnMTI3LjAuMC4xJztcclxuICAgIC8vIHB1YmxpYyBVUkw6IHN0cmluZyA9IFwiaHR0cDovLzE5Mi4xNjguMS42Ny9zaWdlc3BfcGhwXCI7XHJcbiAgICAvLyB1c3VhcmlvQWN0aXZvOiBNVXN1YXJpbyA9IHtcclxuICAgIC8vICAgY29uZXhpb25EQjoge1xyXG4gICAgLy8gICAgIGJhc2VEZURhdG9zOiBcImRiX3NpZ2VzcF9kZW1vdjNcIixcclxuICAgIC8vICAgICBnZXN0b3I6IFwicG9zdGdyZXNcIixcclxuICAgIC8vICAgICBsb2dpbjogXCJwb3N0Z3Jlc1wiLFxyXG4gICAgLy8gICAgIG5vbWJyZTogXCJTSUdFU1AgQy5BLCBzZXJ2aWRvciA4NSAoU0UgUFVFREUgVVNBUilcIixcclxuICAgIC8vICAgICBwYXNzd29yZDogXCJhZG1pbnNpZ2VzcFwiLFxyXG4gICAgLy8gICAgIHB1ZXJ0bzogXCI1NDMyXCIsXHJcbiAgICAvLyAgICAgc2Vydmlkb3I6IFwiMTkyLjE2OC4xLjY3XCIsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGVtcHJlc2E6IHtcclxuICAgIC8vICAgICBpZDogMSxcclxuICAgIC8vICAgICBwZXJpb2RvRmlzY2FsOiBcIjIwMTktMDEtMDFcIixcclxuICAgIC8vICAgICB0aXR1bG86IFwiU0lHRVNQIEMuQS5cIlxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICBub21icmU6IFwiU0lHRVNQXCIsXHJcbiAgICAvLyAgIHRva2VuOiBcImV5SjBlWEFpT2lKS1YxUWlMQ0poYkdjaU9pSklVek00TkNKOS5leUp3WVhOemQyOXlaRjkxYzNVaU9pSXhNak0wTlRZM09DSXNJbWxrWDJWdGNISmxjMkVpT2lJeElpd2lkR2wwWlcxd0lqb2lVMGxIUlZOUUlFTXVRUzRpTENKd1pYSm1hWE5qWVd3aU9pSXlNREU1TFRBeExUQXhJaXdpYkY5MWMzVmhjbWx2SWpvaVUwbEhSVk5RSWl3aWMyVnlkbWxrYjNJaU9pSXhPVEl1TVRZNExqRXVOamNpTENKd2RXVnlkRzhpT2lJMU5ETXlJaXdpWW1GelpXUmxaR0YwYjNNaU9pSmtZbDl6YVdkbGMzQmZaR1Z0YjNZeklpd2liRzluYVc0aU9pSndiM04wWjNKbGN5SXNJbkJoYzNOM2IzSmtJam9pWVdSdGFXNXphV2RsYzNBaWZRLlBJU0JTZnVlUkFkc1dzSjFBYUdjVkNnVy0yYUprZ3R2TGRzVzBCZ281bHR5WW93RDhveV9ucUs1c2pFMlVSR2tcIlxyXG4gICAgLy8gfVxyXG4gICAgLy8gcHJvY2VkZTogc3RyaW5nID0gJ1NDR0NNUCc7XHJcbiAgICAvLyBjb2RzaXM6IHN0cmluZyA9ICdTQ0cnO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgdG9hc3Q6IFRvYXN0clNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZhbGlkYSBxdWUgc2VsbyBzZSBlc2NyaWJhbiBndWlvbmVzIHkgOVxyXG4gICAgICogQHBhcmFtIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5R3Vpb25lc0FuZE5pbmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnLScgfHwgZXZlbnQua2V5ID09PSAnOScpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgIFxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgZWwgbW9uY21wIGRlIHNpZ2VzcF9jb21wcm9iYW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQ29tcHJvYmFudGVBbW91bnQoYW1vdW50OiBudW1iZXIsIGlkQ29tcHJvYmFudGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oYCR7dGhpcy5VUkx9L2Rhby9zaWdlc3AvY29tcHJvYmFudGVfZGFvLnBocD9tb250bz10cnVlYCwge1xyXG4gICAgICAgIG1vbmNtcDogYW1vdW50LFxyXG4gICAgICAgIGlkX2NvbXByb2JhbnRlOiBpZENvbXByb2JhbnRlXHJcbiAgICAgIH0sIHtcclxuICAgICAgICBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKClcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIGVsIGNvbXByb2JhbnRlIHByc3VwdWVzdGFyaW8gZGUgRWdyZXNvc1xyXG4gICAgICogQHBhcmFtIGNvbXByb2JhbnRlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvRWdyZXNvcyhjb21wcm9iYW50ZTogSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9FZ3Jlc29zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55PihgJHt0aGlzLlVSTH0vZGFvL3NwZy9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19lZ3Jlc29zX2Rhby5waHBgLFxyXG4gICAgICB7IC4uLmNvbXByb2JhbnRlLCBpZDogY29tcHJvYmFudGUuaWRfZHRfc3BnY21wIH0sIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgY29tcHJvYmFudGUgcHJlc3VwdWVzdGFyaW8gZGUgRWdyZXNvc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MoKTogT2JzZXJ2YWJsZTxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3NbXT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9fZWdyZXNvc19kYW8ucGhwYCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0VncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSBlbCBjb21wcm9iYW50ZSBwcnN1cHVlc3RhcmlvIGRlIEluZ3Jlc29zXHJcbiAgICAgKiBAcGFyYW0gY29tcHJvYmFudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyhjb21wcm9iYW50ZTogSUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvcyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY29tcHJvYmFudGVfcHJlc3VwdWVzdGFyaW9fZWdyZXNvc19kYW8ucGhwYCxcclxuICAgICAgeyAuLi5jb21wcm9iYW50ZSwgaWQ6IGNvbXByb2JhbnRlLmlkX2R0X3NwaWNtcCB9LCB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIGNvbXByb2JhbnRlIHByZXN1cHVlc3RhcmlvIGRlIEluZ3Jlc29zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb21wcm9iYW50ZVByZXN1cHVlc3RhcmlvSW5ncmVzb3MoKTogT2JzZXJ2YWJsZTxNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbXByb2JhbnRlUHJlc3VwdWVzdGFyaW9JbmdyZXNvc1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jb21wcm9iYW50ZV9wcmVzdXB1ZXN0YXJpb19pbmdyZXNvc19kYW8ucGhwYCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKVxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tcHJvYmFudGVQcmVzdXB1ZXN0YXJpb0luZ3Jlc29zKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgZWdyZXNvXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25FeHBlbnNlQWNjb3VudChkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb24pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9jdWVudGFzX2VncmVzb3NfZGFvLnBocGAsIGRpc3RyaWJ1dGlvbixcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pO1xyXG4gICAgfVxyXG5cclxuICAgICAgIC8qKlxyXG4gICAgICogQEFjdHVhbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGN1ZW50YSBkZSBlZ3Jlc29cclxuICAgICAqIEBwYXJhbSBkaXN0cmlidXRpb25cclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIHVwZGF0ZURpc3RyaWJ1dGlvbkV4cGVuc2VBY2NvdW50MihkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb24yW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2N1ZW50YXNfZWdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KTtcclxuICAgICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQEFjdHVhbGl6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGN1ZW50YSBkZSBJbmdyZXNvXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jdWVudGFzX2luZ3Jlc29zX2Rhby5waHBgLCBkaXN0cmlidXRpb24sXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3Mpe1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IG5ldyBNQ3VlbnRhSW5ncmVzb3MocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVBY2NvdW50MihkaXN0cmlidXRpb246IElVcGRhdGVEaXN0cmlidXRpb25JbmdyZXNvczJbXSk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUN1ZW50YUluZ3Jlc29zKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBBY3R1YWxpemEgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSBjdWVudGEgZGUgSW5ncmVzbyBkZSBFc3RydWN0dXJhXHJcbiAgICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVEaXN0cmlidXRpb25JbmNvbWVTdHJ1Y3R1cmVBY2NvdW50KGRpc3RyaWJ1dGlvbjogSVVwZGF0ZURpc3RyaWJ1dGlvbkluZ3Jlc29zLCBsZXZlbDogbnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NwaS9jdWVudGFfZXN0cnVjdHVyYV9pbmdyZXNvc19kYW8ucGhwYCwgZGlzdHJpYnV0aW9uLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKXtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSBuZXcgTUluY29tZVN0cnVjdHVyZUFjY291bnQocmVzLmRhdGEsIGxldmVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIHBvciBuaXZlbCBkZSBsYXMgY3VlbmF0cyBkZSBlZ3Jlc29zXHJcbiAgICAgKiBAcGFyYW0gbGV2ZWwgTsO6bWVybyBkZSBuaXZlbGVzIGRlIGxhIGNvbmZpZ3VyYWNpw7NuXHJcbiAgICAgKiBAcGFyYW0gaWQgaWQgZGVsIG5pdmVsIDMgbyA1IHF1ZSBzZSB2YSBhIGJ1c2NhclxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFFZ3Jlc29zW10+XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFeHBlbnNlQWNjb3VudHNGb3JMZXZlbChsZXZlbDogbnVtYmVyLCBpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YUVncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY3VlbnRhc19lZ3Jlc29zX2Rhby5waHA/bGV2ZWw9JHtsZXZlbH0maWQ9JHtpZH1gLFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUVncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjYXTDoWxvZ28gZGUgZXN0cnVjdHVyYSBwcmVzdXB1ZXNhcmlhXHJcbiAgICAgKiBAcGFyYW0gZGF0YSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXJcclxuICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIENvbmZpZ3VyYWNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkNhdGFsb2dvRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhKGRhdGE6IGFueVtdLCBjb25maWd1cmF0aW9uOiBNQ29uZmlndXJhdGlvblNQRyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgIGNvbnN0IGNhdGFsb2dvID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0VzdHJ1Y3R1cmFzQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZGF0YSxcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICB9LFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gY2F0YWxvZ28uYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIGRlIGVncmVzb3NcclxuICAgICAqIEBwYXJhbSBvbmx5QXZhaWxhYmxlXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUN1ZW50YUVncmVzb3NbXT5cclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRFeHBlbnNlQWNjb3VudHMob25seUF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlKTogT2JzZXJ2YWJsZTxNQ3VlbnRhRWdyZXNvc1tdPntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YUVncmVzb3NbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvY3VlbnRhc19lZ3Jlc29zX2Rhby5waHAke1xyXG4gICAgICAgIG9ubHlBdmFpbGFibGUgPyAnP2F2YWlsYWJsZT10cnVlJyA6ICcnXHJcbiAgICAgIH1gLCB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUN1ZW50YUVncmVzb3MoZWxlbWVudCkpKVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSB0b2RhcyBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWV0c2FyaWFzIGRlIGxhcyA1IHRhYmxhc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1BbGxTdHJ1Y3R1cmU+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QWxsQnVkZ2V0U3RydWN0dXJlKCk6IFByb21pc2U8TUFsbFN0cnVjdHVyZT4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlT25lKCkuc3Vic2NyaWJlKHN0cnVjdHVyZU9uZSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZVR3b0FsbCgpLnN1YnNjcmliZShzdHJ1Y3R1cmVUd28gPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZVRocmVlKCkuc3Vic2NyaWJlKHN0cnVjdHVyZVRocmVlID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZUZvdXIoKS5zdWJzY3JpYmUoc3RydWN0dXJlRm91ciA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldEJ1ZGdldFN0cnVjdHVyZUZpdmVCeUlkRXA0KCkuc3Vic2NyaWJlKHN0cnVjdHVyZUZpdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBNQWxsU3RydWN0dXJlKHtcclxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVPbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlVHdvLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZVRocmVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZUZvdXIsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlRml2ZVxyXG4gICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgY29tcGxldGEgZGVwZW5kaWVuZG8gZGUgbGEgY29uZmlndXJhY2nDs25cclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnlbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKiBAdHlwZT0ge31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGdldEJ1ZGdldFN0cnVjdHVyZUNvbXBsZXRlKG5pdmVsOm51bWJlcix0aXBvPzpzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhID0gW107XHJcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRCdWRnZXRTdHJ1Y3R1cmVGaXZlKG5pdmVsLHRpcG8pLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgZGF0YS5wdXNoKC4uLnJlc3VsdClcclxuICAgICAgICB9KVxyXG4gICAgICAgIC8vIGF3YWl0IHRoaXMuZ2V0QnVkZ2V0U3RydWN0dXJlVGhyZWVDb21wbGV0ZSgzKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgICAvLyAgIGRhdGEucHVzaCguLi5yZXN1bHQpXHJcbiAgICAgICAgLy8gfSlcclxuXHJcbiAgICAgICAgYXdhaXQgcmVzb2x2ZShkYXRhKTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVsaW1pbmEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3Rhcmlhc1xyXG4gICAgICogQHBhcmFtIGlkU3RydWN0dXJlcyBJZCBkZSBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIDUgcXVlIHZhbiBhIHNlciBlbGltaW5hZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZUJ1ZGdldFN0cnVjdHVyZUZpdmUoaWRTdHJ1Y3R1cmVzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdCgnZGVsZXRlJywgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocGAsXHJcbiAgICAgIHsgYm9keTogaWRTdHJ1Y3R1cmVzLCBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyA0XHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBFc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgcXVlIHZhbiBhIHNlciBhY3R1YWxpemFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQnVkZ2V0U3RydWN0dXJlRml2ZShzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFncmVnYSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIDRcclxuICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmVzIExhcyBlc3RydWN0dXJhcyBxdWUgdmFuIGEgc2VyIHJlZ2lzdHJhZGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ1ZGdldFN0cnVjdHVyZUZpdmUoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhNV9kYW8ucGhwYCwgc3RydWN0dXJlcyxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSB0b2RhIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgNVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICogQHBhcmFtcyB0aXBvOlwic3NzXCIgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVGaXZlKGxldmVsOiBudW1iZXIgPSBudWxsLCB0aXBvOnN0cmluZz0nJyk6IE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZVtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGVbXT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTVfZGFvLnBocD9jb21wbGV0ZT10cnVlJnRpcG89JHt0aXBvfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgIFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGUgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGUoZSwgbGV2ZWwpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgNSBwb3IgZWwgSWQgZGUgbGEgZXN0cnVjdHVyYSA0XHJcbiAgICAgKiBAcGFyYW0gaWRFcDQgaWQgZGUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSA0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVGaXZlQnlJZEVwNChpZEVwND86IHN0cmluZyk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55W10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE1X2Rhby5waHAke2lkRXA0ID8gYD9pZF9lcDQ9JHtpZEVwNH1gIDogJyd9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRWxpbWluYSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzXHJcbiAgICAgKiBAcGFyYW0gaWRTdHJ1Y3R1cmVzIElkIGRlIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgMyBxdWUgdmFuYSAgc2VyIGVsaW1pbmFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlQnVkZ2V0U3RydWN0dXJlRm91cihpZFN0cnVjdHVyZXM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KCdkZWxldGUnLCBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhNF9kYW8ucGhwYCxcclxuICAgICAgeyBib2R5OiBpZFN0cnVjdHVyZXMsIGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY3R1YWxpemEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIDRcclxuICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmVzIEVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyBxdWUgdmFuIGEgc2VyIGFjdHVhbGl6YWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVCdWRnZXRTdHJ1Y3R1cmVGb3VyKHN0cnVjdHVyZXM6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhNF9kYW8ucGhwYCwgc3RydWN0dXJlcyxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWdyZWdhIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgNFxyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgTGFzIGVzdHJ1Y3R1cmFzIHF1ZSB2YW4gYSBzZXIgcmVnaXN0cmFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlRm91cihzdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRm91cltdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHBgLCBzdHJ1Y3R1cmVzLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgNFxyXG4gICAgICogQHBhcmFtIGlkRXAzIElkIGRlIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgM1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhcHJlc3VwdWVzdGFyaWFbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVGb3VyKGlkRXAzPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRm91cltdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGb3VyW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWE0X2Rhby5waHAke2lkRXAzID8gYD9pZF9lcDM9JHtpZEVwM31gIDogJyd9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRm91cihlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gRWxpbWluYSB1bmEgbyB2YXJpYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzXHJcbiAgICAgKiBAcGFyYW0gaWRTdHJ1Y3R1cmVzIElkIGRlIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgMyBxdWUgdmFuYSAgc2VyIGVsaW1pbmFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlQnVkZ2V0U3RydWN0dXJlVGhyZWUoaWRTdHJ1Y3R1cmVzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdCgnZGVsZXRlJywgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTNfZGFvLnBocGAsXHJcbiAgICAgIHsgYm9keTogaWRTdHJ1Y3R1cmVzLCBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyAzXHJcbiAgICAgKiBAcGFyYW0gc3RydWN0dXJlcyBFc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgcXVlIHZhbiBhIHNlciBhY3R1YWxpemFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQnVkZ2V0U3RydWN0dXJlVGhyZWUoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dChgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwYCwgc3RydWN0dXJlcyxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWdyZWdhIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgM1xyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZXMgTGFzIGVzdHJ1Y3R1cmFzIHF1ZSB2YW4gYSBzZXIgcmVnaXN0cmFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2V0QnVkZ2V0U3RydWN0dXJlVGhyZWUoc3RydWN0dXJlczogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTNfZGFvLnBocGAsIHN0cnVjdHVyZXMsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFNlIHRyYWUgbGEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSBjb21wbGV0YSBoYXN0YSBlbCBuaXZlbCAzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55W10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlVGhyZWVDb21wbGV0ZShsZXZlbDogbnVtYmVyKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhRml2ZUNvbXBsZXRlW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYUZpdmVDb21wbGV0ZVtdPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhM19kYW8ucGhwP2NvbXBsZXRlPXRydWVgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFGaXZlQ29tcGxldGUoZWxlbWVudCwgbGV2ZWwpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgM1xyXG4gICAgICogQHBhcmFtIGlkRXAyIElkIGRlIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWEgMlxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhcHJlc3VwdWVzdGFyaWFbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRCdWRnZXRTdHJ1Y3R1cmVUaHJlZShpZEVwMj86IHN0cmluZyk6IE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVRocmVlW10+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWEzX2Rhby5waHAke2lkRXAyID8gYD9pZF9lcDI9JHtpZEVwMn1gIDogJyd9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVGhyZWUoZWxlbWVudCkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEVsaW1pbmEgdW5hIG8gdmFyaWFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyB1bm9cclxuICAgICAqIEBwYXJhbSBpZFN0cnVjdHVyZXMgSWQgZGUgbGEgbyBsYXMgZXN0cnVjdHVyYXMgcHJlc3VwdWVzdGFyaWFzIHF1ZSB2YW4gYSBzZXIgZWxpbWluYWRhc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVCdWRnZXRTdHJ1Y3R1cmVUd28oaWRTdHJ1Y3R1cmVzOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdCgnZGVsZXRlJywgYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTJfZGFvLnBocGAsXHJcbiAgICAgIHsgYm9keTogaWRTdHJ1Y3R1cmVzLCBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWN0dWFsaXphIHVuYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIGRvc1xyXG4gICAgICogQHBhcmFtIHN0cnVjdHVyZSBFc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhIHVubyBxdWUgc2UgdmEgYSBhY3R1YWxpemFyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdXBkYXRlQnVkZ2V0U3RydWN0dXJlVHdvKHN0cnVjdHVyZTogSUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3b1tdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTJfZGFvLnBocGAsIHN0cnVjdHVyZSxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0cmEgbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RyaWFzIGRvcyBlbiBsYSBiYXNlIGRlIGRhdG9zXHJcbiAgICAgKiBAcGFyYW0gYnVkZ2V0U3RydWN0dXJlcyBBcnJheSBkZSBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYSBxdWUgc2UgdmFuIGEgcmVnaXN0cmFyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ1ZGdldFN0cnVjdHVyZVR3byhidWRnZXRTdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTJfZGFvLnBocGAsXHJcbiAgICAgIGJ1ZGdldFN0cnVjdHVyZXMsIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZVR3byhpZEVwMTogc3RyaW5nKTogT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhVHdvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3b1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9lc3RydWN0dXJhX3ByZXN1cHVlc3RhcmlhMl9kYW8ucGhwP2lkX2VwMT0ke2lkRXAxfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd28oZWxlbWVudCkpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QnVkZ2V0U3RydWN0dXJlVHdvQWxsKCk6IE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVR3b1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd29bXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTJfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFUd28oZWxlbWVudCkpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBFbGltaW5hIHVuYSBvIHZhcmlhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYXMgdW5vXHJcbiAgICAgKiBAcGFyYW0gaWRTdHJ1Y3R1cmVzIElkIGRlIGxhIG8gbGFzIGVzdHJ1Y3R1cmFzIHByZXN1cHVlc3RhcmlhcyBxdWUgdmFuIGEgc2VyIGVsaW1pbmFkYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVsZXRlQnVkZ2V0U3RydWN0dXJlT25lKGlkU3RydWN0dXJlczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoJ2RlbGV0ZScsIGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWExX2Rhby5waHBgLFxyXG4gICAgICB7IGJvZHk6IGlkU3RydWN0dXJlcywgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjdHVhbGl6YSB1bmEgZXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSB1bm9cclxuICAgICAqIEBwYXJhbSBzdHJ1Y3R1cmUgRXN0cnVjdHVyYSBwcmVzdXB1ZXN0YXJpYSB1bm8gcXVlIHNlIHZhIGEgYWN0dWFsaXphclxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPGFueT5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZUJ1ZGdldFN0cnVjdHVyZU9uZShzdHJ1Y3R1cmU6IElFc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmVbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWExX2Rhby5waHBgLCBzdHJ1Y3R1cmUsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJhIGxhcyBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0cmlhcyBlbiBsYSBiYXNlIGRlIGRhdG9zXHJcbiAgICAgKiBAcGFyYW0gYnVkZ2V0U3RydWN0dXJlcyBBcnJheSBkZSBlc3RydWN0dXJhcyBwcmVzdXB1ZXN0YXJpYSBxdWUgcyBldmFuIGEgcmVnaXN0cmFyXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8YW55PlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEJ1ZGdldFN0cnVjdHVyZU9uZShidWRnZXRTdHJ1Y3R1cmVzOiBJRXN0cnVjdHVyYVByZXN1cHVlc3RhcmlhT25lW10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsXHJcbiAgICAgIGJ1ZGdldFN0cnVjdHVyZXMsIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBlc3RydWN0dXJhIHByZXN1cHVlc3RhcmlhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEJ1ZGdldFN0cnVjdHVyZU9uZSgpOiBPYnNlcnZhYmxlPE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmVbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Fc3RydWN0dXJhUHJlc3VwdWVzdGFyaWFPbmVbXT4oYCR7dGhpcy5VUkx9L2Rhby9zcGcvZXN0cnVjdHVyYV9wcmVzdXB1ZXN0YXJpYTFfZGFvLnBocGAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUVzdHJ1Y3R1cmFQcmVzdXB1ZXN0YXJpYU9uZShlbGVtZW50KSkpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY29uZmlndXJhY2lvbmVzIGRlIGxhIGVzdHJ1Y3R1cmEgcHJlc3VwdWVzdGFyaWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29uZmlndXJhdGlvblNQR1tdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ3VyYXRpb25TUEcoKTogT2JzZXJ2YWJsZTxNQ29uZmlndXJhdGlvblNQRz4ge1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvbmZpZ3VyYXRpb25TUEc+KGAke3RoaXMuVVJMfS9kYW8vc3BnL2VzdHJ1Y3R1cmFfcHJlc3VwdWVzdGFyaWFfY29uZmlnX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiBuZXcgTUNvbmZpZ3VyYXRpb25TUEcocmVzcC5kYXRhWzBdKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbmZpZ3VyYWNpb25lcyBkZSBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNQ29uZmlndXJhdGlvblJQQ1tdPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbmZpZ3VyYXRpb25SUEMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db25maWd1cmF0aW9uUlBDPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfY29uZmlnX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlc3AuZGF0YSA9IG5ldyBNQ29uZmlndXJhdGlvblJQQyhyZXNwLmRhdGEpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgTUNvbmZpZ3VyYWNpb25TTk8gZGUgbGEgbm9taW5hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TTk9bXT5cclxuICAgICAqIEBkYXRlIDI3LTA3LTIwMjFcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uU05PKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2NvbmZpZ3VyYWNpb25fZGFvLnBocD90aXBvPSR7J2NvbmZpZ3VyYWNpb24nfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgaWYocmVzcC5kYXRhICE9bnVsbCl7XHJcbiAgICAgICAgICAgICAgcmVzcC5kYXRhID0gcmVzcC5kYXRhLm1hcChlID0+IG5ldyBNQ29uZmlndXJhY2lvblNOTyhlKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVzcC5kYXRhPVtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzcFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBkYXRlVG9TdHJpbmcoZGF0ZTogRGF0ZSk6IHN0cmluZ3tcclxuICAgICAgcmV0dXJuIGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHtcclxuICAgICAgICBkYXRlLmdldE1vbnRoKCkgKyAxID49IDEwID8gZGF0ZS5nZXRNb250aCgpICsgMSA6IGAwJHtkYXRlLmdldE1vbnRoKCkgKyAxfWBcclxuICAgICAgfS0ke1xyXG4gICAgICAgIGRhdGUuZ2V0RGF0ZSgpID49IDEwID8gZGF0ZS5nZXREYXRlKCkgOiBgMCR7ZGF0ZS5nZXREYXRlKCl9YFxyXG4gICAgICB9YFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbmZpZ3VyYWNpb25lcyBkZSBTZWd1cmlkYWRcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlnU1NTKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3NzL3NlZ3VyaWRhZF9jb25maWdfZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzcC5kYXRhID0gbmV3IE1Db25maWdTU1MocmVzcC5kYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc3BcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRzKHN5c3RlbUNvZGU6IHN0cmluZyA9IG51bGwsIHBlcm1pdDogYm9vbGVhbik6IE9ic2VydmFibGU8SVJlc3BvbnNlPntcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zc3MvY29tcG9uZW50ZXNfZGFvLnBocD8ke3N5c3RlbUNvZGUgPyBgY29kc2lzPSR7c3lzdGVtQ29kZX0ke1xyXG4gICAgICAgICAgcGVybWl0ID8gYCZwZXJtaXQ9dHJ1ZWAgOiAnJ1xyXG4gICAgICAgIH1gIDogJyd9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9XHJcbiAgICAgICkucGlwZShcclxuICBcclxuICAgICAgICBtYXAocmVzID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ29tcG9uZW50KGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGZ1ZW50ZXMgZGUgZmluYW5jaWFtaWVudG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNRnVlbnRlRmluYW5jaWFtaWVudG9bXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGdWVudGVGaW5hbmNpYW1pZW50bygpOiBPYnNlcnZhYmxlPE1GdWVudGVGaW5hbmNpYW1pZW50b1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1GdWVudGVGaW5hbmNpYW1pZW50b1tdPihgJHt0aGlzLlVSTH0vZGFvL3NwZy9mdWVudGVfZmluYW5jaWFtaWVudG9fZGFvLnBocGAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUZ1ZW50ZUZpbmFuY2lhbWllbnRvKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBjZW50cm9zIGRlIGNvc3RvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNlbnRyb0Nvc3RvW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICogQHBhcmFtIGlkOmlkdXN1cmlvIG8gaWQgZGVsIGVjbnRybyBkZSBjb3N0b1xyXG4gICAgICogbW9kaWZpY2FkbyAyOC0xMi0yMDIyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDZW50cm9Db3N0byh0aXBvOiAnYWxsJ3wnb25lJ3wndXNlcid8J2VudGVyJz0gbnVsbCwgaWQ/OnN0cmluZyk6IE9ic2VydmFibGU8TUNlbnRyb0Nvc3RvW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jZW50cm9fY29zdG9fZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DZW50cm9Db3N0byhlbGVtZW50KSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGNlbnRyb3MgZGUgY29zdG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29zdENlbnRlcnMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jZW50cm9fY29zdG9fZGFvLnBocGAsIFxyXG4gICAgICB7aGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DZW50cm9Db3N0byhlbGVtZW50KSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRVc2VyQ29zdENlbnRlcnMoY29kaWdvOnN0cmluZyk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY2VudHJvX2Nvc3RvX3VzdWFyaW9fZGFvLnBocD9jb2RpZ289JHtjb2RpZ299YCwgXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTVVzdWFyaW9DZW50cm9Db3N0byhlbGVtZW50KSlcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXNcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBjaGVja2tzXHJcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBDb2x1bW5hcyBxdWUgdmEgYSB0ZW5lciBsYSB0YWJsYVxyXG4gICAgICogQHBhcmFtIHRpdGxlIFTDrXR1bG8gZGUgbGEgbW9kYWxcclxuICAgICAqIEBwYXJhbSBkYXRhU291cmNlIERhdGEgcXVlIHMgZXZhIGEgbW9zdHJhciBlbiBsYSB0YWJsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3BlbkRpYWxvZ011bHRpU2VsZWN0KFxyXG4gICAgICAvLyBjb2x1bW5zOiBzdHJpbmdbXSwgXHJcbiAgICAgIC8vIHRpdGxlOiBzdHJpbmcsIFxyXG4gICAgICAvLyBkYXRhU291cmNlOiBhbnlbXSxcclxuICAgICAgLy8gY29sdW1uTmFtZXM/OiBzdHJpbmdbXVxyXG4gICAgICBjb2x1bW5zOiBzdHJpbmdbXSwgXHJcbiAgICAgIHRpdGxlOiBzdHJpbmcsIFxyXG4gICAgICBkYXRhU291cmNlOiBhbnlbXSwgXHJcbiAgICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSA9IG51bGwsIFxyXG4gICAgICB3aWR0aDogc3RyaW5nID0gJzQ1MHB4JyxcclxuICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgIGhhc0JhY2tkcm9wPzogYm9vbGVhbixcclxuICAgICAgICBkaXNhYmxlQ2xvc2U/OiBib29sZWFuLFxyXG4gICAgICAgLy8gZGlzYWJsZU1hc3RlclRvZ2dsZT86IGJvb2xlYW5cclxuICAgICAgfSA9IHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLCBcclxuICAgICAgICBoYXNCYWNrZHJvcDogZmFsc2UsIFxyXG4gICAgICAvLyAgZGlzYWJsZU1hc3RlclRvZ2dsZTogZmFsc2VcclxuICAgICAgfVxyXG4gICAgKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUYWJsZVNlbGVjdENvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcclxuICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBkYXRhU291cmNlLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXMsXHJcbiAgICAgICAgIC8vIGRpc2FibGVNYXN0ZXJUb2dnbGU6IG9wdGlvbnMuZGlzYWJsZU1hc3RlclRvZ2dsZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnLFxyXG4gICAgICAgIGhhc0JhY2tkcm9wOiBvcHRpb25zLmhhc0JhY2tkcm9wLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZTogb3B0aW9ucy5kaXNhYmxlQ2xvc2VcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgY29tdW5pZGFkZXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNUGxhblVuaWNvQ3VlbnRhPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dQbGFuVW5pY29DdWVudGFzKCk6IFByb21pc2U8TVBsYW5Vbmljb0N1ZW50YT4ge1xyXG4gICAgICBsZXQgcGxhbmVzOiBNUGxhblVuaWNvQ3VlbnRhW10gPSBhd2FpdCB0aGlzLmdldExpc3RhZG9QTGFuVW5pY29DdWVudGFzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydjdWVudGEnLCAnZGVub21pbmFjaW9uJ10sXHJcbiAgICAgICAgICBjb2x1bW5OYW1lczogWydjdWVudGEnLCAnZGVub21pbmFjacOzbiddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgUGxhbiBkZSBDdWVudGFzIEfDqW5lcmFsJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHBsYW5lc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBsaXN0YWRvIGRlbCBwbGFuIMO6bmljbyBkZSBjdWVudGFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TXBsYW5Vbmljb0N1ZW50YVtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldExpc3RhZG9QTGFuVW5pY29DdWVudGFzKCk6IE9ic2VydmFibGU8TVBsYW5Vbmljb0N1ZW50YVtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1QbGFuVW5pY29DdWVudGFbXT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvcGxhbl91bmljb19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNUGxhblVuaWNvQ3VlbnRhKGVsZW1lbnQpKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gZGUgU0NHXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TQ0dbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKiBAbW9kaWZpdCAyNS0wNy0yMDIxXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb25maWd1cmF0aW9uU0NHKCk6IE9ic2VydmFibGU8TUNvbmZpZ3VyYWNpb25TQ0dbXT4geyAgICAgIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ29uZmlndXJhY2lvblNDR1tdPihgJHt0aGlzLlVSTH0vZGFvL3NjZy9jb25maWd1cmFjaW9uX2NvbnRhYmlsaWRhZF9kYW8ucGhwYCxcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX1cclxuICAgICAgKS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55KSA9PiByZXNwLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1Db25maWd1cmFjaW9uU0NHKGVsZW1lbnQpKSlcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgdW4gZGlhbG9nIGRlIGNvbmZpcm1hY2nDs25cclxuICAgICAqIEBwYXJhbSB0aXRsZSBUw610dWxvIGRlIGxhIG1vZGFsIGRlIGNvbmZpcm1cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lbnNhamUgKG9wY2lvbmFsKSBwYXJhIGVsIHVzdXNhcmlvXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8Ym9vbGVhbj5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvcGVuRGlhbG9nQ29uZmlybSh0aXRsZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICBtZXNzYWdlOiAobWVzc2FnZSkgPyBtZXNzYWdlIDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29udmllcnRlIGVsIGNvbnRlbmlkbyBkZSB1biBBYnN0cmFjdENvbnRyb2wgZW4gbWF5w7pzY3VsYSAoVXNhciBlbiBldmVudG8ga2V5dXApXHJcbiAgICAgKiBAcGFyYW0gZm9ybUdyb3VwIEZvcm11bGFyaW8gZMOzbmRlIHNlIHZhIGEgYnVzY2FyIGVsIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQHBhcmFtIG5hbWUgTm9tYnJlIGRlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoYW5nZVRvVXBwZXJDYXNlKGZvcm1Hcm91cDogRm9ybUdyb3VwLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5nZXRBYnN0cmFjdENvbnRyb2woZm9ybUdyb3VwLCBuYW1lKS5zZXRWYWx1ZSh0aGlzLmdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXAsIG5hbWUpLnZhbHVlLnRvVXBwZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgZWwgQWJzdHJhY3RDb250cm9sIGRlIHVuIGZvcm11bGFyaW9cclxuICAgICAqIEBwYXJhbSBmb3JtR3JvdXAgRm9ybXVsYXJpbyBkb25kZSBzZSB2YSBhIGJ1c2NhciBlbCBBYnN0cmFjdENvbnRyb2xcclxuICAgICAqIEBwYXJhbSBuYW1lIE5vbWJyZSBkZWwgQWJzdHJhY3RDb250cm9sXHJcbiAgICAgKiBAcmV0dXJuIEFic3RyYWN0Q29udHJvbFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFic3RyYWN0Q29udHJvbChmb3JtR3JvdXA6IEZvcm1Hcm91cCwgbmFtZTogc3RyaW5nKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgcmV0dXJuIGZvcm1Hcm91cC5nZXQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUHJldmllbmUgcXVlIHNlIGVzY3JpYmFuIGxldHJhcyBlbiBlbCBpbnB1dCAoVXNhciBlbiBrZXlwcmVzcylcclxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZGVsIHRlY2xhZG9cclxuICAgICAqIEByZXR1cm4gYm9vbGVhblxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqIEBtb2RpZmljYWRvIGNvbW8gb25seU51bWVybyBwYXJhIGNvcnJlZ2lyIGNvZGlnbywgdXNhciBjdXJyZW5jeS1pbnB1dCBzaSBxdWllcmUgdXNhciBkZWNpbWFsZXMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbmx5RGVjaW1hbChldmVudD86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghaXNOYU4oK2V2ZW50LmtleSkgJiYgZXZlbnQua2V5Q29kZSAhPSAzMikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTsgICAgICBcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQcmV2aWVuZSBxdWUgc2UgZXNjcmliYW4gbGV0cmFzIGVuIGVsIGlucHV0IChVc2FyIGVuIGtleXByZXNzKVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25seU51bWJlcnMoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coZXZlbnQpO1xyXG4gICAgICBpZiAoIWlzTmFOKCtldmVudC5rZXkpICYmIGV2ZW50LmtleUNvZGUgIT0gMzIpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFjZXB0YSBzb2xvIG51bWVybywgZGVsZXRlIHkgYmFja3NwYWNlXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRlbCB0ZWNsYWRvXHJcbiAgICAgKiBAcmV0dXJuIGJvb2xlYW5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25seU51bWJlcnMyKGV2ZW50PzogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgIGlmICghaXNOYU4oK2V2ZW50LmtleSkgIHx8IGV2ZW50LmtleUNvZGUgPT0gOCB8fCBldmVudC5rZXlDb2RlID09IDQ2KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBY2VwdGEgc29sbyBudW1lcm8sZ3Vpb25lcywgcGFyZW50ZXNpcyxlc3BhY2lvc1xyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyB0eXBlTnVtYmVyc0h5cGhlbihldmVudD86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICBpZiAoIWlzTmFOKCtldmVudC5rZXkpIHx8IGV2ZW50LmtleUNvZGUgPT0gOCB8fCAgZXZlbnQua2V5Q29kZSA9PSAzMiAgfHwgZXZlbnQua2V5Q29kZSA9PSA0NiBcclxuICAgICAgfHwgZXZlbnQua2V5Q29kZSA9PSA1OCB8fCBldmVudC5rZXlDb2RlID09IDU3IHx8IGV2ZW50LmtleUNvZGUgPT0gMTg5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBQZXJtaXRlIChhLXogQS1aIMOhLcO6IMOxw5Egw7zDnCAnLC4pIHF1ZSBzZSBlc2NyaWJhbiBudW1lcm9zIGVuIGVsIGlucHV0IChVc2FyIGVuIGtleXByZXNzKVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAZGF0ZSAxNC0wNS0yMDIyXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgdHlwZU5hbWUoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoKGV2ZW50LmtleT49J2EnICYmIGV2ZW50LmtleTw9J3onKSAgfHwgKGV2ZW50LmtleT49J0EnICYmIGV2ZW50LmtleTw9J1onKSB8fCAgZXZlbnQua2V5PT1cIsOxXCIgfHwgIGV2ZW50LmtleT09XCLDkVwiIFxyXG4gICAgICAgICAgfHwgKGV2ZW50LmtleT49J8OhJyAmJiBldmVudC5rZXk8PSfDuicpIHx8IGV2ZW50LmtleT49J8O8JyAgfHwgZXZlbnQua2V5Pj0nw5wnICB8fCBldmVudC5rZXk9PVwiJ1wiICB8fCBldmVudC5rZXlDb2RlPT0zMiBcclxuICAgICAgICAgIHx8ICBldmVudC5rZXk9PVwiLlwiIHx8ICBldmVudC5rZXk9PVwiLFwiIHx8IGV2ZW50LmtleUNvZGUgPT0gOCB8fCAgZXZlbnQua2V5Q29kZSA9PSAzMiAgfHwgZXZlbnQua2V5Q29kZSA9PSA0NiAgKXtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFBlcm1pdGUgKDAtOSBhLXogQS1aIMOhLcO6IMOxw5Egw7zDnCAnLC4tXy86KCklI8K6JiTigqzCo8KlKSBxdWUgc2UgZXNjcmliYW4gIGVuIGVsIGlucHV0IChVc2FyIGVuIGtleXByZXNzKVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAZGF0ZSAxNC0wNS0yMDIyXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgdHlwZVRleHQoZXZlbnQ/OiBhbnkpOiBib29sZWFuIHsgICAgICBcclxuICAgICAgICBpZiAoKGV2ZW50LmtleT49J2EnICAmJiBldmVudC5rZXk8PSd6JykgfHwgKGV2ZW50LmtleT49J0EnICYmIGV2ZW50LmtleTw9J1onKSB8fCBldmVudC5rZXk9PVwiw7FcIiB8fCBldmVudC5rZXk9PVwiw5FcIiBcclxuICAgICAgICAgIHx8IChldmVudC5rZXk+PSfDoScgJiYgZXZlbnQua2V5PD0nw7onKSB8fCBldmVudC5rZXk9PSfDvCcgfHwgZXZlbnQua2V5PT0nw5wnIHx8IGV2ZW50LmtleT09XCInXCIgfHwgaXNOYU4oK2V2ZW50LmtleSkgXHJcbiAgICAgICAgICB8fCBldmVudC5rZXk9PVwiLlwiICB8fCAgZXZlbnQua2V5PT1cIixcIiB8fCBldmVudC5rZXk9PVwiJlwiIHx8ICBldmVudC5rZXk9PVwiX1wifHwgZXZlbnQua2V5PT1cIi1cIiB8fCBldmVudC5rZXk9PVwiI1wiXHJcbiAgICAgICAgICB8fCBldmVudC5rZXk9PVwiwrpcIiAgfHwgIGV2ZW50LmtleT09XCIkXCIgfHwgZXZlbnQua2V5PT1cIihcIiB8fCBldmVudC5rZXk9PVwiKVwiIHx8IGV2ZW50LmtleT09XCIlXCIgfHwgZXZlbnQua2V5PT0nICdcclxuICAgICAgICAgIHx8IGV2ZW50LmtleT09JzonICB8fGV2ZW50LmtleT09Jy8nfHwgZXZlbnQua2V5Q29kZT09ODM2NCB8fCAgZXZlbnQua2V5Q29kZT09MTY1IHx8ZXZlbnQua2V5Q29kZT09MTYzIFxyXG4gICAgICAgICAgfHwgZXZlbnQua2V5Q29kZSA9PSA4IHx8ICBldmVudC5rZXlDb2RlID09IDMyICB8fCBldmVudC5rZXlDb2RlID09IDQ2ICl7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFBlcm1pdGUgKDAtOSBhLXogQS1aIMOxw5EgLi1fKSBxdWUgc2UgZXNjcmliYW4gIGVuIGVsIGlucHV0IChVc2FyIGVuIGtleXByZXNzKVxyXG4gICAgICogQHBhcmFtIGV2ZW50IEV2ZW50byBkZWwgdGVjbGFkb1xyXG4gICAgICogQHJldHVybiBib29sZWFuXHJcbiAgICAgKiBAZGF0ZSAxNC0wNS0yMDIyXHJcbiAgICAgKi9cclxuICAgICAgIHB1YmxpYyB0eXBlQ29kZShldmVudD86IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICgoZXZlbnQua2V5Pj0nYScgICYmIGV2ZW50LmtleTw9J3onKSB8fCAoZXZlbnQua2V5Pj0nQScgJiYgZXZlbnQua2V5PD0nWicpICB8fCBldmVudC5rZXk9PVwiw7FcIiB8fCBldmVudC5rZXk9PVwiw5FcIiBcclxuICAgICAgICAgIHx8aXNOYU4oK2V2ZW50LmtleSkgfHwgZXZlbnQua2V5PT1cIi5cIiB8fCAgZXZlbnQua2V5PT1cIl9cIiB8fCBldmVudC5rZXk9PVwiLVwiIHx8IGV2ZW50LmtleUNvZGUgPT0gOCB8fCAgZXZlbnQua2V5Q29kZSA9PSAzMiAgfHwgZXZlbnQua2V5Q29kZSA9PSA0NiApe1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGNvbXVuaWRhZGVzXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TUNvbXVuaWRhZD5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuRGlhbG9nVW5pZGFkZXNUcmlidXRhcmlhcygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICBsZXQgdWRUcmlidXRhcmlhczogTVVuaWRhZFRyaWJ1dGFyaWFbXSA9IGF3YWl0IHRoaXMuZ2V0VW5pZGFkZXNUcmlidXRhcmlhcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnM6IFsnYcOxbycsICducm9fZGVjcmV0bycsICdmZWNoYV9kZWNyZXRvJywgJ2VudHJhZGFfdmlkZW5jaWEnLCAncHVibGljYWNpb25fZ2FjZXRhJywgJ25yb19nYWNldGEnLCAndmFsb3J1dCddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgVW5pZGFkZXMgVHJpYnV0YXJpYXMnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogdWRUcmlidXRhcmlhc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgdW5pZGFkZXMgdHJpYnV0YXJpYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VW5pZGFkZXNUcmlidXRhcmlhcygpOiBPYnNlcnZhYmxlPE1VbmlkYWRUcmlidXRhcmlhW10+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdDogSVJlcXVlc3QgPSB7XHJcbiAgICAgICAgb3BlcmFjaW9uOiAnb2J0ZW5lckRhdGEnLFxyXG4gICAgICAgIHNpZ2VzcF9jb25leGlvbjoge1xyXG4gICAgICAgICAgc2Vydmlkb3I6IHRoaXMuVVJMLFxyXG4gICAgICAgICAgdXN1YXJpbzogdGhpcy51c3VhcmlvQWN0aXZvLmdldEludGVyZmFjZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxNVW5pZGFkVHJpYnV0YXJpYVtdPihgJHt0aGlzLlVSTH0vZGFvL2NmZy91bmR0cmlidXRhcmlhX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzcDogYW55W10pID0+IHJlc3AubWFwKGVsZW1lbnQgPT4gbmV3IE1VbmlkYWRUcmlidXRhcmlhKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIHVuYSBtb2RhbCBnw6luZXJpY2FcclxuICAgICAqIEBwYXJhbSBjb2x1bW5zIENvbHVtbmFzIHF1ZSB2YSBhIHRlbmVyIGxhIHRhYmxhXHJcbiAgICAgKiBAcGFyYW0gdGl0bGUgVMOtdHVsbyBkZWwgZGlhbG9nXHJcbiAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSBEYXRhIHF1ZSBzZSB2YSBhIG1vc3RyYXIgZW4gbGEgdGFibGFcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxhbnk+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgIGNvbHVtbnM6IHN0cmluZ1tdLCBcclxuICAgICAgdGl0bGU6IHN0cmluZywgXHJcbiAgICAgIGRhdGFTb3VyY2U6IGFueVtdLCBcclxuICAgICAgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gbnVsbCwgXHJcbiAgICAgIHdpZHRoOiBzdHJpbmcgPSAnNDUwcHgnLFxyXG4gICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgaGFzQmFja2Ryb3A/OiBib29sZWFuLFxyXG4gICAgICAgIGRpc2FibGVDbG9zZT86IGJvb2xlYW5cclxuICAgICAgfSA9IHtkaXNhYmxlQ2xvc2U6IGZhbHNlLCBoYXNCYWNrZHJvcDogZmFsc2V9XHJcbiAgICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDYXRhbG9nb0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgIGRhdGFTb3VyY2UsXHJcbiAgICAgICAgICBjb2x1bW5OYW1lc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJyxcclxuICAgICAgICBoYXNCYWNrZHJvcDogb3B0aW9ucy5oYXNCYWNrZHJvcCA/IG9wdGlvbnMuaGFzQmFja2Ryb3AgOiBmYWxzZSxcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IG9wdGlvbnMuZGlzYWJsZUNsb3NlID8gb3B0aW9ucy5kaXNhYmxlQ2xvc2UgOiBmYWxzZSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIHVuYSBtb2RhbCBnw6luZXJpY2EgY29uIDIgaW5wdXRzXHJcbiAgICAgKiBAcGFyYW0gY29sdW1ucyBDb2x1bW5hcyBxdWUgdmEgYSB0ZW5lciBsYSB0YWJsYVxyXG4gICAgICogQHBhcmFtIHRpdGxlIFTDrXR1bG8gZGVsIGRpYWxvZ1xyXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgRGF0YSBxdWUgc2UgdmEgYSBtb3N0cmFyIGVuIGxhIHRhYmxhXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8YW55PlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0Rvc0lucHV0cyhcclxuICAgICAgY29sdW1uczogc3RyaW5nW10sXHJcbiAgICAgIHRpdGxlOiBzdHJpbmcsIFxyXG4gICAgICBkYXRhU291cmNlOiBhbnlbXSwgXHJcbiAgICAgIGZpbHRlckRhdGE6IGZpbHRlckRhdGFbXSxcclxuICAgICAgY29sdW1uTmFtZXM6IHN0cmluZ1tdID0gbnVsbCxcclxuICAgICAgd2lkdGg6IHN0cmluZyA9IFwiNDUwcHhcIlxyXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Eb2JsZUlucHV0Q29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1ucyxcclxuICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzLFxyXG4gICAgICAgICAgZmlsdGVyRGF0YVxyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIGRlIGxhcyBjb211bmlkYWRlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Db211bmlkYWQ+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ0NvbXVuaWRhZCgpOiBQcm9taXNlPE1Db211bmlkYWQ+IHtcclxuICAgICAgbGV0IGNvbXVuaWRhZGVzOiBNQ29tdW5pZGFkW10gPSBhd2FpdCB0aGlzLmdldENvbXVuaWRhZGVzKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENhdGFsb2dvQ29tcG9uZW50LCB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgY29sdW1uczogWydwcmVmaWpvJywgJ3BhaXMnLCAnZXN0YWRvJywgJ211bmljaXBpbycsICdwYXJyb3F1aWEnLCAnY29kaWdvJywgJ2NvbXVuaWRhZCddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgQ29tdW5pZGFkZXMnLFxyXG4gICAgICAgICAgZGF0YVNvdXJjZTogY29tdW5pZGFkZXNcclxuICAgICAgICB9IGFzIElDYXRhbG9nbyxcclxuICAgICAgICB3aWR0aDogJzQ1MHB4JyxcclxuICAgICAgICBtYXhIZWlnaHQ6ICc5MHZoJ1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNvbXVuaWRhZGVzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvbXVuaWRhZFtdPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbXVuaWRhZGVzKCk6IE9ic2VydmFibGU8TUNvbXVuaWRhZFtdPiB7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TUNvbXVuaWRhZFtdPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9jb211bmlkYWRlc19kYW8ucGhwYCwgcmVxdWVzdCkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueVtdKSA9PiByZXNwLm1hcChlbGVtZW50ID0+IG5ldyBNQ29tdW5pZGFkKGVsZW1lbnQpKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGRpYWxvZyBkZSBsYXMgbGFzIG1vbmVkYXNcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNTW9uZWRhPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5EaWFsb2dNb25lZGFzKCk6IFByb21pc2U8TU1vbmVkYT4ge1xyXG4gICAgICBsZXQgY29pbnM6IE1Nb25lZGFbXSA9IGF3YWl0IHRoaXMuZ2V0TW9uZWRhcygndG9kYXMnKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2NvZGlnbycsICdkZW5vbWluYWNpb24nLCAnY29kaWdvSXNvJywgJ3NpbWJvbG8nXSxcclxuICAgICAgICAgIHRpdGxlOiAnQ2F0w6Fsb2dvIGRlIE1vbmVkYXMnLFxyXG4gICAgICAgICAgY29sdW1uTmFtZXM6IFsnY8OzZGlnbycsICdkZW5vbWluYWNpw7NuJywgJ2lzbycsICdzaW1ib2xvJ10sXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBjb2luc1xyXG4gICAgICAgIH0gYXMgSUNhdGFsb2dvLFxyXG4gICAgICAgIHdpZHRoOiAnNDUwcHgnLFxyXG4gICAgICAgIG1heEhlaWdodDogJzkwdmgnXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBtb25lZGFzXHJcbiAgICogQHJldHVybiBPYnNlcnZhYmxlPE1Nb25lZGFbXT5cclxuICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAqIGFjdHVhbGl6YWRvIDQtMTItMjAyMlxyXG4gICAqIEBwYXJhbSB0aXBvIDpzdHJpbmcgeyd0b2RhcycsJ3VubycsJ2FjdHVhbH1cclxuICAgKiBAcGFyYW0gaWQgOiBudW1iZXJcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi8gXHJcbiAgICBcclxuICAgIFxyXG4gICAgcHVibGljIGdldE1vbmVkYXModGlwbzpzdHJpbmcsaWQ/Om51bWJlcik6IE9ic2VydmFibGU8TU1vbmVkYVtdPiB7ICAgICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TU1vbmVkYVtdPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9tb25lZGFfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTU1vbmVkYShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQERlc2NyaXB0aW9uOiBPYnRpZW5lIGxhIHRhc2EgZGUgY2FtYmlvIGFzb2NpYWRhcyBhIHVubyBvIHZhcmlhcyBtb25lZGFzXHJcbiAgICAgKiBAcGFyYW0gdGlwbyBzdHJpbmdcclxuICAgICAqIEBwYXJhbSBpZCBjb2RpZ28gbW9uZWRhXHJcbiAgICAgKiBAcmV0dXJucyBhcnJheS9udWxsXHJcbiAgICAgKiBAdGlwbzphbGwtPnRvZGFzLCAobW9uZWRhLT51bmEgbW9uZWRhIGlkLT5pZCBkZSBtb25lZGEpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdXJyZW5jeUV4Y2hhbmdlUmF0ZSh0aXBvOiAnYWxsJ3wgJ21vbmVkYSc9IG51bGwsIGlkPzpudW1iZXIpOiBPYnNlcnZhYmxlPE1FeGNoYW5nZVJhdGVbXT4geyAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1FeGNoYW5nZVJhdGVbXT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvdGFzYV9jYW1iaW9fZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXNwOiBhbnkpID0+IHJlc3AuZGF0YS5tYXAoZWxlbWVudCA9PiBuZXcgTUV4Y2hhbmdlUmF0ZShlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGxhcyBjdWVudGFzIGNvbnRhYmxlcyAoQ3VlbnRhcyBJbnN0aXR1Y2lvbmFsZXMpXHJcbiAgICAgKiBAcmV0dXJuIFByb21pc2U8TWN1ZW50YUluc3RpdHVjaW9uYWw+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ0N1ZW50YXNJbnN0aXR1Y2lvbmFsZXMoKTogUHJvbWlzZTxNQ3VlbnRhSW5zdGl0dWNpb25hbD4ge1xyXG4gICAgICBsZXQgYWNjb3VudHM6IE1DdWVudGFJbnN0aXR1Y2lvbmFsW10gPSBhd2FpdCB0aGlzLmdldEN1ZW50YXNJbnN0aXR1Y2lvbmFsZXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ2N1ZW50YScsICdkZW5vbWluYWNpb24nXSxcclxuICAgICAgICAgIGNvbHVtbk5hbWVzOiBbJ2N1ZW50YScsICdkZW5vbWluYWNpw7NuJ10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBwbGFuIGRlIGN1ZW50YSBpbnN0aXR1Y2lvbmFsJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGFjY291bnRzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc4MDBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIGNvbnRhYmxlcyAoQ3VlbnRhcyBJbnN0aXR1Y2lvbmFsZXMpXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUN1ZW50YUluc3RpdHVjaW9uYWxbXT5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdWVudGFzSW5zdGl0dWNpb25hbGVzKGludmVudG9yeT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPE1DdWVudGFJbnN0aXR1Y2lvbmFsW10+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUN1ZW50YUluc3RpdHVjaW9uYWxbXT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY3VlbnRhc19kYW8ucGhwJHsoaW52ZW50b3J5KSA/ICc/aW52ZW50b3J5PXRydWUnIDogJyd9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlc3A6IGFueSkgPT4gcmVzcC5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhSW5zdGl0dWNpb25hbChlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBkaWFsb2cgZGUgbGFzIGN1ZW50YXMgZGUgcHJlc3VwdWVzdG8gKFJlY3Vyc29zIHkgRWdyZXNvcylcclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ0N1ZW50YXNQcmVzdXB1ZXN0bygpOiBQcm9taXNlPE1DdWVudGFQcmVzdXB1ZXN0bz4ge1xyXG4gICAgICBsZXQgYWNjb3VudHM6IE1DdWVudGFQcmVzdXB1ZXN0b1tdID0gYXdhaXQgdGhpcy5nZXRDdWVudGFzUHJlc3VwdWVzdG8oKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5OYW1lczogWydjdWVudGEnLCAnZGVub21pbmFjacOzbiddLFxyXG4gICAgICAgICAgY29sdW1uczogWydjdWVudGEnLCAnZGVub21pbmFjaW9uJ10sXHJcbiAgICAgICAgICB0aXRsZTogJ0NhdMOhbG9nbyBkZSBDdWVudGFzIGRlIFByZXN1cHVlc3RvJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IGFjY291bnRzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjdWVudGFzIGRlIHJlY3Vyc29zIHkgZWdyZXNvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1DdWVudGFQcmVzdXB1ZXN0bz5cclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDdWVudGFzUHJlc3VwdWVzdG8oZmlsdGVyPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1DdWVudGFQcmVzdXB1ZXN0b1tdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1DdWVudGFQcmVzdXB1ZXN0bz4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvcGxhbl91bmljb19jdWVudGFzX2Rhby5waHA/ZmlsdGVyPSR7ZmlsdGVyfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoIG1hcCgocmVzOiBhbnkpID0+IHJlcy5kYXRhLm1hcChlbGVtZW50ID0+IG5ldyBNQ3VlbnRhUHJlc3VwdWVzdG8oZWxlbWVudCkpKSk7XHJcbiAgICB9XHJcblxyXG4gICBcclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgY8OhdGFsb2dvIGRlIGN1ZW50YXMgZGUgbGEgdGFibGEgXCJzY2dfcGxhbl91bmljb19yZVwiXHJcbiAgICAgKiBAcmV0dXJucyBQcm9taXNlPE1DdWVudGFQcmVzdXB1ZXN0bz5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAcGFyYW1zIGZpbHRybzogSW5kaWNhIGJham8gcXVlIHBhcmFtZXRyb3Mgc2UgdmEgYSBmaWx0cmFyIGVsIGNhdGFsb2dvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29DdWVudGFzUHJlc3VzcHVlc3RvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgZmlsdHJvOiBmaWx0cm9DdWVudGFzUHJlc3VwdWVzdG8gPSBudWxsLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gJzc1MHB4J1xyXG4gICAgKTogUHJvbWlzZTxNQ3VlbnRhUHJlc3VwdWVzdG8+IHtcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFQcmVzdXB1ZXN0b1tdID0gW107XHJcblxyXG4gICAgICBhd2FpdCB0aGlzLmdldEN1ZW50YXNQcmVzdXB1ZXN0bygpLnRvUHJvbWlzZSgpLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgIGN1ZW50YXMgPSByZXM7XHJcbiAgICAgICAgaWYgKGZpbHRybykge1xyXG4gICAgICAgICAgaWYgKGZpbHRyby5lc3RhZG8pIHtcclxuICAgICAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMuZmlsdGVyKGMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBjLnN0YXR1cyA9PSBmaWx0cm8uZXN0YWRvXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZmlsdHJvLnRpcG8pIHtcclxuICAgICAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMuZmlsdGVyKGMgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBjLnRpcG8gPT0gZmlsdHJvLnRpcG9cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY3VlbnRhcyA9IGN1ZW50YXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgZVsncHJvdlN0YXR1cyddID0gZS5zdGF0dXMgPT0gXCJDXCIgPyBcIk1vdmltaWVudG9zXCIgOiBcIlRvdGFsaXphZG9yYVwiXHJcbiAgICAgICAgICBlWydwcm92VHlwZSddID0gZS5zdGF0dXMgPT0gXCJSXCIgPyBcIlJlY3Vyc29zXCIgOiBcIkluZ3Jlc29zXCJcclxuICAgICAgICAgIHJldHVybiBlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcInByb3ZTdGF0dXNcIixcInByb3ZUeXBlXCJdLFxyXG4gICAgICAgIHRpdHVsbyxcclxuICAgICAgICBjdWVudGFzLFxyXG4gICAgICAgIFtcIkN1ZW50YVwiLFwiRGVub21pbmFjacOzblwiLFwiRXN0YWRvXCIsXCJUaXBvXCJdLFxyXG4gICAgICAgIGFuY2hvXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBBYnJlIGVsIGPDoXRhbG9nbyBkZSBjdWVudGFzIGRlIGxhIHRhYmxhIFwic3BnX2N1ZW50YXNcIlxyXG4gICAgICogQHJldHVybnMgUHJvbWlzZTxNQ3VlbnRhRWdyZXNvcz5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAcGFyYW1zIHByZXN1cHVlc3RvOiBJbmRpY2Egc2kgc2UgYSB0cmFiYWphciBjb24gZXN0cnVjdHVyYSBkZSBwcmVzdXB1ZXN0byBvIG5vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBvcGVuQ2F0YWxvZ29DdWVudGFzRWdyZXNvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgcHJlc3VwdWVzdG86IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gXCI3NTBweFwiXHJcbiAgICApOiBQcm9taXNlPE1DdWVudGFFZ3Jlc29zPntcclxuICAgICAgbGV0IGN1ZW50YXM6IE1DdWVudGFFZ3Jlc29zW10gPSBbXTtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRFeHBlbnNlQWNjb3VudHMoKS50b1Byb21pc2UoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgY3VlbnRhcyA9IHJlc1xyXG4gICAgICAgIGN1ZW50YXMgPSBjdWVudGFzLmZpbHRlcihlID0+IHtcclxuICAgICAgICAgIHJldHVybiBlLnN0YXR1cyA9PSBcIkNcIlxyXG4gICAgICAgIH0pLm1hcChlID0+IHtcclxuICAgICAgICAgIGVbJ3Byb3ZTdGF0dXMnXSA9IGUuc3RhdHVzID09IFwiQ1wiID8gXCJNb3ZpbWllbnRvc1wiIDogXCJUb3RhbGl6YWRvcmFcIlxyXG4gICAgICAgICAgcmV0dXJuIGU7XHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgaWYgKHByZXN1cHVlc3RvKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvRG9zSW5wdXRzKFxyXG4gICAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcImVzdHJ1Y3R1cmFcIixcInByb3ZTdGF0dXNcIl0sXHJcbiAgICAgICAgICB0aXR1bG8sXHJcbiAgICAgICAgICBjdWVudGFzLFxyXG4gICAgICAgICAgW3tcclxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IFwiQ3VlbnRhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImN1ZW50YVwiXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkVzdHJ1Y3R1cmFcIixcclxuICAgICAgICAgICAgcHJvcGVydHk6IFwiZXN0cnVjdHVyYVwiXHJcbiAgICAgICAgICB9XSxcclxuICAgICAgICAgIFtcIkN1ZW50YVwiLCBcIkRlbm9taW5hY2nDs25cIiwgXCJFc3RydWN0dXJhXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkQWNjb3VudHM6IE1DdWVudGFFZ3Jlc29zW10gPSBbXTtcclxuICAgICAgICBjdWVudGFzLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICBpZiAoIWZpbHRlcmVkQWNjb3VudHMuZmluZChlID0+IGUuY3VlbnRhID09IGMuY3VlbnRhKSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZEFjY291bnRzLnB1c2goYylcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0dlbmVyaWNvKFxyXG4gICAgICAgICAgW1wiY3VlbnRhXCIsXCJkZW5vbWluYWNpb25cIixcInByb3ZTdGF0dXNcIl0sXHJcbiAgICAgICAgICB0aXR1bG8sXHJcbiAgICAgICAgICBmaWx0ZXJlZEFjY291bnRzLFxyXG4gICAgICAgICAgW1wiQ3VlbnRhXCIsIFwiRGVub21pbmFjacOzblwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gQWJyZSBlbCBjw6F0YWxvZ28gZGUgY3VlbnRhcyBkZSBsYSB0YWJsYSBcInNwaV9jdWVudGFzXCJcclxuICAgICAqIEByZXR1cm5zIFByb21pc2U8TUN1ZW50YUluZ3Jlc29zPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqIEBwYXJhbXMgcHJlc3VwdWVzdG86IEluZGljYSBzaSBzZSBhIHRyYWJhamFyIGNvbiBlc3RydWN0dXJhIGRlIHByZXN1cHVlc3RvIG8gbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIG9wZW5DYXRhbG9nb0N1ZW50YXNJbmdyZXNvKFxyXG4gICAgICB0aXR1bG86IHN0cmluZyxcclxuICAgICAgcHJlc3VwdWVzdG86IGJvb2xlYW4gPSB0cnVlLFxyXG4gICAgICBhbmNobzogc3RyaW5nID0gXCI3NTBweFwiXHJcbiAgICApOiBQcm9taXNlPE1DdWVudGFJbmdyZXNvcz57XHJcbiAgICAgIGxldCBjdWVudGFzOiBNQ3VlbnRhSW5ncmVzb3NbXSA9IFtdO1xyXG4gICAgICBhd2FpdCB0aGlzLmdldEluY29tZUFjY291bnRzKCkudG9Qcm9taXNlKCkudGhlbigocmVzOiBJUmVzcG9uc2UpID0+IHtcclxuICAgICAgICBjdWVudGFzID0gcmVzLmRhdGFcclxuICAgICAgICBjdWVudGFzID0gY3VlbnRhcy5maWx0ZXIoZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZS5lc3RhZG8gPT0gXCJDXCJcclxuICAgICAgICB9KS5tYXAoZSA9PiB7XHJcbiAgICAgICAgICBlWydwcm92U3RhdHVzJ10gPSBlLmVzdGFkbyA9PSBcIkNcIiA/IFwiTW92aW1pZW50b3NcIiA6IFwiVG90YWxpemFkb3JhXCJcclxuICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChwcmVzdXB1ZXN0bykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5DYXRhbG9nb0Rvc0lucHV0cyhcclxuICAgICAgICAgIFtcImN1ZW50YVwiLFwiZGVub21pbmFjaW9uXCIsXCJlc3RydWN0dXJhXCIsXCJwcm92U3RhdHVzXCJdLFxyXG4gICAgICAgICAgdGl0dWxvLFxyXG4gICAgICAgICAgY3VlbnRhcyxcclxuICAgICAgICAgIFt7XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBcIkN1ZW50YVwiLFxyXG4gICAgICAgICAgICBwcm9wZXJ0eTogXCJjdWVudGFcIlxyXG4gICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcjogXCJFc3RydWN0dXJhXCIsXHJcbiAgICAgICAgICAgIHByb3BlcnR5OiBcImVzdHJ1Y3R1cmFcIlxyXG4gICAgICAgICAgfV0sXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0cnVjdHVyYVwiLCBcIkVzdGFkb1wiXSxcclxuICAgICAgICAgIGFuY2hvXHJcbiAgICAgICAgKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEFjY291bnRzOiBNQ3VlbnRhSW5ncmVzb3NbXSA9IFtdO1xyXG4gICAgICAgIGN1ZW50YXMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgIGlmICghZmlsdGVyZWRBY2NvdW50cy5maW5kKGUgPT4gZS5jdWVudGEgPT0gYy5jdWVudGEpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMucHVzaChjKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlbkNhdGFsb2dvR2VuZXJpY28oXHJcbiAgICAgICAgICBbXCJjdWVudGFcIixcImRlbm9taW5hY2lvblwiLFwicHJvdlN0YXR1c1wiXSxcclxuICAgICAgICAgIHRpdHVsbyxcclxuICAgICAgICAgIGZpbHRlcmVkQWNjb3VudHMsXHJcbiAgICAgICAgICBbXCJDdWVudGFcIiwgXCJEZW5vbWluYWNpw7NuXCIsIFwiRXN0YWRvXCJdLFxyXG4gICAgICAgICAgYW5jaG9cclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgIH0gICAgXHJcblxyXG4gICAgcHVibGljIGdldFVuaWRhZEFkbWluaXN0cmF0aXZhKHRpcG8/OnN0cmluZyl7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3BnL3VuaWRhZF9hZG1pbmlzdHJhdGl2YV9kYW8ucGhwP3RpcG89JHt0aXBvfWAsXHJcbiAgICAgIHtoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCl9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoKHJlczphbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQWRtaW5pc3RyYXRpdmVVbml0KGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSkgXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgY2FyZ29zIGRlIHNlcnZpY2lvc1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTZXJ2aWNlQ2hhcmdlcyhzZXJ2aWNlSWQ6bnVtYmVyID0gbnVsbCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zb2Mvc2VydmljaW9fY2FyZ29fZGFvLnBocCR7XHJcbiAgICAgICAgc2VydmljZUlkID8gYD9zZXJ2aWNlX2lkPSR7c2VydmljZUlkfWAgOiAnJ1xyXG4gICAgICB9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVNlcnZpY2VDaGFyZ2UoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcGFpc2VzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TUNvdW50cnk+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICogQG1vZGlmaWVkIDEwLTAxLTIwMjJcclxuICAgICAqIEBwYXJhbSBjb2RpZ286IENvZGlnbyBkZWwgcGFpc1xyXG5cclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0Q291bnRyaWVzKGNvZGlnbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxNQ291bnRyeVtdPiB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TUNvdW50cnk+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL3BhaXNlc19kYW8ucGhwP2NvZGlnbz0ke2NvZGlnb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db3VudHJ5KGUpKSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgZXN0YWRvc1xyXG4gICAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVN0YXRlPlxyXG4gICAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICAgKiBAbW9kaWZpY2FkbyA0LTEyLTIwMjJcclxuICAgICAgICogQHBhcmFtIGNvZGlnbzogQ29kaWdvIGRlbCBwYWlzXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0U3RhdGVzKGNvZGlnbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxNU3RhdGVbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1TdGF0ZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvZXN0YWRvc19kYW8ucGhwP2NvZGlnbz0ke2NvZGlnb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1TdGF0ZShlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvKipcclxuICAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIG11bmljaXBpb3NcclxuICAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1NdW5pY2lwYWxpdHk+XHJcbiAgICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgICAqIEBtb2RpZmljYWRvIDEwLTAxLTIwMjJcclxuICAgICAgICogQHBhcmFtIHBhaXM6IENvZGlnbyBkZWwgcGFpcyAsXHJcbiAgICAgICAqIEBwYXJhbSBlc3RhZG86IENvZGlnbyBkZWwgZXN0YWRvXHJcbiAgICAgICAqIEBhY3R1YWxpemFkbyA0LTEyLTIwMjJcclxuICAgICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRNdW5pY2lwYWxpdGllcyhwYWlzPzpzdHJpbmcsZXN0YWRvPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1NdW5pY2lwYWxpdHlbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1NdW5pY2lwYWxpdHk+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL211bmljaXBpb3NfZGFvLnBocD9wYWlzPSR7cGFpc30mZXN0YWRvPSR7ZXN0YWRvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTU11bmljaXBhbGl0eShlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvKipcclxuICAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIHBhcnJvcXVpYXMgXHJcbiAgICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUGFyaXNoPlxyXG4gICAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICAgKiBAbW9kaWZpY2FkbyAxMC0wMS0yMDIyXHJcbiAgICAgICAqIEBwYXJhbSBwYWlzOiBDb2RpZ28gZGVsIHBhaXNcclxuICAgICAgICogQHBhcmFtIGVzdGFkbzogQ29kaWdvIGRlbCBlc3RhZG9cclxuICAgICAgICogQHBhcmFtIG11bmljaXBpbzpjb2RpZ28gTXVuaWNpcGlvXHJcbiAgICAgICAqIEBhY3R1YWxpemFkbyA0LTEyLTIwMjJcclxuXHJcbiAgICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0UGFyaXNoZXMocGFpcz86c3RyaW5nLGVzdGFkbz86c3RyaW5nLG11bmljaXBpbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxNUGFyaXNoW10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNUGFyaXNoPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9wYXJyb3F1aWFzX2Rhby5waHA/cGFpcz0ke3BhaXN9JmVzdGFkbz0ke2VzdGFkb30mbXVuaWNpcGlvPSR7bXVuaWNpcGlvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVBhcmlzaChlKSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvKipcclxuICAgICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGFzIGNpdWRhZGVzXHJcbiAgICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUGFyaXNoPlxyXG4gICAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICAgKiBAbW9kaWZpY2FkbyAxMC0wMS0yMDIyXHJcbiAgICAgICAqIEBwYXJhbSBwYWlzOiBDb2RpZ28gZGVsIHBhaXNcclxuICAgICAgICogQHBhcmFtIGVzdGFkbzogQ29kaWdvIGRlbCBlc3RhZG9cclxuXHJcblxyXG4gICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgZ2V0Q2l0eShwYWlzPzpzdHJpbmcsZXN0YWRvPzpzdHJpbmcpOiBPYnNlcnZhYmxlPE1DaXR5W10+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxNQ2l0eT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY2l1ZGFkZXNfZGFvLnBocD9wYWlzPSR7cGFpc30mZXN0YWRvPSR7ZXN0YWRvfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNpdHkoZSkpKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgY2l1ZGFkZXNcclxuICAgICAgICogQHJldHVybiBPYnNlcnZhYmxlPE1QYXJpc2g+XHJcbiAgICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICAgKiBAbW9kaWZpY2FkbyAxMC0wMS0yMDIyXHJcbiAgICAgICAqIEBwYXJhbSBwYWlzOiBDb2RpZ28gZGVsIHBhaXNcclxuXHJcbiAgICAgICAqL1xyXG4gICAgICAgIHB1YmxpYyBnZXRDb21tdW5pdGllcyhwYWlzPzpzdHJpbmcsZXN0YWRvPzpzdHJpbmcsIG11bmljaXBpbz86c3RyaW5nLHBhcnJvcXVpYT86c3RyaW5nKTogT2JzZXJ2YWJsZTxNQ29tbXVuaXR5W10+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1Db21tdW5pdHk+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2NvbXVuaWRhZGVzX2Rhby5waHA/cGFpcz0ke3BhaXN9JmVzdGFkbz0ke2VzdGFkb30mbXVuaWNpcGlvPSR7bXVuaWNpcGlvfSZwYXJyb3F1aWE9JHtwYXJyb3F1aWF9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db21tdW5pdHkoZSkpKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBzaXN0ZW1hcyBhY3RpdmFzXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVNpc3RlbWE+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0U2lzdGVtYXMoKTogT2JzZXJ2YWJsZTxNU2lzdGVtYVtdPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE1TaXN0ZW1hPihgJHt0aGlzLlVSTH0vZGFvL3Nzcy9zaXN0ZW1hc19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVNpc3RlbWEoZSkpKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgbW9uZWRhIGFjdHVhbFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAYWN0dWFsaXphZG86IDQtMTItMjAyMjJcclxuICAgICAqIEBwYXJhbXMgaWQ6IGlkIGRlIGxhIG1vbmVkYSxcclxuICAgICAqIEBwYXJhbXMgdGlwbzogdG9kYXMtPm9idGllbmUgdG9kYXMgbGFzIG1vbmVkYSwgKHVuby0+IG9idGllbmUgdW5hIG1vbmVkYSArIGlkKVxyXG4gICAgICogKG1vbjpmb3JtYXRvIHBhcmEgaW5wdXRDdXJyZW5jeSArIGlkIClcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEN1cnJlbnRDdXJyZW5jeSh0aXBvOid0b2Rhcyd8J3Vubyd8J21vbic9bnVsbCxpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9tb25lZGFfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IG5ldyBNTW9uZWRhQ29uZmlnKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBsaW5lYSBlbXByZXNhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAYWN0dWFsaXphZG86IDUtMTItMjAyMjJcclxuICAgICAqL1xyXG4gICAgICAgICBwdWJsaWMgZ2V0RW50ZXJwcmlzZSh0aXBvOidsaW5lYScgfCdwcm9jZXNvJ3wnZGVmYXVsdCc9bnVsbCAsaWQ/Om51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vY2ZnL2VudGVycHJpc2VfZGFvLnBocD90aXBvPSR7dGlwb31gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRW50ZXJwcmlzZShlKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIG9yZ2FuaXphY2lvblxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25UeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL3RpcG9fb3JnYW5pemFjaW9uX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNT3JnYW5pemF0aW9uVHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgb3JnYW5pemFjaW9uXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNwZWNpYWx0aWVzKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvZXNwZWNpYWxpZGFkX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU3BlY2lhbHR5KGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBkb2N1bWVudG9zXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERvY3VtZW50cygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vcnBjL2RvY3VtZW50b19kYW8ucGhwYCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTURvY3VtZW50KGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBjbGFzaWZpY2FjaW9uZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q2xhc2lmaWNhdGlvbnMoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9jbGFzaWZpY2FjaW9uX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ2xhc2lmaWNhdGlvbihlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBwcmVmaWpvIGRlIGxvcyB1c3Vhcmlvc1xyXG4gICAgICogQHBhcmFtIHByb2NlZGUgRGUgcXVlIG3Ds2R1bG8gcHJvY2VkZVxyXG4gICAgICogQHBhcmFtIGNvZHNpcyBDw7NkaWdvIGRlbCBzaXN0ZW1hXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8TVVzdWFyaW9QcmVmaWpvW10+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VXNlclByZWZpeChmaWx0ZXI6ICdkZXRhaWwnID0gbnVsbCwgY29kZTogc3RyaW5nID0gbnVsbCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29udHJvbF9udW1lcm9fZGFvLnBocCR7XHJcbiAgICAgICAgZmlsdGVyID8gYD9maWx0ZXI9JHtmaWx0ZXJ9JmNvZGU9JHtjb2RlfWAgOiAnJ1xyXG4gICAgICB9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVVzdWFyaW9QcmVmaWpvKGUpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcGVmaWpvXHJcbiAgICAgKiBAcGFyYW0gcHJvY2VkZSBEZSBxdWUgbcOzZHVsbyBwcm9jZWRlXHJcbiAgICAgKiBAcGFyYW0gY29kc2lzIEPDs2RpZ28gZGVsIHNpc3RlbWFcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNVXN1YXJpb1ByZWZpam9bXT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5Q3Jlc3BvIDE3LTEyLTIwMjJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByZWZpeChmaWx0ZXI6ICdhbGwnIHwgJ29uZScgPSBudWxsLCBjb2RlOiBzdHJpbmcgPSBudWxsKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9jZmcvY29udHJvbF9udW1lcm9fZGFvLnBocCR7XHJcbiAgICAgICAgZmlsdGVyID8gYD9maWx0ZXI9JHtmaWx0ZXJ9JmNvZGU9JHtjb2RlfWAgOiAnJ1xyXG4gICAgICB9YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVByZWZpam8oZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFicmUgZWwgZGlhbG9nIHBhcmEgYnVzY2FyIGxvcyBwcm92ZWVkb3Jlc1xyXG4gICAgICogQHJldHVybiBQcm9taXNlPE1Qcm92ZWVkb3I+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgb3BlbkRpYWxvZ1Byb3ZlZWRvcmVzKCk6IFByb21pc2U8TVByb3ZlZWRvcj4ge1xyXG4gICAgICBsZXQgcHJvdmVlZG9yZXM6IE1Qcm92ZWVkb3JbXSA9IGF3YWl0IHRoaXMuZ2V0UHJvdmVlZG9yZXMoKS50b1Byb21pc2UoKTtcclxuICAgICAgbGV0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ2F0YWxvZ29Db21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBjb2x1bW5zOiBbJ3RpcG8nLCAncmlmJywgJ25vbWJyZSddLFxyXG4gICAgICAgICAgdGl0bGU6ICdDYXTDoWxvZ28gZGUgUHJvdmVlZG9yZXMgeSBCZW5lZmljaWFyaW9zJyxcclxuICAgICAgICAgIGRhdGFTb3VyY2U6IHByb3ZlZWRvcmVzXHJcbiAgICAgICAgfSBhcyBJQ2F0YWxvZ28sXHJcbiAgICAgICAgd2lkdGg6ICc0NTBweCcsXHJcbiAgICAgICAgbWF4SGVpZ2h0OiAnOTB2aCdcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxNUHJvdmVlZG9yW10+XHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHJvdmVlZG9yZXMoKTogT2JzZXJ2YWJsZTxNUHJvdmVlZG9yW10+IHtcclxuICAgICAgbGV0IHJlcXVlc3Q6IElSZXF1ZXN0ID0ge1xyXG4gICAgICAgIG9wZXJhY2lvbjogJ29idGVuZXJEYXRhJyxcclxuICAgICAgICBzaWdlc3BfY29uZXhpb246IHtcclxuICAgICAgICAgIHNlcnZpZG9yOiB0aGlzLlVSTCxcclxuICAgICAgICAgIHVzdWFyaW86IHRoaXMudXN1YXJpb0FjdGl2by5nZXRJbnRlcmZhY2UoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TVByb3ZlZWRvcltdPihgJHt0aGlzLlVSTH0vZGFvL3JwYy9wcm92ZWVkb3JfYmVuZWZpY2lhcmlvX2Rhby5waHBgLCByZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZWxlbWVudCA9PiBuZXcgTVByb3ZlZWRvcihlbGVtZW50KSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgcHJvdmVlZG9yZXMgeSBiZW5lZmljaWFyaW9zXHJcbiAgICAgKiBATm90ZSBTaSBxdWllcmUgc29sbyBsb3MgZGF0b3MgYmFzaWNvcyB1c2UgbG9zIHBhcmFtZXRyb3MgKCdTJywnUCcsJ04nKVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKiBAdHlwZSA9eydQJywnQicsJ1MnfVxyXG4gICAgICogQGRlc3RpbmF0aW9uID17J1AnLCdCJywnQycsJ0EnLCdOJ33iiYh7UHJvdmVlZG9yLEJlbmVmaWNpYXJpbyxDb250YXRpc3RhLEFtYm9zLE5pbmd1bm99XHJcbiAgICAgKiBAYWNjb3VudCA9eydTJywnTid9IHBhcmEgdHJhZXIgbGFzIGN1ZW50YXMgYmFuY2FyaWFzIGRlbCBwcm92ZWVkb3IgcG9yIGRlZmVjdG8gZXN0YSBlbiBOXHJcbiAgICAgKiBAbW9kaWZpY2FkbyAxNy0wNy0yMDIzXHJcbiAgICAgKi9cclxuXHJcbiAgICBwdWJsaWMgZ2V0UHJvdmlkZXJzQW5kQmVuZWZpY2lhcmllcyh0eXBlOiBzdHJpbmcgPSdkZWZhdWx0JywgZGVzdGluYXRpb246c3RyaW5nPW51bGwsIGFjY291bnQ6c3RyaW5nPSdOJyk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9ycGMvcHJvdmVlZG9yX2JlbmVmaWNpYXJpb19kYW8ucGhwJHt0eXBlID8gYD9wcm92aWRlcl90eXBlPSR7dHlwZX1gICA6ICcnfSZkZXN0aW5hdGlvbj0ke2Rlc3RpbmF0aW9ufSZhY2NvdW50PSR7YWNjb3VudH1gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVByb3ZpZGVyQmVuZWZpY2lhcnkoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIHVuIFVzdWFyaW8gc2VndW4gc3UgSURcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VXNlckJ5SWQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zc3MvdXN1YXJpb19kYW8ucGhwP2lkPSR7aWR9YCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Vc3VhcmlvKHJlcy5kYXRhKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxvcyBiYW5jb3NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFua3MoaWRFbnRlcnByaXNlPzpudW1iZXIpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2JhbmNvX2Rhby5waHA/ZT0ke2lkRW50ZXJwcmlzZX1gLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUJhbmsoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGN1ZW50YSBiYW5jYXJpYXNcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0QmFua0FjY291bnRUeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2NiL2JhbmNvX3RpcG9fY3VlbnRhX2Rhby5waHBgLCBcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUJhbmtBY2NvdW50VHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIG9idGllbmUgbGFzIGN1ZW50YSBzZWd1biBlbCBpZFxyXG4gICAgICogQHBhcmFtIHRpcG8geydiYW5jbycsICdkZWZhdWx0J31cclxuICAgICAqIEBwYXJhbSBpZCBwYXJhIGxhIG9wY2lvbiBiYW5jbyB1c2FyIGlkPWlkQmFuY28sIG9wY2lvbiBkZWZhdWxmIGlkPWlkRW50ZXJwcmlzZVxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBbGxCYW5rQWNjb3VudCh0aXBvOnN0cmluZyxpZDpudW1iZXIpeyAgICAgICAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc2NiL2N1ZW50YV9iYW5jb19kYW8ucGhwP3RpcG89JHt0aXBvfSZlPSR7aWR9YCxcclxuICAgICAge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOmFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGVsZW1lbnQgPT4gbmV3IE1DdWVudGFCYW5jbyhlbGVtZW50KSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IFtdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICAgIH0pIFxyXG4gICAgICApXHJcbiAgICB9IFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIGJhbmNvcyBzaWdlY29mXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBDYXJsb3MgQWxib3Jub3pcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNpZ2Vjb2ZCYW5rcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc2lnZXNwL2JhbmNvX3NpZ2Vjb2ZfZGFvLnBocGAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNU2lnZWNvZkJhbmsoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgY29uZmlndXJhY2lvbiBkZSBTT0NcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIENhcmxvcyBBbGJvcm5velxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29uZmlnU09DKCk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zb2MvY29uZmlndXJhY2lvbl9kYW8ucGhwYCwgXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gbmV3IE1Db25maWdTT0MocmVzLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGRlZHVjY2lvblxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgQ2FybG9zIEFsYm9ybm96XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZWR1Y3Rpb25UeXBlcygpOiBPYnNlcnZhYmxlPElSZXNwb25zZT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3RiL3RpcG9fZGVkdWNjaW9uX2Rhby5waHBgLFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNRGVkdWN0aW9uVHlwZShlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEluY29tZUFjY291bnRzKG9ubHlBdmFpbGFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PntcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zcGkvY3VlbnRhc19pbmdyZXNvc19kYW8ucGhwJHtcclxuICAgICAgICBvbmx5QXZhaWxhYmxlID8gJz9hdmFpbGFibGU9dHJ1ZScgOiAnJ1xyXG4gICAgICB9YCwge2hlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUN1ZW50YUluZ3Jlc29zKGUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENoYXJnZXMoKXtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oXHJcbiAgICAgICAgYCR7dGhpcy5VUkx9L2Rhby9zdGIvY2FyZ29zX2Rhby5waHBgLCBcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9XHJcbiAgICAgICkucGlwZShcclxuICAgICAgICBtYXAoKHJlczogSVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNhcmdvKGUpKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldERlZHVjdGlvbnMoKXtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihcclxuICAgICAgICBgJHt0aGlzLlVSTH0vZGFvL3N0Yi9kZWR1Y2Npb25lc19kYW8ucGhwYCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXM6IElSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1EZWR1Y3Rpb24oZSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICkgIFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhIGxvcyBkYXRvcyBkZSBFbXByZXNhXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRDb21wYW55KHRpcG8/OnN0cmluZyxpZD86bnVtYmVyKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL2NmZy9lbXByZXNhc19kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICBcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUVtcHJlc2EoZSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgdGlwb3MgZGUgZG9jdW1lbnRvcyByZWdpc3RyYWRvcyBlbiBDWFBcclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqIEBkYXRlIDIwLTA3LTIwMjFcclxuICAgICAqL1xyXG4gICAgICBwdWJsaWMgZ2V0VGlwb3NEb2N1bWV0b3MoKTogT2JzZXJ2YWJsZTxJUmVzcG9uc2U+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vY3hwL3RpcG9fZG9jdW1lbnRvX2Rhby5waHA/b3BlcmFjaW9uPSR7J2J1c2Nhcid9JmV4aXN0ZW49JHsnZXhpc3Rlbid9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNVGlwb0RvY3VtZW50b0NYUChlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcblxyXG4gICAgIC8qKlxyXG4gICAgICAqIEBwYXJhbSBnZXQgdG9tYSBsb3MgdmFsb3JlczogWyBpZE9yZGVuQ29tcHJhICwncmVjZXBjaW9uJywnZXhpc3RlbicsJ2NvZGlnbycsICdvcmRlbmVzU09DJywgJ29wJywgJ2FydCcgXVxyXG4gICAgICAqIEBwYXJhbSBuIGNvZGlnbyBEb2N1bWVudG8gT3JkZW4sIHNlIHVzYSBwYXJhIG9idGVuZXIgbG9zIGRldGFsbGVzIGRlIGxhIG9yZGVuIGRlIGNvbXByYSwgZXMgb2JsaWdhdG9yaW8gYWwgY29tYmluYXIgY29uIGxhIG9wY2lvbiBnZXQ6IGlkT3JkZW5Db21wcmFcclxuICAgICAgKiBAZGVzY3JpcHRpb24gJ3JlY2VwY2lvbic6IE9idGluZSBsYXMgb3JkZW5lcyBkZSBzdW1pbmlzdHJvLFxyXG4gICAgICAqIGV4aXN0ZSB5IGNvZGlnbzogT2J0aWVuZSBsb3MgY29kaWdvcyByZWdpc3RyYWRvcywgXHJcbiAgICAgICogb3JkZW5lc1NPQzogb2J0aWVuZSBsYXMgb3JkZW5lcyBkZSBjb21wcmEsXHJcbiAgICAgICogb3A6IG9idGllbmUgbGFzIG9yZGVuZXMgcGVuZGllbnRlc1xyXG4gICAgICAqIGFydDogb2J0aWVuZSBsb3MgYXJ0aWN1bG9zIFxyXG4gICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgICogQGRhdGUgMy0xMC0yMDIxXHJcbiAgICAgICogQHJldHVybnMgXHJcbiAgICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0RW50cmFkYVN1bWluaXN0cm9zKGdldDphbnksIG4/OnN0cmluZyk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Npdi9lbnRyYWRhX3N1bWluaXN0cm9fZGFvLnBocD9nZXQ9JHtnZXR9Jm49JHtufWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1FbnRyYWRhU3VtaW5pc3Ryb3MoZSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGRvY3VtZW50b3MgcmVnaXN0cmFkb3MgZW4gQ1hQXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAZGF0ZSAyMC0wNy0yMDIxXHJcbiAgICAgKi9cclxuXHJcbiAgICAgIHB1YmxpYyBnZXRDb25jZXB0b3NDeFAoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vY3hwL2NvbmNlcHRvX2Rhby5waHA/b3BlcmFjaW9uPSR7J2J1c2Nhcid9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ29uY2VwdG9zQ1hQKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAvKiogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgbG9zIGNvbmNlcHRvcyBSZXRlbmNpb24gSVNSTFxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICogQGRhdGUgMjYtMDctMjAyMVxyXG4gICAgICovXHJcblxyXG4gICAgICAgIHB1YmxpYyBnZXRDb25jZXB0b3NSZXRlbmNpb24oKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zdGIvZGVkdWNjaW9uZXNfZGFvLnBocD9jb2RlPSR7J2NvbmNlcHRvcyd9YCxcclxuICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ29uY2VwdG9SZXRlbmNpb24oZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgLyoqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgbGEgY29uZmlndXJhY2nDs24gZGUgUlJISCB5IGRlIFNOT1xyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICovXHJcbiAgICAgIHB1YmxpYyBvYnRlbmVyQ29uZmlndXJhY2lvblNOTygpe1xyXG4gICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2NvbmZpZ3VyYWNpb25fZGFvLnBocD90aXBvPSR7J2NvbmZpZ3VyYWNpb24nfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyBcclxuICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGg+MCl7XHJcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Db25maWd1cmFjaW9uU05PKGUpKTsgIFxyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICB9XHJcblxyXG4gICAgIC8qKlxyXG4gICAgICAqIFxyXG4gICAgICAqIEBwYXJhbSB0aXBvIFsnZGVmYXVsdCcsICd1bm8nLCAnY2FyZ29zJ10gZGFmYXVsdDpUb2RhcyBsYXMgbm9taW5hcywgdW5vOiB1bmEgbm9taW5hLCAnY2FyZ29zJzogbm9taW5hcyBwb3IgY2FyZ29zXHJcbiAgICAgICogQHBhcmFtIGlkIDppZCBkZSBsYSBub21pbmEuIENhbXBvIHJlcXVlcmlkbyBwYXJhIHVubyB5IGNhcmdvc1xyXG4gICAgICAqIEByZXR1cm5zIGFycmF5KCkgICAgICBcclxuICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgbm9taW5hcyByZWdpc3RyYWRhc1xyXG4gICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgICogQGRhdGUgMjAtMTAtMjFcclxuICAgICAgKlxyXG4gICAgICovICAgICBcclxuXHJcbiAgICAgICBwdWJsaWMgZ2V0Tm9taW5hKHRpcG86c3RyaW5nLGlkPzpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vZGVmaW5pY2lvbl9ub21pbmFfZGFvLnBocD90aXBvPSR7dGlwb30maWQ9JHtpZH1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICByZXRyeSgzKSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IodGhpcy5oYW5kbGVyRXJyb3IpLFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1EZWZpbmljaW9uTm9taW5hKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgIC8qKlxyXG4gICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgY2FyZ29zIGRlIGxhcyBub21pbmFcclxuICAgICogQHBhcmFtIHRpcG8gWydjb2RpZ28nLCdkZWZhdWx0J10gLT5jb2RpZ286IG9idGllbmUgZWwgcHJveGltbyBjb2RpZ28uIC0+ZGVmYXVsdDogb2J0aWVuZSB0b2RvcyBsb3MgY2FyZ29zIGRlIGxhIG5vbWluYVxyXG4gICAgKiBAcGFyYW0gaWQgaWQgZGUgbGEgbm9taW5hXHJcbiAgICAqIEByZXR1cm5zIGFycmF5KClcclxuICAgICovXHJcbiAgICAgIHB1YmxpYyBnZXRDYXJnb3NOb21pbmEodGlwbzpzdHJpbmcsaWQ/Om51bWJlcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9hc2lnbmFjaW9uX2Nhcmdvc19kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUFzaWduYWNpb25DYXJnbyhlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgICB9ICBcclxuICAgICAgXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE9idGllbmUgdW4gcGVyc29uYWwgZGUgbGEgbsOzbWluYVxyXG4gICAgICogQHJldHVybiBPYnNlcnZhYmxlPElSZXNwb25zZT5cclxuICAgICAqIEBhdXRob3IgRGltYWx5IENyZXNwb1xyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0UGVyc29uYWxTUkgodGlwbzpzdHJpbmcsaWQ/Om51bWJlcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9wZXJzb25hbF9kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVBlcnNvbmFsKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGxhcyBhZ2VuY2lhIGRlIGJhbmNvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKi9cclxuICAgICAgIHB1YmxpYyBnZXRBZ2VuY2lhQmFuY28odGlwbzpzdHJpbmcsaWQ/Om51bWJlcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3NjYi9hZ2VuY2lhX2Rhby5waHA/Y29kZT0ke3RpcG99JmlkPSR7aWR9YCxcclxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKFxyXG4gICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICBjYXRjaEVycm9yKHRoaXMuaGFuZGxlckVycm9yKSxcclxuICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQWdlbmNpYUJhbmNvKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYSBob2phcyBkZSB0aWVtcG9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAYXV0aG9yIERpbWFseSBDcmVzcG9cclxuICAgICAqL1xyXG4gICAgICAgICAgIHB1YmxpYyBnZXRIb2phVGllbXBvKHRpcG86c3RyaW5nLGlkUGVyc29uYWw/Om51bWJlcixpZE5vbWluYT86bnVtYmVyKXtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Nuby9ob2phX3RpZW1wb19kYW8ucGhwP2lkUGVyc29uYWw9JHtpZFBlcnNvbmFsfSZpZE5vbWluYT0ke2lkTm9taW5hfWAsXHJcbiAgICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgcmV0cnkoMyksXHJcbiAgICAgICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUhvamFUaWVtcG8oZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9ICAgICAgICAgXHJcbiAgICAgICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsb3MgY2xpZW50ZXMgXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAdGlwbyBbYmFzaWNvLGNvZGlnbyxjZWR1bGFdXHJcbiAgICAgKiBcclxuICAgICAqL1xyXG5cclxuICAgIHB1YmxpYyBnZXRDbGllbnRlKHRpcG86IHN0cmluZyA9J2RlZmF1bHQnLCBpZDpudW1iZXI9MCwgY29kaWdvOnN0cmluZz0nJywgY2VkdWxhOnN0cmluZz0nJyk6IE9ic2VydmFibGU8SVJlc3BvbnNlPiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zZnYvY2xpZW50X2Rhby5waHA/dGlwbz0ke3RpcG99JmlkPSR7aWR9JmNvZGlnbz0ke2NvZGlnb30mY2VkcmlmY2xpPSR7Y2VkdWxhfWAsIFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgICBcclxuICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTUNsaWVudChlKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhIHNpIGxhIGZlY2hhIGVzdGEgZGVudHJvIGRlbCBwZXJpb2RvIGZpc2NhbCB5IGVsIG1lcyBlc3RhIGFiaWVydG8gbyBjZXJyYWRvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgICAgKiBAYXV0aG9yIDExLTEwLTIwMjNcclxuICAgICAqL1xyXG4gICAgICAgcHVibGljIGdldFZhbGlkYXJQZXJpb2RvKGZlY2hhOnN0cmluZywgcGVyaW9kb0Zpc2NhbDpzdHJpbmcpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zY2cvY29uZmlndXJhY2lvbl9jb250YWJpbGlkYWRfZGFvLnBocD9mZWNoYT0ke2ZlY2hhfSZwZXJpb2RvPSR7cGVyaW9kb0Zpc2NhbH1gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4geyByZXR1cm4gcmVzO30pKTtcclxuICAgICAgfSBcclxuICAgICAgXHJcblxyXG4gICAgXHJcbiAgXHJcblxyXG5cclxuICAgIHB1YmxpYyB1c2VySGFzUmlnaHRzKGNvbHVtbjonYWRtaW5pc3RyYWRvcicgfCAnaW5zZXJ0YXInIHwgJ2FjdHVhbGl6YXInIHwgJ2NvbnN1bHRhcicgXHJcbiAgICB8ICdlbGltaW5hcicgfCAnYW51bGFyJyB8J2Rlc2NhcmdhcicgfCAnZWplY3V0YXJfX3Byb2Nlc2FyXycgfCAnaW1wcmltaXInIFxyXG4gICAgfCAnZW52aWFyX19jb3JyZW9fJyB8ICd2aXNpYmxlJyl7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KFxyXG4gICAgICAgIGAke3RoaXMuVVJMfS9kYW8vc3NzL2RlcmVjaG9zX3VzdWFyaW9fZGFvLnBocD9pZENvbXBvbmVudD0ke1xyXG4gICAgICAgICAgdGhpcy5jdXJyZW50Q29tcG9uZW50LmlkXHJcbiAgICAgICAgfSZjb2x1bW49JHtjb2x1bW59YCwgXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfVxyXG4gICAgICApXHJcblxyXG4gICAgfVxyXG5cclxuICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0b3JuYSBsb3MgaGVhZGVycyBwYXJhIGhhY2VyIGxhcyBwZXRpY2lvbmVzXHJcbiAgICAgKiBAcGFyYW1zIHR5cGU6IFRpcG8gTUlNRSBwZXJtaXRpZG8gcG9yIGRlZmVjdG8gc2UgdG9tYSBhcHBsaWNhdGlvbi9qc29uXHJcbiAgICAgKiBAcmV0dXJuIEh0dHBIZWFkZXJzXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICogQGRhdGUtdXBkYXRlOiAxNS0wNi0yMDIyIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SHR0cEhlYWRlcnModHlwZT86c3RyaW5nKTogSHR0cEhlYWRlcnMgeyBcclxuICAgICAgIXR5cGU/IHR5cGU9J2FwcGxpY2F0aW9uL2pzb24nOicnOyAgICAgIFxyXG4gICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogdHlwZSxcclxuICAgICAgICAnQXV0aG9yaXphdGlvbic6IGAke3RoaXMudXN1YXJpb0FjdGl2by50b2tlbn1gXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gaGVhZGVycztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIHNlcnZpZG9yIGd1YXJkYWRvIGVuIGVsIHNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIHN0cmluZ1xyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNlcnZlcigpOiBzdHJpbmcge1xyXG4gICAgICByZXR1cm4gdGhpcy5VUkw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCB1c3VhcmlvIGd1YXJkYWRvIGVuIGVsIHNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcmV0dXJuIE1Vc3VhcmlvXHJcbiAgICAgKiBAYXV0aG9yIE1pZ3VlbCBSYW3DrXJlelxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VXNlcigpIHtcclxuICAgICAgbGV0IGNvbmV4aW9uOiBJQ29uZXhpb24gPSBhd2FpdCAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgndXNlcicpKSA/IEpTT04ucGFyc2UoYXRvYihzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpKSA6IG51bGw7XHJcbiAgICAgIC8vY29uc29sZS5sb2coY29uZXhpb24pXHJcbiAgICAgIC8vIGRlYnVnZ2VyXHJcbiAgICAgIGlmIChjb25leGlvbikge1xyXG4gICAgICAgIHRoaXMudXN1YXJpb0FjdGl2byA9IG5ldyBNVXN1YXJpbyhjb25leGlvbi51c3VhcmlvKTtcclxuICAgICAgICB0aGlzLlVSTCA9IGNvbmV4aW9uLnNlcnZpZG9yO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gdG9hc3QgZGUgc3VjY2Vzc1xyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93VG9hc3RTdWNjZXNzKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSB1biB0b2FzdCBkZSBlcnJvclxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93VG9hc3RFcnJvcihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy50b2FzdC5lcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIE11ZXN0cmEgdW4gc3dlZXRhbGVydDIgZGUgw6l4aXRvXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBNZW5zYWplIHF1ZSBzZSB2YSBhIG1vc3RyYXJcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGRhdGUgMjItMTEtMjAyMVxyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgc2hvd1RvYXN0U3VjY2Vzc1N3YWwobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICAgIGljb246ICdzdWNjZXNzJyxcclxuICAgICAgICAgIHRpdGxlOiAnw4l4aXRvJyxcclxuICAgICAgICAgIHRleHQ6IG1lc3NhZ2UsICBcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICBcclxuXHJcbiAgICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gTXVlc3RyYSB1biBzd2VldGFsZXJ0MiBkZSBlcnJvclxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgTWVuc2FqZSBxdWUgc2UgdmEgYSBtb3N0cmFyXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBkYXRlIDIyLTExLTIwMjFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dUb2FzdEVycm9yU3dhbChtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgU3dhbC5maXJlKHtcclxuICAgICAgICBpY29uOiAnZXJyb3InLFxyXG4gICAgICAgIHRpdGxlOiAnwqFFcnJvciEnLFxyXG4gICAgICAgIHRleHQ6IG1lc3NhZ2UsICBcclxuICAgICAgICAgICAgIFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEd1YXJkYSBlbCB1c3VhcmlvIGxvZ3VlYWRvIGVuIGVsIFNlc3Npb25TdG9yYWdlXHJcbiAgICAgKiBAcGFyYW0gdXNlciBVc3VhcmlvIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZW4gZWwgU2Vzc2lvblN0b3JhZ2VcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNhdmVVc2VyKGRhdGE6IElDb25leGlvbik6IHZvaWQge1xyXG4gICAgICB0aGlzLnVzdWFyaW9BY3Rpdm8gPSBuZXcgTVVzdWFyaW8oZGF0YS51c3VhcmlvKTtcclxuICAgICAgdGhpcy5VUkwgPSBkYXRhLnNlcnZpZG9yO1xyXG4gICAgICBsZXQgZW5jcnlwdGVkVXNlcjogc3RyaW5nID0gYnRvYShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3VzZXInLCBlbmNyeXB0ZWRVc2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRlIGEgbGEgdXJsIGEgbGEgY3VhbCBzZSBsZSB2YW4gYSByZWFsaXphciBwZXRpY2lvbmVzIGFsIGJhY2tFbmRcclxuICAgICAqIEBwYXJhbSB1cmwgVVJsIGRvbmRlIHNlIHZhbiBhIHJlYWxpemFyIGxhcyBwZXRpY2lvbmVzXHJcbiAgICAgKiBAcmV0dXJuIHZvaWRcclxuICAgICAqIEBhdXRob3IgTWlndWVsIFJhbcOtcmV6XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRVcmwodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgdGhpcy5VUkwgPSB1cmw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gSW5pY2lhbGl6YSBlbCBzZXJ2aWNpbyBkZSBzaWdlc3BcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGluaXQoKTogdm9pZCB7XHJcbiAgICAgIC8vIFZlcmlmaWNhbW9zIHNpIGhheSB1biB1c3VhcmlvIGVuIGxhIHNlc3Npb25TdG9yYWdlLCBlc3RvIGVzIG5lY2VzYXJpbyBwYXJhIHJlY2FyZ2FyIGxhIHDDoWdpbmFcclxuICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSkge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3VzZXInKSlcclxuICAgICAgICB0aGlzLmdldFVzZXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFZlcmlmaWNhIHNpIHVuIHVzdWFyaW8gZXN0w6EgbG9ndWVhZG9cclxuICAgICAqIEByZXR1cm4gUHJvbWlzZTxib29sZWFuPlxyXG4gICAgICogQGF1dGhvciBNaWd1ZWwgUmFtw61yZXpcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGlzTG9nZ2VkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCd1c2VyJykpIHtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVyRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogYW55IHtcclxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09jdXJyacOzIHVuIGVycm9yJylcclxuICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIG9idGllbmUgZWwgcGVyc29uYWwgc2VndW4gZmlsdHJvXHJcbiAgICAgKiBAcmV0dXJuIE9ic2VydmFibGU8SVJlc3BvbnNlPlxyXG4gICAgICogQGRhdGUgMTUtMTEtMjAyMVxyXG4gICAgICogQHBhcmFtIHRpcG86IHZhbG9yZXMgWydjYXRhbG9nbycsJ2NhdGFsb2dvU25vJywnZGVmYXVsdCcsJ25vbWluYScsJ3Jlc3BvbnNhYmxlcyddXHJcbiAgICAgKiBAcGFyYW1zIGRhdG86b2JqZWN0IHtub21icmU6c3RyaW5nLCBhcGVsbGlkbzpzdHJpbmcsIGNlZHVsYS5zdHJpbmd9IHVzZSBwYXJhIGxhIG9wY2lvbiAnY2F0YWxvZ28nIG8gJ2NhdGFsb2dvU25vJ1xyXG4gICAgICovXHJcbiAgICAgICBwdWJsaWMgZ2V0UGVyc29uYWwodGlwbzpzdHJpbmcsIGRhdG8/OmFueSl7XHJcbiAgICAgICAgICBsZXQgY2VkdWxhPScnO1xyXG4gICAgICAgICAgbGV0IG5vbWJyZT0nJztcclxuICAgICAgICAgIGxldCBhcGVsbGlkbz0nJztcclxuICAgICAgICAgIGxldCBpZEVudGVycHJpc2U9MDtcclxuICAgICAgICBpZihkYXRvKXtcclxuICAgICAgICAgIGNlZHVsYT1kYXRvLmNlZHVsYVxyXG4gICAgICAgICAgbm9tYnJlPWRhdG8ubm9tYnJlXHJcbiAgICAgICAgICBhcGVsbGlkbz1kYXRvLmFwZWxsaWRvXHJcbiAgICAgICAgICBpZEVudGVycHJpc2U9ZGF0by5pZEVudGVycHJpc2VcclxuICAgICAgICB9ICAgICAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL3BlcnNvbmFsX2Rhby5waHA/dGlwbz0ke3RpcG99JmNlZHVsYT0ke2NlZHVsYX0mbm9tYnJlPSR7bm9tYnJlfSZhcGVsbGlkbz0ke2FwZWxsaWRvfSZlPSR7aWRFbnRlcnByaXNlfWAsXHJcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZShcclxuICAgICAgICAgIHJldHJ5KDMpLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcih0aGlzLmhhbmRsZXJFcnJvciksXHJcbiAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVBlcnNvbmFsKGUpKTsgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gXHJcblxyXG4gICAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBvYnRlbmVyIHBlcnNvbmFsIE5vbWluYSBzZWd1biBmaWx0cm9cclxuICAgICAqIEByZXR1cm4gT2JzZXJ2YWJsZTxJUmVzcG9uc2U+XHJcbiAgICAgKiBAZGF0ZSAxNS0xMS0yMDIxXHJcbiAgICAgKiAqIEBwYXJhbSB0aXBvOiB2YWxvcmVzIFsnY2F0YWxvZ28nLCdkZWZhdWx0Jywnbm9taW5hJ11cclxuICAgICAqIEBwYXJhbXMgZGF0bzpvYmplY3Qge25vbWJyZTpzdHJpbmcsIGFwZWxsaWRvOnN0cmluZywgY2VkdWxhLnN0cmluZ30gdXNlIHBhcmEgbGEgb3BjaW9uICdjYXRhbG9nbydcclxuXHJcbiAgICAgKi9cclxuICAgICAgICBwdWJsaWMgZ2V0UGVyc29uYWxOb21pbmEodGlwbzpzdHJpbmcsZGF0bz86YW55KXtcclxuICAgICAgICAgIGxldCBjZWR1bGE9Jyc7XHJcbiAgICAgICAgICBsZXQgbm9tYnJlPScnO1xyXG4gICAgICAgICAgbGV0IGFwZWxsaWRvPScnO1xyXG4gICAgICAgICAgbGV0IGlkRW50ZXJwcmlzZT0wO1xyXG4gICAgICAgICAgbGV0IGlkTm9taW5hPTA7XHJcbiAgICAgICAgaWYoZGF0byl7XHJcbiAgICAgICAgICBjZWR1bGE9ZGF0by5jZWR1bGFcclxuICAgICAgICAgIG5vbWJyZT1kYXRvLm5vbWJyZVxyXG4gICAgICAgICAgYXBlbGxpZG89ZGF0by5hcGVsbGlkb1xyXG4gICAgICAgICAgaWRFbnRlcnByaXNlPWRhdG8uaWRFbnRlcnByaXNlXHJcbiAgICAgICAgICBpZE5vbWluYT1kYXRvLmlkTm9taW5hXHJcbiAgICAgICAgfSAgICAgICAgXHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc25vL2FzaWduYWNpb25fcGVyc29uYWxfbm9taW5hX2Rhby5waHA/XHJcbiAgICAgICAgICB0aXBvPSR7dGlwb30mY2VkdWxhPSR7Y2VkdWxhfSZub21icmU9JHtub21icmV9JmFwZWxsaWRvPSR7YXBlbGxpZG99JmlkTm9taW5hPSR7aWROb21pbmF9JmlkRW50ZXJwcmlzZT0ke2lkRW50ZXJwcmlzZX1gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgICAgICAgIFxyXG4gICAgICAgICAgICBtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1QZXJzb25hbE5vbWluYShlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQHBhcmFtIGlkUGVyc29uYWw6IGlkIGRlbCBwZXJzb25hbFxyXG4gICAqIEBwYXJhbSB0aXBvOiB2YWxvcmVzWydub21pbmFfcGVyc29uYWwnXSBcclxuICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBsYXMgbm9taW5hcyBkZWwgcGVyc29uYWwgcmVzdW1pZGFcclxuICAgKiBAZGVwcmVjYXRlZDsgMjAtMDEtMjJcclxuICAgKiBAcmV0dXJucyBcclxuICAgKi9cclxuICBcclxuICBwdWJsaWMgZ2V0UGVyc29uYWxOb21pbmFSZXN1bWlkYShpZFBlcnNvbmFsOm51bWJlcix0aXBvOnN0cmluZyl7XHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vcGVyc29uYWxfZGFvLnBocD9pZFBlcnNvbmFsPSR7aWRQZXJzb25hbH0mdGlwbz0ke3RpcG99YCxcclxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgICAgXHJcbiAgICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTU5vbWluYVNpbXBsZShlKSk7ICAgICAgICAgICAgICBcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIEpzb24gU2lzdGVtYXMgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICAgICAgKiBAYXV0aG9yIEluZy4gRGltYWx5IENyZXNwb1xyXG4gICAgICAgKi9cclxuICAgICAgIHB1YmxpYyBnZXRQZXJmaWxTaXN0ZW1hKGlkX3VzdWFyaW86bnVtYmVyICl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zc3MvdXN1YXJpb3Nfc2lzdGVtYXNfZGFvLnBocD9pZF91c3VhcmlvPSR7aWRfdXN1YXJpb31gLFxyXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgIFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4geyBcclxuICAgICAgICAgICAgaWYocmVzLmRhdGEubGVuZ3RoPjApe1xyXG4gICAgICAgICAgICAgIHJlcy5kYXRhID0gcmVzLmRhdGEubWFwKGUgPT4gbmV3IE1Vc3VhcmlvU2lzdGVtYShlKSk7ICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzOyAgICAgXHJcbiAgICAgICAgICAgfSlcclxuICAgICAgICAgIFxyXG4gICAgICAgICk7XHJcbiAgICAgIFxyXG4gICB9XHJcblxyXG4gIFxyXG4gICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIEpzb24gTWVudSBwYXJhIGVsIHVzdWFyaW8gZGVmaW5pZG8gc2VndW4gc3UgcGVybWlzb2xvZ2lhIGRlbCBTaXN0ZW1hXHJcbiAgICAgICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgICAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICAgICAgKi9cclxuICAgICAgICAgIHB1YmxpYyBnZXRQZXJmaWxOb0NvbXBvbmVudChpZF91c3VhcmlvOm51bWJlcixzaXN0ZW1hOnN0cmluZywgbmFtZUNvbXBvbmVudDogc3RyaW5nICl7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuVVJMfS9kYW8vc3NzL2RlcmVjaG9zX3VzdWFyaW9fZGFvLnBocD9pZF91c3VhcmlvPSR7aWRfdXN1YXJpb30mc2lzdGVtYT0ke3Npc3RlbWF9Jm5hbWVjb21wb25lbnQ9JHtuYW1lQ29tcG9uZW50fWAsXHJcbiAgICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpIH0pLnBpcGUoICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgfVxyXG4gIFxyXG4gICAgICAgLyoqXHJcbiAgICAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIEpzb24gTWVudSBwYXJhIGVsIHVzdWFyaW8gZGVmaW5pZG8gc2VndW4gc3UgcGVybWlzb2xvZ2lhIGRlbCBTaXN0ZW1hXHJcbiAgICAgICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgICAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgZ2V0SnNvbk1lbnUoaWRfdXN1YXJpbzpudW1iZXIsc2lzdGVtYTpzdHJpbmcpe1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5VUkx9L2Rhby9zc3MvbWVudV9kYW8ucGhwP2lkX3VzdWFyaW89JHtpZF91c3VhcmlvfSZzaXN0ZW1hPSR7c2lzdGVtYX1gLFxyXG4gICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmdldEh0dHBIZWFkZXJzKCkgfSkucGlwZSggICAgICAgICAgXHJcbiAgICAgICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHsgXHJcbiAgICAgICAgICAgICAgIHRoaXMudXNlck1lbnUgPSByZXMuZGF0YTtcclxuICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlck1lbnU7XHJcbiAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICAvKipcclxuICAgICAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBKc29uIE1lbnUgcGFyYSBlbCB1c3VhcmlvIGRlZmluaWRvIHNlZ3VuIHN1IHBlcm1pc29sb2dpYSBkZWwgU2lzdGVtYVxyXG4gICAgICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgICAgICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZW5vXHJcbiAgICAgICovXHJcbiAgICAgIHB1YmxpYyBsb2coYm9keTogTUxvZyApeyAgXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLlVSTH0vZGFvL3Nzcy9sb2dfZGFvLnBocGAsIGJvZHkgLCB7XHJcbiAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5nZXRIdHRwSGVhZGVycygpXHJcbiAgICAgICAgfSkucGlwZSggIFxyXG4gICAgICAgICAgbWFwKChyZXM6IGFueSkgPT4geyAgXHJcbiAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgIFxyXG4gICAgfVxyXG5cclxuICBcclxuICAgICAgICBcclxuICAgLyoqXHJcbiAgICAqIEBuYW1lIEVuY3J5cHREYXRhXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBFbnNjcmlwdGEgdW5hIGV4cHJlc2lvbiBkYXRhXHJcbiAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2XDsW9cclxuICAgICovXHJcbiAgICBwdWJsaWMgRW5jcnlwdERhdGEoIGV4cHJlc2lvbiA6IHN0cmluZyl7XHJcbiAgICAgICBjb25zdCBrZXkgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSAoXCIwMTIzNDU2Nzg5U0lHRVNQXCIpOyAvLyBuw7ptZXJvIGhleGFkZWNpbWFsIGRlIDE2IGTDrWdpdG9zIGNvbW8gY2xhdmVcclxuICAgICAgIGNvbnN0IGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UgKCdTSUdFU1AwMTIzNDU2Nzg5Jyk7IC8vIE7Dum1lcm8gaGV4YWRlY2ltYWwgY29tbyBkZXNwbGF6YW1pZW50byBkZSBjbGF2ZVxyXG4gICAgICAgbGV0IHNyY3MgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZShleHByZXNpb24pO1xyXG4gICAgICAgbGV0IGVuY3J5cHRlZCA9IENyeXB0b0pTLkFFUy5lbmNyeXB0KHNyY3MsIGtleSwgeyBpdjogaXYsIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLCBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcgfSk7XHJcbiAgICAgICByZXR1cm4gZW5jcnlwdGVkLmNpcGhlcnRleHQudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgfVxyXG4gXHJcbiAgICAvKipcclxuICAgICogQG5hbWUgRGVjcnlwdERhdGFcclxuICAgICogQGRlc2NyaXB0aW9uIERlc2VuY3JpcHRhIHVuYSBleHByZXNpb24gZGF0YVxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlw7FvXHJcbiAgICAqL1xyXG4gICAgcHVibGljIERlY3J5cHREYXRhKCBleHByZXNpb24gOiBzdHJpbmcpe1xyXG4gICAgICAgY29uc3Qga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UgKFwiMDEyMzQ1Njc4OVNJR0VTUFwiKTsgLy8gbsO6bWVybyBoZXhhZGVjaW1hbCBkZSAxNiBkw61naXRvcyBjb21vIGNsYXZlXHJcbiAgICAgICBjb25zdCBpdiA9IENyeXB0b0pTLmVuYy5VdGY4LnBhcnNlICgnU0lHRVNQMDEyMzQ1Njc4OScpOyAvLyBOw7ptZXJvIGhleGFkZWNpbWFsIGNvbW8gZGVzcGxhemFtaWVudG8gZGUgY2xhdmVcclxuICAgICAgIGxldCBlbmNyeXB0ZWRIZXhTdHIgPSBDcnlwdG9KUy5lbmMuSGV4LnBhcnNlKGV4cHJlc2lvbik7XHJcbiAgICAgICBsZXQgc3JjcyA9IENyeXB0b0pTLmVuYy5CYXNlNjQuc3RyaW5naWZ5KGVuY3J5cHRlZEhleFN0cik7XHJcbiAgICAgICBsZXQgZGVjcnlwdCA9IENyeXB0b0pTLkFFUy5kZWNyeXB0KHNyY3MsIGtleSwgeyBpdjogaXYsIG1vZGU6IENyeXB0b0pTLm1vZGUuQ0JDLCBwYWRkaW5nOiBDcnlwdG9KUy5wYWQuUGtjczcgfSk7XHJcbiAgICAgICBsZXQgZGVjcnlwdGVkU3RyID0gZGVjcnlwdC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XHJcbiAgICAgICByZXR1cm4gZGVjcnlwdGVkU3RyLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiBcclxuIFxyXG4gICAgLyoqXHJcbiAgICAqIEBuYW1lIGdldFJlc3BvbnNlUGVyZmlsVG9vbGJhclxyXG4gICAgKiBAZGVzY3JpcHRpb24gTWV0b2RvIHF1ZSBvYnRpZW5lIHVuYSByZXNwdWVzdGEgdHJ1ZSBvIGZhbHNlIGJhc2FkbyBlbiB1bmEgZXN0cnVjdHVyYSBzcmluZyBiaW5hbnJpYSBzZWd1biBcclxuICAgICogICAgICAgICAgICAgIGxhIHBvc2ljaW9uIGRhZGEgZGVsIHRvb2xiYXIuIHNlIHBhc2Egc3RyaW5nIGJpbmFyaW8gcXVlIGNvbnRpZW5lIDEgeSAwIGVuIHJlcHJlc2VudGFjaW9uIFxyXG4gICAgKiAgICAgICAgICAgICAgZGUgbGFzIHByb3BpZXN0YWRlcyBhZG1pbmlzdHJhZG9yLGNvbnN1bHRhcixlamVjdXRhcixpbXByaW1pciBldGMgLi4uIGNhZGEgcG9zaWNpb24gc2VjdWVuY2lhbCBcclxuICAgICogICAgICAgICAgICAgIHNpIGVzdGEgZW4gMSBlcyB0cnVlIHkgMCBlbiBmYWxzZSB5IGRldnVsZXZlIGVsIHZhbG9yIHNlZ3VuIGxvIHJlcXVpZXJhIGVsIHVzdWFyaW86XHJcbiAgICAqICAgICAgICAgICAgICBzdHJpbmdiaW5hcmlvIDogJzEwMTEnIHkgcG9zaWNpb24gZXMgMiwgcG9yIHRhbnRvIHNlIHRhcmUgMCB5IGVzIGZhbHNlIHF1ZSByZXByZXNlbnRhIG9wY2lvbiBjb25zdWx0YXIuXHJcbiAgICAqICAgICAgICAgICAgICBFc3RydWN0dXJhIHN0cmluZyBiaW5hcmlvOlxyXG4gICAgKiAgICAgICAgICAgICAgUG9zaWNpw7NuIDpcclxuICAgICogICAgICAgICAgICAgIDAuICBBZG1pbmlzdHJhZG9yICAgICAgICA2LiAgRGVzY2FyZ2FyICAgICAgMTIuIFJldmVyc2FyIGFwcm9iYXIgICAgICAxOC4gUmV2ZXJzYXIgYW51bGFyIGNvbnRhYmlsaXphZG9cclxuICAgICogICAgICAgICAgICAgIDEuICBpbnNlcnRhciAgICAgICAgICAgICA3LiAgRWplY3V0YXIgICAgICAgMTMuIEFudWxhci5cclxuICAgICogICAgICAgICAgICAgIDIuICBBY3R1YWxpemFyICAgICAgICAgICA4LiAgRW52aWFyICAgICAgICAgMTQuIHJldmVyc2FyIGFudWxhclxyXG4gICAgKiAgICAgICAgICAgICAgMy4gIGNvbnN1bHRhciAgICAgICAgICAgIDkuIEltcHJpbWlyICAgICAgICAxNS4gY29udGFiaWxpemFyXHJcbiAgICAqICAgICAgICAgICAgICA0LiAgRWxpbWluYXIgICAgICAgICAgICAgMTAuIFZpc2libGUgICAgICAgIDE2LiByZXZlcnNhciBjb250YWJpbGl6YXJcclxuICAgICogICAgICAgICAgICAgIDUuICBBbnVsYXIgICAgICAgICAgICAgICAxMS4gQXByb2JhciAgICAgICAgMTcuIGFudWxhciBjb250YWJpbGl6YWRvICAgICAgIFxyXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgKiBAYXV0aG9yIEluZy4gV2lsbWVyIEJyaWNlw7FvXHJcbiAgICAqL1xyXG4gICAgIHB1YmxpYyBnZXRSZXNwb25zZVBlcmZpbFRvb2xiYXIoIHN0cmluZ2JpbmFyaW8gOiBzdHJpbmcsIHBvc2l0aW9uIDogbnVtYmVyICl7XHJcbiAgICAgICAgICBsZXQgYmluYXJpbyA9IHN0cmluZ2JpbmFyaW8uc3Vic3RyaW5nKHBvc2l0aW9uLHBvc2l0aW9uKzEpIDtcclxuICAgICAgICAgIGlmIChiaW5hcmlvPT1cIjFcIil7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxyXG4gICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlOyBcclxuICAgICB9XHJcblxyXG4gLyoqXHJcbiAgICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIElwIGRlbCBjbGllbnRlXHJcbiAgICAqIEByZXR1cm4gSnNvbiBkYXRhXHJcbiAgICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICAgKi9cclxuICBwdWJsaWMgZ2V0SVBBZGRyZXNzKCl7ICBcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChcImh0dHA6Ly9hcGkuaXBpZnkub3JnLz9mb3JtYXQ9anNvblwiKSBcclxuICAgIC5waXBlKFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgY2F1Z2h0IGluIHNlcnZpY2UnKVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdpcF9hZHJlc3MnLCAnMTI3LjAuMC4xJyk7XHJcbiAgICAgICAgLy9IYW5kbGUgdGhlIGVycm9yIGhlcmVcclxuXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTsgICAgLy9SZXRocm93IGl0IGJhY2sgdG8gY29tcG9uZW50XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gICAgXHJcbiAgfVxyXG4gLyoqXHJcbiAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICogQHJldHVybiBKc29uIGRhdGFcclxuICAqIEBhdXRob3IgSW5nLiBXaWxtZXIgQnJpY2Vub1xyXG4gICovXHJcbiAgcHVibGljIHNldElwQWRyZXNzKCl7XHJcbiAgICB0aGlzLmdldElQQWRkcmVzcygpLnN1YnNjcmliZSggKHJlc3A6IGFueSkgICA9PiB7XHJcbiAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2lwX2FkcmVzcycsIHJlc3AuaXApO1xyXG4gICAgICAgICB0aGlzLmlwX2FkcmVzcyA9IHJlc3AuaXA7XHJcbiAgICB9KTsgIFxyXG4gIH0gXHJcbiAvKipcclxuICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIGVsIElwIGRlbCBjbGllbnRlXHJcbiAgKiBAcmV0dXJuIEpzb24gZGF0YVxyXG4gICogQGF1dGhvciBJbmcuIFdpbG1lciBCcmljZW5vXHJcbiAgKi9cclxuICBwdWJsaWMgZ2V0SXBBZHJlc3MoKXtcclxuICAgIHRoaXMuaXBfYWRyZXNzID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnaXBfYWRyZXNzJyk7ICBcclxuICB9IFxyXG5cclxuICAgLyoqXHJcbiAgKiBAZGVzY3JpcHRpb24gT2J0aWVuZSBlbCBJcCBkZWwgY2xpZW50ZVxyXG4gICogQHJldHVybiBKc29uIGRhdGFcclxuICAqIEBkaWEgMTktMDUtMjAyMlxyXG4gICovICBcclxuXHJcbiAgICBwdWJsaWMgY3JlYXRlQXVkaXRvcmlhKHNubzpNU25vTG9nW10pe1xyXG4gICAgICBsZXQgYm9keT1bXTtcclxuICAgICAgc25vLmZvckVhY2goZT0+IHtib2R5LnB1c2goZS5kYXRhSW50ZWZhY2UoKSl9KTtcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PElSZXNwb25zZT4oYCR7dGhpcy5VUkx9L2Rhby9zbm8vc2VndXJpZGFkX2Rhby5waHA/YCxib2R5LFxyXG4gICAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKX0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtyZXR1cm4gcmVzO30pXHJcbiAgICAgICk7XHJcbiAgICB9ICBcclxuXHJcbiAvKiogIFxyXG4gICogQGRlc2NyaXB0aW9uIE9idGllbmUgbG9zIHRpcG9zIGRlIGRlcG9zaXRvcyAgKiBcclxuICAqIEBwYXJhbSBwcm9jZWRlIDogcHJvY2VkZSBkZWwgbW9kdWxvXHJcbiAgKiBAcGFyYW0gaWRBcnRpY3VsbyA6IGlkIGRlbCBhcnRpY3Vsb1xyXG4gICogQHBhcmFtIGlkVXN1YXJpbyA6IGlkIHVzdWFyaW8gcGVybWl0aWRvXHJcbiAgKiBAcmV0dXJucyBcclxuICAqIEBhdXRob3IgSmF2aWVyIFRvdmFyXHJcbiAgKiBAZGF0ZSAyMy0xMS0yMDIyXHJcbiAgKi8gICAgICBcclxuICBwdWJsaWMgZ2V0RGVwb3NpdFR5cGUocHJvY2VkZTpzdHJpbmcsaWRBcnRpY3VsbzpudW1iZXIsaWRVc3VhcmlvPzpudW1iZXIpe1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8SVJlc3BvbnNlPihgJHt0aGlzLlVSTH0vZGFvL3Npdi9jYXRhbG9nb19wYXJhbWV0cml6YWRvX2Rhby5waHA/Z2V0PSR7cHJvY2VkZX0maWQ9JHtpZEFydGljdWxvfSZpPSR7aWRVc3VhcmlvfWAsXHJcbiAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICAgXHJcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLnN1Y2Nlc3MpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgcmVzLmRhdGEgPSByZXMuZGF0YS5tYXAoZSA9PiBuZXcgTVRpcG9EZXBvc2l0b3MoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqICBcclxuICAqIEBkZXNjcmlwdGlvbiBPYnRpZW5lIENhcmdvcyBBZGljaW9uYWxlcyAgKiBcclxuICAqIEBwYXJhbSB0aXBvIDogb25lLGRlZmF1bHRcclxuICAqIEBwYXJhbSBpZCA6IGlkIGRlbCBjYXJnbyBcclxuICAqIEByZXR1cm5zIFxyXG4gICogQGF1dGhvciBEaW1hbHkgQ3Jlc3BvXHJcbiAgKiBAZGF0ZSAxMy0xMS0yMDIyXHJcbiAgKi8gICAgICBcclxuICBwdWJsaWMgZ2V0Q2FyZ29zQWRpY2lvbmFsZXModGlwbzpzdHJpbmcsaWQ/Om51bWJlcil7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxJUmVzcG9uc2U+KGAke3RoaXMuVVJMfS9kYW8vc3RiL2Nhcmdvc19hZGljaW9uYWxlc19kYW8ucGhwP3RpcG89JHt0aXBvfSZpZD0ke2lkfWAsXHJcbiAgICB7IGhlYWRlcnM6IHRoaXMuZ2V0SHR0cEhlYWRlcnMoKSB9KS5waXBlKCAgICBcclxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2VzcykgeyAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXMuZGF0YSA9IHJlcy5kYXRhLm1hcChlID0+IG5ldyBNQ2FyZ29zQWRpY2lvbmFsZXMoZSkpOyAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG5cclxuICAgICAgICBcclxufVxyXG5cclxuICBcclxuaW50ZXJmYWNlIGZpbHRyb0N1ZW50YXNQcmVzdXB1ZXN0byB7XHJcbiAgdGlwbz86ICdFJyB8ICdSJyxcclxuICBlc3RhZG8/OiAnQycgfCAnUydcclxufVxyXG5cclxuXHJcbiJdfQ==
|