diff --git a/.codex-links/WebIntranet/AnularPicadas.aspx b/.codex-links/WebIntranet/AnularPicadas.aspx new file mode 100644 index 0000000..37fa47a --- /dev/null +++ b/.codex-links/WebIntranet/AnularPicadas.aspx @@ -0,0 +1,99 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" Async="true" CodeBehind="AnularPicadas.aspx.vb" Inherits="WebIntranet.AnularPicadas" %> + + +
+ +
+

Introducir picada a personal

+
+
    +
  • / Control Horario
  • +
  • / Anular picada a personal
  • +
+
+

+
+ +
+

Persona:

+ + +
+
+
+
+

Del

+ +
+
+

al

+ +
+
+ +
+
+ +
+ +
+
+
+ +
diff --git a/.codex-links/WebIntranet/AnularPicadas.aspx.designer.vb b/.codex-links/WebIntranet/AnularPicadas.aspx.designer.vb new file mode 100644 index 0000000..023f4f4 --- /dev/null +++ b/.codex-links/WebIntranet/AnularPicadas.aspx.designer.vb @@ -0,0 +1,96 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class AnularPicadas + + ''' + '''Control intPicadaPersBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents intPicadaPersBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Li1. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents Li1 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control VAAPBCBLpers. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents VAAPBCBLpers As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control estIncPicBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents estIncPicBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control cbPersonas. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents cbPersonas As Global.DevExpress.Web.ASPxComboBox + + ''' + '''Control fechaInicioListInc. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents fechaInicioListInc As Global.System.Web.UI.HtmlControls.HtmlInputGenericControl + + ''' + '''Control fechaFinListInc. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents fechaFinListInc As Global.System.Web.UI.HtmlControls.HtmlInputGenericControl + + ''' + '''Control btnAnuPic. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents btnAnuPic As Global.System.Web.UI.HtmlControls.HtmlInputButton + + ''' + '''Control tablaPicadasAnular. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents tablaPicadasAnular As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/AnularPicadas.aspx.vb b/.codex-links/WebIntranet/AnularPicadas.aspx.vb new file mode 100644 index 0000000..9cbff2b --- /dev/null +++ b/.codex-links/WebIntranet/AnularPicadas.aspx.vb @@ -0,0 +1,105 @@ +Imports System.Net.Http +Imports Newtonsoft.Json + +Public Class AnularPicadas + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + estIncPicBL.Visible = False + If Session("modo") = "PERSONAL" Then + If Session("persona").Personas(0).Dni = "44286377S" Then + estIncPicBL.Visible = True + End If + Dim persons As List(Of Models.Personal) = Session("persona").Personas + Dim listaPersonas As New List(Of Models.Personal) + Dim listDni = Session("usuariosSeleccionados") + For Each pers As String In listDni + Dim per = persons.FirstOrDefault(Function(x) x.Dni = pers) + listaPersonas.Add(per) + Next + cbPersonas.DataSource = listaPersonas.OrderBy(Function(x) x.Nombre) + cbPersonas.DataBind() + 'Dim DivSelect = "" + 'selPersonas.InnerHtml = DivSelect + Else + Response.Redirect("default.aspx") + End If + End Sub + + Protected Async Sub cargarPicadas(sender As Object, e As EventArgs) + Dim persona As New List(Of String) + persona.Add(cbPersonas.Value) + Dim Fei = CDate(fechaInicioListInc.Value) + Dim Fef = CDate(fechaFinListInc.Value) + + Dim consulta As New Models.Consulta + consulta.listaNif = persona + consulta.fechaInicio = Fei + consulta.fechaFin = Fef + Dim jsonConsulta As String = JsonConvert.SerializeObject(consulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ListPicadasAnular" + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As List(Of Models.listPicadasAnular) = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of Models.listPicadasAnular))(sRespuesta, settings) + + Dim html = "" + + html += "" + + "" + + For Each picada As Models.listPicadasAnular In objetoDatos + Dim check = If(picada.activo = True, "checked", "") + html += "" + Next + + html += "
InactivaFecha / HoraIncidencia
" + picada.fecha.ToString("dd/MM/yyyy HH:mm") + "" + picada.incidencia + "
" + + tablaPicadasAnular.InnerHtml = html + tablaPicadasAnular.Style.Add("display", "flex !important") + End Sub + + Public Shared Async Function ModificarPicadas(cbList As String) As Threading.Tasks.Task(Of String) + + Dim objetoConsulta As New List(Of Models.EditarPicadasAnuladas) + Dim cbList1 = cbList.Split("/") + For Each str As String In cbList1 + Dim s = str.Split("-") + Dim nEdPi As New Models.EditarPicadasAnuladas + nEdPi.idPicada = CInt(s(0)) + nEdPi.estado = CBool(s(1)) + objetoConsulta.Add(nEdPi) + Next + + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EditarPicadasAnular" + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.resultadoEditarPicadasAnuladas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.resultadoEditarPicadasAnuladas)(sRespuesta, settings) + + + Return objetoDatos.mensaje + End Function +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/Clases.vb b/.codex-links/WebIntranet/Clases.vb new file mode 100644 index 0000000..95947dd --- /dev/null +++ b/.codex-links/WebIntranet/Clases.vb @@ -0,0 +1,568 @@ + +Namespace Models + + Public Class TramoTeletrabajoExcepcion + Public Property fechaInicio As Date + Public Property fechaFin As Date + Public Property idExcepTel As Integer + Public Property idPersona As Integer + Public Property motivo As String + + End Class + Public Class ResultadoListadoExcepciones + Public Property resultado As Integer + Public Property mensaje As String + Public Property listado As List(Of TramoTeletrabajoExcepcion) + End Class + Public Class ResultadoListTeletrabajoEntreFechas + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property ListadoEF As List(Of TramosTeletrabajo) + End Class + Public Class TramosTeletrabajo + Public Property id As Integer + Public Property nuDias As Integer + Public Property excepcion As Boolean + Public Property lunes As Boolean + Public Property martes As Boolean + Public Property miercoles As Boolean + Public Property jueves As Boolean + Public Property viernes As Boolean + Public Property motivo As String + Public Property Fei As Date + Public Property Fef As Date + End Class + Public Class resultadoEditarPicadasAnuladas + Public Property resultado As Integer + Public Property mensaje As String + End Class + Public Class EditarPicadasAnuladas + Public Property idPicada As Integer + Public Property estado As Boolean + End Class + Public Class ResultadoObtenerHAD + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property HAD As String + End Class + Public Class EnumDepartamento + Public Property idDep As Integer + Public Property Descripcion As String + End Class + Public Class listPicadasAnular + Public Property id As Integer + Public Property idUsu As Integer + Public Property fecha As Date + Public Property incidencia As String + Public Property activo As Boolean + End Class + + Public Class FechaIniFin + Property fechaInicio As String + Property fechaFin As String + End Class + Public Class ResultadoIdentificacion + Public Property resultado As Integer + Public Property Personas As List(Of Personal) + Public Property FeIniInciPorAceptar As Date + Public Property FeFinInciPorAceptar As Date + Public Property FeIniInciBorrador As Date + Public Property FeFinInciBorrador As Date + Public Property errores As String + End Class + Public Class Identificacion + Public Property Nif As String + Public Property clave As String + Public Property origen As String + Public Property resultado As String + End Class + + Public Class SituacionPersonalOficina + Public Property PerenlaOficina As List(Of PersonaSituacion) + Public Property PerconIncidencia As List(Of PersonaSituacion) + End Class + + Public Class PersonaSituacion + Public Property Nif As String + Public Property ApeNom As String + Public Property Situacion As String + End Class + Public Class GenerarForaTer + Public Property nif As String + Public Property Swift As String + Public Property Bic As String + Public Property Entidad As String + Public Property IBAN As String + End Class + Public Class ResultadoGenerarForaTer + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroForaTer As Byte() + End Class + + Public Class compAcceso + Public Property idAcceso As String + Public Property clave As String + + End Class + + Public Class ResultadoListPicaEntreFechas + Public Property resultado As Integer + Public Property Mensaje As String + Public Property ListadoEF As ListadoPicadasEntreFechas + End Class + Public Class ListadoPicadasEntreFechas + Property ListaDepartamento As List(Of Departamento) + Property FechaInicio As String + Property FechaFin As String + Property HorasTraPeriodo As Double + End Class + + Public Class Departamento + Property NombreDepartamento As String + Property LisPersonas As List(Of PersonaCH) + End Class + Public Class Anos_Meses_Dias + Property Anos As Integer + Property Meses As Integer + Property Dias As Integer + + End Class + Public Class PersonaCH + Property ApellidosNombre As String + Property LisFechasTurnos As List(Of FechaTurno) + Property TotalesPeriodo As TotalPeriodo + End Class + + Public Class FechaTurno + Property DesFechaTurno As String + Property LisPicadasAsistencias As List(Of PicadaAsistencia) + Property TotalesPeriodo As TotalPeriodo + End Class + + Public Class PicadaAsistencia + Property Fecha As String + Property Hora As String + Property HoraReal As String + Property Incidencia As String + Property HorasATrabajar As String + Property HorasTrabajadas As String + Property HorasExtraACompensar As String + Property HorasExtraAguardar As String + Property Saldo As String + Property HorasRecuperables As String + Property HorasIncumplimiento As String + Property HorasTrabajadasTarde As String + Property NumeroPicada As String + End Class + + Public Class TotalPeriodo + Property TotalHorasATrabajar As String + Property TotalHorasTrabajadas As String + Property TotalHorasExtraACompensar As String + Property TotalHorasExtraAguardar As String + Property TotalSaldo As String + Property TotalHorasRecuperables As String + Property TotalHorasIncumplimiento As String + Property TotalHorasTrabajadasTarde As String + End Class + Public Class Persona + Public Property Nombre As String + Public Property Apellidos As String + Public Property DNI As String + Public Property email() As String + Public Property FechaNacimiento As Date? + Public Property Telefono As String + Public Property Direccion As String + Public Property CodigoPostal As String + Public Property Provincia As String + Public Property Poblacion As String + Public Property FechaAlta As Date? + End Class + Public Class NominaTrabajador + Public Property idNominaTrabajador As String + Public Property Descripcion As String + Public Property MesNomina As Integer + End Class + Public Class Incidencias + Public Property idIncidencias As String + Public Property Descripcion As String + Public Property EsInciReloj As Boolean + End Class + Public Class ResultadoHorasExtrasEntreFechas + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property HorasEF As HorasExtEntreFech + End Class + + Public Class HorasExtEntreFech + Property FechaInicio As Date() + Property FechaFin As Date() + Property Nombre As String + Property SaldoPeriodo As String + Property SalcoAcumulado As String + Property ListadoHorasExtras As List(Of HoraExtra) + + End Class + + Public Class HoraExtra + Property Fecha As Date + Property Horas As String + Property Descripcion As String + + End Class + Public Class ClaVaApBc + Property Anno As Integer + Property Nombre As String + Property TotPerVa As String + Property TotDisVa As String + Property TotDifVa As String + Property TotPerAp As String + Property TotDisAp As String + Property TotDifAp As String + Property TotPerBc As String + Property TotDisBc As String + Property TotDifBc As String + Property TotPerDr As String + Property TotDisDr As String + Property TotDifDr As String + Property TotPerHr As String + Property TotDisHr As String + Property TotDifHr As String + + Property ListadoVaApBc As List(Of VaApBc) + End Class + + Public Class VaApBc + Property Fecha As Date + Property FechaFin As Date + Property Descripcion As String + Property HorasManana As String + Property HorasTarde As String + Property NumDias As Integer + End Class + Public Class ResultadoSituacionVAAPBC + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property DiasVAB As List(Of ClaVaApBc) + End Class + 'Public Class ResultadoIdentificacion + ' Public Property resultado As Integer + ' Public Property Personas As List(Of Personal) + ' Public Property FeIniInciPorAceptar As Date + ' Public Property FeFinInciPorAceptar As Date + ' Public Property errores As String + 'End Class + Public Class Personal + Public Property Nombre As String + Public Property Dni As String + Public Property idPersona As Integer + Public Property Departamento As String + Public Property Roll As String + Public Property Grupo As String + Public Property NumeroInciPorAceptar As Integer + Public Property FeIniInciPorAceptar As Date + Public Property FeFinInciPorAceptar As Date + + + End Class + Public Class ListaPersonasDelegadas + Public Property nifIdent As String + Public Property listaPersonasDel As List(Of PersonaDelegada) + End Class + Public Class PersonaDelegada + Public Property Nif As String + Public Property Delegado As Boolean + End Class + + Public Class Consulta + Public Property fechaInicio As Nullable(Of Date) + Public Property fechaFin As Nullable(Of Date) + Public Property listaNif As List(Of String) + End Class + + Public Class ListAsisEntreFechas + Property ListaPersonas As List(Of PersonaAsi) + Property FechaInicio As String + Property FechaFin As String + + End Class + + Public Class PersonaAsi + Property ApellidosNombre As String + Property Nif As String + Property LisAsistencias As List(Of Asistencia) + + End Class + + Public Class Asistencia + Property idAsistencia As Integer + Property DesAsistencia As String + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property HorasTraManana As String + Public Property HorasTraTarde As String + Public Property Observaciones As String + Public Property ExpedienteECO As String + Public Property Estado As String + Public Property DesWeb As String + Public Property Tipo As String + Public Property Ndias As Integer + + End Class + Public Class ResultadoListAsisEntreFechas + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property ListadoEF As ListAsisEntreFechas + Public Property ListadoEFNoAceptada As ListAsisEntreFechas + + End Class + + Public Class ResultadoObtenAsistencia + ''' + ''' Devuelve 0 si es correcto en caso que no sea 0 devuelve error + ''' + ''' + ''' + Public Property Nif As String + Public Property ApellidosNombre As String + Public Property idAsistencia As Integer + Public Property DesAsistencia As String + Public Property idIncidenciaControlHorario As Integer + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property HoraInicioManana As String + Public Property HoraFinManana As String + Public Property HorasTraManana As String + Public Property HoraInicioTarde As String + Public Property HoraFinTarde As String + Public Property HorasTraTarde As String + Public Property Observaciones As String + Public Property PosiblesEstados As List(Of Estados) + Public Property PuedeCambiarEstado As Boolean + Public Property EstadosAsistencia As List(Of EstadosdelaAsistencia) + Public Property IdEstadoActual As Integer + Public Property DesEstadoActual As String + Public Property Expediente As String + Public Property ExisteArchivo As Boolean = False + Public Property Resultado As Integer + Public Property Mensaje As String + + End Class + + Public Class EstadosdelaAsistencia + Public Property FechaHora As Date + Public Property IdTipoEstado As Integer + Public Property Usuario As String + Public Property InformacionAnexa As String + Public Property Observaciones As String + + + End Class + Public Class Estados + Public Property idEstado As String + Public Property Descripcion As String + + End Class + + Public Class EstadosAsistencia + Private Property listaEstados As List(Of Estados) + End Class + + Public Class Incidencia + Public Property idIncidencias As String + Public Property Descripcion As String + Public Property EsInciReloj As Boolean + Public Property RequiereAprobacion As Boolean + Public Property AdmiteDiasCompletos As Boolean + Public Property AdmiteIntervaloDias As Boolean + Public Property AdmiteIntervaloHoras As Boolean + Public Property AdmiteInstanteTemporal As Boolean + Public Property AdmiteRangosFechas As Boolean + Public Property Adjunto As String + Public Property idGrupo As String + Public Property idSubgrupo As String + Public Property visibleWeb As Boolean + Public Property descripcionWeb As String + Public Property ayudaWeb As String + Public Property orden As Integer + ReadOnly Property Nombre As String + Get + If descripcionWeb IsNot Nothing Then + Nombre = descripcionWeb + Else + Nombre = Descripcion + End If + End Get + End Property + + End Class + Public Class FicheroAtrasnmitir + Public Property idRegistro As Integer + Public Property tabla As String + Public Property Fichero As String + + End Class + Public Class ResultadoAlmacenaFicheroAtransmitir + Public Property Resultado As Integer + Public Property Mensaje As String + + End Class + Public Class grupos + Public Property idGrupo As String + Public Property Descripcion As String + Public Property NumIncidencias As Integer + Public Property NumSolicitudes As Integer + Public Property orden As Integer + Public Property ayudaWeb As String + + End Class + Public Class subGrupos + Public Property idSubGrupo As Integer + Public Property ayudaWeb As String + Public Property descripcion As String + Public Property orden As Integer + Public Property numCom As Integer + Public Property numSol As Integer + End Class + Public Class ResultadoSubGruposIncidenciasControlHorario + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property listaSubgrupos As List(Of subGrupos) + End Class + Public Class ResultadoModificaPersonasDelegadas + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property Personas As List(Of Personal) + Public Property FeIniInciPorAceptar As Date + Public Property FeFinInciPorAceptar As Date + End Class + Public Class ConsultaAnnoMes + Public Property Anno As Integer + Public Property Mes As Integer + Public Property listaNif As List(Of String) + End Class + + Public Class ResultadoExcelResumenAsistencia + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + + Public Class AlmacenaFicheroIncidencia + Public Property idAsistencia As Integer + Public Property Fichero As String + End Class + + Public Class ResultadoGenAsisEntreFechas + ''' + ''' Devuelve 0 si es correcto en caso que no sea 0 devuelve error + ''' + ''' + Public Property Resultado As Integer + + Public Property idAsistencia As Integer + + Public Property Mensaje As String + End Class + Public Class ResultadoGenTeletrabajoEntreFechas + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property Errores As List(Of String) + Public Property ListadoEF As ListTeleTrabajoEntreFechas + End Class + Public Class GenTeletrabajoEntreFechas + Public Property ListNif As List(Of String) + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property ListadoEF As ListTeleTrabajoEntreFechas + End Class + Public Class ListTeleTrabajoEntreFechas + Property ListaPersonas As List(Of PersonaAsi) + Property FechaInicio As String + Property FechaFin As String + + End Class + Public Class ListAsisMasivas + + Public Property Nif As String + + Public Property ListAsis As List(Of AsisEstado) + + End Class + + Public Class AsisEstado + + Public Property idAsistencia As Integer + + Public Property idEstado As Integer + + End Class + + Public Class NifPersona + Property Nif As String + End Class + Public Class ResultadoObtenerDatosPersonales + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property DatosPersonales As DatosPersonas + End Class + Public Class ObtenerDatosPersonales + Public Property Nif As String + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property DatosPersonales As DatosPersonas + End Class + Public Class DatosPersonas + Public Property Nif As String + Public Property Direccion As String + Public Property CodigoPostal As String + Public Property Poblacion As String + Public Property Provincia As String + Public Property Telefono As String + Public Property Movil As String + Public Property IBAN As String + End Class + Public Class ResultadoExcelHojaAcreditacionDatos + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + Public Class ExcelHojaAcreditacionDatos + Public Property ListNif As List(Of String) + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + Public Class ResultadoSolicitudConsolidacionGrado + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + Public Class SolicitudConsolidacionGrado + Public Property ListNif As List(Of String) + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + Public Class ResultadoExcelRPT + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + Public Class ExcelRPT + Public Property ListNif As List(Of String) + Public Property FechaInicio As Date + Public Property FechaFin As Date + Public Property Resultado As Integer + Public Property Mensaje As String + Public Property FicheroExcel As Byte() + End Class + +End Namespace diff --git a/.codex-links/WebIntranet/Content/1-oaaf-logo.svg b/.codex-links/WebIntranet/Content/1-oaaf-logo.svg new file mode 100644 index 0000000..10a180d --- /dev/null +++ b/.codex-links/WebIntranet/Content/1-oaaf-logo.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Black.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Black.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Black.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Black.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-BlackItalic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-BlackItalic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-BlackItalic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-BlackItalic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Bold.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Bold.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Bold.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Bold.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-BoldItalic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-BoldItalic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-BoldItalic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-BoldItalic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Italic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Italic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Italic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Italic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Light.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Light.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Light.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Light.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-LightItalic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-LightItalic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-LightItalic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-LightItalic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Medium.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Medium.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Medium.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Medium.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-MediumItalic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-MediumItalic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-MediumItalic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-MediumItalic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Regular.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Regular.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Regular.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Regular.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Thin.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-Thin.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-Thin.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-Thin.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-ThinItalic.ttf b/.codex-links/WebIntranet/Content/FUENTES/Roboto-ThinItalic.ttf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Roboto-ThinItalic.ttf rename to .codex-links/WebIntranet/Content/FUENTES/Roboto-ThinItalic.ttf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Satoshi-Black.otf b/.codex-links/WebIntranet/Content/FUENTES/Satoshi-Black.otf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Satoshi-Black.otf rename to .codex-links/WebIntranet/Content/FUENTES/Satoshi-Black.otf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Satoshi-Regular.otf b/.codex-links/WebIntranet/Content/FUENTES/Satoshi-Regular.otf similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/FUENTES/Satoshi-Regular.otf rename to .codex-links/WebIntranet/Content/FUENTES/Satoshi-Regular.otf diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-brands-400.ttf b/.codex-links/WebIntranet/Content/FUENTES/fa-brands-400.ttf similarity index 96% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-brands-400.ttf rename to .codex-links/WebIntranet/Content/FUENTES/fa-brands-400.ttf index 774d51a..641a489 100644 Binary files a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-brands-400.ttf and b/.codex-links/WebIntranet/Content/FUENTES/fa-brands-400.ttf differ diff --git a/.codex-links/WebIntranet/Content/FUENTES/fa-brands-400.woff2 b/.codex-links/WebIntranet/Content/FUENTES/fa-brands-400.woff2 new file mode 100644 index 0000000..5929101 Binary files /dev/null and b/.codex-links/WebIntranet/Content/FUENTES/fa-brands-400.woff2 differ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-regular-400.ttf b/.codex-links/WebIntranet/Content/FUENTES/fa-regular-400.ttf similarity index 72% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-regular-400.ttf rename to .codex-links/WebIntranet/Content/FUENTES/fa-regular-400.ttf index 8a9d634..7d634a2 100644 Binary files a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-regular-400.ttf and b/.codex-links/WebIntranet/Content/FUENTES/fa-regular-400.ttf differ diff --git a/.codex-links/WebIntranet/Content/FUENTES/fa-regular-400.woff2 b/.codex-links/WebIntranet/Content/FUENTES/fa-regular-400.woff2 new file mode 100644 index 0000000..953d554 Binary files /dev/null and b/.codex-links/WebIntranet/Content/FUENTES/fa-regular-400.woff2 differ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-solid-900.ttf b/.codex-links/WebIntranet/Content/FUENTES/fa-solid-900.ttf similarity index 82% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-solid-900.ttf rename to .codex-links/WebIntranet/Content/FUENTES/fa-solid-900.ttf index 993dbe1..b3a2b64 100644 Binary files a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-solid-900.ttf and b/.codex-links/WebIntranet/Content/FUENTES/fa-solid-900.ttf differ diff --git a/.codex-links/WebIntranet/Content/FUENTES/fa-solid-900.woff2 b/.codex-links/WebIntranet/Content/FUENTES/fa-solid-900.woff2 new file mode 100644 index 0000000..83433f4 Binary files /dev/null and b/.codex-links/WebIntranet/Content/FUENTES/fa-solid-900.woff2 differ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-v4compatibility.ttf b/.codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.ttf similarity index 76% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-v4compatibility.ttf rename to .codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.ttf index ab6ae22..e4eea68 100644 Binary files a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/webfonts/fa-v4compatibility.ttf and b/.codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.ttf differ diff --git a/.codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.woff2 b/.codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.woff2 new file mode 100644 index 0000000..e804f18 Binary files /dev/null and b/.codex-links/WebIntranet/Content/FUENTES/fa-v4compatibility.woff2 differ diff --git a/.codex-links/WebIntranet/Content/Site.css b/.codex-links/WebIntranet/Content/Site.css new file mode 100644 index 0000000..4be33cc --- /dev/null +++ b/.codex-links/WebIntranet/Content/Site.css @@ -0,0 +1,2875 @@ + + +/**************************************ESTILO BASE***********************************/ +:root { + --AzulOAAF: #2291d0; + --GrisOscuroOAAF: #343334; + --AzulClaroOAAF: #6fafd3; + --GrisClaroOAAF: #a4a3a4; + --GrisNeutro: #e9e9e9; + --TT1: #cdf1b1; + --TT2: #52ecf6; + --TT3: #ea8361; + --TTEx: #ba65f5; +} + +.gestionPropia { + --AzulOAAF: #2291d0; + --GrisOscuroOAAF: #343334; + --AzulClaroOAAF: #6fafd3; + --GrisClaroOAAF: #a4a3a4; +} + +.gestionPersonal { + --AzulOAAF: #343334; + --AzulClaroOAAD: #a4a3a4; + --GrisOscuroOAAF: #2291d0; + --GrisClaroOAAF: #6fafd3; +} + +@font-face { + font-family: 'RobotoB'; + src: url('FUENTES/Roboto-Bold.ttf') format('truetype'); +} + +@font-face { + font-family: 'RobotoI'; + src: url('FUENTES/Roboto-Italic.ttf') format('truetype'); +} + +@font-face { + font-family: 'Roboto'; + src: url('FUENTES/Roboto-Regular.ttf') format('truetype'); +} + +@font-face { + font-family: 'SatoshiB'; + src: url('FUENTES/Satoshi-Black.otf') format('opentype'); +} + +@font-face { + font-family: 'Satoshi'; + src: url('FUENTES/Satoshi-Regular.otf') format('opentype'); +} + + +/**************************************ESTILO GENERAL***********************************/ +p { + font-family: "Satoshi"; + +} +.op05{ + opacity:0.5; +} +.celdaBoton{ + cursor:pointer; + text-align:center; + font-weight:bold +} +.celdaBoton:hover { + color:white; + background-color: var(--AzulOAAF); + +} +.celdaH { + background-color: var(--AzulOAAF); + border: 1px solid white; + border-collapse: collapse; + border-bottom: none; +} + + .celdaH p { + text-decoration: none; + color: white; + text-align: center; + word-wrap: break-word; + } + + .celdaH p:hover { + text-decoration: none; + color: white; + } + +.celdaD { + border: 1px solid black; + border-collapse: collapse; + padding-block: 2px; +} + + .celdaD p { + text-align: center; + margin: 0; + color: black; + word-wrap: break-word; + } + +.multiselect { + width: 200px; +} + +.selectBox { + position: relative; +} + + .selectBox select { + width: 100%; + font-weight: bold; + } + +.overSelect { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +#checkboxes { + display: none; + border: 1px #dadada solid; +} + + #checkboxes label { + display: block; + } + + #checkboxes label:hover { + background-color: #1e90ff; + } + +#cajaFiltros { + display: flex; + max-width: 750px; + justify-content: space-between; + margin-bottom: 15px; + margin-inline: auto; + flex-wrap:wrap; +} +#btnPicar { + margin-top: 50px; +} +.cajaModInc { + background-color: white; + padding: 20px; + height: fit-content; + margin-inline: auto; + margin-block: auto; + flex-direction: column-reverse; + display: flex; +} +.oculto{ + display:none !important +} + +#btnAtrasGeneral { + position: fixed; + top: 145px; + left: 160px; + z-index: 6; +} +#tablasPersonalMob { + display: none; +} +#marcoSituacion{ + background-color: #0000007f; + position:fixed; + top:0; + left:0; + width:100%; + height:100vh; + justify-content:center; + align-items:center; + z-index:15; +} +#divSituacion { + padding:20px; + max-width:80%; + max-height:600px; + background-color:white; +} +#tablaActivos{ + max-height:500px; + overflow-y:auto; +} +#tablaInactivos { + max-height: 500px; + overflow-y: auto; +} + +.lblGeneral { + margin-bottom:0; + margin-top:10px; +} +#divCambiarIBAN { + background-color: #000000b2; + width:100%; + height:100vh; + justify-content:center; + align-items:center; + z-index:15; + position:fixed; + top:0; + left:0; +} +#divIBAN { + background-color:white; + padding:20px; + min-width:450px; + max-width:650px; + display:flex; + flex-direction:column; + gap:15px; +} +#IncidenciasPendientesDiv { + background-color: #000000bf; + width: 100%; + height: 100vh; + position: fixed; + top: 0; + left: 0; + z-index: 30; + display: none; + justify-content: center; + align-items: center +} + + +.popupIncPendientes { + height: 180px; + padding: 20px; + display: flex; + min-width: 500px; + background-color: white; + justify-content: center; + position: relative; + flex-direction: column; + /*background-image: url(../content/images/logoModal.png);*/ + /*background-position: left; + background-position-y: bottom; + background-repeat: no-repeat;*/ +} + + +.ListaMenu a { + text-decoration:none; + color:darkgray +} +#txtobservacionesPI { + width: calc(100% - 175px) +} +.tituloMobile { + display:none +} +#usuarioNav { + font-weight: bold; + color: black; + text-decoration: none; + font-family: 'SatoshiB'; +} +.card-header { + background-color: var(--AzulOAAF); + cursor:pointer; +} +.card-header:hover { + background-color:var(--AzulClaroOAAF) +} + +.CardSubgrupo { + border: none; + background-color: transparent; + color: white; +} + +.sombraNavegador { + -webkit-box-shadow: 0px 0px 19px 2px rgba(0,0,0,0.19); + box-shadow: 0px 0px 19px 2px rgba(0,0,0,0.19); +} + +.TablaOAAF th { + font-family: 'RobotoB'; + text-align: start; +} + +.TablaOAAF td { + font-family: 'Roboto'; + text-align: start; +} + +#barraNavegacionVacia { + padding-inline: 160px; + z-index: 5; + flex-direction: column; + left: 0; + top: 0px; + position: fixed; + width: 100%; + background-color: white; +} +#Nav1 { + padding-inline: 160px; + z-index: 5; + flex-direction: column; + left: 0; + top: 0px; + position: fixed; + width: 100%; + background-color: white; +} +.btnHome { + margin-block: 15px; + display: flex; + width: 100%; + font-size: 40px; + justify-content: center; + font-family: 'SatoshiB' !important; + text-decoration: none !important; +} + .btnHome h1{ + padding:0 + } + .btnOAAFAzul { + user-select: none; + cursor: pointer; + background-color: var(--AzulOAAF); + border-radius: 15px; + font-family: 'Satoshi'; + border: none; + color: white !important; + padding: 10px; + text-align: center; + } + + .btnOAAFAzul:hover { + opacity: 0.6; + } + +.btnOAAFBlack { + user-select: none; + cursor: pointer; + padding: 10px; + text-align: center; + background-color: var(--GrisOscuroOAAF); + border-radius: 15px; + font-family: 'Satoshi'; + border: none; + color: white !important; +} + + .btnOAAFBlack:hover { + opacity: 0.6; + } + +.body { + font-family: 'Roboto' +} + +.padding-pag { + padding-inline: 160px; +} + + +.listaTeletrabajo { + transition: all 0.2s +} + +.listaTeletrabajoCheck { + transition: all 0.2s +} + +.listaTeletrabajo:hover { + cursor: pointer; + font-weight: bold; +} + +.listaTeletrabajoCheck:hover { + cursor: pointer; + background-color: var(--GrisClaroOAAF); + color: white; +} + +.diaConTeletrabajo1 { + background-color: var(--TT1); + color: white; +} + + +.diaConTeletrabajo2 { + background-color: var(--TT2); + color: white; +} + + + +.diaConTeletrabajo3 { + background-color: var(--TT3); + color: white; +} + + +.diaConTeletrabajoEx { + background-color: var(--TTEx); + color: white; +} + +.btnCerrarModInc { + border: 1px solid black; + padding: 5px; + padding-inline: 10px; + cursor: pointer +} + + .btnCerrarModInc:hover { + background-color: black; + color: white !important; + } + + +.btnBack:hover { + background-color: var(--AzulClaro) !important +} +.ocultoTurn { + display:none +} +body { + /* position: relative; + padding-top: 150px; + font-family: "Roboto"; + padding-left: 0px; + padding-right: 0px;*/ +} + +/*.collapseInc:not(.show) { + display: none; +}*/ + +.hidden { + display: none +} + +.pagina { + padding-top: 200px; + padding-inline: 160px; +} + +.btnAzul { + cursor:pointer; + height: 38px !important; + background-color: var(--AzulOAAF) !important; + color: white !important; + border-radius: 5px; + border: none; + text-transform: uppercase; + font-family: "RobotoB"; + font-size: 16px; + filter: opacity(0.7); +} + + + .btnAzul:hover { + filter: opacity(1); + } + +.btnGris { + cursor:pointer; + height: 38px !important; + background-color: var(--GrisNeutro) !important; + color: black !important; + border-radius: 5px; + border: none; + text-transform: uppercase; + font-family: "RobotoB"; + font-size: 16px; +} + + .btnGris:hover { + background-color: var(--GrisMedio) !important; + } + +.cajaIntPicadas { + min-width: 425px; +} + +.btnBlanco { + height: 38px !important; + background-color: white !important; + color: var(--AzulOAAF); + border-radius: 5px; + border: none; +} + + .btnBlanco:hover { + background-color: lightgray !important; + } +#navigation { + box-shadow: 10px 25px 31px -26px rgba(0,0,0,0.33); +} +.btnAlargado { + min-width: 200px; + font-size: 16px; +} + +.IntroducirFechas { + margin-bottom: 0px; + line-height: normal; + justify-content: space-evenly; + margin-right: auto; + margin-left: auto; + margin-top: 3rem; + max-width: 740px; +} +.selectInHora { + display: flex; + width: 100% +} +.inFecha { + width: 150px; + height: 30px; + margin-left: 0px; + border-radius: 6px; + border-color: rgba(0,0,0,.1); +} +.row { + margin-right: 0; + margin-left: 0; +} + +.celdaBlanca { + background-color: white !important; + border: 0px none !important; +} + +.pagina { + height: 100vh; +} + +.Loading { + display: none; + width: 100px; + /*animation-name: spin;*/ + animation-duration: 3000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; +} + +#divLoading { + display: none; + z-index: 99; + position: absolute; + width: 100%; + height: 100vh; + background-color: #00000086; +} + + #divLoading .Loading { + display: flex !important; + position: fixed; + width: 150px; + height:auto; + top: 400px; + border-radius: 100%; + left: calc(50% - 75px); + background: white; + padding: 20px; + border-radius: 10px; + } + +#divLoading2 { + position: absolute; + top: 300px; + left: calc(50% - 50px); +} + +#divLoading3 { + position: absolute; + top: 300px; + left: calc(50% - 50px); +} + +#divLoading4 { + position: absolute; + top: 300px; + left: calc(50% - 50px); +} + +#divLoading5 { + position: absolute; + top: 355px; + left: calc(50% - 50px); +} + +#divLoading6 { + position: absolute; + top: 300px; + left: calc(50% - 50px); +} + +.inactivo { + display: none !important; +} + +/*.tablaPicadas tr:nth-child(odd) td { + background-color: #dedede +}*/ +/**************************************BARRA NAVEGACION***********************************/ +.barraNavegacion { + height: 50px; + padding-right: 0px; + padding-left: 15px; + margin-left: 11px; +} + +.top-menu2 { + line-height: 35px; + position: relative; + display: flex; + list-style: none; + padding: 0px; + margin-bottom: 0; +} + + .top-menu2 ul li { + cursor: pointer; + padding: 10px; + background-color: var(--AzulClaroOAAF); + display: none; + max-width: 250px; + line-height: normal; + } + + .top-menu2 li { + color: black !important; + margin-left: 10px; + margin-right: 10px; + cursor: pointer; + transition: all 0.2s + } + + .top-menu2 li:hover { + border-bottom: 4px solid; + border-block-color: var(--AzulOAAF); + color: var(--AzulParlamento) !important; + transition: all 0.2s + } + +#optContHorario { + padding-left: 0; + position: fixed; + top: 105px; + left: calc(50% - 225px); + padding-top: 80px; +} + + #optContHorario li { + color: white; + cursor: pointer; + padding: 10px; + background-color: #F8F9FA; + display: none; + max-width: 250px; + line-height: normal; + } + + #optContHorario:hover li { + transition: all 0.2s; + display: block + } + + #optContHorario:hover li:hover { + transition: all 0.2s; + } +.pag { + min-height: calc(100vh - 396px); + width: 100%; + padding-inline: 10%; + padding-top: 250px; +} +.top-menu2 ul li:hover { + transition: all 0.2s; + display: block; +} + +#navLateral { + padding-inline: 10px; + max-height: calc(100vh - 396px); + overflow: auto; +} + + #navLateral ul { + list-style-type: disc + } + + #navLateral ul li { + cursor: pointer; + margin-block: 15px; + } + + #navLateral ul li a { + color: black; + text-decoration: none + } + + #navLateral ul li:hover { + opacity: 0.6 + } + +.listActivo { + font-weight: bold +} + +.migasDePan { + font-size:14px; + margin-bottom: 40px; +} + + .migasDePan ul { + list-style: none; + display: flex; + gap: 5px; + } + + .migasDePan ul li { + cursor: pointer; + color: blue; + } + + .migasDePan .migaActiva { + cursor: initial; + color: dimgrey + } + + +.navbar-light .navbar-nav .nav-link { + /*color: white !important;*/ + font-family:'Satoshi'; + cursor:pointer; +} + +navbar navbar-expand-lg +#usuarioNav { + color: white !important; + margin-right: 20px; +} + +.separacion { + padding-top: 20px; + width: 100%; + background-color: white; +} + +.item1 { + grid-row-end: 1 / span 2; + display: flex; + justify-content: end !important; +} + +.item2 { + grid-area: nominas; + justify-content: start !important; +} + +.item3 { + grid-area: datosPersonales; + justify-content: start !important; +} + +.grid-container { + display: grid; + grid-template-columns: auto auto; + background-color: #F8F9FA; + padding: 40px; +} + + + + +.recuadroDeHome { + background-color: #F8F9FA; + margin-left: 5%; + margin-right: 5% +} + +.contenedor { + display: flex; +} + +.barraIzquierda { + width: 20px; + height: 90px; + background-color: var(--AzulParlamento); +} + +.barraArriba { + background-color: #5BA1BA; + height: 10px; + margin-left: 20px; + width: calc(100% - 20px); + justify-content: end; + position: fixed; + top: 0px; +} + +.containerNavBar { + background-color: white; + display: flex; + width: 100%; + justify-content: space-between; + align-items: center; +} + +.formatoCategoriasHome { + padding-bottom: 10px; + /*font-family: Neuton-Regular;*/ + color: white; + padding-left: 30px; + font-size: 40px; +} + +.hoverLinkControlHorario { + background-image: url('../Content/images/ControlHorarioImg.png'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + margin: 0px; + padding: 0px; + transition: all 0.2s; +} + + .hoverLinkControlHorario:hover { + background-image: url('../Content/images/ControlHorarioHover.jpg'); + } + + +.hoverLinkDatosPersonales { + background-image: url('../Content/images/DatosPersonalesImg.jpeg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + margin: 0px; + padding: 0px; + transition: all 0.2s; +} + + + .hoverLinkDatosPersonales:hover { + background-image: url('../Content/images/DatosPersonalesHover.jpg'); + } + + +.hoverLinkNominas { + background-image: url('../Content/images/NominasImg.jpeg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + margin: 0px; + padding: 0px; + transition: all 0.2s; +} + + .hoverLinkNominas:hover { + background-image: url('../Content/images/NominasHover.jpg'); + } + +.justificadoCentro { + justify-content: center; +} + +.colorFondoNavBar { + background-color: #F8F9FA !important; + height: 100px; +} + +.titularOpcControlHorario { + font-family: 'Satoshi'; + color: var(--AzulOAAF); + margin-bottom: 40px; +} + + +.divInpHora .row .div { + margin-left: 0px; +} + +#usNav { + display: flex; + margin-right: 20px; + gap: 10px; +} + + #usNav img { + height: 20px; + margin-right: 13px; + margin-top: 5px; + cursor: pointer; + } + +.gestionPersonal #imgUsers div { + filter: hue-rotate(350deg); +} + +.gestionPersonal #imgLogout div { + filter: hue-rotate(350deg); +} + +.gestionPersonal #imgCambioModo div { + filter: hue-rotate(350deg); +} + +#imgLogout div { + background-image: url(../content/images/logoutHover.png); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + height: 25px; + width: 25px; + margin-right: 15px; + transition: all 0.2s; +} + + #imgLogout div:hover { + background-image: url(../content/images/logout.png); + transition: all 0.2s; + } + +#imgCambiarModo i { + height: 25px; + width: 25px; + transition: all 0.2s; +} + + #imgCambiarModo i:hover { + transition: all 0.2s; + } + +#imgUsers div { + height: 25px; + width: 25px; + margin-right: 15px; + transition: all 0.2s; +} + + #imgUsers div:hover { + background-image: url(../content/images/userEdit.png); + transition: all 0.2s; + } + +.usSeleccionado { + padding-top: 90px; + padding-bottom: 10px; + margin-bottom: 15px; +} + + .usSeleccionado p { + margin-top: 0; + padding-inline: 40px; + margin-bottom: 0; + } + +.navbar-brand { + cursor: pointer; + margin-left: 15px; +} + +.nav-pills .nav-link.active, .nav-pills .show > .nav-link { + background-color: var(--AzulClaro); + border-radius: 0px; + padding: 12px; +} + +.navbar-nav { + align-items: center; +} + +.dropdown-menu { + background-color: white; + font-family: 'Roboto'; +} + +.dropdown-item { + color: black; + background-color: white; +} + + .dropdown-item:hover { + border-bottom: 4px solid; + border-color: var(--AzulOAAF); + } + + .dropdown-item.active { + border-bottom: 4px solid; + background-color: white !important; + color: black !important; + border-color: var(--AzulOAAF); + } + + +.incidenciasDesplegable { + background-color: white; + font-family: 'Roboto'; +} + + .incidenciasDesplegable > tr > td { + color: black; + background-color: white; + } + + .incidenciasDesplegable > tr > td:hover { + border-bottom: 4px solid; + border-color: var(--AzulOAAF); + } + + .incidenciasDesplegable > tr > td.active { + border-bottom: 4px solid; + background-color: white !important; + color: black !important; + border-color: var(--AzulOAAF); + } + +.activado { + border-bottom: 4px solid; + border-color: var(--AzulOAAF) !important; +} + +.activadoSub { + border-bottom: 4px solid; + border-color: var(--AzulOAAF) !important; +} + + +#topMenuVacia { + margin-top: 23px; + width: calc(100% - 322px); + margin-left: 15px +} + +#topMenuVacia2 { + margin-top: 23px; + width: calc(100% - 322px); + margin-left: 15px +} + + +/**************************************SELECCION MODO***********************************/ +#usNavVacia { + display: flex +} + + #usNavVacia img { + height: 20px; + margin-right: 13px; + margin-top: 5px; + cursor: pointer; + } + +#imgLogoutVacia div { + background-image: url(../content/images/logoutHover.png); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + height: 25px; + width: 25px; + margin-right: 15px; + transition: all 0.2s; +} + + #imgLogoutVacia div:hover { + background-image: url(../content/images/logout.png); + transition: all 0.2s; + } + +#UsuarioNavVacia { + color: white !important; + margin-right: 20px; +} + + +/**************************************SELECCION USUARIOS***********************************/ + + +#usNavVacia2 { + display: flex +} + + #usNavVacia2 img { + height: 20px; + margin-right: 13px; + margin-top: 5px; + cursor: pointer; + } + +#imgLogoutVacia2 div { + background-image: url(../content/images/logoutHover.png); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + height: 25px; + width: 25px; + margin-right: 15px; + transition: all 0.2s; +} + + #imgLogoutVacia2 div:hover { + background-image: url(../content/images/logout.png); + transition: all 0.2s; + } + +#UsuarioNavVacia2 { + color: white !important; + margin-right: 20px; +} + +#cajaUsuario { + padding-top: 25px; +} + +.divUsuarioSelect p { + margin-bottom: 15px; + padding-left: 40px; +} + +#divBtn { + display: flex; + justify-content: center; +} + +.CBUsuarios { + width: 85%; +} + + .CBUsuarios input { + height: 30px; + } + +#btnSeleccionar { + position: relative; + bottom: 0; + margin-top: 15px; + max-width: 450px; + width: 100%; + margin-inline: auto; +} + +.colorFondoSeleccionPersonas { + background-color: var(--GrisNeutro) !important; +} + +.seleccionando { + height: 100vh; + justify-content: center; + align-items: center; +} + +#cajaSelecciones { + padding-inline: 0px; + display: flex; + flex-direction: column; + margin-left: auto; + margin-right: 5px; + background-color: white; + max-width: 500px; + min-height: 40vh; + max-height: 70vh; + overflow: auto; + position: relative; +} + +#cajaSeleccionados { + padding-inline: 0px; + display: flex; + flex-direction: column; + margin-left: 5px; + margin-right: auto; + background-color: white; + max-width: 500px; + max-height: 70vh; + overflow: auto; +} + +@media (max-width: 992px) { + + .barraArriba { + display: none; + } + + .cajaIntPicadas{ + min-width:0 + } + + #topMenu { + display: none; + } + + .barraIzquierda { + display: none; + } + + .colorFondoNavBar { + margin-top: 0px; + height: 60px; + background-color: var(--AzulOAAF) !important; + } + + #linkLogoParlamento { + display: none; + } + + #usNav { + display: none; + } + + .textoParAnda { + display: flex !important; + } + + .divConMenuHambur { + display: flex !important; + } + + #divElementosCabecera { + display: flex !important; + } + + .separacionHome { + margin-top: 0px !important; + } +} + +.separacionHome { + margin-top: 10px; +} + +.hlist { + display: flex; + flex-direction: column; + background-color: #e5e5e5; + box-shadow: 0px 30px 50px -50px rgba(0,0,0,0.19); +} + + .hlist li { + list-style-type: none; + display: inline-block; + padding: 9px; + } + + + + +#divElementosCabecera { + display: none; +} + +.divConMenuHambur { + display: none; + width: 70px; + height: 60px; + background-color: white; +} + + +.textoParAnda { + display: none; + width: 200px; + height: 80px; + font-size: 25px; + align-items: center; + color: white; +} + +.inpUsuario { + /* + margin-top: 5px; + height: 20px; + width: 20px; + + */ + margin-right: 30px; +} + +#selectAllselUs { + margin-top: 7px; + height: 16px; + width: 16px; + margin-right: 20px; +} + +.inpDep { + margin-top: 7px; + min-height: 16px; + min-width: 16px; + margin-right: 20px; +} + +.pUsuario { + line-height: 30px; + margin: 0; +} + +.divUsuario { + margin-bottom: 15px; + padding-inline: 40px; +} + +.fondoAzulOscuro { + background: var(--AzulOAAF); + color: white; + padding-block: 10px; +} + +.divDep { + font-size: 20px; +} + +/**************************************CONTROL HORARIO***********************************/ +#pagControlHorario2 { + position: absolute; + top: 0px; + left: 0; + z-index: -1; + height: 100vh; + width: 100%; + background-repeat: no-repeat; + background-size: 60%; + background-position-x: left; + opacity: 0.5; + background-position-y: bottom; +} + +.menusControlHorario2 ul { + position: absolute !important; + top: 300px; + padding-left: 0; +} + +.menusControlHorario2 a { + text-decoration: none; + color: white !important; + font-size: 25px; +} + +.menusControlHorario2 p { + margin: 0px; + cursor: pointer; +} + +.categoriasLiCH { + user-select: none; + font-family: 'Satoshi' !important; + transition: all 0.2s; + margin-bottom: 15px; + color: var(--AzulOAAF); +} + + .categoriasLiCH:hover { + border-bottom: 4px solid; + border-color: var(--AzulOAAF); + font-size: 30px + } + +.menuItemCH { + position: inherit; + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + padding-left: 80px; + padding-top: 5px; + padding-bottom: 5px; + margin-top: 15px; + margin-bottom: 15px; + min-width: 600px; + max-width: 850px; + min-height: 40px; + background-color: var(--AzulClaro); + transition: all 0.2s; +} + + .menuItemCH:hover { + transform: scale(110%); + transform-origin: 0% 100%; + background-color: var(--AzulOAAF); + transition: all 0.1s; + } + +/************************************** HOME ***********************************/ + +.btnSeccion { + border-radius: 5px; + width: 100%; + max-width: 700px; + height: 320px; + position: relative; + background-size: cover; + background-position: center; + background-repeat: no-repeat; + transition: all 0.2s +} + + .btnSeccion img { + border-bottom-left-radius: 5px; + } + + .btnSeccion:hover { + transform: scale(102%); + filter: grayscale(100%); + transition: all 0.2s + } + +.datosPersonales { + display: flex; + justify-content: right; +} + +.nominas { + justify-content: right; + display: flex; +} + + +/************************************** NOMINAS ***********************************/ +.inptxt { + border-radius: 15px; + border-width: 1px; + padding-inline: 15px; + text-align: end; + font-family: 'Roboto'; +} + +.intAnyoNominas { + margin-bottom: 30px; +} + + .intAnyoNominas p { + font-family: "Roboto"; + color: var(--AzulOAAF); + margin-right: 15px; + margin-bottom: 0px; + line-height: 38px !important; + } + + +#mensajeError { + color: red; + text-align: center +} + +.listadoNominas { + margin-top: 0rem !important; +} + + .listadoNominas ul li { + height: 50px; + width: 100% !important; + font-family: 'Roboto'; + color: white; + background-color: var(--GrisClaroOAAF); + list-style: none !important; + border: solid; + border-width: 1px !important; + border-color: black; + cursor: pointer; + } + + .listadoNominas ul li:hover { + opacity: 0.6; + } + + .listadoNominas ul li p { + margin-bottom: 0px !important; + height: 20px; + margin-left: 20px; + line-height: normal; + } + +/************************************** INTRODUCIR PICADA ***********************************/ + +.secPicada { + padding: 50px; + padding-top: 25px; + font-size: 20px; + margin-top: 50px; + width: 100%; +} + +#fechaHoraPicada { + font-weight: bolder; + font-size: 20px; +} + +#fechaActual p { + font-family: 'Roboto'; + margin-bottom: 25px; +} + +.incidencias { + height: 40px; + margin-bottom: 25px; +} + + .incidencias p { + font-size: 15px; + line-height: 35px; + margin-bottom: 0px; + } + +.nombreDiaSemana { + font-size: 16px; +} + +.divListadoTeletrabajo { + height: 100%; + width: 85%; + background-color: var(--GrisNeutro); +} + +.selectIn { + border-radius: 15px; + min-height: 30px; + font-family: 'Roboto'; + width: calc(100% - 260px) +} + + .selectIn .dxeButton { + transition: all 0.2s; + background: var(--AzulOAAF); + border-radius: 0 !important; + border-bottom-right-radius: 15px !important; + border-top-right-radius: 15px !important; + } + + .selectIn .dxeButton:hover { + opacity: 0.6; + } + + .selectIn .dxic { + padding-inline: 10px !important; + border-radius: 15px; + background-color: white; + } + + .selectIn .dxpcDropDown { + background: white; + font-family: 'Roboto'; + } + + .selectIn .dxeButton { + border-radius: 5px; + } + + .selectIn p { + margin-bottom: 0px !important; + } + +#mensajePicada { + margin-top: 30px; + width: 100%; + display: flex; + justify-content: center; + margin-left: auto; + margin-right: auto; + font-size: 18px; + max-width: 400px; + text-align: center; + margin-top: 20px; + font-weight: bold; +} + + +#selIncidenciaNoReloj { + width: calc(100% - 185px); +} +/***************************************** teletrabajo******************************/ + +.txtAreaIntTeletrabajo { + height: 230px; + width: 560px; + resize: none; +} + +.fondoVentanaTeletrabajo { + background-image: url(../content/images/logoModal.png); + background-position: left; + background-position-y: bottom; + background-repeat: no-repeat; +} + +/************************************** LISTADO PICADAS ***********************************/ +#mensaje { + color: red; + font-weight: bold; + margin-top: 1rem; + text-align: center; +} + +#btnImprimir { + display: none; + /*background-color: var(--AzulClaro);*/ + color: white !important; +} + +.btnMostrar { + text-align: center !important; + background-color: var(--AzulClaro); + color: white !important; +} + +#tablaPicadas { + /* width: 95%; + margin-left: auto; + margin-right: auto;*/ +} + +.tablaPicadas { + margin-left: auto; + margin-right: auto; + max-height: 540px; + /*overflow-y: scroll;*/ + /*overflow-x: hidden;*/ + position: relative; + border: 1px solid black; + border-collapse: collapse; + width: 95%; + background-color: #fafafa; + overflow-x:auto; +} + + .tablaPicadas table { + width: 100%; + } + + .tablaPicadas td { + padding-left: 5px; + padding-right: 5px; + width: auto; + border: 1px solid black; + border-collapse: collapse; + background-color: white; + } + + .tablaPicadas th { + position: sticky; + top: -1px; + padding-left: 5px; + padding-right: 5px; + background-color: var(--AzulOAAF); + color: white; + font-weight: bold; + /*border: 1px solid white;*/ + border-collapse: collapse; + text-align: center; + } + +.table-striped > tbody > tr:nth-child(odd) > td, +.table-striped > tbody > tr:nth-child(odd) > th { + background-color: white; +} + + +.tablaPicadas2 { + margin-left: auto; + margin-right: auto; + max-height: 540px; + overflow-y: scroll; + /*overflow-x: hidden;*/ + position: relative; + border: 1px solid black; + border-collapse: collapse; + width: 95%; + background-color: #fafafa; +} + + .tablaPicadas2 table { + width: 100%; + } + + .tablaPicadas2 td { + padding-left: 5px; + padding-right: 5px; + width: auto; + border: 1px solid black; + border-collapse: collapse; + background-color: white; + } + + .tablaPicadas2 th { + position: sticky; + top: 0px; + padding-left: 5px; + padding-right: 5px; + background-color: var(--AzulOAAF); + color: white; + font-weight: bold; + border: 1px solid white; + border-collapse: collapse; + text-align: center; + } + +/*#mostrarGeneral { + background-color: var(--AzulClaro); + display: none; + color: white; +} +#mostrarGeneralInc { + text-align: center !important; + margin-left:2.5%; + width: max-content; + background-color: var(--AzulClaro); + display: none; + color: white; +} +*/ + +.btnPersona { + text-align: center !important; + background-color: var(--AzulOAAF); + color: white !important; +} + +/************************************** INTRODUCIR SOLICITUDES ***********************************/ + +.anchoComboBox { + min-width: calc(100% - 260px); +} + +.observacionesSolici { + height: 80px; + font-size: 18px; + text-align: start; + padding-left: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.4em; + padding-right: 0.4em; + vertical-align: top; + resize: none; + width: calc(100% - 260px); +} + +/************************************** INTRODUCIR INCIDENCIAS ***********************************/ + +.fechainiciosolo { + width: 360px; +} + +.divInpHora { + min-width: 150px; +} + +.incidenciasInt { + width: 100%; + display: flex; +} + + .incidenciasInt p { + /*margin-right: 15px;*/ + margin-top: 0px; + margin-bottom: 0.5rem !important; + } + +.txtInputPrepend { + background: rgb(128, 128, 128) !important; + color: white; + font-size: 10px; + height: 30px; + width: 55px; + margin-left: 5px; + border: none; +} + +.divInpHora { + min-width: 150px; +} + +.inHora { + height: 30px; + margin-left: 0px; +} + +#inpObservaciones { + height: 80px; + font-size: 12px; + text-align: start; + padding-left: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.4em; + padding-right: 0.4em; + vertical-align: top; + width: calc(100% - 260px) +} + +#mensajeIncidencia { + font-size: 20px; + margin-top: 20px !important; + width: 100%; + text-align: center; + color: red; + font-weight: bold; + margin-bottom: 0px; +} + +#mensajeSolicitudes { + font-size: 20px; + margin-top: 20px !important; + width: 100%; + text-align: center; + color: red; + font-weight: bold; + margin-bottom: 0px; +} +/************************************** BOLSA HORAS ***********************************/ +#tablaBolsaHoras { + width: 95%; + margin-left: auto; + margin-right: auto; +} + + #tablaBolsaHoras .tablaPicadas td { + padding: 3px; + padding-left: 10px; + padding-right: 10px; + } + +/************************************** DESGLOSE INCIDENCIA ***********************************/ + +#DesgIncidencia #tablaIncidencia { + border-radius: 5px !important; +} + + #DesgIncidencia #tablaIncidencia th { + text-align: start; + padding: 10px; + width: 200px; + } + + #DesgIncidencia #tablaIncidencia td { + padding: 10px; + } + + #DesgIncidencia #tablaIncidencia td span { + color: white; + margin-left: -10px; + margin-right: 10px; + background-color: grey; + padding: 13px; + } + +.linkIncidencia { + color: #0e7fd6 !important; + text-align: end !important; + cursor: pointer; +} + +#listEstadosInc { + margin-top: 40px; +} + +.DesgIncAtras { + height: 50px; + width: 70px; + position: fixed; + top: 125px; + z-index: 10; + left: 160px; + transition: all 0.2s +} + + +.estado { + display: flex; +} + + .estado input { + margin-right: 5px; + } + + .estado p { + line-height: 30px; + margin-bottom: 0px; + } + +#filtroEstados { + display: flex; + margin-inline: auto; + width: fit-content; + gap: 30px; + padding: 10px; + background-color: var(--AzulOAAF); + color: white; + padding-inline: 30px; + border-radius: 10px; +} + +} +/************************************** VAAPBC ***********************************/ +.tblVAAPBC td { + padding: 3px; + padding-inline: 5px +} + +#mensajeVAAPBC { + text-align: center; + color: red; + font-size: 18px; +} + +/************************************** ANTIGUOS ***********************************/ + +#pagControlHorario { + position: absolute; + top: -165px; + left: 0; + z-index: -1; + height: 100vh; + width: 100%; + background-repeat: no-repeat; + background-size: cover; + background-position-x: right; + background-position-y: bottom; + background-image: url('images/FondoControlHorario.png'); +} + +.menusControlHorario { + position: absolute; + top: 70px; + left: -30px; +} + + .menusControlHorario a { + text-decoration: none; + color: white !important; + font-size: 25px; + } + + .menusControlHorario p { + cursor: pointer; + margin: 0px; + } +/* +#btnPicar { + background-color: white; + color: var(--AzulOAAF); + width: 100%; + font-size: 20px; +} + + #btnPicar:hover { + background-color: grey; + color: white; + } +*/ +#btnIntIncidencia { + background-color: white; + color: var(--AzulOAAF); + width: 100%; + font-size: 20px; +} + + #btnIntIncidencia:hover { + background-color: grey; + color: white; + } + +/************************************** CALENDARIO ***********************************/ + +.diaDeLaSemana { + padding-left: 5px !important; + border: 2px solid var(--GrisOscuro); + max-height: 20%; + width: 14.28%; + padding: 0px; + height: 50px; + cursor: pointer +} + +/*.diaDeLaSemanaActivo:hover { + border: 1px solid var(--GrisMedio); + color: var(--GrisMedio) +} +*/ +.finSemana { + background-color: #f7f7f7; +} + +.icoNavCalendario { + color: black !important; + font-size: 20px !important; +} + +.numeroCalendario { + margin-right: 10px; + line-height: normal; + margin-top: 5px; + font-size: 23px; +} + + + +.diaVacio { + border: 0px none; +} + +#calendarioPicadas { + width: 400px; + position: absolute; + top: 300px; + left: calc(50% - 200px) +} + +} + +/************************************** ANIMACIONES ***********************************/ + +@keyframes spin { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +/************************************** PRINT ***********************************/ + +@media print { + @page { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + + body { + padding-top: 5rem !important; + padding-bottom: 5rem !important; + } + + .myDivToPrint { + display: block; + background-color: white; + height: 100%; + width: 100%; + position: fixed; + top: 0; + left: 0; + margin: 0; + padding: 15px; + font-size: 14px; + line-height: 18px; + -webkit-print-color-adjust: exact; + border-spacing: 0px !important; + } + + .header { + display: none; + } + + .footer { + display: none + } +} + +/************************************** MOVIL ***********************************/ + +@media (max-width: 1312px) { + .btnSeccion { + max-width: 100%; + height: 200px; + margin-inline: 0 !important; + } + + .nominas { + margin-inline: 0; + margin-bottom: 0px; + } + + .controlHorario { + margin-inline: 0; + } +} + +@media (max-width: 991px) { + .estado p{ + font-size:12px; + } + #fechaHoraPicada{ + width:100%; + display:flex; + } + #txtobservacionesPI { + width: 100% + } + .ListaMenu li { + margin-block:15px + } + #tablasPersonalMob { + display: flex; + flex-direction: column + } + #divSituacion { + max-width:90% + } + #collapse1 #Div2 { + padding:0 !important; + } + #collapse2 #Div4 { + padding:0 !important; + } + #divSituacion{ + overflow-y:auto + } + #tAct{ + display:none; + } + #tAus{ + display:none; + } + .tituloTabla { + font-size: 15px + } + + #labelArchivo { + line-height: 0; + margin-bottom: 12px !important; + margin-top: 20px; + } + + .inpArchivoDiv { + flex-direction: column; + width: auto; + height: 120px; + } + + .divInpHora { + width: 100% !important + } + + .colVaciaFooter { + display: none !important + } + + .cajaModInc { + padding: 0px; + padding-block: 20px + } + + #DesgIncidencia #tablaIncidencia td { + display: flex; + padding: 0; + } + + #DesgIncidencia #tablaIncidencia td span { + width: 75px; + } + + .tituDesgSol { + width: 100% + } + + .tablaDesgSol { + width: 100%; + } + + .barraArriba { + display: none; + } + + #topMenu { + display: none; + } + + .barraIzquierda { + display: none; + } + + .colorFondoNavBar { + margin-top: 0px; + height: 60px; + background-color: var(--VerdeParlamento) !important; + } + + #cajaSelecciones { + margin-inline: auto !important + } + + #linkLogoParlamento { + display: none; + } + + #usNav { + display: none; + } + + #nombreUsVacio { + color: white !important + } + + .textoParAnda { + display: flex !important; + } + + .divConMenuHambur { + display: flex !important; + } + + #divElementosCabecera { + display: flex !important; + } + + .separacionHome { + margin-top: 0px !important; + } + + .fondoOscuro { + position: fixed; + width: 100%; + left:0; + height: 100vh; + background-color: #000000bb + } + + .dropdown-item:active { + background-color: transparent + } + + .tituloMobile { + display: flex; + margin-left: 15px; + } + + .migasDePan { + display: none + } + + .CardSubgrupo { + white-space: break-spaces; + text-align: start; + font-size: 15px; + } + + .dropdown-item { + margin-block: 10px; + white-space: pre-wrap + } + .navegadorMobile { + display: block; + width: 100%; + z-index:15; + } + .navegadorMobile a { + /*font-weight: bold;*/ + text-decoration:none + } + #navigation { + display: none + } + + .pag { + margin-top: 0; + padding-inline: 10px; + min-height: calc(100vh - 328px); + } + + body { + /*padding-top: 80px*/ + } + .padding-pag { + padding-inline:10px + } + .formatoCategoriasHome { + font-size: 30px; + text-align: center; + width: 100%; + padding: 0; + } + + #navLateral { + display: none + } + + .soloMovil { + display: unset + } + /* body { + padding-top:40px + }*/ + + .soloDesk { + display: none !important + } + + .botonesListados { + margin-inline: auto; + justify-content: center; + } + + + .secPicada { + font-size: 15px; + margin-top: 20px; + padding:0; + } + + .popupIncPendientes { + min-width: 400px; + } + + .popupIncPendientes .btnAzul { + font-size: 13px + } + + .popupIncPendientes .btnGris { + font-size: 13px; + } + + .listadoControlHorario { + top: 190px; + left: 15px; + } + + .listadoDatosAdministrativos { + top: 190px; + left: 15px; + } + + .DesgIncAtras { + margin-left: 15px; + } + + #mensajeGestPersonal { + display: none !important + } + + .barraNavegacion { + flex-direction: column; + height: auto; + align-items: start; + padding-inline: 0 !important; + position: relative; + margin-left: 0; + padding-left: 0; + } + + .titularOpcControlHorario { + margin-left: 15px; + margin-bottom: 25px; + } + + #barraNavegacion { + background-color: white; + padding-inline: 0 !important; + } + + #footer { + padding-inline: 0 + } + + .divListadoTeletrabajo { + width: 100%; + } + + #areaAgenda { + width: 100%; + } + + .tablaPicadas th { + min-width: 100px; + } + + .seccionHomeDesk { + display: none; + } + + .seccionHomeMobile { + display: flex; + } + + #topMenuVacia { + width: 100%; + margin-left: 0; + padding-block: 10px; + } + + .navbar-nav { + align-items: start; + } + + .top-menu2 { + flex-direction: column; + margin-bottom: 15px; + width: 100%; + } + + .top-menu2 li { + margin: 0px; + max-width: 100% !important; + padding-left: 30px; + } + + #menucolapsable { + width: 100% !important; + } + + #filtroEstados { + gap: 15px; + } + + #optContHorario { + padding-left: 0; + position: relative; + width: 100%; + left: auto; + top: auto; + padding-top: 0; + } + + #optContHorario li { + padding-left: 50px !important; + width: 100%; + } + + #usNav { + margin-left: 30px; + margin-bottom: 15px; + } + + #NavbarMenuComp { + margin-left: 15px; + } + + #imgLogoMobileSelModo { + display: flex; + } + + #imgLogoDeskSelModo { + display: none + } + + #menucolapsable { + height: auto !important; + } + + .btnSeccion { + max-width: 100%; + height: 80px; + margin-inline: 0 !important; + } + + .nominas { + margin-inline: 0; + margin-bottom: 0px; + } + #btnAtrasGeneral { + top: 25px; + left: 225px; + } + .controlHorario { + margin-inline: 0; + } + + .imgBarraVacia { + display: none + } + + .btnSeccion img { + height: 60px; + } + + .btnAzul { + cursor:pointer; + margin-top: 20px; + } + + .btnGris { + cursor:pointer; + margin-top: 20px + } + + #cajaSeleccionados { + display: none; + } + + .menuItemCH { + min-width: 0; + max-width: 100%; + padding-right: 20px; + } + + .home { + margin-inline: 0 !important; + padding-inline: 0 !important; + } + + .row { + margin-inline: 0 !important; + } + + #Home .home { + margin-top: 0 !important; + } + + .intAnyoNominas input { + width: 70%; + } + + .intAnyoNominas #inAnno { + margin-right: 0; + } + + .incidenciasInt { + flex-direction: column; + } + + #selIncidenciaNoReloj { + width: 100%; + } + + #inpExpediente { + width: 100% !important; + } + + #inpObservaciones { + width: 100% !important; + } + + .pagina { + max-width: 100%; + overflow-x: auto; + } + + .selectInHora { + flex-direction: column; + } + + .input-group { + flex-wrap: nowrap; + margin-top: 5px; + } + + .selectIn { + width: 100%; + } + + .inFecha { + width: inherit; + } + + .incidenciasInt p { + margin-bottom: 1rem !important; + } + + .IntroducirFechas { + width: auto !important; + } + + #selecctorInps { + display: block !important; + } + + #selecctorInps input { + width: 100% !important; + } + .btnHome{ + font-size:20px; + } + .DesgIncAtras{ + left:20px; + z-index:0 !important + } + .CBUsuarios { + height: 30px; + width: 100%; + } + + .divTablas { + max-width: 95%; + overflow: scroll; + margin-inline: auto; + } + + .pUsuario { + max-width: calc(100% - 40px); + } + + .burgerMenuActivo { + background-color: var(--AzulOAAF); + color: white; + } + + .burgerMenuActivo span { + filter: invert(1) + } + + #filtroEstados { + max-width: 100%; + flex-wrap: wrap; + } + + .cajaTabla { + max-width: 100%; + overflow-x: scroll; + margin-bottom: 25px + } + + #mensajeGestPersonal { + margin-left: 15px !important; + margin-top: 0px !important; + font-size: 30px !important; + } + .pag{ + padding-top:150px !important; + } +} + + +@media (max-width: 450px) { + .textoContacto { + font-size: 13px + } + + .popupIncPendientes { + min-width: 350px; + } +} +/*@media (max-width: 991px) {*/ + + /**************************************BARRA NAVEGACION***********************************/ + /*.menusControlHorario2 ul { + top: 190px; + padding-left: 20px; + } + + .menusControlHorario ul { + top: 190px; + padding-left: 20px; + } + + #mensajeGestPersonal { + display: none !important; + } + + #divDI { + margin-top: 0 !important; + } + + #divCH { + margin-top: 0 !important; + } + + .pagina { + padding-inline: 20px; + } + + .DesgIncAtras { + left: 20px; + } + + .padding-pag { + padding-inline: 20px; + } + + .barraNavegacion { + flex-direction: column; + height: auto; + align-items: start; + padding-inline: 0; + position: relative; + margin-left: 0; + padding-left: 0; + } + + #barraNavegacion { + padding-left: 0; + padding-top: 0; + } + + #topMenuVacia { + width: 100%; + margin-left: 0; + padding-block: 10px; + } + + .navbar-nav { + align-items: start; + } + + .top-menu2 { + flex-direction: column; + margin-bottom: 15px; + width: 100%; + } + + .top-menu2 li { + margin: 0px; + max-width: 100% !important; + padding-left: 30px; + } + + #menucolapsable { + width: 100% !important; + } + + #optContHorario { + padding-left: 0; + position: relative; + width: 100%; + left: auto; + top: auto; + padding-top: 0; + } + + #optContHorario li { + padding-left: 50px !important; + width: 100%; + } + + #usNav { + margin-left: 30px; + margin-bottom: 15px; + } + + #NavbarMenuComp { + margin-left: 15px; + } + + #menucolapsable { + height: auto !important; + } + + .btnSeccion { + max-width: 100%; + height: 200px; + margin-inline: 0 !important; + } + + .nominas { + margin-inline: 0; + margin-bottom: 0px; + } + + .controlHorario { + margin-inline: 0; + } + + .btnSeccion img { + height: 60px; + } + + .btnAzul { + margin-top: 10px; + } + + #cajaSeleccionados { + display: none; + } + + .menuItemCH { + min-width: 0; + max-width: 100%; + padding-right: 20px; + } + + .home {*/ + /*margin-top: 50px;*/ + /*} + + #Home .home { + margin-top: 0 !important; + } + + .intAnyoNominas input { + width: 70%; + } + + .intAnyoNominas #inAnno { + margin-right: 0; + } + + .incidenciasInt { + flex-direction: column; + } + + #selIncidenciaNoReloj { + width: 100%; + } + + #inpExpediente { + width: 100% !important; + } + + #inpObservaciones { + width: 100% !important; + } + + .selectInHora { + flex-direction: column; + } + + .input-group { + flex-wrap: nowrap; + margin-top: 5px; + } + + .inFecha { + width: inherit; + } + + .incidenciasInt p { + margin-bottom: 1rem !important; + } + + .IntroducirFechas { + width: auto !important; + } + + #selecctorInps { + display: block !important; + } + + #selecctorInps input { + width: 100% !important; + } + + .CBUsuarios { + height: 30px; + width: 100%; + } + + .pUsuario { + max-width: calc(100% - 40px); + } + + .burgerMenuActivo { + background-color: var(--AzulOAAF); + color: white; + } + + .burgerMenuActivo span { + filter: invert(1) + } + + #filtroEstados { + max-width: 100%; + flex-wrap: wrap; + } + + .cajaTabla { + max-width: 100%; + overflow-x: scroll; + margin-bottom: 25px + } + + #barraNavegacionVacia { + padding-inline: 0px; + } + #Nav1{ + padding-inline:0px; + } + .btnOAAFAzul { + margin-block: 20px; + } + .selectIn { + width:100%; + } + #filtroEstados{ + gap:15px; + } + .btnHome { + margin-block: 5px; + font-size: 30px; + justify-content: center !important; + } +}*/ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/all.min.css b/.codex-links/WebIntranet/Content/all.min.css similarity index 98% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/all.min.css rename to .codex-links/WebIntranet/Content/all.min.css index be25496..728e630 100644 --- a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/all.min.css +++ b/.codex-links/WebIntranet/Content/all.min.css @@ -6,4 +6,4 @@ .fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} .fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-solid-900.woff2) format("woff2"),url(/Content/webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-brands-400.woff2) format("woff2"),url(/Content/webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-regular-400.woff2) format("woff2"),url(/Content/webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(/Content/webfonts/fa-v4compatibility.woff2) format("woff2"),url(/Content/webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(~/Content/FUENTES/fa-brands-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(~/Content/FUENTES/fa-regular-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(~/Content/FUENTES/fa-solid-900.woff2) format("woff2"),url(~/Content/FUENTES/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(~/Content/FUENTES/fa-brands-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(~/Content/FUENTES/fa-solid-900.woff2) format("woff2"),url(~/Content/FUENTES/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(~/Content/FUENTES/fa-regular-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(~/Content/FUENTES/fa-solid-900.woff2) format("woff2"),url(~/Content/FUENTES/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(~/Content/FUENTES/fa-brands-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(~/Content/FUENTES/fa-regular-400.woff2) format("woff2"),url(~/Content/FUENTES/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(~/Content/FUENTES/fa-v4compatibility.woff2) format("woff2"),url(~/Content/FUENTES/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/bootstrap.min.css b/.codex-links/WebIntranet/Content/bootstrap.min.css new file mode 100644 index 0000000..e490fd0 --- /dev/null +++ b/.codex-links/WebIntranet/Content/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.1.0 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors + * Copyright 2011-2018 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-ms-flex-order:-1;order:-1}.order-last{-ms-flex-order:13;order:13}.order-0{-ms-flex-order:0;order:0}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-ms-flex-order:-1;order:-1}.order-sm-last{-ms-flex-order:13;order:13}.order-sm-0{-ms-flex-order:0;order:0}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-ms-flex-order:-1;order:-1}.order-md-last{-ms-flex-order:13;order:13}.order-md-0{-ms-flex-order:0;order:0}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-ms-flex-order:-1;order:-1}.order-lg-last{-ms-flex-order:13;order:13}.order-lg-0{-ms-flex-order:0;order:0}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-ms-flex-order:-1;order:-1}.order-xl-last{-ms-flex-order:13;order:13}.order-xl-0{-ms-flex-order:0;order:0}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropright .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropleft .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::after{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label::after{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:0}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:0;box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px;background-color:#dee2e6;border-radius:1rem}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/faviconOAAF.png b/.codex-links/WebIntranet/Content/faviconOAAF.png new file mode 100644 index 0000000..cc4ed3d Binary files /dev/null and b/.codex-links/WebIntranet/Content/faviconOAAF.png differ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/imagenes/1oaaflogo.png b/.codex-links/WebIntranet/Content/images/1-oaaf-logo.png similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/imagenes/1oaaflogo.png rename to .codex-links/WebIntranet/Content/images/1-oaaf-logo.png diff --git a/.codex-links/WebIntranet/Content/images/2-oaaf-logo-negativo.png b/.codex-links/WebIntranet/Content/images/2-oaaf-logo-negativo.png new file mode 100644 index 0000000..b54af2a Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/2-oaaf-logo-negativo.png differ diff --git a/.codex-links/WebIntranet/Content/images/3-oaaf-logo-red-v.png b/.codex-links/WebIntranet/Content/images/3-oaaf-logo-red-v.png new file mode 100644 index 0000000..ebc87cc Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/3-oaaf-logo-red-v.png differ diff --git a/.codex-links/WebIntranet/Content/images/4-oaaf-logo-negativo-red-v.png b/.codex-links/WebIntranet/Content/images/4-oaaf-logo-negativo-red-v.png new file mode 100644 index 0000000..b20bcdf Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/4-oaaf-logo-negativo-red-v.png differ diff --git a/.codex-links/WebIntranet/Content/images/5-oaaf-logo-red-h.png b/.codex-links/WebIntranet/Content/images/5-oaaf-logo-red-h.png new file mode 100644 index 0000000..2edaedd Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/5-oaaf-logo-red-h.png differ diff --git a/.codex-links/WebIntranet/Content/images/6-oaaf-logo-negativo-red-h.png b/.codex-links/WebIntranet/Content/images/6-oaaf-logo-negativo-red-h.png new file mode 100644 index 0000000..cb41386 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/6-oaaf-logo-negativo-red-h.png differ diff --git a/.codex-links/WebIntranet/Content/images/Atras.svg b/.codex-links/WebIntranet/Content/images/Atras.svg new file mode 100644 index 0000000..fe9e990 --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/Atras.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/images/AtrasHover.svg b/.codex-links/WebIntranet/Content/images/AtrasHover.svg new file mode 100644 index 0000000..1e8ae48 --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/AtrasHover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/images/ControlHorario.png b/.codex-links/WebIntranet/Content/images/ControlHorario.png new file mode 100644 index 0000000..04dfde6 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/ControlHorario.png differ diff --git a/.codex-links/WebIntranet/Content/images/ControlHorarioHover.jpg b/.codex-links/WebIntranet/Content/images/ControlHorarioHover.jpg new file mode 100644 index 0000000..9cf4bbc Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/ControlHorarioHover.jpg differ diff --git a/.codex-links/WebIntranet/Content/images/ControlHorarioImg.png b/.codex-links/WebIntranet/Content/images/ControlHorarioImg.png new file mode 100644 index 0000000..8aee7bc Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/ControlHorarioImg.png differ diff --git a/.codex-links/WebIntranet/Content/images/DatosPersonales.png b/.codex-links/WebIntranet/Content/images/DatosPersonales.png new file mode 100644 index 0000000..6e44d34 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/DatosPersonales.png differ diff --git a/.codex-links/WebIntranet/Content/images/DatosPersonalesHover.jpg b/.codex-links/WebIntranet/Content/images/DatosPersonalesHover.jpg new file mode 100644 index 0000000..724433d Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/DatosPersonalesHover.jpg differ diff --git a/.codex-links/WebIntranet/Content/images/DatosPersonalesImg.jpeg b/.codex-links/WebIntranet/Content/images/DatosPersonalesImg.jpeg new file mode 100644 index 0000000..8ceb27a Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/DatosPersonalesImg.jpeg differ diff --git a/.codex-links/WebIntranet/Content/images/FondoControlHorario.png b/.codex-links/WebIntranet/Content/images/FondoControlHorario.png new file mode 100644 index 0000000..acf7837 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/FondoControlHorario.png differ diff --git a/.codex-links/WebIntranet/Content/images/FondoLogIn.png b/.codex-links/WebIntranet/Content/images/FondoLogIn.png new file mode 100644 index 0000000..899e9c2 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/FondoLogIn.png differ diff --git a/.codex-links/WebIntranet/Content/images/GestionesPropias.png b/.codex-links/WebIntranet/Content/images/GestionesPropias.png new file mode 100644 index 0000000..82b7c81 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/GestionesPropias.png differ diff --git a/.codex-links/WebIntranet/Content/images/Nominas.png b/.codex-links/WebIntranet/Content/images/Nominas.png new file mode 100644 index 0000000..38695ac Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/Nominas.png differ diff --git a/.codex-links/WebIntranet/Content/images/NominasHover.jpg b/.codex-links/WebIntranet/Content/images/NominasHover.jpg new file mode 100644 index 0000000..30d0826 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/NominasHover.jpg differ diff --git a/.codex-links/WebIntranet/Content/images/NominasImg.jpeg b/.codex-links/WebIntranet/Content/images/NominasImg.jpeg new file mode 100644 index 0000000..d747eb0 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/NominasImg.jpeg differ diff --git a/.codex-links/WebIntranet/Content/images/OAAF Logo PNG.png b/.codex-links/WebIntranet/Content/images/OAAF Logo PNG.png new file mode 100644 index 0000000..fb9dd41 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/OAAF Logo PNG.png differ diff --git a/.codex-links/WebIntranet/Content/images/cambiarModo.svg b/.codex-links/WebIntranet/Content/images/cambiarModo.svg new file mode 100644 index 0000000..e018d13 --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/cambiarModo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/images/cambiarModoHover.svg b/.codex-links/WebIntranet/Content/images/cambiarModoHover.svg new file mode 100644 index 0000000..5c2de58 --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/cambiarModoHover.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/imagenes/cargaOAAF.gif b/.codex-links/WebIntranet/Content/images/cargaOAAF.gif similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/imagenes/cargaOAAF.gif rename to .codex-links/WebIntranet/Content/images/cargaOAAF.gif diff --git a/.codex-links/WebIntranet/Content/images/cargaOAAF2.gif b/.codex-links/WebIntranet/Content/images/cargaOAAF2.gif new file mode 100644 index 0000000..964dc9f Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/cargaOAAF2.gif differ diff --git a/.codex-links/WebIntranet/Content/images/faviconOAAF.png b/.codex-links/WebIntranet/Content/images/faviconOAAF.png new file mode 100644 index 0000000..9869320 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/faviconOAAF.png differ diff --git a/.codex-links/WebIntranet/Content/images/faviconParlamento.png b/.codex-links/WebIntranet/Content/images/faviconParlamento.png new file mode 100644 index 0000000..6cc2bec Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/faviconParlamento.png differ diff --git a/.codex-links/WebIntranet/Content/images/filtro.svg b/.codex-links/WebIntranet/Content/images/filtro.svg new file mode 100644 index 0000000..23d3db3 --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/filtro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/images/fondo.jpg b/.codex-links/WebIntranet/Content/images/fondo.jpg new file mode 100644 index 0000000..fab29a4 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/fondo.jpg differ diff --git a/.codex-links/WebIntranet/Content/images/fondoBtn.png b/.codex-links/WebIntranet/Content/images/fondoBtn.png new file mode 100644 index 0000000..5990289 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/fondoBtn.png differ diff --git a/.codex-links/WebIntranet/Content/images/fondoBtn2.png b/.codex-links/WebIntranet/Content/images/fondoBtn2.png new file mode 100644 index 0000000..ca9c285 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/fondoBtn2.png differ diff --git a/.codex-links/WebIntranet/Content/images/fondoNav.png b/.codex-links/WebIntranet/Content/images/fondoNav.png new file mode 100644 index 0000000..6178da7 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/fondoNav.png differ diff --git a/.codex-links/WebIntranet/Content/images/fondoOAAF.png b/.codex-links/WebIntranet/Content/images/fondoOAAF.png new file mode 100644 index 0000000..d0eabda Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/fondoOAAF.png differ diff --git a/.codex-links/WebIntranet/Content/images/gestionarOtrasPersonas.png b/.codex-links/WebIntranet/Content/images/gestionarOtrasPersonas.png new file mode 100644 index 0000000..7706a26 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/gestionarOtrasPersonas.png differ diff --git a/.codex-links/WebIntranet/Content/images/iconoUser.png b/.codex-links/WebIntranet/Content/images/iconoUser.png new file mode 100644 index 0000000..ea1f9ae Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/iconoUser.png differ diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/icon/list.svg b/.codex-links/WebIntranet/Content/images/list.svg similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Content/icon/list.svg rename to .codex-links/WebIntranet/Content/images/list.svg diff --git a/.codex-links/WebIntranet/Content/images/loading.png b/.codex-links/WebIntranet/Content/images/loading.png new file mode 100644 index 0000000..876f06a Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/loading.png differ diff --git a/.codex-links/WebIntranet/Content/images/logoModal.png b/.codex-links/WebIntranet/Content/images/logoModal.png new file mode 100644 index 0000000..9646acb Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/logoModal.png differ diff --git a/.codex-links/WebIntranet/Content/images/logoParlamento.png b/.codex-links/WebIntranet/Content/images/logoParlamento.png new file mode 100644 index 0000000..8e620cb Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/logoParlamento.png differ diff --git a/.codex-links/WebIntranet/Content/images/logoParlamentoMovil.svg b/.codex-links/WebIntranet/Content/images/logoParlamentoMovil.svg new file mode 100644 index 0000000..443f8df --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/logoParlamentoMovil.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.codex-links/WebIntranet/Content/images/logout.png b/.codex-links/WebIntranet/Content/images/logout.png new file mode 100644 index 0000000..e0d8810 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/logout.png differ diff --git a/.codex-links/WebIntranet/Content/images/logoutHover.png b/.codex-links/WebIntranet/Content/images/logoutHover.png new file mode 100644 index 0000000..f24bd25 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/logoutHover.png differ diff --git a/.codex-links/WebIntranet/Content/images/print.svg b/.codex-links/WebIntranet/Content/images/print.svg new file mode 100644 index 0000000..4f9cc2d --- /dev/null +++ b/.codex-links/WebIntranet/Content/images/print.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.codex-links/WebIntranet/Content/images/userEdit.png b/.codex-links/WebIntranet/Content/images/userEdit.png new file mode 100644 index 0000000..cd3893a Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/userEdit.png differ diff --git a/.codex-links/WebIntranet/Content/images/users.png b/.codex-links/WebIntranet/Content/images/users.png new file mode 100644 index 0000000..044a69a Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/users.png differ diff --git a/.codex-links/WebIntranet/Content/images/usuarios.png b/.codex-links/WebIntranet/Content/images/usuarios.png new file mode 100644 index 0000000..fc096a8 Binary files /dev/null and b/.codex-links/WebIntranet/Content/images/usuarios.png differ diff --git a/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx new file mode 100644 index 0000000..8c45c16 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx @@ -0,0 +1,32 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="CarHor.aspx.vb" Async="true" Inherits="WebIntranet.CarHor" %> + +
+ +
+

Carrera horizontal

+
+
    +
  • / Datos administrativos
  • +
  • / Carrera horizontal
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.designer.vb new file mode 100644 index 0000000..b850435 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class CarHor + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.vb new file mode 100644 index 0000000..6f5d2ff --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/CarHor.aspx.vb @@ -0,0 +1,42 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin + +Public Class CarHor + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + 'If (Session("persona") Is Nothing) Then + ' ("Default.aspx", False) + 'Else + + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/COMPLEMENTOSCARRERA/GruposEnumExtend/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of COMPLEMENTOSCARRERA))(client, url) + Dim htmlTabla = "" + If (puestosItems.Count > 0) Then + htmlTabla += "" + + "" + + "" + + "" + + "" + For Each itm As COMPLEMENTOSCARRERA In puestosItems + htmlTabla += "" + + "" + + "" + + "" + + "" + Next + htmlTabla += "
Fecha inicioFecha finGrupoTramo
" + If(itm.FECHAINICIO IsNot Nothing, itm.FECHAINICIO.ToString.Substring(0, 10), "") + "" + If(itm.FECHAFIN IsNot Nothing, itm.FECHAFIN.ToString.Substring(0, 10), "") + "" + itm.IDGRUPONavigation.GRUPO1 + "" + itm.IDTRAMONavigation.DESCRIPCION + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx new file mode 100644 index 0000000..c91190f --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx @@ -0,0 +1,32 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="Formacion.aspx.vb" Async="true" Inherits="WebIntranet.Formacion" %> + + +
+ +
+

Formación

+
+
    +
  • / Datos administrativos
  • +
  • / Formación
  • +
+
+
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.designer.vb new file mode 100644 index 0000000..29b1a2f --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Formacion + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.vb new file mode 100644 index 0000000..85a87e6 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Formacion.aspx.vb @@ -0,0 +1,56 @@ +Imports Newtonsoft.Json +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin + +Public Class Formacion + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + Dim vidaAdministrativaItems As New List(Of WebIntranet.ClasesDatosAdmin.FORMACION) + Dim TiposActos As New List(Of TIPOAPTOSADMINISTRATIVOS) + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim response = Await client.GetAsync("/api/FORMACION/formacionespersona/" + idPers.ToString) + + If response.IsSuccessStatusCode Then + Dim resultContent = Await response.Content.ReadAsStringAsync() + vidaAdministrativaItems = If(JsonConvert.DeserializeObject(Of List(Of WebIntranet.ClasesDatosAdmin.FORMACION))(resultContent), New List(Of WebIntranet.ClasesDatosAdmin.FORMACION)()) + vidaAdministrativaItems = vidaAdministrativaItems.ToList() + Else + Console.WriteLine($"Error al cargar Vida Administrativa: {response.StatusCode}") + End If + Dim htmlTabla = "" + If vidaAdministrativaItems.Count > 0 Then + + + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + + "" + For Each itm As WebIntranet.ClasesDatosAdmin.FORMACION In vidaAdministrativaItems + '/fichero.aspx?id=" + linAd.IDLINEAVIDAADMIN.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & linAd.IDLINEAVIDAADMIN.ToString) + "&t=LINEAVIDAADMINISTRATIVA + Dim urlFich = "/fichero.aspx?id=" + itm.IDFORMACION.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & itm.IDFORMACION.ToString) + "&t=FORMACION" + 'Dim urlFich = "/Ficheros?tip=VerFrm&id=" + itm.ToString() + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + Next + htmlTabla += "
Nombre cursoNombreFecha expediciónDuraciónAprovechamientoOficial
" + If(itm.RUTA IsNot Nothing, "" + itm.NOMBRE_CURSO + "", itm.NOMBRE_CURSO) + "" + itm.CENTRO + "" + If(itm.FECHA_EXPEDICION IsNot Nothing, itm.FECHA_EXPEDICION.ToString.Substring(0, 10), "") + "" + itm.DURACION.ToString() + "" + If(itm.APROVECHAMIENTO = True, "", "") + "" + If(itm.OFICIAL = True, "", "") + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx new file mode 100644 index 0000000..566f28c --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx @@ -0,0 +1,33 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="GradoPersonal.aspx.vb" Async="true" Inherits="WebIntranet.GradoPersonal" %> + + +
+ +
+

Grado personal

+
+
    +
  • / Datos administrativos
  • +
  • / Grado personal
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.designer.vb new file mode 100644 index 0000000..c1944e2 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class GradoPersonal + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.vb new file mode 100644 index 0000000..78f44e1 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/GradoPersonal.aspx.vb @@ -0,0 +1,32 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin + +Public Class GradoPersonal + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/CONSOLIDACION_GRADO/GetWithIncludes/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of CONSOLIDACION_GRADO))(client, url) + Dim htmlTabla = "" + htmlTabla += "" + +"" + +"" + +"" + + For Each itm As CONSOLIDACION_GRADO In puestosItems + htmlTabla += "" + + "" + + "" + + "" + Next + htmlTabla += "
NivelFecha efectoFecha resolución
" + itm.IDNIVELNavigation.DESCRIPCION + "" + If(itm.FECHA_EFECTO IsNot Nothing, itm.FECHA_EFECTO.ToString.Substring(0, 10), "") + "" + If(itm.FECHA_RESOLUCION IsNot Nothing, itm.FECHA_RESOLUCION.ToString.Substring(0, 10), "") + "
" + divTabla.InnerHtml = htmlTabla + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx new file mode 100644 index 0000000..14a7f10 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx @@ -0,0 +1,34 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="Idioma.aspx.vb" Async="true" Inherits="WebIntranet.Idioma" %> + + +
+ +
+

Idiomas

+
+
    +
  • / Datos administrativos
  • +
  • / Idiomas
  • +
+
+ +
+
+
+ +
+
+ +
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.designer.vb new file mode 100644 index 0000000..44041dd --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Idioma + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.vb new file mode 100644 index 0000000..18e3397 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Idioma.aspx.vb @@ -0,0 +1,43 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin + +Public Class Idioma + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + + 'If (Session("persona") Is Nothing) Then + ' ("Default.aspx", False) + 'Else + + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/IDIOMAS/GetWithIncludes/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of IDIOMAS))(client, url) + Dim htmlTabla = "" + If (puestosItems.Count > 0) Then + htmlTabla += "" + + "" + + "" + + "" + + "" + For Each itm As IDIOMAS In puestosItems + htmlTabla += "" + + "" + + "" + + "" + + "" + Next + htmlTabla += "
IdiomaNivelCentro de expediciónAño
" + itm.IDTIPOIDIOMANavigation?.DESCRIPCION + "" + itm.IDNIVELNavigation.DESCRIPCION + "" + itm.CENTROEXPEDICION + "" + itm.ANNO.ToString + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + 'End If + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx new file mode 100644 index 0000000..0a29c19 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx @@ -0,0 +1,33 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="Puestos.aspx.vb" Async="true" Inherits="WebIntranet.Puestos" %> + + +
+ +
+

Puestos

+
+
    +
  • / Datos administrativos
  • +
  • / Puestos
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.designer.vb new file mode 100644 index 0000000..4fa851f --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Puestos + + ''' + '''Control divTablaPuestos. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTablaPuestos As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.vb new file mode 100644 index 0000000..34d92e0 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/Puestos.aspx.vb @@ -0,0 +1,60 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers + +Imports WebIntranet.ClasesDatosAdmin + +Public Class Puestos + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + 'If (Session("persona") Is Nothing) Then + ' Response.Redirect("~/Default.aspx", False) + 'Else + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/VIDA_ADMINISTRATIVA/puestospersona/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of PuestoPersona))(client, url) + + Dim htmlTabla = "" + If (puestosItems.Count > 0) Then + + htmlTabla += "" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + +"" + For Each itm As PuestoPersona In puestosItems + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + Next + htmlTabla += "
Puesto de trabajoNivelClase personalGrupoFecha inicioFecha finCaracter OcupaciónAñosMesesDías
" + itm.Puesto + "" + itm.Nivel + "" + itm.Adscripcion + "" + itm.Grupo + "" + If(Not itm.FechaToPo = Nothing, itm.FechaToPo.ToString("dd/MM/yyyy"), "") + "" + If(Not itm.FechaCese = Nothing, itm.FechaCese.ToString("dd/MM/yyyy"), "") + "" + itm.CaracterOcu + "" + itm.AnosSer.ToString + "" + itm.MesesSer.ToString + "" + itm.DiasSer.ToString + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTablaPuestos.InnerHtml = htmlTabla + 'End If + + + End Sub + + + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx new file mode 100644 index 0000000..3b22e3a --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx @@ -0,0 +1,33 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="VidaAdministrativa.aspx.vb" Async="true" Inherits="WebIntranet.VidaAdministrativa" %> + + +
+ +
+

Vida administrativa

+
+
    +
  • / Datos administrativos
  • +
  • / Vida administrativa
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.designer.vb new file mode 100644 index 0000000..af84f70 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class VidaAdministrativa + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.vb new file mode 100644 index 0000000..f618ea0 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/VidaAdministrativa.aspx.vb @@ -0,0 +1,94 @@ +Imports System.Linq.Expressions +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports Newtonsoft.Json +Imports WebIntranet.ClasesDatosAdmin +Imports Serialize.Linq.Serializers +Imports Serialize.Linq.Expressions +Imports Serialize.Linq.Interfaces +Imports Serialize.Linq.Factories + +Public Class VidaAdministrativa + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + Dim vidaAdministrativaItems As New List(Of VIDA_ADMINISTRATIVA) + Dim TiposActos As New List(Of TIPOAPTOSADMINISTRATIVOS) + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim response = Await client.GetAsync("/api/VIDA_ADMINISTRATIVA/vidaspersona/" + idPers.ToString) + + If response.IsSuccessStatusCode Then + Dim resultContent = Await response.Content.ReadAsStringAsync() + vidaAdministrativaItems = If(JsonConvert.DeserializeObject(Of List(Of VIDA_ADMINISTRATIVA))(resultContent), New List(Of VIDA_ADMINISTRATIVA)()) + vidaAdministrativaItems = vidaAdministrativaItems.OrderByDescending(Function(x) x.FECHA).ThenBy(Function(x) x.NUM_REG).ThenBy(Function(x) x.IDMOTIVONavigation?.IDTIPOAPTOSNavigation?.DESCRIPCION).ToList() + Else + Console.WriteLine($"Error al cargar Vida Administrativa: {response.StatusCode}") + End If + + Dim TiApAd = Await client.GetAsync("/api/TIPOAPTOSADMINISTRATIVOS") + Dim TiApAdContent = Await TiApAd.Content.ReadAsStringAsync() + If TiApAd.IsSuccessStatusCode Then + TiposActos = If(JsonConvert.DeserializeObject(Of List(Of TIPOAPTOSADMINISTRATIVOS))(TiApAdContent), New List(Of TIPOAPTOSADMINISTRATIVOS)()) + End If + TiposActos = If(TiposActos?.OrderBy(Function(x) x.DESCRIPCION).ToList(), New List(Of TIPOAPTOSADMINISTRATIVOS)()) + Dim htmlTabla = "" + If vidaAdministrativaItems.Count > 0 Then + + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + For Each itm As VIDA_ADMINISTRATIVA In vidaAdministrativaItems + Dim descActo = TiposActos.FirstOrDefault(Function(x) x.IDTIPO = itm.IDMOTIVONavigation.IDTIPOAPTOS).DESCRIPCION + Dim linkVidaAd = "/DatosAdministrativos/desgVidaAdministrativa.aspx?idVi=" + itm.IDVIDA.ToString().Trim() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & itm.IDVIDA) + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + Next + htmlTabla += "
Tiene documentosActos administrativosDepartamentoCausaObservacionesDescripciónFecha efectoFecha resoluciónCaracter ocupación
" + If(itm.TIENELINEAS = True, "", "") + "" + "" + descActo + "" + If(itm.IDPUESTONavigation?.IDRPTDESNavigation?.IDDEPARTAMENTONavigation?.DESCRIPCION IsNot Nothing, itm.IDPUESTONavigation?.IDRPTDESNavigation?.IDDEPARTAMENTONavigation?.DESCRIPCION, "") + "" + If(itm.OBSERVACIONES IsNot Nothing, itm.OBSERVACIONES, "") + "" + If(itm.FECHA IsNot Nothing, itm.FECHA.ToString.Substring(0, 10), "") + "" + If(itm.FECHARESOLUCION IsNot Nothing, itm.FECHARESOLUCION.ToString.Substring(0, 10), "") + "" + If(itm.OCUPACION_OLDNavigation?.DESCRIPCION IsNot Nothing, itm.OCUPACION_OLDNavigation.DESCRIPCION, "") + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + End Sub + + Private Function CustomTypeResolver(typeName As String) As FactorySettings + If typeName <> "Microsoft.VisualBasic.CompilerServices.Operators" Then + Return Nothing + End If + Return Nothing + End Function + + 'Private Function genrarlink(idvida As Integer, idpersonas As Integer) As String + + 'End Function + +End Class +Public Class CustomTypeResolver + + Public Function Resolve(typeName As String) As Type + If typeName = "Microsoft.VisualBasic.CompilerServices.Operators" Then + Return Nothing + End If + Return Type.GetType(typeName) + End Function +End Class + + diff --git a/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx new file mode 100644 index 0000000..68e45f2 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx @@ -0,0 +1,50 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="desgVidaAdministrativa.aspx.vb" Async="true" Inherits="WebIntranet.desgVidaAdministrativa" %> + +
+
+

Info vida administrativa

+
+ +
+ +
+
+
+

Acto administrativo

+ +
+
+

Causa

+ +
+
+

Fecha de efecto

+ +
+
+

Fecha de resolución

+ +
+
+

NRP

+ +
+
+

Puesto

+ +
+
+

Observaciones

+ +
+
+
+
+
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.designer.vb new file mode 100644 index 0000000..0675896 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.designer.vb @@ -0,0 +1,87 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class desgVidaAdministrativa + + ''' + '''Control actAdmVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents actAdmVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control CausaVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents CausaVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control fechaEfcVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents fechaEfcVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control fechaResVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents fechaResVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control NRPVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents NRPVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control PuestoVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents PuestoVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control ObservacionesVA. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents ObservacionesVA As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control divTablaLiViAd. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTablaLiViAd As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.vb new file mode 100644 index 0000000..672ca83 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/desgVidaAdministrativa.aspx.vb @@ -0,0 +1,96 @@ +Imports System.Linq.Expressions +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports Newtonsoft.Json +Imports Serialize.Linq.Serializers +Imports WebIntranet.ClasesDatosAdmin + +Public Class desgVidaAdministrativa + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + + If Session("Persona") Is Nothing Then + Response.Redirect("default.aspx") + End If + Dim sessionUsuario As String = Session("usuario") + Dim idVidaAd = Request.QueryString("idVi") + 'Session.Add("idVi", idVidaAd) + Dim cl = Request.QueryString("cl") + Dim sCl2 = tsl5.crypt.SHA1("M3Soft." & idVidaAd.ToString) + If sCl2 <> cl Then + Response.Redirect("/default.aspx", False) + Else + Dim client As New HttpClient() + Dim token As String = Session("token") + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim VidaAdministrativaEnlazada As VIDA_ADMINISTRATIVA + Dim response = Await client.GetAsync("/api/VIDA_ADMINISTRATIVA/" + idVidaAd.ToString()) + Dim responseContent = Await response.Content.ReadAsStringAsync() + VidaAdministrativaEnlazada = If(JsonConvert.DeserializeObject(Of VIDA_ADMINISTRATIVA)(responseContent), New VIDA_ADMINISTRATIVA()) + + ' Dim serializer = New ExpressionSerializer(New Serialize.Linq.Serializers.JsonSerializer()) + ' Dim IDVIDA As Integer = VidaAdministrativaEnlazada.IDVIDA + ' Dim filtroPue As Expression(Of Func(Of LINEASVIDAADMINISTRATIVA, Boolean)) = Function(x) x.IDVIDAADMIN = IDVIDA + 'Dim PueExpression = serializer.SerializeText(filtroPue) + 'Dim PuejsonContent = JsonConvert.SerializeObject(New With { + ' .Expression = PueExpression}) + 'Dim Puecontent = New StringContent(PuejsonContent, Encoding.UTF8, "application/json") + Dim lineasVidaAdministrativaEnlazada As List(Of LINEASVIDAADMINISTRATIVA) + + Dim response1 = Await client.GetAsync("/api/LINEASVIDAADMINISTRATIVA/LineasVidaAdminGridbyId/" + idVidaAd) + Dim responseContent1 = Await response1.Content.ReadAsStringAsync() + lineasVidaAdministrativaEnlazada = If(JsonConvert.DeserializeObject(Of List(Of LINEASVIDAADMINISTRATIVA))(responseContent1), New List(Of LINEASVIDAADMINISTRATIVA)()) + + + + actAdmVA.Value = VidaAdministrativaEnlazada.IDMOTIVONavigation.DESCRIPCION.Trim() + CausaVA.Value = VidaAdministrativaEnlazada.IDMOTIVONavigation.DESCRIPCION + 'If VidaAdministrativaEnlazada.FECHA IsNot Nothing Then + + 'End If + fechaEfcVA.Value = If(VidaAdministrativaEnlazada.FECHA.HasValue, CDate(VidaAdministrativaEnlazada.FECHA).ToString("dd/MM/yyyy"), "") + fechaResVA.Value = If(VidaAdministrativaEnlazada.FECHARESOLUCION.HasValue, CDate(VidaAdministrativaEnlazada.FECHARESOLUCION).ToString("dd/MM/yyyy"), "") + NRPVA.Value = VidaAdministrativaEnlazada.NRP + PuestoVA.Value = VidaAdministrativaEnlazada.IDPUESTONavigation?.DESPUESCOM + ObservacionesVA.Value = VidaAdministrativaEnlazada.OBSERVACIONES + + Dim htmlTabla = "" + + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + + "" + For Each linAd As LINEASVIDAADMINISTRATIVA In lineasVidaAdministrativaEnlazada + htmlTabla += "" + + "" + + "" + + "" + + "" + + Dim ruta = "/fichero.aspx?id=" + linAd.IDLINEAVIDAADMIN.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & linAd.IDLINEAVIDAADMIN.ToString) + "&t=LINEAVIDAADMINISTRATIVA" + + If linAd.RUTA IsNot Nothing Then + htmlTabla += "" + + "" + Else + htmlTabla += "" + + "" + End If + + Next + + htmlTabla += "
CódigoDescripciónTipo DocumentoFechaFichero
" + linAd.IDLINEAVIDAADMIN.ToString + "" + linAd.DESCRIPCION + "" + linAd.IDTIPONavigation?.DESCRIPCION + "" + CDate(linAd.FECHASUBIDA).ToString("dd/MM/yyyy") + "Visualizar
" + + divTablaLiViAd.InnerHtml = htmlTabla + End If + + End Sub + + + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx new file mode 100644 index 0000000..bc06e7d --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx @@ -0,0 +1,32 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="docencia.aspx.vb" Inherits="WebIntranet.docencia" Async="true" %> + +
+ +
+

Formación

+
+
    +
  • / Datos administrativos
  • +
  • / Docencia
  • +
+
+
+
+
+ +
+
+ +
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.designer.vb new file mode 100644 index 0000000..1883b1b --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class docencia + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.vb new file mode 100644 index 0000000..d965744 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/docencia.aspx.vb @@ -0,0 +1,54 @@ +Imports Newtonsoft.Json +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin +Public Class docencia + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + Dim vidaAdministrativaItems As New List(Of WebIntranet.ClasesDatosAdmin.DOCENCIA) + Dim TiposActos As New List(Of TIPOAPTOSADMINISTRATIVOS) + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim response = Await client.GetAsync("/api/DOCENCIA/docenciaspersona/" + idPers.ToString) + + If response.IsSuccessStatusCode Then + Dim resultContent = Await response.Content.ReadAsStringAsync() + vidaAdministrativaItems = If(JsonConvert.DeserializeObject(Of List(Of WebIntranet.ClasesDatosAdmin.DOCENCIA))(resultContent), New List(Of WebIntranet.ClasesDatosAdmin.DOCENCIA)()) + vidaAdministrativaItems = vidaAdministrativaItems.ToList() + Else + Console.WriteLine($"Error al cargar Vida Administrativa: {response.StatusCode}") + End If + Dim htmlTabla = "" + If vidaAdministrativaItems.Count > 0 Then + + + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + For Each itm As WebIntranet.ClasesDatosAdmin.DOCENCIA In vidaAdministrativaItems + '/fichero.aspx?id=" + linAd.IDLINEAVIDAADMIN.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & linAd.IDLINEAVIDAADMIN.ToString) + "&t=LINEAVIDAADMINISTRATIVA + Dim urlFich = "/fichero.aspx?id=" + itm.IDDOCENCIA.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & itm.IDDOCENCIA.ToString) + "&t=DOCENCIA" + 'Dim urlFich = "/Ficheros?tip=VerFrm&id=" + itm.ToString() + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + htmlTabla += "" + 'htmlTabla += "" + Next + htmlTabla += "
DenominaciónCentroFechaDuraciónTipo de docencia
" + If(itm.RUTA IsNot Nothing, "" + itm.DENOMINACION + "", itm.DENOMINACION) + "" + itm.CENTRO + "" + If(itm.FECHAEXPEDICION IsNot Nothing, itm.FECHAEXPEDICION.ToString.Substring(0, 10), "") + "" + itm.DURACION.ToString() + "" + itm.IDTIPODOCENCIANavigation.DESCRIPCION + "
" + If(itm.OFICIAL = True, "", "") + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx new file mode 100644 index 0000000..cbcf4f8 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx @@ -0,0 +1,32 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="titulaciones.aspx.vb" Async="true" Inherits="WebIntranet.titulaciones" %> + +
+ +
+

Titulación académica oficial

+
+
    +
  • / Datos administrativos
  • +
  • / Titulación académica oficial
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.designer.vb new file mode 100644 index 0000000..a67de5f --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class titulaciones + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.vb new file mode 100644 index 0000000..3a8cd5e --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/titulaciones.aspx.vb @@ -0,0 +1,46 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports WebIntranet.ClasesDatosAdmin + +Public Class titulaciones + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + 'If (Session("persona") Is Nothing) Then + ' ("Default.aspx", False) + 'Else + + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/TITULACIONES/GetWithIncludes/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of ClasesDatosAdmin.TITULACIONES))(client, url) + Dim htmlTabla = "" + If puestosItems.Count > 0 Then + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + For Each itm As ClasesDatosAdmin.TITULACIONES In puestosItems + Dim ruta = "/fichero.aspx?id=" + itm.IDTITULACION.ToString() + "&cl=" + tsl5.crypt.SHA1("M3Soft." & itm.IDTITULACION.ToString) + "&t=TITULACION" + + htmlTabla += "" + + "" + + "" + + "" + + "" + + "" + Next + htmlTabla += "
DescripciónCentroFecha expediciónFecha incripción provisionalFecha incripción definitiva
" + If(itm.RUTA IsNot Nothing, "" + itm.DESCRIPCION + "", itm.DESCRIPCION) + "" + itm.CENTRO + "" + If(itm.FECHA_EXPEDICION IsNot Nothing, itm.FECHA_EXPEDICION.ToString.Substring(0, 10), "") + "" + If(itm.FECHA_INSCRIPCION_PROVISIONAL IsNot Nothing, itm.FECHA_INSCRIPCION_PROVISIONAL.ToString.Substring(0, 10), "") + "" + If(itm.FECHA_INSCRIPCION_DEFINITIVA IsNot Nothing, itm.FECHA_INSCRIPCION_DEFINITIVA.ToString.Substring(0, 10), "") + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx new file mode 100644 index 0000000..c511c5e --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx @@ -0,0 +1,32 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" Async="true" CodeBehind="trienios.aspx.vb" Inherits="WebIntranet.trienios" %> + +
+ +
+

Trienios

+
+
    +
  • / Datos administrativos
  • +
  • / Trienios
  • +
+
+ +
+
+
+ +
+
+
diff --git a/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.designer.vb b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.designer.vb new file mode 100644 index 0000000..88bdb96 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.designer.vb @@ -0,0 +1,24 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class trienios + + ''' + '''Control divTabla. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divTabla As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.vb b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.vb new file mode 100644 index 0000000..107de89 --- /dev/null +++ b/.codex-links/WebIntranet/DatosAdministrativos/trienios.aspx.vb @@ -0,0 +1,37 @@ +Imports System.Net.Http +Imports System.Net.Http.Headers + +Public Class trienios + Inherits System.Web.UI.Page + + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + + Dim token As String = Session("token") + Dim client As New HttpClient() + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.BaseAddress = New Uri(ConfigurationManager.AppSettings("SwaggerVB")) + Dim idPers = Session("persona").Personas(0).idPersona + Dim url As String = "/api/TRIENIOS/GetWithIncludes/" & idPers + Dim puestosItems = Await UtilAntifraude.ObtenerObjeto(Of List(Of ClasesDatosAdmin.TRIENIOS))(client, url) + Dim htmlTabla = "" + If (puestosItems.Count > 0) Then + htmlTabla += "" + + "" + + "" + + "" + + For Each itm As ClasesDatosAdmin.TRIENIOS In puestosItems + htmlTabla += "" + + "" + + "" + + "" + + Next + htmlTabla += "
GrupoTrienios otras administracionesTrienios oficina
" + itm.IDGRUPONavigation.DESCRIPCION + "" + itm.TOA.ToString + "" + itm.TC.ToString + "
" + Else + htmlTabla += "

No se han encontrado resultados

" + End If + divTabla.InnerHtml = htmlTabla + End Sub + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/Default.aspx b/.codex-links/WebIntranet/Default.aspx new file mode 100644 index 0000000..36ec186 --- /dev/null +++ b/.codex-links/WebIntranet/Default.aspx @@ -0,0 +1,154 @@ +<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebIntranet._Default" Async="true" %> + + + + + + + + + + + + + + + + + +
+
+
+
+

+ +
+

PORTAL DEL EMPLEADO OAAF

+
+ +
+ + + + + +
+
+ +
+ + + + +
+
+ +
+ +
+
+ + +
+ + diff --git a/.codex-links/WebIntranet/Default.aspx.designer.vb b/.codex-links/WebIntranet/Default.aspx.designer.vb new file mode 100644 index 0000000..006fdd1 --- /dev/null +++ b/.codex-links/WebIntranet/Default.aspx.designer.vb @@ -0,0 +1,78 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class _Default + + ''' + '''Control form1. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents form1 As Global.System.Web.UI.HtmlControls.HtmlForm + + ''' + '''Control mensajeError. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents mensajeError As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Usuario. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents Usuario As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control Contrasena. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents Contrasena As Global.System.Web.UI.HtmlControls.HtmlInputPassword + + ''' + '''Control btnAcceso. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents btnAcceso As Global.DevExpress.Web.Bootstrap.BootstrapButton + + ''' + '''Control divLoadingHome. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divLoadingHome As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control loadingHome. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents loadingHome As Global.System.Web.UI.HtmlControls.HtmlImage +End Class diff --git a/.codex-links/WebIntranet/Default.aspx.vb b/.codex-links/WebIntranet/Default.aspx.vb new file mode 100644 index 0000000..a84672a --- /dev/null +++ b/.codex-links/WebIntranet/Default.aspx.vb @@ -0,0 +1,397 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports System.Text +Imports System.Threading.Tasks +Imports Models +Imports Newtonsoft.Json.Linq + +Public Class _Default + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Not IsPostBack Then + mensajeError.InnerText = Convert.ToString(Request.QueryString("certError")) + End If + End Sub + + Private Async Sub btnAcceso_Click(sender As Object, e As EventArgs) Handles btnAcceso.Click + mensajeError.InnerText = "" + + Dim resultIden As String = Await CredNet(Usuario.Value) + Dim RespIden As Models.ResultadoIdentificacion = Nothing + + If resultIden <> "error" Then + Dim client = HttpClientFactory.Create() + client.BaseAddress = New Uri(UtilAntifraude.urlSwagger()) + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", Convert.ToString(Session("token"))) + + Dim loginResponse = Await client.GetAsync("api/ResultadoIdentificacion/nif/" + resultIden + "/Origen/WEBINTRANET") + Dim responseContent = Await loginResponse.Content.ReadAsStringAsync() + + RespIden = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoIdentificacion)(responseContent) + End If + + If RespIden Is Nothing Then + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = "No se pudo identificar al usuario." + Return + End If + + ProcesarResultadoIdentificacion(RespIden, Usuario.Value) + End Sub + + Private Async Function CredNet(Nif As String) As Task(Of String) + Try + Dim contr As String = Contrasena.Value + + Dim client = HttpClientFactory.Create() + client.BaseAddress = New Uri(UtilAntifraude.urlSwagger()) + + Dim loginPayload = "{""NombreUsuario"":""" + Nif + """,""Contraseña"":""" + contr + """, ""Origen"":""Intranet""}" + Dim loginContent As StringContent = New StringContent(loginPayload, Encoding.UTF8, "application/json") + Dim loginResponse = Await client.PostAsync("api/Auth/login", loginContent) + Dim responseContent = Await loginResponse.Content.ReadAsStringAsync() + + If loginResponse.IsSuccessStatusCode Then + Dim parsedJson = JObject.Parse(responseContent) + Session("token") = If(parsedJson("token")?.ToString(), If(parsedJson("Token")?.ToString(), "")) + + Dim us = parsedJson("user") + If us Is Nothing Then us = parsedJson("User") + + If us IsNot Nothing Then + Return If(us("nif")?.ToString(), + If(us("NIF")?.ToString(), + If(us("dni")?.ToString(), + If(us("DNI")?.ToString(), "")))) + End If + + Return "error" + Else + Return "error" + End If + Catch + Return "error" + End Try + End Function + + Private Sub ProcesarResultadoIdentificacion(respIden As Models.ResultadoIdentificacion, usuarioOriginal As String) + If respIden Is Nothing Then + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = "No se pudo identificar al usuario." + Return + End If + + Select Case respIden.resultado.ToString() + Case "0" + Dim Nombre As String = respIden.Personas(0).Nombre + Dim Nif As String = respIden.Personas(0).Dni + + Session.Add("Nombre", Nombre) + Session.Add("usuario", Nif) + Session.Add("Persona", respIden) + + CargarNotificaciones(respIden) + + If Not String.IsNullOrWhiteSpace(usuarioOriginal) AndAlso usuarioOriginal.Length > 1 Then + If Not "0123456789".Contains(usuarioOriginal.Substring(1, 1)) Then + Session.Add("LDAP", usuarioOriginal) + End If + End If + + If respIden.Personas.Count > 1 Then + Response.Redirect("selModo.aspx", False) + Context.ApplicationInstance.CompleteRequest() + Else + Session.Add("modo", "PROPIO") + Session.Add("usuariosSeleccionados", Nif.Split(",").ToList()) + Response.Redirect("home.aspx", False) + Context.ApplicationInstance.CompleteRequest() + End If + + Case "1" + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = "Usuario incorrecto" + + Case "2" + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = "Contraseña incorrecta" + + Case "3" + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = respIden.errores.ToString() + + Case Else + divLoadingHome.Style.Item("display") = "none" + mensajeError.InnerText = "Error de identificación no controlado." + End Select + End Sub + + Private Sub CargarNotificaciones(respIden As Models.ResultadoIdentificacion) + Dim listpersonas = respIden.Personas.ToList() + Dim numAsistenciasPendientes = 0 + Dim listaPersonasIncidenciasPendientes As List(Of String) = New List(Of String) + + If listpersonas.Count > 1 Then + Dim cont = 0 + + For Each persona As Models.Personal In listpersonas + If cont = 0 Then + cont += 1 + Else + numAsistenciasPendientes += persona.NumeroInciPorAceptar + If persona.NumeroInciPorAceptar > 0 Then + listaPersonasIncidenciasPendientes.Add(persona.Dni) + End If + End If + Next + + If numAsistenciasPendientes > 0 Then + Session.Add("nuIncidenciasPendientes", numAsistenciasPendientes) + Session.Add("listaPersonasIncPend", listaPersonasIncidenciasPendientes) + Session.Add("fechaIniIncidenciasPendientes", respIden.FeIniInciPorAceptar.ToString("yyyy-MM-dd")) + Session.Add("fechaFinIncidenciasPendientes", respIden.FeFinInciPorAceptar.ToString("yyyy-MM-dd")) + Session.Add("mostrarAviso", True) + End If + End If + End Sub + + + Public Shared Async Function cargarListado(usu As String, token As String) As Task(Of String) + Return Await cargarListadoInterno(HttpContext.Current, usu, token) + End Function + + + Public Shared Async Function cargarListadoCertificado(dni As String) As Task(Of String) + If String.IsNullOrWhiteSpace(dni) Then + Return "No se pudo obtener el DNI del certificado." + End If + + Dim currentContext = HttpContext.Current + If currentContext Is Nothing Then + Return "No se pudo recuperar el contexto de sesión del acceso." + End If + + If currentContext.Session Is Nothing Then + Return "No se pudo recuperar la sesión del acceso con certificado." + End If + + Dim endpoint As String = ConfigurationManager.AppSettings("CertLoginEndpoint") + If String.IsNullOrWhiteSpace(endpoint) Then + endpoint = "api/Auth/login-cert-proxy" + End If + + Dim payload = "{""Dni"":""" & EscapeJson(dni.Trim()) & """}" + Dim lastError As String = "No se pudo conectar con el servicio de autenticación." + + For Each baseAddress In ObtenerSwaggerBaseAddresses() + Try + Dim client = HttpClientFactory.Create() + client.BaseAddress = baseAddress + client.Timeout = TimeSpan.FromSeconds(15) + + Using loginContent As New StringContent(payload, Encoding.UTF8, "application/json") + Dim loginResponse = Await client.PostAsync(endpoint, loginContent) + Dim responseContent = Await loginResponse.Content.ReadAsStringAsync() + + If Not loginResponse.IsSuccessStatusCode Then + If Not String.IsNullOrWhiteSpace(responseContent) Then + Return responseContent + End If + + Return "Error en el acceso con certificado." + End If + + Dim parsedJson = JObject.Parse(responseContent) + Dim token = If(parsedJson("token")?.ToString(), If(parsedJson("Token")?.ToString(), "")) + + Dim us = parsedJson("user") + If us Is Nothing Then us = parsedJson("User") + + Dim nif = "" + If us IsNot Nothing Then + nif = If(us("nif")?.ToString(), + If(us("NIF")?.ToString(), + If(us("dni")?.ToString(), + If(us("DNI")?.ToString(), "")))) + End If + + If String.IsNullOrWhiteSpace(token) OrElse String.IsNullOrWhiteSpace(nif) Then + Return "Respuesta inválida del servicio de autenticación." + End If + + Try + Return Await cargarListadoInterno(currentContext, nif, token) + Catch ex As Exception + Return "Error interno completando el acceso con certificado: " & ex.Message + End Try + End Using + Catch ex As Exception When TypeOf ex Is HttpRequestException OrElse + TypeOf ex Is TaskCanceledException OrElse + TypeOf ex Is InvalidOperationException OrElse + TypeOf ex Is UriFormatException + lastError = ex.Message + End Try + Next + + Return "No se pudo conectar con el servicio de autenticación configurado: " & lastError + End Function + + Private Shared Iterator Function ObtenerSwaggerBaseAddresses() As IEnumerable(Of Uri) + Dim seen As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) + + For Each candidate In ObtenerSwaggerBaseAddressCandidates() + Dim normalizedCandidate = candidate.Trim() + If normalizedCandidate = "" Then + Continue For + End If + + Dim baseUri As Uri = Nothing + If Not Uri.TryCreate(normalizedCandidate, UriKind.Absolute, baseUri) Then + Continue For + End If + + Dim key = baseUri.AbsoluteUri.TrimEnd("/"c) + If seen.Add(key) Then + Yield baseUri + End If + Next + End Function + + Private Shared Iterator Function ObtenerSwaggerBaseAddressCandidates() As IEnumerable(Of String) + Dim configuredUrl = UtilAntifraude.urlSwagger() + If Not String.IsNullOrWhiteSpace(configuredUrl) Then + Yield configuredUrl + + Dim configuredUri As Uri = Nothing + If Uri.TryCreate(configuredUrl, UriKind.Absolute, configuredUri) AndAlso + String.Equals(configuredUri.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) AndAlso + EsHostLocal(configuredUri.Host) Then + + Dim httpBuilder As New UriBuilder(configuredUri) With { + .Scheme = Uri.UriSchemeHttp, + .Port = configuredUri.Port + } + + Yield httpBuilder.Uri.AbsoluteUri + End If + End If + + Dim explicitFallback = ConfigurationManager.AppSettings("SwaggerVBFallback") + If Not String.IsNullOrWhiteSpace(explicitFallback) Then + Yield explicitFallback + End If + End Function + + Private Shared Function EsHostLocal(host As String) As Boolean + Return String.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase) OrElse + String.Equals(host, "127.0.0.1", StringComparison.OrdinalIgnoreCase) OrElse + String.Equals(host, "::1", StringComparison.OrdinalIgnoreCase) + End Function + + Private Shared Function EscapeJson(valor As String) As String + If valor Is Nothing Then Return "" + Return valor.Replace("\", "\\").Replace("""", "\""").Replace(vbCrLf, "\n").Replace(vbLf, "\n").Replace(vbCr, "\n") + End Function + + Private Shared Async Function cargarListadoInterno(context As HttpContext, usu As String, token As String) As Task(Of String) + If context Is Nothing Then + Return "No se pudo recuperar la sesión del usuario." + End If + + Dim session = context.Session + If session Is Nothing Then + Return "No se pudo recuperar la sesión del usuario." + End If + + session("token") = token + + Dim client = HttpClientFactory.Create() + client.BaseAddress = New Uri(UtilAntifraude.urlSwagger()) + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + + Dim loginResponse = Await client.GetAsync("api/ResultadoIdentificacion/nif/" + usu + "/Origen/WEBINTRANET") + Dim responseContent = Await loginResponse.Content.ReadAsStringAsync() + Dim respIden = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoIdentificacion)(responseContent) + + If respIden Is Nothing Then + Return "No se pudo identificar al usuario." + End If + + If respIden.Personas Is Nothing OrElse respIden.Personas.Count = 0 Then + Return "La identificación no devolvió ninguna persona asociada." + End If + + Dim resultado = Convert.ToString(respIden.resultado) + + Select Case resultado + Case "0" + Dim nombre = respIden.Personas(0).Nombre + Dim nif = respIden.Personas(0).Dni + + session("Nombre") = nombre + session("usuario") = nif + session("Persona") = respIden + + Dim listpersonas = respIden.Personas.ToList() + Dim numAsistenciasPendientes = 0 + Dim listaPersonasIncidenciasPendientes As List(Of String) = New List(Of String) + + If listpersonas.Count > 1 Then + Dim cont = 0 + For Each persona As Models.Personal In listpersonas + If cont = 0 Then + cont += 1 + Else + numAsistenciasPendientes += persona.NumeroInciPorAceptar + If persona.NumeroInciPorAceptar > 0 Then + listaPersonasIncidenciasPendientes.Add(persona.Dni) + End If + End If + Next + + If numAsistenciasPendientes > 0 Then + session("nuIncidenciasPendientes") = numAsistenciasPendientes + session("listaPersonasIncPend") = listaPersonasIncidenciasPendientes + session("fechaIniIncidenciasPendientes") = respIden.FeIniInciPorAceptar.ToString("yyyy-MM-dd") + session("fechaFinIncidenciasPendientes") = respIden.FeFinInciPorAceptar.ToString("yyyy-MM-dd") + session("mostrarAviso") = True + End If + End If + + If Not String.IsNullOrWhiteSpace(usu) AndAlso usu.Length > 1 Then + If Not "0123456789".Contains(usu.Substring(1, 1)) Then + session("LDAP") = usu + End If + End If + + If respIden.Personas.Count > 1 Then + Return "selModo.aspx" + End If + + session("modo") = "PROPIO" + session("usuariosSeleccionados") = nif.Split(",").ToList() + Return "home.aspx" + + Case "1" + Return "Usuario incorrecto" + + Case "2" + Return "Contraseña incorrecta" + + Case "3" + Return Convert.ToString(respIden.errores) + + Case Else + Return "Error de identificación no controlado" + End Select + End Function + +End Class + +Public Class NominaTrabajador + Public Property idNominaTrabajador As String + Public Property Descripcion As String + Public Property MesNomina As Integer +End Class diff --git a/.codex-links/WebIntranet/Global.asax b/.codex-links/WebIntranet/Global.asax new file mode 100644 index 0000000..f9b9e19 --- /dev/null +++ b/.codex-links/WebIntranet/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.vb" Inherits="WebIntranet.Global_asax" Language="VB" %> \ No newline at end of file diff --git a/.codex-links/WebIntranet/Global.asax.vb b/.codex-links/WebIntranet/Global.asax.vb new file mode 100644 index 0000000..05ebb47 --- /dev/null +++ b/.codex-links/WebIntranet/Global.asax.vb @@ -0,0 +1,45 @@ +Imports System.Web.SessionState +Imports DevExpress.Web + +Public Class Global_asax + Inherits System.Web.HttpApplication + Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) + AddHandler DevExpress.Web.ASPxWebControl.CallbackError, AddressOf Application_Error + End Sub + + Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) + ' Fires when the session is started + End Sub + + Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) + ' Fires at the beginning of each request + End Sub + + Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) + ' Fires upon attempting to authenticate the use + End Sub + + Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) + ' Fires when an error occurs + End Sub + + Sub Session_End(ByVal sender As Object, ByVal e As EventArgs) + ' Fires when the session ends + End Sub + + Sub Application_End(ByVal sender As Object, ByVal e As EventArgs) + ' Fires when the application ends + End Sub + + Private Sub Global_asax_AcquireRequestState(sender As Object, e As EventArgs) Handles Me.AcquireRequestState + 'If HttpContext.Current.Session IsNot Nothing Then + ' Dim url = HttpContext.Current.Request.Url.AbsoluteUri + ' Dim usu = If(HttpContext.Current.Session Is Nothing OrElse HttpContext.Current.Session("usuario") Is Nothing, "", HttpContext.Current.Session("usuario")) + ' If (url.ToLower.EndsWith("default.aspx") = False AndAlso url.ToLower.EndsWith("sesionnovalida.aspx") = False) AndAlso usu = "" Then + ' Server.ClearError() + ' Response.Clear() + ' Response.Redirect("/sesionNoValida.aspx", True) + ' End If + 'End If + End Sub +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/ILLink/ILLink.Descriptors.LibraryBuild.xml b/.codex-links/WebIntranet/ILLink/ILLink.Descriptors.LibraryBuild.xml new file mode 100644 index 0000000..a42d7f0 --- /dev/null +++ b/.codex-links/WebIntranet/ILLink/ILLink.Descriptors.LibraryBuild.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.codex-links/WebIntranet/LoginCertBridge.aspx b/.codex-links/WebIntranet/LoginCertBridge.aspx new file mode 100644 index 0000000..dfcfe80 --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertBridge.aspx @@ -0,0 +1,10 @@ +<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="LoginCertBridge.aspx.vb" Inherits="WebIntranet.LoginCertBridge" Async="true" %> + + + + + Login Cert Bridge + + + + diff --git a/.codex-links/WebIntranet/LoginCertBridge.aspx.designer.vb b/.codex-links/WebIntranet/LoginCertBridge.aspx.designer.vb new file mode 100644 index 0000000..87a0f4c --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertBridge.aspx.designer.vb @@ -0,0 +1,15 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class LoginCertBridge +End Class diff --git a/.codex-links/WebIntranet/LoginCertBridge.aspx.vb b/.codex-links/WebIntranet/LoginCertBridge.aspx.vb new file mode 100644 index 0000000..e37c1d0 --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertBridge.aspx.vb @@ -0,0 +1,254 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Text +Imports System.Threading.Tasks +Imports System.Web +Imports System.Web.Caching +Imports Newtonsoft.Json + +Public Class LoginCertBridge + Inherits System.Web.UI.Page + + Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load + RegisterAsyncTask(New PageAsyncTask(AddressOf Procesar)) + End Sub + + Private Async Function Procesar() As Threading.Tasks.Task + Dim iframe As Boolean = String.Equals(Convert.ToString(Request.QueryString("iframe")), "true", StringComparison.OrdinalIgnoreCase) + Dim parentOrigin As String = Convert.ToString(Request.QueryString("parentOrigin")) + Dim returnUrl As String = Convert.ToString(Request.QueryString("returnUrl")) + Dim state As String = Convert.ToString(Request.QueryString("state")) + Dim options = Models.CertificateLoginBridgeOptions.LoadFromConfiguration() + + Try + If Not Models.CertificateLoginBridgeHelper.IsCertificateHostRequest(Request, options.PublicUrl) Then + ResponderError("Not Found", 404, iframe, parentOrigin) + Return + End If + + If iframe AndAlso Not Models.CertificateLoginBridgeHelper.IsAllowedParentOrigin(parentOrigin, options.AllowedParentOrigins) Then + ResponderError("El origen padre no está permitido.", 400, iframe, parentOrigin) + Return + End If + + Dim cert = Models.CertificateLoginBridgeHelper.ReadCertificate( + Request, + options.ForwardedCertificateHeader, + options.AdditionalForwardedCertificateHeaders) + + If cert Is Nothing Then + ResponderError("Certificado no proporcionado.", 401, iframe, parentOrigin) + Return + End If + + Dim dni As String = Models.CertificateLoginBridgeHelper.ObtenerDni(cert) + If String.IsNullOrWhiteSpace(dni) Then + ResponderError("No se pudo obtener un DNI válido del certificado.", 401, iframe, parentOrigin) + Return + End If + + If Not String.IsNullOrWhiteSpace(returnUrl) Then + If Not Models.CertificateLoginBridgeHelper.IsAllowedParentOrigin(returnUrl, options.AllowedParentOrigins) Then + ResponderError("La URL de retorno no esta permitida.", 400, iframe, parentOrigin) + Return + End If + + If String.IsNullOrWhiteSpace(state) Then + ResponderError("No se recibio el estado del acceso con certificado.", 400, iframe, parentOrigin) + Return + End If + + HttpRuntime.Cache.Insert( + GetCacheKey(state), + dni, + Nothing, + DateTime.UtcNow.AddMinutes(2), + Cache.NoSlidingExpiration) + + Response.Redirect(BuildReturnUrl(returnUrl, state), False) + Context.ApplicationInstance.CompleteRequest() + Return + End If + + If iframe Then + Me.Response.StatusCode = 200 + Me.Response.TrySkipIisCustomErrors = True + Me.Response.ContentType = "text/html; charset=utf-8" + Me.Response.Write(Models.CertificateLoginBridgeHelper.BuildIframeDniHtml(dni, parentOrigin)) + Me.Response.Flush() + Context.ApplicationInstance.CompleteRequest() + Return + End If + + Dim endpoint As String = ConfigurationManager.AppSettings("CertLoginEndpoint") + If String.IsNullOrWhiteSpace(endpoint) Then + endpoint = "api/Auth/login-cert-proxy" + End If + + Dim payload As String = "{""Dni"":""" & EscapeJson(dni) & """}" + Dim swaggerResult = Await EjecutarLoginCertificadoAsync(endpoint, payload) + Dim responseContent = swaggerResult.ResponseContent + + If Not swaggerResult.IsSuccessStatusCode Then + ResponderError( + "Swagger devolvió " & CInt(swaggerResult.StatusCode).ToString() & ": " & responseContent, + CInt(swaggerResult.StatusCode), + iframe, + parentOrigin) + Return + End If + + Dim loginResponse = JsonConvert.DeserializeObject(Of Models.CertificateProxyLoginResponse)(responseContent) + If loginResponse Is Nothing OrElse + String.IsNullOrWhiteSpace(loginResponse.Token) OrElse + loginResponse.User Is Nothing Then + ResponderError("Respuesta inválida del servicio de autenticación.", 502, iframe, parentOrigin) + Return + End If + + Me.Response.StatusCode = 200 + Me.Response.TrySkipIisCustomErrors = True + + If iframe Then + Me.Response.ContentType = "text/html; charset=utf-8" + Me.Response.Write(Models.CertificateLoginBridgeHelper.BuildIframeLoginHtml(loginResponse, parentOrigin)) + Else + Me.Response.ContentType = "application/json; charset=utf-8" + Me.Response.Write(responseContent) + End If + + Me.Response.Flush() + Context.ApplicationInstance.CompleteRequest() + Catch ex As Exception + ResponderError("Error interno: " & ex.Message, 500, iframe, parentOrigin) + End Try + End Function + + Private Sub ResponderError(mensaje As String, statusCode As Integer, iframe As Boolean, parentOrigin As String) + Me.Response.TrySkipIisCustomErrors = True + + If iframe Then + Me.Response.StatusCode = 200 + Me.Response.Headers("X-Cert-Bridge-StatusCode") = statusCode.ToString() + Me.Response.ContentType = "text/html; charset=utf-8" + Me.Response.Write(Models.CertificateLoginBridgeHelper.BuildIframeErrorHtml(mensaje, parentOrigin)) + Me.Response.Flush() + Context.ApplicationInstance.CompleteRequest() + Return + End If + + Me.Response.StatusCode = statusCode + Me.Response.ContentType = "text/plain; charset=utf-8" + Me.Response.Write(mensaje) + Me.Response.Flush() + Context.ApplicationInstance.CompleteRequest() + End Sub + + Private Async Function EjecutarLoginCertificadoAsync(endpoint As String, payload As String) As Task(Of SwaggerProxyResult) + Dim lastException As Exception = Nothing + + For Each baseAddress In ObtenerSwaggerBaseAddresses() + Try + Dim client = HttpClientFactory.Create() + client.BaseAddress = baseAddress + client.Timeout = TimeSpan.FromSeconds(20) + + Using content As New StringContent(payload, Encoding.UTF8, "application/json") + Dim httpResponse = Await client.PostAsync(endpoint, content).ConfigureAwait(False) + Dim responseContent = Await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(False) + + Return New SwaggerProxyResult With { + .StatusCode = httpResponse.StatusCode, + .ResponseContent = responseContent + } + End Using + Catch ex As Exception When TypeOf ex Is HttpRequestException OrElse TypeOf ex Is TaskCanceledException OrElse TypeOf ex Is InvalidOperationException + lastException = ex + End Try + Next + + Throw New Exception( + "No se pudo conectar con el servicio de autenticación configurado (" & UtilAntifraude.urlSwagger() & ").", + lastException) + End Function + + Private Iterator Function ObtenerSwaggerBaseAddresses() As IEnumerable(Of Uri) + Dim seen As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) + + For Each candidate In ObtenerSwaggerBaseAddressCandidates() + Dim normalizedCandidate = candidate.Trim() + If normalizedCandidate = "" Then + Continue For + End If + + Dim baseUri As Uri = Nothing + If Not Uri.TryCreate(normalizedCandidate, UriKind.Absolute, baseUri) Then + Continue For + End If + + Dim key = baseUri.AbsoluteUri.TrimEnd("/"c) + If seen.Add(key) Then + Yield baseUri + End If + Next + End Function + + Private Iterator Function ObtenerSwaggerBaseAddressCandidates() As IEnumerable(Of String) + Dim configuredUrl = UtilAntifraude.urlSwagger() + If Not String.IsNullOrWhiteSpace(configuredUrl) Then + Yield configuredUrl + + Dim configuredUri As Uri = Nothing + If Uri.TryCreate(configuredUrl, UriKind.Absolute, configuredUri) AndAlso + String.Equals(configuredUri.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) AndAlso + EsHostLocal(configuredUri.Host) Then + + Dim httpBuilder As New UriBuilder(configuredUri) With { + .Scheme = Uri.UriSchemeHttp, + .Port = configuredUri.Port + } + + Yield httpBuilder.Uri.AbsoluteUri + End If + End If + + Dim explicitFallback = ConfigurationManager.AppSettings("SwaggerVBFallback") + If Not String.IsNullOrWhiteSpace(explicitFallback) Then + Yield explicitFallback + End If + End Function + + Private Function EsHostLocal(host As String) As Boolean + Return String.Equals(host, "localhost", StringComparison.OrdinalIgnoreCase) OrElse + String.Equals(host, "127.0.0.1", StringComparison.OrdinalIgnoreCase) OrElse + String.Equals(host, "::1", StringComparison.OrdinalIgnoreCase) + End Function + + Private Function EscapeJson(valor As String) As String + If valor Is Nothing Then Return "" + Return valor.Replace("\", "\\").Replace("""", "\""").Replace(vbCrLf, "\n").Replace(vbLf, "\n").Replace(vbCr, "\n") + End Function + + Private Function BuildReturnUrl(returnUrl As String, state As String) As String + Dim builder As New UriBuilder(returnUrl) + Dim query = HttpUtility.ParseQueryString(builder.Query) + query("state") = state.Trim() + builder.Query = query.ToString() + Return builder.Uri.AbsoluteUri + End Function + + Private Function GetCacheKey(state As String) As String + Return "CertLoginState:" & state.Trim() + End Function + + Private NotInheritable Class SwaggerProxyResult + Public Property StatusCode As HttpStatusCode + Public Property ResponseContent As String = String.Empty + + Public ReadOnly Property IsSuccessStatusCode As Boolean + Get + Return CInt(StatusCode) >= 200 AndAlso CInt(StatusCode) <= 299 + End Get + End Property + End Class +End Class diff --git a/.codex-links/WebIntranet/LoginCertCallback.aspx b/.codex-links/WebIntranet/LoginCertCallback.aspx new file mode 100644 index 0000000..c660501 --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertCallback.aspx @@ -0,0 +1,10 @@ +<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="LoginCertCallback.aspx.vb" Inherits="WebIntranet.LoginCertCallback" Async="true" %> + + + + + Acceso con certificado + + + + diff --git a/.codex-links/WebIntranet/LoginCertCallback.aspx.designer.vb b/.codex-links/WebIntranet/LoginCertCallback.aspx.designer.vb new file mode 100644 index 0000000..918cde4 --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertCallback.aspx.designer.vb @@ -0,0 +1,5 @@ +Option Strict On +Option Explicit On + +Partial Public Class LoginCertCallback +End Class diff --git a/.codex-links/WebIntranet/LoginCertCallback.aspx.vb b/.codex-links/WebIntranet/LoginCertCallback.aspx.vb new file mode 100644 index 0000000..282bb2a --- /dev/null +++ b/.codex-links/WebIntranet/LoginCertCallback.aspx.vb @@ -0,0 +1,50 @@ +Imports System.Web +Imports System.Threading.Tasks + +Public Class LoginCertCallback + Inherits System.Web.UI.Page + + Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load + RegisterAsyncTask(New PageAsyncTask(AddressOf Procesar)) + End Sub + + Private Async Function Procesar() As Task + Dim state = Convert.ToString(Request.QueryString("state")) + If String.IsNullOrWhiteSpace(state) Then + RedirigirConError("No se recibió el estado del acceso con certificado.") + Return + End If + + Dim cacheKey = GetCacheKey(state) + Dim dni = TryCast(HttpRuntime.Cache(cacheKey), String) + If Not String.IsNullOrWhiteSpace(dni) Then + HttpRuntime.Cache.Remove(cacheKey) + End If + + If String.IsNullOrWhiteSpace(dni) Then + RedirigirConError("No se pudo recuperar el DNI del acceso con certificado.") + Return + End If + + Dim result = Await _Default.cargarListadoCertificado(dni) + If String.Equals(result, "home.aspx", StringComparison.OrdinalIgnoreCase) OrElse + String.Equals(result, "selModo.aspx", StringComparison.OrdinalIgnoreCase) Then + + Response.Redirect(result, False) + Context.ApplicationInstance.CompleteRequest() + Return + End If + + RedirigirConError(result) + End Function + + Private Sub RedirigirConError(message As String) + Dim safeMessage = If(String.IsNullOrWhiteSpace(message), "No se pudo completar el acceso con certificado.", message) + Response.Redirect("Default.aspx?certError=" & HttpUtility.UrlEncode(safeMessage), False) + Context.ApplicationInstance.CompleteRequest() + End Sub + + Private Shared Function GetCacheKey(state As String) As String + Return "CertLoginState:" & state.Trim() + End Function +End Class diff --git a/.codex-links/WebIntranet/Menu.aspx b/.codex-links/WebIntranet/Menu.aspx new file mode 100644 index 0000000..71940bd --- /dev/null +++ b/.codex-links/WebIntranet/Menu.aspx @@ -0,0 +1,15 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="Menu.aspx.vb" Inherits="WebIntranet.Menu" %> + + +
+ +
+

+
+
+
+
+
+
+
diff --git a/.codex-links/WebIntranet/Menu.aspx.designer.vb b/.codex-links/WebIntranet/Menu.aspx.designer.vb new file mode 100644 index 0000000..c4fde89 --- /dev/null +++ b/.codex-links/WebIntranet/Menu.aspx.designer.vb @@ -0,0 +1,51 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Menu + + ''' + '''Control navLateral. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents navLateral As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control tituloMob. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents tituloMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control migasDePan. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents migasDePan As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control listMenu. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents listMenu As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/Menu.aspx.vb b/.codex-links/WebIntranet/Menu.aspx.vb new file mode 100644 index 0000000..5c22a89 --- /dev/null +++ b/.codex-links/WebIntranet/Menu.aspx.vb @@ -0,0 +1,186 @@ +Imports System.Net +Imports System.Net.Security +Imports WebIntranet.Models + +Public Class Menu + Inherits System.Web.UI.Page + Public sessionUsuario As String + Public usuariosSeleccionados As List(Of String) + Public idGrupo As Integer + Public listaGruposInci As List(Of grupos) + Public listaGruposSoli As List(Of grupos) + Public listaGruposGene As List(Of grupos) + Public idSubgrupo As String + Public subgrupos As List(Of subGrupos) + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + sessionUsuario = Session("usuario") + idGrupo = Request.QueryString("g") + Dim tipo = Request.QueryString("t") + idSubgrupo = Request.QueryString("sg") + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/GruposIncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim Datos As List(Of Models.grupos) = + deserializador3.Deserialize(Of List(Of Models.grupos))(respuesta3) + + listaGruposInci = Datos.Where(Function(x) x.NumIncidencias <> 0).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Descripcion).ToList + listaGruposSoli = Datos.Where(Function(x) x.NumSolicitudes <> 0).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Descripcion).ToList + listaGruposGene = Datos.OrderBy(Function(x) x.orden AndAlso (x.NumIncidencias <> 0 OrElse x.NumSolicitudes <> 0)).ThenBy(Function(x) x.Descripcion).ToList + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/SubGruposIncidenciasControlHorario?idGrupo=" + idGrupo.ToString + Dim credenciales2 As New Net.CredentialCache() + Dim clienteHTTP2 As New Net.WebClient() + clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + clienteHTTP2.Credentials = credenciales2 + Dim respuesta2 As String = clienteHTTP3.DownloadString(url2) + Dim deserializador2 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings2 As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim Datos2 As ResultadoSubGruposIncidenciasControlHorario = + deserializador2.Deserialize(Of ResultadoSubGruposIncidenciasControlHorario)(respuesta2) + subgrupos = Datos2.listaSubgrupos + subgrupos = If(tipo = "p", subgrupos.Where(Function(x) x.numSol <> 0).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.descripcion).ToList, subgrupos.Where(Function(x) x.numCom <> 0).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.descripcion).ToList) + cargarBarraLateral(tipo) + cargarMenu(tipo) + End Sub + Public Sub cargarBarraLateral(tipo As String) + Dim lista + If tipo = "p" Then + lista = listaGruposSoli + ElseIf tipo = "i" Then + lista = listaGruposInci + ElseIf tipo Is Nothing OrElse tipo = "" Then + lista = listaGruposGene + End If + Dim html = "" + html += "" + navLateral.InnerHtml = html + End Sub + Public Sub cargarMenu(tipo As String) + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/IncidenciasControlHorario" + ' Dim url3 As String = "http://192.168.41.14:81/api/IncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + credenciales3.Add(New Uri(url3), "Basic", New Net.NetworkCredential(usuario, contraseña)) + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim listaPicada As List(Of Incidencia) = + deserializador3.Deserialize(Of List(Of Incidencia))(respuesta3) + Dim ListIncidenciasNoReloj = listaPicada.Where(Function(x) x.EsInciReloj = False).OrderBy(Function(x) x.Descripcion).ToList + Dim lista As List(Of Incidencia) + Dim htmlMigas = "" + 'Dim htmlTituloMob = "" + Dim descrip + Dim sec + Dim titulo + If tipo = "p" Then + sec = "Permisos" + descrip = listaGruposSoli.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + lista = ListIncidenciasNoReloj.Where(Function(x) x.RequiereAprobacion = True AndAlso x.idGrupo IsNot "" AndAlso x.idGrupo = idGrupo AndAlso x.visibleWeb = True).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Nombre).ToList + htmlMigas += "
    " + + "
  • / Permisos
  • " + + "
  • / " + listaGruposSoli.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + "
  • " + + "
" + titulo = listaGruposSoli.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + ElseIf tipo = "i" Then + sec = "Incidencias" + descrip = listaGruposInci.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + lista = ListIncidenciasNoReloj.Where(Function(x) x.RequiereAprobacion = False AndAlso x.idGrupo IsNot "" AndAlso x.idGrupo = idGrupo AndAlso x.visibleWeb = True).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Nombre).ToList + htmlMigas += "
    " + + "
  • / Comunicaciones
  • " + + "
  • / " + listaGruposInci.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + "
  • " + + "
" + titulo = listaGruposInci.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + ElseIf tipo Is Nothing OrElse tipo = "" Then + sec = "Incidencias y comunicaciones" + descrip = listaGruposGene.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + lista = ListIncidenciasNoReloj.Where(Function(x) x.idGrupo IsNot "" AndAlso x.idGrupo = idGrupo AndAlso x.visibleWeb = True).OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Nombre).ToList + htmlMigas += "
    " + + "
  • / Solicitudes y comunicaciones
  • " + + "
  • / " + listaGruposGene.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + "
  • " + + "
" + titulo = listaGruposGene.FirstOrDefault(Function(x) x.idGrupo = idGrupo).Descripcion + End If + Dim htmlSubgrupos = "" + If subgrupos.Count > 0 Then + For Each subgrp As subGrupos In subgrupos + Dim listainciSubgrupo = lista.Where(Function(x) x.idSubgrupo IsNot "" AndAlso x.idSubgrupo = subgrp.idSubGrupo) + If listainciSubgrupo.All(Function(x) x.visibleWeb <> False) = True Then + htmlSubgrupos += "
" + + If(subgrp.ayudaWeb IsNot Nothing, "" + subgrp.ayudaWeb + "", "") + + "
" + + "
" + + "" + + "" + + "
" + + "
" + + "
" + + "
" + + "
    " + For Each itemSub As Incidencia In listainciSubgrupo.OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Nombre) + htmlSubgrupos += "
  • " + If(itemSub.ayudaWeb IsNot Nothing, "" + itemSub.ayudaWeb + "", "") + "" + itemSub.Nombre.Replace("""", "") + "
  • " + Next + htmlSubgrupos += "
" + + "
" + + "
" + + "
" + End If + Next + End If + Dim html = "" + + 'Dim listaSinSG = lista.Where(Function(x) x.idSubgrupo = "") + ''SERGIO:El agu me dijo que tenian que salir ordenados por campo orden + Dim listaSinSG = lista.Where(Function(x) x.idSubgrupo = "").OrderBy(Function(x) x.orden) + If listaSinSG.Count > 0 Then + html += "
" + + "
" + + "
" + + "" + + "" + + "
" + + "
" + + "
" + + "
" + + "
    " + For Each item As Incidencia In listaSinSG.OrderBy(Function(x) x.orden).ThenBy(Function(x) x.Nombre) + html += "
  • " + If(item.ayudaWeb IsNot Nothing, "" + item.ayudaWeb + "", "") + "" + item.Nombre.Replace("""", "") + "
  • " + Next + html += "
" + + "
" + + "
" + + "
" + End If + migasDePan.InnerHtml = htmlMigas + 'tituloMenu.InnerText = titulo + + listMenu.InnerHtml = "
" + html + htmlSubgrupos + "
" + tituloMob.InnerText = titulo + End Sub +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/Models/CertificateLoginBridgeHelper.vb b/.codex-links/WebIntranet/Models/CertificateLoginBridgeHelper.vb new file mode 100644 index 0000000..a6a8cfe --- /dev/null +++ b/.codex-links/WebIntranet/Models/CertificateLoginBridgeHelper.vb @@ -0,0 +1,490 @@ +Imports System.Security.Cryptography.X509Certificates +Imports System.Text.RegularExpressions +Imports Newtonsoft.Json + +Namespace Models + Public Class CertificateLoginBridgeOptions + Public Property PublicUrl As String = String.Empty + Public Property ForwardedCertificateHeader As String = "X-ARR-ClientCert" + Public Property AdditionalForwardedCertificateHeaders As List(Of String) = New List(Of String)() + Public Property AllowedParentOrigins As List(Of String) = New List(Of String)() + + Public Shared Function LoadFromConfiguration() As CertificateLoginBridgeOptions + Dim publicUrl = FirstNonEmpty( + ConfigurationManager.AppSettings("CertificateLoginPublicUrl"), + ConfigurationManager.AppSettings("UrlCertLogin")) + + Dim forwardedCertificateHeader = FirstNonEmpty( + ConfigurationManager.AppSettings("CertificateForwardedHeader"), + ConfigurationManager.AppSettings("CertHeaderName"), + "X-ARR-ClientCert") + + Dim additionalHeadersSetting = FirstNonEmpty( + ConfigurationManager.AppSettings("CertificateAdditionalForwardedHeaders"), + ConfigurationManager.AppSettings("AdditionalCertHeaders")) + + Dim allowedOriginsSetting = FirstNonEmpty( + ConfigurationManager.AppSettings("CertificateAllowedParentOrigins"), + ConfigurationManager.AppSettings("AllowedParentOrigins")) + + Return New CertificateLoginBridgeOptions With { + .PublicUrl = publicUrl, + .ForwardedCertificateHeader = forwardedCertificateHeader, + .AdditionalForwardedCertificateHeaders = SplitSetting(additionalHeadersSetting), + .AllowedParentOrigins = SplitSetting(allowedOriginsSetting) + } + End Function + + Private Shared Function SplitSetting(value As String) As List(Of String) + If String.IsNullOrWhiteSpace(value) Then + Return New List(Of String)() + End If + + Return value.Split(New Char() {";"c, "|"c}, StringSplitOptions.RemoveEmptyEntries). + Select(Function(item) item.Trim()). + Where(Function(item) item <> String.Empty). + ToList() + End Function + + Private Shared Function FirstNonEmpty(ParamArray values() As String) As String + For Each value In values + If Not String.IsNullOrWhiteSpace(value) Then + Return value.Trim() + End If + Next + + Return String.Empty + End Function + End Class + + Public Class CertificateProxyLoginResponse + Public Property Token As String = String.Empty + Public Property User As CertificateProxyUser + End Class + + Public Class CertificateProxyUser + Public Property NIF As String = String.Empty + Public Property NOMBRE As String = String.Empty + Public Property APELLIDOS As String = String.Empty + Public Property ADMINISTRARPTYREGISTRO As Boolean? + End Class + + Public Module CertificateLoginBridgeHelper + Private ReadOnly DefaultCertificateHeaders As String() = { + "X-ARR-ClientCert", + "X-Client-Cert", + "X-Client-Cert-Der-Base64", + "X-Client-Certificate", + "X-Client-Certificate-Der-Base64", + "X-SSL-CERT", + "X-SSL-Client-Cert", + "X-SSL-Client-Cert-Base64", + "X-Tls-Client-Cert", + "X-Tls-Client-Cert-Der-Base64", + "X-Forwarded-Tls-Client-Cert", + "Ssl-Client-Cert" + } + + Private ReadOnly DefaultCertificateServerVariables As String() = { + "SSL_CLIENT_CERT", + "HTTP_SSL_CLIENT_CERT", + "HTTP_X_SSL_CLIENT_CERT", + "HTTP_X_CLIENT_CERT", + "HTTP_X_CLIENT_CERTIFICATE", + "HTTP_X_ARR_CLIENTCERT", + "CERT_CERTIFICATE" + } + + Public Function IsCertificateHostRequest(request As HttpRequest, publicUrl As String) As Boolean + If request Is Nothing OrElse String.IsNullOrWhiteSpace(publicUrl) Then + Return False + End If + + Dim configuredUri As Uri = Nothing + If Not Uri.TryCreate(publicUrl, UriKind.Absolute, configuredUri) Then + Return False + End If + + Dim forwardedHostRaw = GetFirstHeaderValue(request, "X-Forwarded-Host") + Dim forwardedProtoRaw = GetFirstHeaderValue(request, "X-Forwarded-Proto") + Dim forwardedPortRaw = GetFirstHeaderValue(request, "X-Forwarded-Port") + Dim hasForwardedInfo = + Not String.IsNullOrWhiteSpace(forwardedHostRaw) OrElse + Not String.IsNullOrWhiteSpace(forwardedProtoRaw) OrElse + Not String.IsNullOrWhiteSpace(forwardedPortRaw) + + Dim requestHost = ExtractHost(If(hasForwardedInfo, forwardedHostRaw, Nothing)) + If String.IsNullOrWhiteSpace(requestHost) AndAlso request.Url IsNot Nothing Then + requestHost = request.Url.Host + End If + + If Not String.Equals(requestHost, configuredUri.Host, StringComparison.OrdinalIgnoreCase) Then + Return False + End If + + If Not hasForwardedInfo Then + Return True + End If + + Dim requestScheme = FirstToken(forwardedProtoRaw) + If String.IsNullOrWhiteSpace(requestScheme) Then + requestScheme = configuredUri.Scheme + End If + + Dim requestPort = ParseNullableInt(forwardedPortRaw) + If Not requestPort.HasValue Then + requestPort = ExtractPort(forwardedHostRaw) + End If + If Not requestPort.HasValue Then + requestPort = GetDefaultPort(requestScheme) + End If + + Dim configuredPort = If(configuredUri.IsDefaultPort, GetDefaultPort(configuredUri.Scheme), configuredUri.Port) + Return String.Equals(requestScheme, configuredUri.Scheme, StringComparison.OrdinalIgnoreCase) AndAlso + requestPort.Value = configuredPort + End Function + + Public Function IsAllowedParentOrigin(parentOrigin As String, allowedParentOrigins As IEnumerable(Of String)) As Boolean + Dim normalizedParentOrigin = NormalizeOrigin(parentOrigin) + If String.IsNullOrWhiteSpace(normalizedParentOrigin) Then + Return False + End If + + Return allowedParentOrigins. + Where(Function(origin) Not String.IsNullOrWhiteSpace(origin)). + Select(Function(origin) NormalizeOrigin(origin)). + Any(Function(origin) String.Equals(origin, normalizedParentOrigin, StringComparison.OrdinalIgnoreCase)) + End Function + + Public Function ReadCertificate( + request As HttpRequest, + forwardedCertificateHeader As String, + additionalForwardedCertificateHeaders As IEnumerable(Of String)) As X509Certificate2 + + Dim directCertificate = ReadDirectCertificate(request) + If directCertificate IsNot Nothing Then + Return directCertificate + End If + + Dim headerCandidates As New List(Of String)() + AddHeaderCandidate(headerCandidates, forwardedCertificateHeader) + + If additionalForwardedCertificateHeaders IsNot Nothing Then + For Each headerName In additionalForwardedCertificateHeaders + AddHeaderCandidate(headerCandidates, headerName) + Next + End If + + For Each headerName In DefaultCertificateHeaders + AddHeaderCandidate(headerCandidates, headerName) + Next + + For Each headerName In headerCandidates.Distinct(StringComparer.OrdinalIgnoreCase) + Dim rawHeader = request.Headers(headerName) + If String.IsNullOrWhiteSpace(rawHeader) Then + Continue For + End If + + Dim certificate = TryCreateCertificate(rawHeader) + If certificate IsNot Nothing Then + Return certificate + End If + Next + + For Each serverVariableName In DefaultCertificateServerVariables + Dim rawValue = request.ServerVariables(serverVariableName) + If String.IsNullOrWhiteSpace(rawValue) Then + Continue For + End If + + Dim certificate = TryCreateCertificate(rawValue) + If certificate IsNot Nothing Then + Return certificate + End If + Next + + Return Nothing + End Function + + Public Function ObtenerDni(certificado As X509Certificate2) As String + Try + If certificado Is Nothing Then + Return String.Empty + End If + + Dim candidateValues As New List(Of String) From { + ExtractDistinguishedNameValue(certificado.Subject, "OID.2.5.4.97"), + ExtractDistinguishedNameValue(certificado.Subject, "2.5.4.97"), + ExtractDistinguishedNameValue(certificado.Subject, "SERIALNUMBER"), + ExtractDistinguishedNameValue(certificado.Subject, "OID.2.5.4.5"), + ExtractDistinguishedNameValue(certificado.Subject, "2.5.4.5"), + certificado.GetNameInfo(X509NameType.SimpleName, False) + } + + For Each candidateValue In candidateValues + Dim nif = NormalizarIdentificadorFiscal(candidateValue) + If nif <> String.Empty Then + Return nif + End If + Next + + Return NormalizarIdentificadorFiscal(certificado.Subject) + Catch + Return String.Empty + End Try + End Function + + Public Function BuildIframeDniHtml(dni As String, parentOrigin As String) As String + Dim payloadJson = JsonConvert.SerializeObject(New With { + .dni = dni + }) + Dim targetOriginJson = JsonConvert.SerializeObject(NormalizeOrigin(parentOrigin)) + + Return BuildIframePostMessageHtml( + payloadJson, + targetOriginJson, + "Validando acceso con certificado...") + End Function + + Public Function BuildIframeLoginHtml(response As CertificateProxyLoginResponse, parentOrigin As String) As String + Dim payloadJson = JsonConvert.SerializeObject(New With { + .token = response.Token, + .user = response.User + }) + Dim targetOriginJson = JsonConvert.SerializeObject(NormalizeOrigin(parentOrigin)) + + Return BuildIframePostMessageHtml( + payloadJson, + targetOriginJson, + "Validando acceso con certificado...") + End Function + + Public Function BuildIframeErrorHtml(message As String, parentOrigin As String) As String + Dim payloadJson = JsonConvert.SerializeObject(New With { + .error = message + }) + Dim targetOriginJson = JsonConvert.SerializeObject(NormalizeOrigin(parentOrigin)) + Dim safeMessage = If(String.IsNullOrWhiteSpace(message), "No se pudo completar el acceso con certificado.", message) + + Return BuildIframePostMessageHtml( + payloadJson, + targetOriginJson, + safeMessage) + End Function + + Private Function BuildIframePostMessageHtml( + payloadJson As String, + targetOriginJson As String, + visibleMessage As String) As String + + Dim visibleMessageJson = JsonConvert.SerializeObject(visibleMessage) + + Return "" & + "" & + "Autenticacion Certificado" & + "" & + "
" & + "" & + "" & + "" + End Function + + Private Function ReadDirectCertificate(request As HttpRequest) As X509Certificate2 + Try + If request Is Nothing OrElse request.ClientCertificate Is Nothing OrElse Not request.ClientCertificate.IsPresent Then + Return Nothing + End If + + Dim rawCertificate = request.ClientCertificate.Certificate + If rawCertificate Is Nothing OrElse rawCertificate.Length = 0 Then + Return Nothing + End If + + Return New X509Certificate2(rawCertificate) + Catch + Return Nothing + End Try + End Function + + Private Function TryCreateCertificate(rawHeader As String) As X509Certificate2 + Dim normalizedValue = Uri.UnescapeDataString(rawHeader).Trim() + If normalizedValue = String.Empty Then + Return Nothing + End If + + If normalizedValue.IndexOf("BEGIN CERTIFICATE", StringComparison.OrdinalIgnoreCase) >= 0 Then + Try + Dim pemPayload = Regex.Replace( + normalizedValue, + "-+BEGIN CERTIFICATE-+|-+END CERTIFICATE-+|\s+", + String.Empty, + RegexOptions.IgnoreCase) + + If pemPayload <> String.Empty Then + Return New X509Certificate2(Convert.FromBase64String(pemPayload)) + End If + Catch + End Try + End If + + Dim compactValue = Regex.Replace(normalizedValue, "\s+", String.Empty) + If compactValue.Length > 0 AndAlso compactValue.Length Mod 2 = 0 AndAlso Regex.IsMatch(compactValue, "^[0-9a-fA-F]+$") Then + Try + Return New X509Certificate2(HexStringToBytes(compactValue)) + Catch + End Try + End If + + Try + Return New X509Certificate2(Convert.FromBase64String(compactValue)) + Catch + Return Nothing + End Try + End Function + + Private Function NormalizarIdentificadorFiscal(value As String) As String + If String.IsNullOrWhiteSpace(value) Then + Return String.Empty + End If + + Dim normalizedValue = value.Trim().Trim(""""c).ToUpperInvariant() + If normalizedValue.StartsWith("IDCES-", StringComparison.OrdinalIgnoreCase) OrElse + normalizedValue.StartsWith("VATES-", StringComparison.OrdinalIgnoreCase) Then + normalizedValue = normalizedValue.Split("-"c).Last().Trim() + End If + + Dim match = Regex.Match(normalizedValue, "\b[0-9XYZ]\d{7}[A-Z]\b", RegexOptions.IgnoreCase) + If match.Success Then + Return match.Value.ToUpperInvariant() + End If + + Return String.Empty + End Function + + Private Function ExtractDistinguishedNameValue(subject As String, attributeName As String) As String + If String.IsNullOrWhiteSpace(subject) OrElse String.IsNullOrWhiteSpace(attributeName) Then + Return String.Empty + End If + + Dim pattern = "(?:^|,\s*)" & Regex.Escape(attributeName) & "\s*=\s*(""[^""]+""|[^,]+)" + Dim match = Regex.Match(subject, pattern, RegexOptions.IgnoreCase) + If Not match.Success Then + Return String.Empty + End If + + Return match.Groups(1).Value.Trim().Trim(""""c) + End Function + + Private Function HexStringToBytes(value As String) As Byte() + Dim bytes((value.Length \ 2) - 1) As Byte + For i = 0 To bytes.Length - 1 + bytes(i) = Convert.ToByte(value.Substring(i * 2, 2), 16) + Next + + Return bytes + End Function + + Private Function NormalizeOrigin(value As String) As String + Dim uri As Uri = Nothing + If Not Uri.TryCreate(value, UriKind.Absolute, uri) Then + Return String.Empty + End If + + Return uri.GetLeftPart(UriPartial.Authority).TrimEnd("/"c) + End Function + + Private Function ExtractHost(value As String) As String + Dim token = FirstToken(value) + If String.IsNullOrWhiteSpace(token) Then + Return String.Empty + End If + + Dim uri As Uri = Nothing + If Uri.TryCreate("http://" & token, UriKind.Absolute, uri) Then + Return uri.Host + End If + + Return token + End Function + + Private Function ExtractPort(value As String) As Integer? + Dim token = FirstToken(value) + If String.IsNullOrWhiteSpace(token) Then + Return Nothing + End If + + Dim uri As Uri = Nothing + If Uri.TryCreate("http://" & token, UriKind.Absolute, uri) AndAlso Not uri.IsDefaultPort Then + Return uri.Port + End If + + Return Nothing + End Function + + Private Function ParseNullableInt(value As String) As Integer? + Dim parsedValue As Integer + If Integer.TryParse(FirstToken(value), parsedValue) Then + Return parsedValue + End If + + Return Nothing + End Function + + Private Function FirstToken(value As String) As String + If String.IsNullOrWhiteSpace(value) Then + Return String.Empty + End If + + Return value.Split(","c)(0).Trim() + End Function + + Private Function GetFirstHeaderValue(request As HttpRequest, headerName As String) As String + If request Is Nothing OrElse String.IsNullOrWhiteSpace(headerName) Then + Return String.Empty + End If + + Return request.Headers(headerName) + End Function + + Private Function GetDefaultPort(scheme As String) As Integer + If String.Equals(scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) Then + Return 80 + End If + + Return 443 + End Function + + Private Sub AddHeaderCandidate(headerCandidates As ICollection(Of String), headerName As String) + If Not String.IsNullOrWhiteSpace(headerName) Then + headerCandidates.Add(headerName.Trim()) + End If + End Sub + End Module +End Namespace + + diff --git a/.codex-links/WebIntranet/Models/ClasesDatosAdmin.vb b/.codex-links/WebIntranet/Models/ClasesDatosAdmin.vb new file mode 100644 index 0000000..755c95b --- /dev/null +++ b/.codex-links/WebIntranet/Models/ClasesDatosAdmin.vb @@ -0,0 +1,772 @@ +Namespace ClasesDatosAdmin + Public Class PuestoPersona + + Public Property Puesto As String + Public Property Nivel As String + Public Property Adscripcion As String + Public Property Grupo As String + Public Property FechaToPo As DateTime + Public Property MotivoToPo As String + Public Property CaracterOcu As String + Public Property FechaCese As DateTime + Public Property MotivoCese As String + Public Property AnosSer As Integer + Public Property MesesSer As Integer + Public Property DiasSer As Integer + Public Property unidadAdministrativa As String + Public Property servicioAdscrito As String + End Class + Partial Public Class DOCENCIA + Public Property IDDOCENCIA As Integer + Public Property DENOMINACION As String + Public Property CENTRO As String + Public Property TIPO As String + Public Property FECHAEXPEDICION As DateTime? + Public Property DURACION As Decimal? + Public Property IDTIPODOCENCIA As Integer? + Public Property IDPERSONA As Integer? + Public Property RUTA As String + Public Overridable Property IDPERSONANavigation As PERSONAS + Public Overridable Property IDTIPODOCENCIANavigation As ENUMERACIONES + End Class + + + Partial Public Class FORMACION + Public Property IDFORMACION As Integer + Public Property NUM_REGISTRO As String + Public Property NOMBRE_CURSO As String + Public Property CENTRO As String + Public Property FECHA_EXPEDICION As Date? + Public Property DURACION As Double? + Public Property IDPERSONA As Integer? + Public Property FECHA_INSCRIPCION_PROVISIONAL As Date? + Public Property FECHA_INSCRIPCION_DEFINITIVA As Date? + Public Property APROVECHAMIENTO As Boolean + Public Property APTOCPH As Boolean + Public Property OFICIAL As Boolean + Public Property RUTA As String + Public Property NIF As String + Public Property IDCURSO As Integer? + Public Property NOTA As Decimal? + Public Property OBSERVACIONES As String + Public Overridable Property IDPERSONANavigation As PERSONAS + End Class + + Partial Public Class COMPLEMENTOSCARRERA + Public Property IDCOMCARR As Integer + Public Property IDPERSONA As Integer? + Public Property FECHAINICIO As Date? + Public Property IDGRUPO As Integer? + Public Property CANTIDAD As Decimal? + Public Property IDTRAMO As Integer? + Public Property FECHAFIN As Date? + Public Overridable Property IDGRUPONavigation As GRUPO + Public Overridable Property IDPERSONANavigation As PERSONAS + Public Overridable Property IDTRAMONavigation As ENUMERACIONES + End Class + Partial Public Class TITULACIONES + Public Property IDTITULACION As Integer + Public Property IDPERSONA As Integer? + Public Property NUM_REGISTRO As String + Public Property DESCRIPCION As String + Public Property CENTRO As String + Public Property FECHA_EXPEDICION As Date? + Public Property FECHA_INSCRIPCION_PROVISIONAL As Date? + Public Property FECHA_INSCRIPCION_DEFINITIVA As Date? + Public Property RUTA As String + Public Overridable Property IDPERSONANavigation As PERSONAS + End Class + Partial Public Class TRIENIOS + Public Property IDTRIENIO As Integer + Public Property IDPERSONAL As Integer? + Public Property GRUPO As String + Public Property TOA As Integer? + Public Property TC As Integer? + Public Property IDGRUPO As Integer? + Public Overridable Property IDGRUPONavigation As GRUPO + Public Overridable Property IDPERSONALNavigation As PERSONAS + End Class + + Partial Public Class VIDA_ADMINISTRATIVA + Public Property IDVIDA As Integer + Public Property IDPERSONAL As Integer? + Public Property NUM_REG As Integer? + Public Property IDMOTIVO As Integer? + Public Property FECHA As Date? + Public Property NRP As String + Public Property IDPUESTO As Integer? + Public Property DENOMINACION_OLD As String + Public Property NIVEL_OLD As Integer? + Public Property OCUPACION_OLD As Integer? + Public Property GRUPOT As Integer? + Public Property NTRIENIO As Integer? + Public Property NIVELC As Integer? + Public Property TITULO As String + Public Property CENTRO As String + Public Property FECHAT As Date? + Public Property OBSERVACIONES As String + Public Property FECHARESOLUCION As Date? + Public Property IDTRAMOCARRERAHORIZONTAL As Integer? + Public Property IDTIPOPERSONAL As Integer? + Public Property IDSERVICIOADSCRITO As Integer? + Public Property IDSUBUNIDADADMINISTRATIVA As Integer? + Public Property IDUNIDADADMINISTRATIVA As Integer? + Public Property TIENELINEAS As Boolean + Public Overridable Property GRUPOTNavigation As GRUPO + Public Overridable Property IDMOTIVONavigation As MOTIVOS_ADMINISTRATIVOS + 'Public Overridable Property IDPERSONALNavigation As PERSONAS? + Public Overridable Property IDPUESTONavigation As PUESTOS + Public Overridable Property IDSERVICIOADSCRITONavigation As SERVICIOS + Public Overridable Property IDSUBUNIDADADMINISTRATIVANavigation As SUBUNIDADADMINISTRATIVA + Public Overridable Property IDTIPOPERSONALNavigation As TIPOS_PERSONAL + Public Overridable Property IDTRAMOCARRERAHORIZONTALNavigation As ENUMERACIONES + Public Overridable Property IDUNIDADADMINISTRATIVANavigation As UNIDADADMINISTRATIVA + Public Overridable Property LINEASVIDAADMINISTRATIVA As ICollection(Of LINEASVIDAADMINISTRATIVA) = New List(Of LINEASVIDAADMINISTRATIVA)() + Public Overridable Property NIVELCNavigation As NIVEL + Public Overridable Property NIVEL_OLDNavigation As NIVEL + Public Overridable Property OCUPACION_OLDNavigation As OCUPACION + End Class + Partial Public Class LINEASVIDAADMINISTRATIVA + Public Property IDLINEAVIDAADMIN As Integer + Public Property IDVIDAADMIN As Integer? + Public Property DESCRIPCION As String + Public Property FECHASUBIDA As Date? + Public Property IDLINEAANTERIOR As Integer? + Public Property IDTIPO As Integer? + Public Property RUTA As String + Public Property SOBREESCRITO As Boolean + Public Overridable Property IDLINEAANTERIORNavigation As LINEASVIDAADMINISTRATIVA + Public Overridable Property IDTIPONavigation As ENUMERACIONES + Public Overridable Property IDVIDAADMINNavigation As VIDA_ADMINISTRATIVA + Public Overridable Property InverseIDLINEAANTERIORNavigation As ICollection(Of LINEASVIDAADMINISTRATIVA) = New List(Of LINEASVIDAADMINISTRATIVA)() + End Class + + Partial Public Class OCUPACION + Public Property IDOCUPACION As Integer + Public Property OCUPACION1 As String + Public Property DESCRIPCION As String + Public Property OCU_RES As String + Public Property ACTIVO As Boolean + Public Property DESCRIPCION_ANEXO As String + Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + + Partial Public Class SUBUNIDADADMINISTRATIVA + Public Property IDSUBUNIDADADMINISTRATIVA As Integer + Public Property IDUNIDADADMINISTRATIVA As Integer? + Public Property NOMBRE As String + Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + Public Overridable Property RPT_DESCRIP As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + + Partial Public Class GRUPO + Public Property IDGRUPO As Integer + Public Property GRUPO1 As String + Public Property DESCRIPCION As String + Public Property ACTIVO As Boolean + Public Property IMPORTE_G As Integer? + Public Property IMPORTE_TRI_TOA As Integer? + Public Property IMPORTE_TRI_TC As Integer? + Public Property IMPORTE_TRI_TCE As Integer? + Public Property IMPORTE_G_EXTRAS As Integer? + Public Property IMPORTE_TRI_TOAE As Integer? + 'Public Overridable Property COMPLEMENTOSCARRERA As ICollection(Of COMPLEMENTOSCARRERA) = New List(Of COMPLEMENTOSCARRERA)() + 'Public Overridable Property CUERPO As ICollection(Of CUERPO) = New List(Of CUERPO)() + 'Public Overridable Property RPT_DESCRIPGRUPO1Navigation As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + 'Public Overridable Property RPT_DESCRIPGRUPO2Navigation As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + 'Public Overridable Property TRIENIOS As ICollection(Of TRIENIOS) = New List(Of TRIENIOS)() + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class MOTIVOS_ADMINISTRATIVOS + Public Property IDMOTIVO As Integer + Public Property MOTIVO As String + Public Property DESCRIPCION As String + Public Property ACTIVO As String + Public Property TIPO As String + Public Property IDTIPOAPTOS As Integer? + Public Property ACTIVOB As Boolean + 'Public Overridable Property ACTOSADMINPREP As ICollection(Of ACTOSADMINPREP) = New List(Of ACTOSADMINPREP)() + Public Overridable Property IDTIPOAPTOSNavigation As TIPOAPTOSADMINISTRATIVOS + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class UNIDADADMINISTRATIVA + Public Property IDUNIDADADMINISTRATIVA As Integer + Public Property CLAVE_DEPARTAMENTO As String + Public Property LITERAL_DEPARTAMENTO As String + Public Property ACTIVO_DEPARTAMENTO As Boolean + Public Property ORDEN As Decimal? + Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + Public Overridable Property RPT_DESCRIP As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + + Partial Public Class PUESTOS + Public Property IDPUESTO As Integer + Public Property IDRPT As Integer? + Public Property IDRPTDES As Integer? + Public Property CODIGO As String + Public Property ESTADO As String + Public Property DOTACION As String + Public Property IDPERSONAL As Integer? + Public Property IDOCUPACION As Integer? + Public Property TITULAR As Integer? + Public Property IDDOTACION As Integer + Public Property ORDEN As Integer? + Public Property IDSERVICIOADSCRITO As Integer? + Public Property IDSUBUNIDADADMINISTRATIVA As Integer? + Public Property IDUNIDADADMINISTRATIVA As Integer? + Public Property DESPUESCOM As String + 'Public Overridable Property IDOCUPACIONNavigation As OCUPACION? + 'Public Overridable Property IDPERSONALNavigation As PERSONAS? + Public Overridable Property IDRPTDESNavigation As RPT_DESCRIP + 'Public Overridable Property IDRPTNavigation As RPT? + 'Public Overridable Property IDSERVICIOADSCRITONavigation As SERVICIOS? + 'Public Overridable Property IDSUBUNIDADADMINISTRATIVANavigation As SUBUNIDADADMINISTRATIVA? + 'Public Overridable Property IDUNIDADADMINISTRATIVANavigation As UNIDADADMINISTRATIVA? + 'Public Overridable Property TITULARNavigation As PERSONAS? + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class RPT_DESCRIP + Public Property IDRPTDES As Integer + Public Property IDRPT As Integer? + Public Property DENOMINACION As String + Public Property ADSCRIPCION As Integer? + Public Property GRUPO1 As Integer? + Public Property CUERPO1 As Integer? + Public Property IDNIVEL_RPT As Integer? + Public Property PROVISION As Integer? + Public Property CARACTERISTICAS As String + Public Property REQUISITOS As String + Public Property PLAZAS As Integer? + Public Property CODIGO As String + Public Property ESPECIFICO As Decimal? + Public Property GRUPO2 As Integer? + Public Property CUERPO2 As Integer? + Public Property EXPERIENCIA As String + Public Property TITULO_ESPECIF As String + Public Property IDUNIDADADMINISTRATIVA As Integer? + Public Property ORDEN As Integer? + Public Property GRUPOC As String + Public Property VIRTUAL As Boolean + Public Property OBSERVACIONES As String + Public Property IDSUBUNIDADADMINISTRATIVA As Integer? + Public Property IDTIPOVIRTUAL As Integer? + Public Property DEPARTAMENTO As String + Public Property VIRTUALAC As Boolean + Public Property VIRTUALAC2 As Boolean + Public Property VIRTUALOTRO As Boolean + Public Property IDDEPARTAMENTO As Integer? + 'Public Overridable Property ADSCRIPCIONNavigation As ADSCRIPCION? + 'Public Overridable Property CUERPO1Navigation As CUERPO? + 'Public Overridable Property CUERPO2Navigation As CUERPO? + 'Public Overridable Property GRUPO1Navigation As GRUPO + 'Public Overridable Property GRUPO2Navigation As GRUPO + Public Overridable Property IDDEPARTAMENTONavigation As ENUMERACIONES + 'Public Overridable Property IDNIVEL_RPTNavigation As NIVEL? + 'Public Overridable Property IDRPTNavigation As RPT? + 'Public Overridable Property IDSUBUNIDADADMINISTRATIVANavigation As SUBUNIDADADMINISTRATIVA? + 'Public Overridable Property IDTIPOVIRTUALNavigation As ENUMERACIONES? + 'Public Overridable Property IDUNIDADADMINISTRATIVANavigation As UNIDADADMINISTRATIVA? + 'Public Overridable Property PROVISIONNavigation As PROVISION? + 'Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + End Class + Partial Public Class TIPOAPTOSADMINISTRATIVOS + Public Property IDTIPO As Integer + Public Property DESCRIPCION As String + Public Property ACTIVO As Boolean + Public Property CORREO As String + 'Public Overridable Property MOTIVOS_ADMINISTRATIVOS As ICollection(Of MOTIVOS_ADMINISTRATIVOS) = New List(Of MOTIVOS_ADMINISTRATIVOS)() + End Class + Partial Public Class ENUMERACIONES + Public Property IDENUMERACION As Integer + Public Property IDGRUPOENUMERACION As Integer + Public Property CODIGO As String + Public Property DESCRIPCION As String + Public Property VALORALFABETICO1 As String + Public Property VALORALFABETICO2 As String + Public Property VALORNUMERICO1 As Decimal? + Public Property VALORNUMERICO2 As Decimal? + Public Property ORDEN As Integer? + Public Property OCULTO As Boolean + Public Property VALORALFABETICO3 As String + Public Property VALORALFABETICO4 As String + Public Property VALORALFABETICOLARGO As String + Public Property VALORNUMERICO3 As Decimal? + Public Property VALORNUMERICO4 As Decimal? + 'Public Overridable Property ASCENDIENTES As ICollection(Of ASCENDIENTES) = New List(Of ASCENDIENTES)() + 'Public Overridable Property ASCENDIENTESHISTORICOIRPF As ICollection(Of ASCENDIENTESHISTORICOIRPF) = New List(Of ASCENDIENTESHISTORICOIRPF)() + 'Public Overridable Property ASISTENCIAS As ICollection(Of ASISTENCIAS) = New List(Of ASISTENCIAS)() + 'Public Overridable Property COMPLEMENTOSCARRERA As ICollection(Of COMPLEMENTOSCARRERA) = New List(Of COMPLEMENTOSCARRERA)() + 'Public Overridable Property CUENTASCOTIZACIONPATRONAL As ICollection(Of CUENTASCOTIZACIONPATRONAL) = New List(Of CUENTASCOTIZACIONPATRONAL)() + 'Public Overridable Property CURSOS As ICollection(Of CURSOS) = New List(Of CURSOS)() + 'Public Overridable Property DEVENGOSIDCLAVENavigation As ICollection(Of DEVENGOS) = New List(Of DEVENGOS)() + 'Public Overridable Property DEVENGOSIDCONTRATOORELACIONNavigation As ICollection(Of DEVENGOS) = New List(Of DEVENGOS)() + 'Public Overridable Property DEVENGOSIDDISCAPACIDADNavigation As ICollection(Of DEVENGOS) = New List(Of DEVENGOS)() + 'Public Overridable Property DEVENGOSIDSITUACIONFAMILIARNavigation As ICollection(Of DEVENGOS) = New List(Of DEVENGOS)() + 'Public Overridable Property DEVENGOSIDSUBCLAVENavigation As ICollection(Of DEVENGOS) = New List(Of DEVENGOS)() + 'Public Overridable Property ENFERMEDADES As ICollection(Of ENFERMEDADES) = New List(Of ENFERMEDADES)() + 'Public Overridable Property ENLACES As ICollection(Of ENLACES) = New List(Of ENLACES)() + 'Public Overridable Property EXCEPCIONESPERMISOS As ICollection(Of EXCEPCIONESPERMISOS) = New List(Of EXCEPCIONESPERMISOS)() + 'Public Overridable Property EXPEDIENTESPERSONAS As ICollection(Of EXPEDIENTESPERSONAS) = New List(Of EXPEDIENTESPERSONAS)() + 'Public Overridable Property FAMILIAIDDISCAPACIDADNavigation As ICollection(Of FAMILIA) = New List(Of FAMILIA)() + 'Public Overridable Property FAMILIAIDPARENTESCONavigation As ICollection(Of FAMILIA) = New List(Of FAMILIA)() + 'Public Overridable Property FICHEROS As ICollection(Of FICHEROS) = New List(Of FICHEROS)( + 'Public Overridable Property FORMACIONIMPARTIDA As ICollection(Of FORMACIONIMPARTIDA) = New List(Of FORMACIONIMPARTIDA)() + 'Public Overridable Property HIJOS As ICollection(Of HIJOS) = New List(Of HIJOS)() + 'Public Overridable Property HIJOSHISTORICOIRPF As ICollection(Of HIJOSHISTORICOIRPF) = New List(Of HIJOSHISTORICOIRPF)() + 'Public Overridable Property HISTORICOIRPF As ICollection(Of HISTORICOIRPF) = New List(Of HISTORICOIRPF)() + 'Public Overridable Property HORARIOSPERSONASIDTARDEOBLIGATORIANavigation As ICollection(Of HORARIOSPERSONAS) = New List(Of HORARIOSPERSONAS)() + 'Public Overridable Property HORARIOSPERSONASIDTURNONavigation As ICollection(Of HORARIOSPERSONAS) = New List(Of HORARIOSPERSONAS)() + 'Public Overridable Property HORASMES As ICollection(Of HORASMES) = New List(Of HORASMES)() + 'Public Overridable Property IDGRUPOENUMERACIONNavigation As GRUPOSENUMERACIONES? + 'Public Overridable Property IDIOMASIDNIVELNavigation As ICollection(Of IDIOMAS) = New List(Of IDIOMAS)() + 'Public Overridable Property IDIOMASIDTIPOIDIOMANavigation As ICollection(Of IDIOMAS) = New List(Of IDIOMAS)() + 'Public Overridable Property INCIDENCIASCONTROLHORARIOIDADJUNTONavigation As ICollection(Of INCIDENCIASCONTROLHORARIO) = New List(Of INCIDENCIASCONTROLHORARIO)() + 'Public Overridable Property INCIDENCIASCONTROLHORARIOIDGRUPONavigation As ICollection(Of INCIDENCIASCONTROLHORARIO) = New List(Of INCIDENCIASCONTROLHORARIO)() + 'Public Overridable Property INCIDENCIASCONTROLHORARIOIDTIPONavigation As ICollection(Of INCIDENCIASCONTROLHORARIO) = New List(Of INCIDENCIASCONTROLHORARIO)() + 'Public Overridable Property LINEASVIDAADMINISTRATIVA As ICollection(Of LINEASVIDAADMINISTRATIVA) = New List(Of LINEASVIDAADMINISTRATIVA)() + 'Public Overridable Property NOMINASIDSITUACIONNOMINANavigation As ICollection(Of Nominas) = New List(Of Nominas)() + 'Public Overridable Property NOMINASIDTIPONavigation As ICollection(Of Nominas) = New List(Of Nominas)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDGRUPOFUNCIONARIONavigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDMUTUA2Navigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDMUTUANavigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDSINDICATO1Navigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDSINDICATO2Navigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property NOMINATRABAJADORCABECERAIDTIPOPERSONANavigation As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property PERIODOSSILTRAIDESTADONavigation As ICollection(Of PERIODOSSILTRA) = New List(Of PERIODOSSILTRA)() + 'Public Overridable Property PERIODOSSILTRAIDTIPOLIQUIDACIONNavigation As ICollection(Of PERIODOSSILTRA) = New List(Of PERIODOSSILTRA)() + 'Public Overridable Property PERIODOSSILTRAIDTIPOPERIODOTRAMONavigation As ICollection(Of PERIODOSSILTRA) = New List(Of PERIODOSSILTRA)() + 'Public Overridable Property PERSONASIDCAUSAALTAPARNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDCAUSABAJAPARNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDCAUSADEBAJANavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDDEPARTAMENTONavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDDISCAPACIDADNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDESCALANavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDESPECIALIDADNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDGRUPOFUNCIONARIONavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDMUTUA2Navigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDMUTUANavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDOCUPACIONNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDSEXONavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDSITUACIONENRPTNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDSITUACIONFAMILIARNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDSITUACIONLABORALNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDTIPOEMPLEADORPTNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PERSONASIDTIPONavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property PLANTILLASIDGRUPONavigation As ICollection(Of PLANTILLAS) = New List(Of PLANTILLAS)() + 'Public Overridable Property PLANTILLASIDTIPONavigation As ICollection(Of PLANTILLAS) = New List(Of PLANTILLAS)() + 'Public Overridable Property PROCESOSIDSUBTIPONavigation As ICollection(Of PROCESOS) = New List(Of PROCESOS)() + 'Public Overridable Property PROCESOSIDTIPONavigation As ICollection(Of PROCESOS) = New List(Of PROCESOS)() + 'Public Overridable Property PUESTOSTRABAJOIDGRUPOFUNCIONARIONavigation As ICollection(Of PUESTOSTRABAJO) = New List(Of PUESTOSTRABAJO)() + 'Public Overridable Property PUESTOSTRABAJOIDTIPONavigation As ICollection(Of PUESTOSTRABAJO) = New List(Of PUESTOSTRABAJO)() + 'Public Overridable Property ROLESDEPARTAMENTOSCH As ICollection(Of ROLESDEPARTAMENTOSCH) = New List(Of ROLESDEPARTAMENTOSCH)() + 'Public Overridable Property RPT As ICollection(Of RPT) = New List(Of RPT)() + 'Public Overridable Property RPT_DESCRIPIDDEPARTAMENTONavigation As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + 'Public Overridable Property RPT_DESCRIPIDTIPOVIRTUALNavigation As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + 'Public Overridable Property SALAS As ICollection(Of SALAS) = New List(Of SALAS)() + 'Public Overridable Property SESIONESIDTIPONavigation As ICollection(Of SESIONES) = New List(Of SESIONES)() + 'Public Overridable Property SESIONESIDTURNONavigation As ICollection(Of SESIONES) = New List(Of SESIONES)() + 'Public Overridable Property SITUACIONACTUALIRPFIDCONTRATOORELACIONNavigation As ICollection(Of SITUACIONACTUALIRPF) = New List(Of SITUACIONACTUALIRPF)() + 'Public Overridable Property SITUACIONACTUALIRPFIDDISCAPACIDADNavigation As ICollection(Of SITUACIONACTUALIRPF) = New List(Of SITUACIONACTUALIRPF)() + 'Public Overridable Property SITUACIONACTUALIRPFIDSITUACIONFAMILIARNavigation As ICollection(Of SITUACIONACTUALIRPF) = New List(Of SITUACIONACTUALIRPF)() + 'Public Overridable Property SITUACIONACTUALIRPFIDSITUACIONLABORALNavigation As ICollection(Of SITUACIONACTUALIRPF) = New List(Of SITUACIONACTUALIRPF)() + 'Public Overridable Property TIPOSPUESTOSTRABAJOIDGRUPOFUNCIONARIONavigation As ICollection(Of TIPOSPUESTOSTRABAJO) = New List(Of TIPOSPUESTOSTRABAJO)() + 'Public Overridable Property TIPOSPUESTOSTRABAJOIDTIPOPERSONANavigation As ICollection(Of TIPOSPUESTOSTRABAJO) = New List(Of TIPOSPUESTOSTRABAJO)() + 'Public Overridable Property TIPOSSESIONES As ICollection(Of TIPOSSESIONES) = New List(Of TIPOSSESIONES)() + 'Public Overridable Property TIPOSTRAMOSIDREGIMENAPLICACIONNavigation As ICollection(Of TIPOSTRAMOS) = New List(Of TIPOSTRAMOS)() + 'Public Overridable Property TIPOSTRAMOSIDTIPOTRAMOFICHEROXMLNavigation As ICollection(Of TIPOSTRAMOS) = New List(Of TIPOSTRAMOS)() + 'Public Overridable Property TURNOSTEMPORALES As ICollection(Of TURNOSTEMPORALES) = New List(Of TURNOSTEMPORALES)() + 'Public Overridable Property VALIDACIONDOCUMENTOS As ICollection(Of VALIDACIONDOCUMENTOS) = New List(Of VALIDACIONDOCUMENTOS)() + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class TIPOS_PERSONAL + Public Property IDTIPO As Integer + Public Property TIPO_PERSONAL As String + Public Property DESCRIPCION As String + 'Public Overridable Property PERSONAS As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class IDIOMAS + Public Property IDIDIOMA As Integer + Public Property IDTIPOIDIOMA As Integer? + Public Property IDNIVEL As Integer? + Public Property CENTROEXPEDICION As String + Public Property ANNO As Integer? + Public Property IDPERSONA As Integer? + Public Overridable Property IDNIVELNavigation As ENUMERACIONES + Public Overridable Property IDPERSONANavigation As PERSONAS + Public Overridable Property IDTIPOIDIOMANavigation As ENUMERACIONES + End Class + + Partial Public Class SERVICIOS + Public Property IDSERVICIO As Integer + Public Property DESCRIPCION As String + Public Property ORDEN As Integer + Public Property ACTIVO As Boolean + 'Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + 'Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class NIVEL + Public Property IDNIVEL As Integer + Public Property NIVEL1 As String + Public Property DESCRIPCION As String + Public Property ACTIVO As Boolean + Public Property IMPORTE_N As Integer? + Public Property ALTO_CARGO As Boolean + Public Overridable Property COMPLEMENTONIVEL As ICollection(Of COMPLEMENTONIVEL) = New List(Of COMPLEMENTONIVEL)() + Public Overridable Property CONSOLIDACION_GRADO As ICollection(Of CONSOLIDACION_GRADO) = New List(Of CONSOLIDACION_GRADO)() + Public Overridable Property PERSONASIDGRADOPERSONALCONSOLIDADONavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + Public Overridable Property PERSONASIDNIVELRPTNavigation As ICollection(Of PERSONAS) = New List(Of PERSONAS)() + Public Overridable Property RPT_DESCRIP As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + Public Overridable Property VIDA_ADMINISTRATIVANIVELCNavigation As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + Public Overridable Property VIDA_ADMINISTRATIVANIVEL_OLDNavigation As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class COMPLEMENTONIVEL + Public Property IDCOMPLEMENTONIVEL As Integer + Public Property IMPORTEANUAL As Decimal? + Public Property IMPORTEMENSUAL As Decimal? + Public Property IDNIVEL As Integer? + Public Property IDRPT As Integer? + Public Overridable Property IDNIVELNavigation As NIVEL + Public Overridable Property IDRPTNavigation As RPT + End Class + Partial Public Class RPT + Public Property IDRPT As Integer + Public Property DESCRIPCION As String + Public Property EJERCICIO As Integer? + Public Property F_PLENO As Date? + Public Property F_PARLAMENTO As Date? + Public Property IDSITUACION As Integer? + Public Property FECHAINICIO As Date? + Public Property FECHAFIN As Date? + Public Property NOTAS As String + Public Overridable Property COMPLEMENTONIVEL As ICollection(Of COMPLEMENTONIVEL) = New List(Of COMPLEMENTONIVEL)() + Public Overridable Property IDSITUACIONNavigation As ENUMERACIONES + Public Overridable Property PUESTOS As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + Public Overridable Property RETRIBUCIONBASICA As ICollection(Of RETRIBUCIONBASICA) = New List(Of RETRIBUCIONBASICA)() + Public Overridable Property RPT_DESCRIP As ICollection(Of RPT_DESCRIP) = New List(Of RPT_DESCRIP)() + End Class + Partial Public Class CONSOLIDACION_GRADO + Public Property IDCUMPGRADO As Integer + Public Property IDPERSONAL As Integer? + Public Property NIVEL As Integer? + Public Property FECHA_EFECTO As Date? + Public Property FECHA_RESOLUCION As Date? + Public Property FECHA_COMUNICACION As Date? + Public Property IDNIVEL As Integer? + Public Overridable Property IDNIVELNavigation As NIVEL + Public Overridable Property IDPERSONALNavigation As PERSONAS + End Class + Partial Public Class PERSONAS + Public Property IDPERSONA As Integer + Public Property NIF As String + Public Property APELLIDOS As String + Public Property NOMBRE As String + Public Property DOMICILIO As String + Public Property CODIGOPOSTAL As String + Public Property CEUTAMELILLA As Boolean + Public Property CORREOELECTRONICO As String + Public Property CUENTABANCARIA As String + Public Property IDMUTUA As Integer? + Public Property NUMEROAFILIACIONMUTUA As String + Public Property FECHANACIMIENTO As Date? + Public Property FORMACIONACADEMICA As String + Public Property TELEFONO1 As String + Public Property TELEFONO2 As String + Public Property LUGARNACIMIENTO As String + Public Property INGRADMNAUTO As Date? + Public Property INGRESOADMINISTRACIONESTADO As Date? + Public Property INGRESOADMINISTRACIONLOCAL As Date? + Public Property IDSITUACIONFAMILIAR As Integer? + Public Property IDSITUACIONLABORAL As Integer? + Public Property IDPUESTOTRABAJOOPOSICION As Integer? + Public Property CODIGOMUNICIPIO As String + Public Property PLURIEMPLEO As Decimal + Public Property NUMEROPLURIEMPLEO As String + Public Property TRIENIOSADMINISTRACIONA1 As Integer + Public Property TRIENIOSADMINISTRACIONA2 As Integer + Public Property TRIENIOSADMINISTRACIONC1 As Integer + Public Property TRIENIOSADMINISTRACIONC2 As Integer + Public Property TRIENIOSADMINISTRACIONE As Integer + Public Property TRIENIOSPARLAMENTOA1 As Integer + Public Property TRIENIOSPARLAMENTOA2 As Integer + Public Property TRIENIOSPARLAMENTOC1 As Integer + Public Property TRIENIOSPARLAMENTOC2 As Integer + Public Property TRIENIOSPARLAMENTOE As Integer + Public Property IMPORTETRIENIOADMINISTRACION As Decimal + Public Property FECHACUMPLIMIENTOTRIENIO As Date? + Public Property IDSINDICATO1 As Integer? + Public Property IDSINDICATO2 As Integer? + Public Property CUOTASINDICAL1 As Decimal? + Public Property CUOTASINDICAL2 As Decimal? + Public Property NUMEROTARJETA As Decimal? + Public Property IDTIPO As Integer? + Public Property RETENCIONAAPLICAR As Decimal? + Public Property NIVEL As String + Public Property CODIGO As String + Public Property SEGUROACCIDENTE As Decimal + Public Property BASESSJUN2010 As Decimal + Public Property SEXENIOS As Decimal + Public Property DIASENFERMEDAD60 As Decimal + Public Property IMPORTEENFERMEDAD60 As Decimal + Public Property DIASENFERMEDAD75 As Decimal + Public Property IMPORTEENFERMEDAD75 As Decimal + Public Property IMPORTEDECUCCIONGRUPO As Decimal + Public Property IMPTRIADMPAGAEXTRA As Decimal + Public Property TRATAMIENTO As String + Public Property IDDISCAPACIDAD As Integer? + Public Property PENSIONISTAS As Boolean + Public Property IDSITUACIONACTUALIRPF As Integer? + Public Property MOVILIDADREDUCIDA As Boolean + Public Property AÑOCAMBIORESIDENCIA As Integer + Public Property IDFICHEROFOTO As Integer? + Public Property NUMEROSEXENIO As Integer + Public Property NUMEROQUINQUENIO As Integer + Public Property QUINQUENIO As Decimal + Public Property FECHAALTA As Date? + Public Property FECHABAJA As Date? + Public Property BASEANTERIORALABAJA As Decimal? + Public Property BASEMESANTERIOR As Decimal? + Public Property NOCOTIZADESEMPLEO As Boolean + Public Property PUESTOTRABAJOENTARJETA As String + Public Property IDSEXO As Integer? + Public Property IDCONTRATO As Integer? + Public Property IDCUENTACOTIZACIONPATRONAL As Integer? + Public Property FECHAALTADIETAS As Date? + Public Property FECHABAJADIETAS As Date? + Public Property PROFESION As String + Public Property EMPRESA As String + Public Property CARGOULTIMOPUESTO As String + Public Property KILOMETROS As Decimal? + Public Property PEAJESAUTOPISTA As Decimal? + Public Property PERTENECEAMESA As Boolean + Public Property RENUNCIADIETA As Boolean + Public Property RENUNCIACESANTIA As Boolean + Public Property ESTANCIAYMANUTENCION As Decimal? + Public Property CODIGOANTIGUODIPUTADO As String + Public Property CUENTABANCARIADIPUTADO As String + Public Property CUENTABANCARIAPARTIDO As String + Public Property IMPORTEPARTIDO As Decimal? + Public Property RENUNCIAKMS As Boolean + Public Property IDDEPARTAMENTO As Integer? + Public Property FECHABAJASEGURIDADSOCIAL As Date? + Public Property IDCAUSADEBAJA As Integer? + Public Property PREMIOJUBILACIONMENSUAL As Decimal? + Public Property IDOCUPACION As Integer? + Public Property IMPORTEULTIMANOMINA As Decimal? + Public Property QUINQUENIOEXTRA As Decimal + Public Property IDMUTUA2 As Integer? + Public Property NUMEROAFILIACIONMUTUA2 As String + Public Property TRIENIOSADMINISTRACIONB As Integer + Public Property TRIENIOSPARLAMENTOB As Integer + Public Property IDGRUPOFUNCIONARIO As Integer? + Public Property FECHACUMPLIMIENTOCARRERA As Date? + Public Property COMPLEMENTOCARRERAA1 As Integer? + Public Property COMPLEMENTOCARRERAB As Integer? + Public Property COMPLEMENTOCARRERAC1 As Integer? + Public Property COMPLEMENTOCARRERAC2 As Integer? + Public Property COMPLEMENTOCARRERAE As Integer? + Public Property COMPLEMENTOCARRERAA2 As Integer? + Public Property DOMICILIONOTIFICACIONES As String + Public Property TELEFONO1NOTIFICACIONES As String + Public Property CORREONOTIFICACIONES As String + Public Property CODIGOPOSTALNOTIFICACIONES As String + Public Property TELEFONO2NOTIFICACIONES As String + Public Property CODIGOMUNICIPIONOTIFICACION As String + Public Property TRIENIOSADMINISTRACIONA1A As Integer? + Public Property TRIENIOSADMINISTRACIONA2A As Integer? + Public Property TRIENIOSADMINISTRACIONC1A As Integer? + Public Property TRIENIOSADMINISTRACIONC2A As Integer? + Public Property TRIENIOSADMINISTRACIONEA As Integer? + Public Property IMPORTETRIENIOADMINISTRACIONA As Decimal? + Public Property IMPTRIADMPAGAEXTRAA As Decimal? + Public Property TRIENIOSADMINISTRACIONBA As Integer? + Public Property EXTERNO As Integer? + Public Property FECHAALTACONTROLHORARIO As Date? + Public Property FECHAALTAPAR As Date? + Public Property FECHABAJAPAR As Date? + Public Property FECHACONSOLIDACIONGRADO As Date? + Public Property FECHACUMPLIMIENTOPROXTRIENIO As Date? + Public Property FECHAPOSIBLEJUBILACION As Date? + Public Property FECHATARJETA As Date? + Public Property FECHATITULACION As Date? + Public Property IDADSCRIPCIONRPT As Integer? + Public Property IDCAUSAALTAPAR As Integer? + Public Property IDCAUSABAJAPAR As Integer? + Public Property IDCUERPORPT As Integer? + Public Property IDGRADOPERSONALCONSOLIDADO As Integer? + Public Property IDNIVELRPT As Integer? + Public Property IDSITUACIONADMINISTRATIVARPT As Integer? + Public Property IDSITUACIONENRPT As Integer? + Public Property IDTIPOEMPLEADORPT As Integer? + Public Property NRP As String + Public Property NRP_OLD As String + Public Property TITULACIONOFICIAL As String + Public Property SUPERVISORDETODO As Boolean + Public Property SUPERVISORDEPARTAMENTO As Boolean + Public Property DELEGADO As Boolean + Public Property ADMINISTRADORCONTROLHORARIO As Boolean + Public Property ADMINISTRADORTOTAL As Boolean + Public Property ADMINISTRARPTYREGISTRO As Boolean + Public Property DELEGADOINFORMES As Boolean + Public Property IDESCALA As Integer? + Public Property IDESPECIALIDAD As Integer? + Public Property MAXHENEGATIVASPERMITIDAS_D As Decimal? + Public Property NUMEROREINTENTOSFALLIDOS As Integer? + Public Property PERMITESALDONEGATIVOHE As Boolean + 'Public Overridable Property ACTOSADMINPREP As ICollection(Of ACTOSADMINPREP) = New List(Of ACTOSADMINPREP)() + 'Public Overridable Property ASCENDIENTES As ICollection(Of ASCENDIENTES) = New List(Of ASCENDIENTES)() + 'Public Overridable Property ASIGNACIONTEMPORALCOBRADA As ICollection(Of ASIGNACIONTEMPORALCOBRADA) = New List(Of ASIGNACIONTEMPORALCOBRADA)() + 'Public Overridable Property ASISTENCIAS As ICollection(Of ASISTENCIAS) = New List(Of ASISTENCIAS)() + 'Public Overridable Property ASISTENCIASSESIONES As ICollection(Of ASISTENCIASSESIONES) = New List(Of ASISTENCIASSESIONES)() + 'Public Overridable Property CODIGOMUNICIPIONOTIFICACIONNavigation As MUNICIPIOS? + 'Public Overridable Property CODIGOMUNICIPIONavigation As MUNICIPIOS? + 'Public Overridable Property COMPLEMENTOSCARRERA As ICollection(Of COMPLEMENTOSCARRERA) = New List(Of COMPLEMENTOSCARRERA)() + 'Public Overridable Property CONSOLIDACION_GRADO As ICollection(Of CONSOLIDACION_GRADO) = New List(Of CONSOLIDACION_GRADO)() + 'Public Overridable Property CORREOS As ICollection(Of CORREOS) = New List(Of CORREOS)() + 'Public Overridable Property DEDUCCIONESRETENCIONESJUDICI As ICollection(Of DEDUCCIONESRETENCIONESJUDICI) = New List(Of DEDUCCIONESRETENCIONESJUDICI)() + 'Public Overridable Property DIASACOMPENSARPERSONAS As ICollection(Of DIASACOMPENSARPERSONAS) = New List(Of DIASACOMPENSARPERSONAS)() + 'Public Overridable Property DIFERENCIAPAGODELEGADO As ICollection(Of DIFERENCIAPAGODELEGADO) = New List(Of DIFERENCIAPAGODELEGADO)() + 'Public Overridable Property DIFERENCIATRIENIOS As ICollection(Of DIFERENCIATRIENIOS) = New List(Of DIFERENCIATRIENIOS)() + 'Public Overridable Property DIPUTADOS As ICollection(Of DIPUTADOS) = New List(Of DIPUTADOS)() + 'Public Overridable Property ENFERMEDADES As ICollection(Of ENFERMEDADES) = New List(Of ENFERMEDADES)() + 'Public Overridable Property EXCEPCIONESPERMISOSIDPERSONANavigation As ICollection(Of EXCEPCIONESPERMISOS) = New List(Of EXCEPCIONESPERMISOS)() + 'Public Overridable Property EXCEPCIONESPERMISOSIDPERSONAPERMISONavigation As ICollection(Of EXCEPCIONESPERMISOS) = New List(Of EXCEPCIONESPERMISOS)() + 'Public Overridable Property EXPEDIENTESPERSONAS As ICollection(Of EXPEDIENTESPERSONAS) = New List(Of EXPEDIENTESPERSONAS)() + 'Public Overridable Property FAMILIA As ICollection(Of FAMILIA) = New List(Of FAMILIA)() + 'Public Overridable Property FORMACION As ICollection(Of FORMACION) = New List(Of FORMACION)() + 'Public Overridable Property HIJOS As ICollection(Of HIJOS) = New List(Of HIJOS)() + 'Public Overridable Property HISTORICOIRPF As ICollection(Of HISTORICOIRPF) = New List(Of HISTORICOIRPF)() + 'Public Overridable Property HORARIOSPERSONAS As ICollection(Of HORARIOSPERSONAS) = New List(Of HORARIOSPERSONAS)() + 'Public Overridable Property HORASEXTRAS As ICollection(Of HORASEXTRAS) = New List(Of HORASEXTRAS)() + 'Public Overridable Property HORASMES As ICollection(Of HORASMES) = New List(Of HORASMES)() + 'Public Overridable Property HUELGAS As ICollection(Of HUELGAS) = New List(Of HUELGAS)() + Public Overridable Property IDADSCRIPCIONRPTNavigation As TIPOS_PERSONAL + Public Overridable Property IDCAUSAALTAPARNavigation As ENUMERACIONES + Public Overridable Property IDCAUSABAJAPARNavigation As ENUMERACIONES + Public Overridable Property IDCAUSADEBAJANavigation As ENUMERACIONES + 'Public Overridable Property IDCONTRATONavigation As CONTRATOS? + 'Public Overridable Property IDCUENTACOTIZACIONPATRONALNavigation As CUENTASCOTIZACIONPATRONAL? + 'Public Overridable Property IDCUERPORPTNavigation As CUERPO? + Public Overridable Property IDDEPARTAMENTONavigation As ENUMERACIONES + Public Overridable Property IDDISCAPACIDADNavigation As ENUMERACIONES + Public Overridable Property IDESCALANavigation As ENUMERACIONES + Public Overridable Property IDESPECIALIDADNavigation As ENUMERACIONES + 'Public Overridable Property IDFICHEROFOTONavigation As FICHEROS? + Public Overridable Property IDGRADOPERSONALCONSOLIDADONavigation As NIVEL + Public Overridable Property IDGRUPOFUNCIONARIONavigation As ENUMERACIONES + + 'Public Overridable Property IDIOMAS As ICollection(Of IDIOMAS) = New List(Of IDIOMAS)() + Public Overridable Property IDMUTUA2Navigation As ENUMERACIONES + Public Overridable Property IDMUTUANavigation As ENUMERACIONES + Public Overridable Property IDNIVELRPTNavigation As NIVEL + Public Overridable Property IDOCUPACIONNavigation As ENUMERACIONES + 'Public Overridable Property IDPUESTOTRABAJOOPOSICIONNavigation As TIPOSPUESTOSTRABAJO? + Public Overridable Property IDSEXONavigation As ENUMERACIONES + 'Public Overridable Property IDSITUACIONACTUALIRPFNavigation As SITUACIONACTUALIRPF? + 'Public Overridable Property IDSITUACIONADMINISTRATIVARPTNavigation As SITUACION + Public Overridable Property IDSITUACIONENRPTNavigation As ENUMERACIONES + Public Overridable Property IDSITUACIONFAMILIARNavigation As ENUMERACIONES + Public Overridable Property IDSITUACIONLABORALNavigation As ENUMERACIONES + Public Overridable Property IDTIPOEMPLEADORPTNavigation As ENUMERACIONES + Public Overridable Property IDTIPONavigation As ENUMERACIONES + + 'Public Overridable Property INCIDENCIAS As ICollection(Of INCIDENCIAS) = New List(Of INCIDENCIAS)() + 'Public Overridable Property MAPEOSUSUARIOS As ICollection(Of MAPEOSUSUARIOS) = New List(Of MAPEOSUSUARIOS)() + 'Public Overridable Property MATERNIDADES As ICollection(Of MATERNIDADES) = New List(Of MATERNIDADES)() + 'Public Overridable Property NOMINATRABAJADORCABECERA As ICollection(Of NOMINATRABAJADORCABECERA) = New List(Of NOMINATRABAJADORCABECERA)() + 'Public Overridable Property OTRASRETRIBUCIONES As ICollection(Of OTRASRETRIBUCIONES) = New List(Of OTRASRETRIBUCIONES)() + 'Public Overridable Property PERMISOSSINRETRIBUCION As ICollection(Of PERMISOSSINRETRIBUCION) = New List(Of PERMISOSSINRETRIBUCION)() + 'Public Overridable Property PERSONASLEGISLATURAS As ICollection(Of PERSONASLEGISLATURAS) = New List(Of PERSONASLEGISLATURAS)() + 'Public Overridable Property PICADAS As ICollection(Of PICADAS) = New List(Of PICADAS)() + 'Public Overridable Property PRESTAMOS As ICollection(Of PRESTAMOS) = New List(Of PRESTAMOS)() + 'Public Overridable Property PRODUCTIVIDAD As ICollection(Of PRODUCTIVIDAD) = New List(Of PRODUCTIVIDAD)() + Public Overridable Property PUESTOSIDPERSONALNavigation As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + Public Overridable Property PUESTOSTITULARNavigation As ICollection(Of PUESTOS) = New List(Of PUESTOS)() + 'Public Overridable Property PUESTOSTRABAJO As ICollection(Of PUESTOSTRABAJO) = New List(Of PUESTOSTRABAJO)() + 'Public Overridable Property REDUCCIONDEJORNADA As ICollection(Of REDUCCIONDEJORNADA) = New List(Of REDUCCIONDEJORNADA)() + 'Public Overridable Property RETENCIONJUDICIAL As ICollection(Of RETENCIONJUDICIAL) = New List(Of RETENCIONJUDICIAL)() + 'Public Overridable Property TARJETAS As ICollection(Of TARJETAS) = New List(Of TARJETAS)() + 'Public Overridable Property TIPOSDOCACTOSADMINPREP As ICollection(Of TIPOSDOCACTOSADMINPREP) = New List(Of TIPOSDOCACTOSADMINPREP)() + 'Public Overridable Property TIPOSSESIONES As ICollection(Of TIPOSSESIONES) = New List(Of TIPOSSESIONES)() + 'Public Overridable Property TITULACIONES As ICollection(Of TITULACIONES) = New List(Of TITULACIONES)() + 'Public Overridable Property TRABAJADORTIEMPOPARCIAL As ICollection(Of TRABAJADORTIEMPOPARCIAL) = New List(Of TRABAJADORTIEMPOPARCIAL)() + 'Public Overridable Property TRIENIOS As ICollection(Of TRIENIOS) = New List(Of TRIENIOS)() + 'Public Overridable Property VEHICULOS As ICollection(Of VEHICULOS) = New List(Of VEHICULOS)() + Public Overridable Property VIDA_ADMINISTRATIVA As ICollection(Of VIDA_ADMINISTRATIVA) = New List(Of VIDA_ADMINISTRATIVA)() + End Class + Partial Public Class RETRIBUCIONBASICA + Public Property IDRETRIBUCION As Integer + Public Property COMCARRA1T1 As Decimal + Public Property COMCARRA2T1 As Decimal + Public Property COMCARRBT1 As Decimal + Public Property COMCARRC1T1 As Decimal + Public Property COMCARRC2T1 As Decimal + Public Property COMCARRET1 As Decimal + Public Property SUELDOA1 As Decimal + Public Property SUELDOA1X As Decimal + Public Property SUELDOA2 As Decimal + Public Property SUELDOA2X As Decimal + Public Property SUELDOB As Decimal + Public Property SUELDOBX As Decimal + Public Property SUELDOC1 As Decimal + Public Property SUELDOC1X As Decimal + Public Property SUELDOC2 As Decimal + Public Property SUELDOC2X As Decimal + Public Property SUELDOE As Decimal + Public Property SUELDOEX As Decimal + Public Property TRIADMA1 As Decimal + Public Property TRIADMA1X As Decimal + Public Property TRIADMA2 As Decimal + Public Property TRIADMA2X As Decimal + Public Property TRIADMB As Decimal + Public Property TRIADMBX As Decimal + Public Property TRIADMC1 As Decimal + Public Property TRIADMC1X As Decimal + Public Property TRIADMC2 As Decimal + Public Property TRIADMC2X As Decimal + Public Property TRIADME As Decimal + Public Property TRIADMEX As Decimal + Public Property TRICAMA1 As Decimal + Public Property TRICAMA1X As Decimal + Public Property TRICAMA2 As Decimal + Public Property TRICAMA2X As Decimal + Public Property TRICAMB As Decimal + Public Property TRICAMBX As Decimal + Public Property TRICAMC1 As Decimal + Public Property TRICAMC1X As Decimal + Public Property TRICAMC2 As Decimal + Public Property TRICAMC2X As Decimal + Public Property TRICAME As Decimal + Public Property TRICAMEX As Decimal + Public Property IDRPT As Integer? + Public Property COMCARRA1T2 As Decimal + Public Property COMCARRA2T2 As Decimal + Public Property COMCARRBT2 As Decimal + Public Property COMCARRC1T2 As Decimal + Public Property COMCARRC2T2 As Decimal + Public Property COMCARRET2 As Decimal + Public Property COMCARRA1T3 As Decimal + Public Property COMCARRA2T3 As Decimal + Public Property COMCARRBT3 As Decimal + Public Property COMCARRC1T3 As Decimal + Public Property COMCARRC2T3 As Decimal + Public Property COMCARRET3 As Decimal + Public Property COMCARRA1T4 As Decimal + Public Property COMCARRA2T4 As Decimal + Public Property COMCARRBT4 As Decimal + Public Property COMCARRC1T4 As Decimal + Public Property COMCARRC2T4 As Decimal + Public Property COMCARRET4 As Decimal + Public Property COMCARRA1T5 As Decimal + Public Property COMCARRA2T5 As Decimal + Public Property COMCARRBT5 As Decimal + Public Property COMCARRC1T5 As Decimal + Public Property COMCARRC2T5 As Decimal + Public Property COMCARRET5 As Decimal + Public Overridable Property IDRPTNavigation As RPT + End Class + +End Namespace \ No newline at end of file diff --git a/.codex-links/WebIntranet/Models/UtilAntifraude.vb b/.codex-links/WebIntranet/Models/UtilAntifraude.vb new file mode 100644 index 0000000..3be6a01 --- /dev/null +++ b/.codex-links/WebIntranet/Models/UtilAntifraude.vb @@ -0,0 +1,40 @@ +Imports Microsoft.Extensions.Configuration +Imports Microsoft.IdentityModel.Clients.ActiveDirectory +Imports Newtonsoft.Json +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports System.Threading.Tasks + +Public Class UtilAntifraude + + Private Shared Property Conf As IConfiguration + Public Shared Function CheckCred() As Boolean + If HttpContext.Current.Session("persona") IsNot Nothing Then + Return True + Else + Return False + End If + End Function + Public Shared Async Function ObtenerObjeto(Of T)(ByVal cliente As HttpClient, ByVal uri As String) As Task(Of T) + Dim response = Await cliente.GetAsync(uri) + + If response.IsSuccessStatusCode Then + Dim resultContent = Await response.Content.ReadAsStringAsync() + Return JsonConvert.DeserializeObject(Of T)(resultContent) + Else + Return Nothing + End If + End Function + Public Shared Function ObtenerCliente(ByVal token As String, ByVal clientFactory As IHttpClientFactory) As HttpClient + Dim client = clientFactory.CreateClient() + client.BaseAddress = New Uri(urlSwagger()) + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", token) + client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json")) + Return client + End Function + Public Shared Function urlSwagger() As String + 'Conf = New ConfigurationBuilder().AddJsonFile("appsettings.json").Build() + Dim swagger As String = ConfigurationManager.AppSettings("SwaggerVB") + Return swagger + End Function +End Class diff --git a/.codex-links/WebIntranet/My Project/Application.Designer.vb b/.codex-links/WebIntranet/My Project/Application.Designer.vb new file mode 100644 index 0000000..24aaa49 --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' Versión de runtime:4.0.30319.42000 +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/.codex-links/WebIntranet/My Project/Application.myapp b/.codex-links/WebIntranet/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/.codex-links/WebIntranet/My Project/AssemblyInfo.vb b/.codex-links/WebIntranet/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..af46354 --- /dev/null +++ b/.codex-links/WebIntranet/My Project/AssemblyInfo.vb @@ -0,0 +1,34 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/.codex-links/WebIntranet/My Project/Resources.Designer.vb b/.codex-links/WebIntranet/My Project/Resources.Designer.vb new file mode 100644 index 0000000..ca347fb --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' Versión de runtime:4.0.30319.42000 +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'StronglyTypedResourceBuilder generó automáticamente esta clase + 'a través de una herramienta como ResGen o Visual Studio. + 'Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen + 'con la opción /str o recompile su proyecto de VS. + ''' + ''' Clase de recurso fuertemente tipado, para buscar cadenas traducidas, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("WebIntranet.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Reemplaza la propiedad CurrentUICulture del subproceso actual para todas las + ''' búsquedas de recursos mediante esta clase de recurso fuertemente tipado. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/.codex-links/WebIntranet/My Project/Resources.resx b/.codex-links/WebIntranet/My Project/Resources.resx new file mode 100644 index 0000000..91e8e80 --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/.codex-links/WebIntranet/My Project/Settings.Designer.vb b/.codex-links/WebIntranet/My Project/Settings.Designer.vb new file mode 100644 index 0000000..c2be83a --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' Versión de runtime:4.0.30319.42000 +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Funcionalidad para autoguardar My.Settings" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.WebIntranet.My.MySettings + Get + Return Global.WebIntranet.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/.codex-links/WebIntranet/My Project/Settings.settings b/.codex-links/WebIntranet/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/.codex-links/WebIntranet/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.codex-links/WebIntranet/My Project/licenses.licx b/.codex-links/WebIntranet/My Project/licenses.licx new file mode 100644 index 0000000..78484e1 --- /dev/null +++ b/.codex-links/WebIntranet/My Project/licenses.licx @@ -0,0 +1 @@ +DevExpress.Web.ASPxComboBox, DevExpress.Web.v23.2, Version=23.2.3.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/.codex-links/WebIntranet/Nominas.aspx b/.codex-links/WebIntranet/Nominas.aspx new file mode 100644 index 0000000..7164561 --- /dev/null +++ b/.codex-links/WebIntranet/Nominas.aspx @@ -0,0 +1,101 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="Nominas.aspx.vb" Inherits="WebIntranet.Nominas" %> + + +
+
+ +
+

Nóminas

+
+
    +
  • / Retribuciones
  • +
  • / Nóminas
  • +
+
+ + <%--
--%> + <%--
+ +
--%> + + <%--

NÓMINAS

--%> + <%--
--%> + +
+
+

NÓMINAS DEL AÑO

+ + +
+

+
+
+
+
    +
+
+
+
+
+ +
+
+
+
+ + diff --git a/.codex-links/WebIntranet/Nominas.aspx.designer.vb b/.codex-links/WebIntranet/Nominas.aspx.designer.vb new file mode 100644 index 0000000..cdab021 --- /dev/null +++ b/.codex-links/WebIntranet/Nominas.aspx.designer.vb @@ -0,0 +1,42 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class Nominas + + ''' + '''Control inAnno. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents inAnno As Global.System.Web.UI.HtmlControls.HtmlInputText + + ''' + '''Control lisNominasTrabajador. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents lisNominasTrabajador As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control iframepdf. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents iframepdf As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/Nominas.aspx.vb b/.codex-links/WebIntranet/Nominas.aspx.vb new file mode 100644 index 0000000..9aac94f --- /dev/null +++ b/.codex-links/WebIntranet/Nominas.aspx.vb @@ -0,0 +1,85 @@ +Imports System.Net +Imports System.Net.Security + +Public Class Nominas + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + + End Sub + + Private Sub BuscarNominas_Click(sender As Object, e As EventArgs) + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim Anno = inAnno.Value ' pedir año + 'Dim Nif = Session("usuario") ' se obtiene de la identificacion + Dim nominas = NominasPersona(Anno) ' datos para el combo de nominas + Dim htmlLista = "" + + For Each nomina As NominaTrabajador In nominas + htmlLista += "
  • " + nomina.Descripcion + "

  • " + Next + htmlLista += "" + + lisNominasTrabajador.InnerHtml = htmlLista + + End Sub + + + Private Function NominasPersona(anno As String) As List(Of NominaTrabajador) + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/NominasTrabajadorAnno?Nif=" + sessionUsuario + "&Anno=" + anno + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim listaNominas As List(Of NominaTrabajador) = + deserializador3.Deserialize(Of List(Of NominaTrabajador))(respuesta3) + Return listaNominas + + End Function + + + Public Shared Function ObtenerPdf(idNomina As String) As String + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim nif = sessionUsuario + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/NominaPdf?Nif=" + nif + "&Idnomina=" + idNomina + Dim credenciales3 As New Net.CredentialCache() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = 50000000 + Dim sRespuesta3 As String = deserializador3.Deserialize(Of String)(respuesta3) + + Return "[{""nombre"":""" + nif + "_" + idNomina + ".pdf"",""base64String"":""" + sRespuesta3 + """}]" + + End Function + + Protected Sub Unnamed_ServerClick(sender As Object, e As EventArgs) + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim Anno = inAnno.Value ' pedir año + 'Dim Nif = Session("usuario") ' se obtiene de la identificacion + Dim nominas = NominasPersona(Anno) ' datos para el combo de nominas + Dim htmlLista = "" + + For Each nomina As NominaTrabajador In nominas + htmlLista += "
  • " + nomina.Descripcion + "

  • " + Next + htmlLista += "" + If htmlLista = "" Then + htmlLista += "

    Este año no contiene nóminas

    " + End If + lisNominasTrabajador.InnerHtml = htmlLista + + End Sub +End Class diff --git a/.codex-links/WebIntranet/ParcheaPublicacion.cmd b/.codex-links/WebIntranet/ParcheaPublicacion.cmd new file mode 100644 index 0000000..bec7965 --- /dev/null +++ b/.codex-links/WebIntranet/ParcheaPublicacion.cmd @@ -0,0 +1,3 @@ +"C:\Program Files\7-zip\7z.exe" d c:\tecnosis.publicados\WebIntranet.zip Content\C_C\tecnosis.tfs\Clientes\COAS\WebIntranet\obj\Release\Package\PackageTmp\bin\DevExpress.Data.v23.2.dll +"C:\Program Files\7-zip\7z.exe" a c:\tecnosis.publicados\WebIntranet.zip "C:\tecnosis.tfs\Controles\Binarios\DevExpress 23.2\Bin\Framework\DevExpress.Data.v23.2.dll" +"C:\Program Files\7-zip\7z.exe" rn c:\tecnosis.publicados\WebIntranet.zip DevExpress.Data.v23.2.dll Content\C_C\tecnosis.tfs\Clientes\COAS\WebIntranet\obj\Release\Package\PackageTmp\bin\DevExpress.Data.v23.2.dll diff --git a/.codex-links/WebIntranet/ResListPicaEntreFechas.vb b/.codex-links/WebIntranet/ResListPicaEntreFechas.vb new file mode 100644 index 0000000..6899e1d --- /dev/null +++ b/.codex-links/WebIntranet/ResListPicaEntreFechas.vb @@ -0,0 +1,6 @@ +Public Class ResListPicaEntreFechas + Property resultado As Integer + Property Mensaje As String + + Property algo As String +End Class diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Scripts/all.min.js b/.codex-links/WebIntranet/Scripts/all.min.js similarity index 100% rename from Antifraude.Net/GestionaDenunciasAN/wwwroot/Scripts/all.min.js rename to .codex-links/WebIntranet/Scripts/all.min.js diff --git a/.codex-links/WebIntranet/Scripts/bootstrap.min.js b/.codex-links/WebIntranet/Scripts/bootstrap.min.js new file mode 100644 index 0000000..eac9842 --- /dev/null +++ b/.codex-links/WebIntranet/Scripts/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.1.0 (https://getbootstrap.com/) + * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,c){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)P(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
    ',trigger:"hover focus",title:"",delay:0,html:!(_e={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"}),selector:!(de={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"}),placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},pe="out",ve={HIDE:"hide"+he,HIDDEN:"hidden"+he,SHOW:(me="show")+he,SHOWN:"shown"+he,INSERTED:"inserted"+he,CLICK:"click"+he,FOCUSIN:"focusin"+he,FOCUSOUT:"focusout"+he,MOUSEENTER:"mouseenter"+he,MOUSELEAVE:"mouseleave"+he},Ee="fade",ye="show",Te=".tooltip-inner",Ce=".arrow",Ie="hover",Ae="focus",De="click",be="manual",Se=function(){function i(t,e){if("undefined"==typeof c)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=oe(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(oe(this.getTipElement()).hasClass(ye))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),oe.removeData(this.element,this.constructor.DATA_KEY),oe(this.element).off(this.constructor.EVENT_KEY),oe(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&oe(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===oe(this.element).css("display"))throw new Error("Please use show on visible elements");var t=oe.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){oe(this.element).trigger(t);var n=oe.contains(this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!n)return;var i=this.getTipElement(),r=Cn.getUID(this.constructor.NAME);i.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&oe(i).addClass(Ee);var s="function"==typeof this.config.placement?this.config.placement.call(this,i,this.element):this.config.placement,o=this._getAttachment(s);this.addAttachmentClass(o);var a=!1===this.config.container?document.body:oe(this.config.container);oe(i).data(this.constructor.DATA_KEY,this),oe.contains(this.element.ownerDocument.documentElement,this.tip)||oe(i).appendTo(a),oe(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new c(this.element,i,{placement:o,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:Ce},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),oe(i).addClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().on("mouseover",null,oe.noop);var l=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,oe(e.element).trigger(e.constructor.Event.SHOWN),t===pe&&e._leave(null,e)};if(oe(this.tip).hasClass(Ee)){var h=Cn.getTransitionDurationFromElement(this.tip);oe(this.tip).one(Cn.TRANSITION_END,l).emulateTransitionEnd(h)}else l()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=oe.Event(this.constructor.Event.HIDE),r=function(){e._hoverState!==me&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),oe(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(oe(this.element).trigger(i),!i.isDefaultPrevented()){if(oe(n).removeClass(ye),"ontouchstart"in document.documentElement&&oe(document.body).children().off("mouseover",null,oe.noop),this._activeTrigger[De]=!1,this._activeTrigger[Ae]=!1,this._activeTrigger[Ie]=!1,oe(this.tip).hasClass(Ee)){var s=Cn.getTransitionDurationFromElement(n);oe(n).one(Cn.TRANSITION_END,r).emulateTransitionEnd(s)}else r();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){oe(this.getTipElement()).addClass(ue+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||oe(this.config.template)[0],this.tip},t.setContent=function(){var t=oe(this.getTipElement());this.setElementContent(t.find(Te),this.getTitle()),t.removeClass(Ee+" "+ye)},t.setElementContent=function(t,e){var n=this.config.html;"object"==typeof e&&(e.nodeType||e.jquery)?n?oe(e).parent().is(t)||t.empty().append(e):t.text(oe(e).text()):t[n?"html":"text"](e)},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getAttachment=function(t){return _e[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)oe(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==be){var e=t===Ie?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Ie?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;oe(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}oe(i.element).closest(".modal").on("hide.bs.modal",function(){return i.hide()})}),this.config.selector?this.config=h({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Ae:Ie]=!0),oe(e.getTipElement()).hasClass(ye)||e._hoverState===me?e._hoverState=me:(clearTimeout(e._timeout),e._hoverState=me,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===me&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||oe(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),oe(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Ae:Ie]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=pe,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===pe&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){return"number"==typeof(t=h({},this.constructor.Default,oe(this.element).data(),t)).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),Cn.typeCheckConfig(ae,t,this.constructor.DefaultType),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=oe(this.getTipElement()),e=t.attr("class").match(fe);null!==e&&0

    '}),He=h({},Nn.DefaultType,{content:"(string|element|function)"}),We="fade",xe=".popover-header",Ue=".popover-body",Ke={HIDE:"hide"+ke,HIDDEN:"hidden"+ke,SHOW:(Me="show")+ke,SHOWN:"shown"+ke,INSERTED:"inserted"+ke,CLICK:"click"+ke,FOCUSIN:"focusin"+ke,FOCUSOUT:"focusout"+ke,MOUSEENTER:"mouseenter"+ke,MOUSELEAVE:"mouseleave"+ke},Fe=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){we(this.getTipElement()).addClass(Le+"-"+t)},r.getTipElement=function(){return this.tip=this.tip||we(this.config.template)[0],this.tip},r.setContent=function(){var t=we(this.getTipElement());this.setElementContent(t.find(xe),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(Ue),e),t.removeClass(We+" "+Me)},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=we(this.getTipElement()),e=t.attr("class").match(je);null!==e&&0=this._offsets[r]&&("undefined"==typeof this._offsets[r+1]||t+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0=o.clientWidth&&i>=o.clientHeight}),l=0i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-us[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)f(l.top)||'bottom'===i&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.right + + + + + + + Oficina Andaluza Antifraude + + + + + + + + + + + +
    + +
    + +

    +
    +
    + +
    + + +
    + + +
    +
    + + + diff --git a/.codex-links/WebIntranet/Site.master.designer.vb b/.codex-links/WebIntranet/Site.master.designer.vb new file mode 100644 index 0000000..b34efb9 --- /dev/null +++ b/.codex-links/WebIntranet/Site.master.designer.vb @@ -0,0 +1,564 @@ +'------------------------------------------------------------------------------ +' +' Este cdigo fue generado por una herramienta. +' +' Los cambios en este archivo podran causar un comportamiento incorrecto y se perdern si +' se vuelve a generar el cdigo. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class SiteMaster + + ''' + '''Control body. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents body As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Div1. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Div1 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Div2. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Div2 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Div3. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Div3 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Div4. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Div4 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control btnAtrasGeneral. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents btnAtrasGeneral As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control barraNavegacion. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents barraNavegacion As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control linkLogoParlamento. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents linkLogoParlamento As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control usuarioNav. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents usuarioNav As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control imgCambiarModo. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents imgCambiarModo As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control imgGestDele. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents imgGestDele As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control selUsuIcon. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents selUsuIcon As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control conMenuHambur. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents conMenuHambur As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control navigation. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents navigation As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestPermisos. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestPermisos As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control menuSeccionVacacionesPermisos. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents menuSeccionVacacionesPermisos As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestIncidencias. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestIncidencias As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control menuSeccionIncidencias. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents menuSeccionIncidencias As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestInciPers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestInciPers As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestControlHorario. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestControlHorario As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestIntPicada. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestIntPicada As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestIntPicadaPers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestIntPicadaPers As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestAnuPicadaPers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestAnuPicadaPers As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestlistPicadas. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestlistPicadas As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestVAAPBCBL. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestVAAPBCBL As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestVAAPBCBLpers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestVAAPBCBLpers As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control estInciPicada. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents estInciPicada As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestControlTT. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestControlTT As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control A1. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents A1 As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control A2. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents A2 As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control pestDatosPers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestDatosPers As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestGestDep. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestGestDep As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control DatosAdmMen. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents DatosAdmMen As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control pestRetribuciones. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents pestRetribuciones As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control tabSituacionPersonal. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents tabSituacionPersonal As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control CardSolicitudesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents CardSolicitudesMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control solicitudesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents solicitudesMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control CardComunicacionesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents CardComunicacionesMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control comunicacionesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents comunicacionesMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control mobInciPersonal. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents mobInciPersonal As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control cardControlHorario. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents cardControlHorario As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control intPicadaMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents intPicadaMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control intPicadaPersMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents intPicadaPersMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control AnularPicadaPersMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents AnularPicadaPersMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control infPicadasMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents infPicadasMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control VacacionesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents VacacionesMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control VacacionesMobpers. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents VacacionesMobpers As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control estInciPicadaMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents estInciPicadaMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control cardControlTT. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents cardControlTT As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control A3. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents A3 As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control A4. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents A4 As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control cardSitucaionPersonal. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents cardSitucaionPersonal As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control CardDatosAdminMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents CardDatosAdminMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control cardGestDep. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents cardGestDep As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Div6Mov. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Div6Mov As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control CardRetribucionesMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents CardRetribucionesMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control nombreUsuarioMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents nombreUsuarioMob As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control imgCambiarModoMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents imgCambiarModoMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control imgGestDeleMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents imgGestDeleMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control imgUsersMob. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents imgUsersMob As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control Content. + ''' + ''' + '''Campo generado automticamente. + '''Para modificarlo, mueva la declaracin del campo del archivo del diseador al archivo de cdigo subyacente. + ''' + Protected WithEvents Content As Global.System.Web.UI.WebControls.ContentPlaceHolder +End Class diff --git a/.codex-links/WebIntranet/Site.master.vb b/.codex-links/WebIntranet/Site.master.vb new file mode 100644 index 0000000..3ecb047 --- /dev/null +++ b/.codex-links/WebIntranet/Site.master.vb @@ -0,0 +1,179 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports Newtonsoft.Json +Imports System.Threading.Tasks +Imports WebIntranet.Models + +Public Class SiteMaster + Inherits System.Web.UI.MasterPage + Public asemVer As String + Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) + Dim ver As Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version + asemVer = ver.ToString.Replace(".", "_") + DatosAdmMen.Visible = False + Div6Mov.Visible = False + estInciPicada.Visible = False + estInciPicadaMob.Visible = False + mobInciPersonal.Visible = False + pestInciPers.Visible = False + If Session("Persona") Is Nothing Then + Response.Redirect("default.aspx") + End If + usuarioNav.InnerHtml = Session("Nombre") + nombreUsuarioMob.InnerHtml = Session("Nombre") + Dim sessionUsuario As String = Session("usuario") + cargarGrupos() + If HttpContext.Current.Request.Url.AbsolutePath.ToLower.Contains("selmodo") Or HttpContext.Current.Request.Url.AbsolutePath.ToLower.Contains("selusuarios") Then + conMenuHambur.Visible = False + btnAtrasGeneral.Visible = False + navigation.Visible = False + imgCambiarModo.Visible = False + imgGestDele.Visible = False + selUsuIcon.Visible = False + End If + If Session("RET") = "RET" AndAlso Session("modo") = "PROPIO" Then + pestIncidencias.Visible = False + pestPermisos.Visible = False + pestControlHorario.Visible = False + CardSolicitudesMob.Visible = False + CardComunicacionesMob.Visible = False + cardControlHorario.Visible = False + + + End If + If Session("persona").Personas(0).Roll <> "SUPERVISOR" AndAlso Session("persona").Personas(0).Roll <> "SUPERVISORDETODO" Then + imgGestDele.Visible = False + End If + If Session("persona").Personas(0).Roll <> "SUPERVISOR" AndAlso Session("persona").Personas(0).Roll <> "DELEGADO" AndAlso Session("persona").Personas(0).Roll <> "SUPERVISORDETODO" Then + imgCambiarModo.Visible = False + End If + If Session("persona").Personas(0).Roll <> "SUPERVISORDETODO" Then + tabSituacionPersonal.Visible = False + cardSitucaionPersonal.Visible = False + pestControlTT.Visible = False + cardControlTT.Visible = False + End If + If Session("modo") = "PROPIO" Then + pestGestDep.Visible = False + cardGestDep.Visible = False + VacacionesMobpers.Visible = False + pestVAAPBCBLpers.Visible = False + imgGestDele.Visible = False + selUsuIcon.Visible = False + body.Attributes.Remove("class") + body.Attributes.Add("class", "gestionPropia") + intPicadaPersMob.Visible = False + pestIntPicadaPers.Visible = False + AnularPicadaPersMob.Visible = False + pestAnuPicadaPers.Visible = False + 'If Session("persona").Personas(0).Dni = "44286377S" Then + DatosAdmMen.Visible = True + Div6Mov.Visible = True + 'End If + pestControlTT.Visible = False + cardControlTT.Visible = False + ElseIf Session("modo") = "PERSONAL" Then + If Session("persona").Personas(0).Roll = "SUPERVISORDETODO" Then + estInciPicada.Visible = True + estInciPicadaMob.Visible = True + mobInciPersonal.Visible = True + pestInciPers.Visible = True + End If + intPicadaMob.Visible = False + pestIntPicada.Visible = False + body.Attributes.Remove("class") + body.Attributes.Add("class", "gestionPersonal") + pestIntPicada.Visible = False + CardComunicacionesMob.Visible = False + CardDatosAdminMob.Visible = False + 'CardDatosPersMob.Visible = False + CardRetribucionesMob.Visible = False + CardSolicitudesMob.Visible = False + 'BolsaHorasMob.Visible = False + VacacionesMob.Visible = False + 'pestBolsaHoras.Visible = False + pestDatosPers.Visible = False + pestIncidencias.Visible = False + pestPermisos.Visible = False + pestVAAPBCBL.Visible = False + pestRetribuciones.Visible = False + 'hercPropia.Visible = False + 'pestlistPicadas.Visible = False + 'pestIntPicada.Visible = False + 'pestIntTeleTra.Visible = False + 'pestDatosAdmin.Visible = False + 'infPicadasMob.Visible = False + 'navbarDropdown_rama6.Visible = False + + Else + 'hercPerson.Visible = False + body.Attributes.Remove("class") + body.Attributes.Add("class", "gestionPropia") + End If + + + End Sub + Function cargarGrupos() + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/GruposIncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim Datos As List(Of Models.grupos) = + deserializador3.Deserialize(Of List(Of Models.grupos))(respuesta3) + Dim listaGruposInci = Datos.Where(Function(x) x.NumIncidencias <> 0).ToList + Dim listaGruposSoli = Datos.Where(Function(x) x.NumSolicitudes <> 0).ToList + Dim htmlSoli = "" + Dim htmlInci = "" + For Each grupo As grupos In listaGruposSoli + If grupo.ayudaWeb IsNot Nothing Then + htmlSoli += "
    " + grupo.ayudaWeb + "" + grupo.Descripcion + "
    " + Else + htmlSoli += "" + grupo.Descripcion + "" + End If + Next + For Each grupo As grupos In listaGruposInci + If grupo.ayudaWeb IsNot Nothing Then + htmlInci += "
    " + grupo.ayudaWeb + "" + grupo.Descripcion + "
    " + + Else + htmlInci += "" + grupo.Descripcion + "" + + End If + Next + menuSeccionVacacionesPermisos.InnerHtml = htmlSoli + solicitudesMob.InnerHtml = htmlSoli + menuSeccionIncidencias.InnerHtml = htmlInci + comunicacionesMob.InnerHtml = htmlInci + + + 'cbGrupoInci.DataSource = listaGruposInci + 'cbGrupoInci.ValueField = "idGrupo" + 'cbGrupoInci.TextField = "Descripcion" + 'cbGrupoSoli.DataSource = listaGruposSoli + 'cbGrupoSoli.ValueField = "idGrupo" + 'cbGrupoSoli.TextField = "Descripcion" + 'cbGrupoSoli.DataBind() + 'cbGrupoInci.DataBind() + End Function + Protected Sub LoggedInMenuMenu_ItemClick(ByVal source As Object, ByVal e As DevExpress.Web.Bootstrap.BootstrapMenuItemEventArgs) + If e.Item.Name = "Logout" Then + + Response.Redirect("~/Account/Login.aspx") + End If + End Sub + + Protected Sub linkLogo_ServerClick(sender As Object, e As EventArgs) + If Session("persona").personas.count > 1 Then + Response.Redirect("/selModo.aspx") + Else + Response.Redirect("/home.aspx") + End If + End Sub +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/SolicitudesComunicaciones.aspx b/.codex-links/WebIntranet/SolicitudesComunicaciones.aspx new file mode 100644 index 0000000..d24b089 --- /dev/null +++ b/.codex-links/WebIntranet/SolicitudesComunicaciones.aspx @@ -0,0 +1,652 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="SolicitudesComunicaciones.aspx.vb" Inherits="WebIntranet.SolicitudesComunicaciones" %> + + + + +
    + + + +
    +

    +
    +
    +
    +
    +
    +

    Añadir nuevo tramo

    +
    + +
    +

    FECHA*:

    +
    +
    +
    + Inicio +
    + +
    +
    +
    + Final +
    + +
    + +
    +
    +
    +

    HORARIO MAÑANA

    +
    +
    +
    + Inicio +
    + +
    +
    +
    + Final +
    + +
    +
    +
    + Total +
    + +
    +
    +
    +
    +

    HORARIO TARDE

    +
    +
    +
    + Inicio +
    + +
    +
    +
    + Final +
    + +
    +
    +
    + Total +
    + +
    +
    +
    +
    +

    ARCHIVO ADJUNTO

    +
    + +

    Ningún archivo seleccionado

    + +
    +
    +
    + +
    +

    OBSERVACIONES

    + " + if (inciActual.Adjunto == "SI") { + "ARCHIVO ADJUNTO" + + '' + } + html += "" + + "" + + $('#ModInc').html(html) + $('#ModInc').css('display', 'flex') + + if (DiasCompletos == true && IntervaloDias == true || IntervaloDias == true) { + $('#inFdI').css('display', '') + $('#inFdI-I').css('display', '') + $('#inFdI-F').css('display', '') + } + if (DiasCompletos == true && IntervaloDias == false) { + $('#inFdI').css('display', '') + $('#inFdI-I').css('display', '') + } + if (IntervaloHoras == true) { + $('#inHdI-M').css('display', '') + $('#inHdI-T').css('display', '') + } + if (editable == false && DiasCompletos == false && IntervaloDias == false && IntervaloHoras == false) { + $('#inFdI').css('display', '') + $('#inFdI-I').css('display', '') + $('#inFdI-F').css('display', '') + $('#inHdI-M').css('display', '') + $('#inHdI-T').css('display', '') + } + + } + } + }); + } + function guardarCambiosModInc() { + $("#divLoading").css("display", "flex") + var observaciones = document.getElementById('inObs').value + var idEstado = 0 + var fcIn = $('#inpIniDesgIn').val() + var fcFn = $('#inpFinDesgIn').val() + var horaIniMan = $('#inHdI-MI').val() + var horaFinMan = $('#inHdI-MF').val() + var horaTotMan = $('#inHdI-MT').text() + var horaIniTar = $('#inHdI-TI').val() + var horaFinTar = $('#inHdI-TF').val() + var horaTotTar = $('#inHdI-TT').text() + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString) + + $.ajax({ + type: "post", + url: "./desgSolicitudesComunicaciones.aspx/ModificarEstado", + data: '{"i":"' + urlParams.get("idAsis") + '","h":"' + urlParams.get("cl") + '","idEstado":' + idEstado + ',"FechaInicio":"' + fcIn + '","FechaFin":"' + fcFn + '","horainiciomanana":"' + horaIniMan + '",' + + '"horafinmanana":"' + horaFinMan + '","horastrabajadasmanana":"' + horaTotMan + '","horainiciotarde":"' + horaIniTar + '","horafintarde":"' + horaFinTar + '","horastrabajadastarde":"' + horaTotTar + '",' + + '"observaciones": "' + observaciones + '","fichero":"' + fichero + '"}', + async: true, + contentType: "application/json; charset=utf-8", + dataType: "json", + success: function (result) { + if (result.d != "") { + if (result.d.includes("ERROR--")) { + compEr(result.d) + return + } + success = true + DesgloseIncidencia = JSON.parse(result.d) + if (DesgloseIncidencia[0].resultado == 0) { + $("#ModInc").html("") + $("#ModInc").css("display", "none") + $("#divLoading").css("display", "none") + window.location.reload() + //MostrarDesgIncidencia(sessionStorage.getItem("idAsistencia")) + //$('#mensajeDesgAsis').css('color', 'green') + //document.getElementById('mensajeDesgAsis').innerHTML = DesgloseIncidencia[0].mensaje + //MostrarIncidencias() + } + else { + $("#divLoading").css("display", "none") + $("#ModInc").html("") + $("#ModInc").css("display", "none") + $('#mensajeDesgAsis').css('color', 'red') + document.getElementById('mensajeDesgAsis').innerHTML = DesgloseIncidencia[0].mensaje + } + } + }, + error: function (result) { + alert('error occured'); + //alert(result.responseText); + $("#iconLoading").css("display", "none") + //$(".Loading").hide() + } + }); + } + function BorrarInc(id) { + $('#divConfirmacion').html('
    ' + + '

    ¿Está seguro de que desea eliminar esta incidencia?

    ' + + '' + + ' ' + + '
    ') + $('#divConfirmacion').css('display', 'flex') + } + function confirmarBorrar(id) { + + $.ajax({ + type: "post", + url: "/desgSolicitudesComunicaciones.aspx/BorrarIncidencia", + async: true, + data: '{"id":"' + id + '"}', + contentType: "application/json; charset=utf-8", + dataType: "json", + success: function (result) { + if (result.d != "") { + success = true + var respuesta = JSON.parse(result.d) + $('#divConfirmacion').html('') + $('#divConfirmacion').css('display', 'none') + window.location.href = "/listSolicitudesComunicaciones.aspx" + //MostrarIncidencias() + /* MostrarPagina("listadoDeIncidencias")*/ + //$('#mensajeListIncidencias').text(respuesta.Mensaje) + + } + } + }); + + } + + diff --git a/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.designer.vb b/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.designer.vb new file mode 100644 index 0000000..33e4d81 --- /dev/null +++ b/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.designer.vb @@ -0,0 +1,96 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class desgSolicitudesComunicaciones + + ''' + '''Control inciActual. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents inciActual As Global.System.Web.UI.WebControls.HiddenField + + ''' + '''Control intPicadaBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents intPicadaBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control intPicadaPersBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents intPicadaPersBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control VAAPBCBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents VAAPBCBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control VAAPBCBLpers. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents VAAPBCBLpers As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control tablaIncidencia. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents tablaIncidencia As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control btnModIncDiv. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents btnModIncDiv As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control btnBorrarIncDiv. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents btnBorrarIncDiv As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control tablaEstadoInc. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents tablaEstadoInc As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.vb b/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.vb new file mode 100644 index 0000000..aa409da --- /dev/null +++ b/.codex-links/WebIntranet/desgSolicitudesComunicaciones.aspx.vb @@ -0,0 +1,558 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports System.Threading.Tasks +Imports Newtonsoft.Json +Imports WebIntranet.Models + +Public Class desgSolicitudesComunicaciones + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("Persona") Is Nothing Then + Response.Redirect("default.aspx") + End If + If Session("modo") = "PERSONAL" Then + 'bolsaDeHorasBL.Visible = False + intPicadaBL.Visible = False + VAAPBCBL.Visible = False + + 'informPicadasBL.Visible = False + Else + VAAPBCBLpers.Visible = False + intPicadaPersBL.Visible = False + End If + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim usuRoll As String = Session("persona").Personas(0).Roll + 'Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + 'sessionUsuario = Session("usuario") + Dim idAsistencia = Request.QueryString("idAsis") + Session.Add("idAsis", idAsistencia) + Dim cl = Request.QueryString("cl") + Dim sCl2 = tsl5.crypt.SHA1("M3Soft." & idAsistencia.ToString) + If sCl2 <> cl Then + Response.Redirect("/default.aspx", False) + Else + + + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url1 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EstadosAsistencias" + Dim credenciales1 As New Net.CredentialCache() + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + clienteHTTP1.Credentials = credenciales1 + Dim respuesta1 As String = clienteHTTP1.DownloadString(url1) + Dim deserializador1 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim listaEstados As List(Of Models.Estados) = + deserializador1.Deserialize(Of List(Of Models.Estados))(respuesta1) + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenAsistencia?idAsistencia=" + idAsistencia + "&Nif=" + sessionUsuario + Dim credenciales2 As New Net.CredentialCache() + Dim clienteHTTP2 As New Net.WebClient() + clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + clienteHTTP2.Credentials = credenciales2 + Dim respuesta2 As String = clienteHTTP2.DownloadString(url2) + Dim deserializador2 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings2 As New Newtonsoft.Json.JsonSerializerSettings() + settings2.CheckAdditionalContent = True + Dim usu = sessionUsuario + Dim objetoDatos As ResultadoObtenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenAsistencia)(respuesta2, settings2) + Dim idAsis = objetoDatos.idAsistencia.ToString + Dim sCl = tsl5.crypt.SHA1("M3Soft." & objetoDatos.idAsistencia.ToString) + Dim urlfichero = "/fichero.aspx?id=" + idAsis + "&t=INCIDENCIA&nif=" + sessionUsuario + "&cl=" + sCl + Dim desgloseIncidencia = objetoDatos + + Dim listP As List(Of Personal) = Session("persona").Personas + Dim persResponsable = listP.Where(Function(x) x.Dni = desgloseIncidencia.Nif).ToList + + If persResponsable.Count = 0 OrElse (persResponsable(0).Dni = sessionUsuario AndAlso Session("modo") = "PERSONAL") Then + Response.Redirect("/Default.aspx") + Exit Sub + End If + + Session.Add("idIncidencia", desgloseIncidencia) + Dim idIncidencia = desgloseIncidencia.idIncidenciaControlHorario + + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/IncidenciasControlHorario" + ' Dim url3 As String = "http://192.168.41.14:81/api/IncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + credenciales3.Add(New Uri(url3), "Basic", New Net.NetworkCredential(usuario, contraseña)) + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim listaPicada As List(Of Incidencia) = + deserializador3.Deserialize(Of List(Of Incidencia))(respuesta3) + + Dim incidencia = listaPicada.FirstOrDefault(Function(x) x.idIncidencias = idIncidencia) + inciActual.Value = JsonConvert.SerializeObject(incidencia) + Session.Add("incidencia", incidencia) + 'If incidencia Is Nothing Then + ' Response.Redirect("/listSolicitudesComunicaciones.aspx") + 'End If + Dim fechaIni = CDate(desgloseIncidencia.FechaInicio).ToString("dd/MM/yyyy") + Dim fechaFin + + If desgloseIncidencia.FechaFin = Nothing Then + fechaFin = "" + Else + fechaFin = CDate(desgloseIncidencia.FechaFin).ToString("dd/MM/yyyy") + End If + Dim htmllista = "" + Dim html = "

    " + desgloseIncidencia.ApellidosNombre + "

    " + + "" + + "" + If incidencia.AdmiteRangosFechas = True Then + html += "" + + "" + Else + html += "" + End If + + html += "" + + "" + If incidencia.AdmiteIntervaloHoras Then + html += "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + End If + html += "" + + "" + + "" + If desgloseIncidencia.PuedeCambiarEstado = False OrElse (desgloseIncidencia.DesEstadoActual = "BORRADOR" And Session("modo") = "PERSONAL") OrElse ((desgloseIncidencia.DesEstadoActual.Contains("VISTO BUENO")) And (usuRoll = "SUPERVISOR" Or usuRoll = "DELEGADO") AndAlso Session("modo") = "PERSONAL") OrElse ((desgloseIncidencia.DesEstadoActual.Contains("SOLICITADA")) And (usuRoll = "SUPERVISOR" Or usuRoll = "DELEGADO") AndAlso Session("modo") = "PERSONAL") Then + Dim estadoActual = "" + estadoActual = desgloseIncidencia.DesEstadoActual + 'If desgloseIncidencia.DesEstadoActual = "ACEPTADA" Then + ' estadoActual = "ACEPTADA" + 'ElseIf desgloseIncidencia.DesEstadoActual = "BORRADOR" Then + ' estadoActual = "BORRADOR" + 'ElseIf desgloseIncidencia.DesEstadoActual = "PROPUESTA" Then + ' estadoActual = "PROPUESTA" + 'Else + + ' For Each posiblesEstados As Estados In desgloseIncidencia.PosiblesEstados + ' If posiblesEstados.idEstado = desgloseIncidencia.IdEstadoActual Then + ' estadoActual = posiblesEstados.Descripcion + ' End If + ' If desgloseIncidencia.IdEstadoActual = 1 Then + ' estadoActual = "ACEPTADA" + ' End If + ' Next + 'End If + html += "" + If desgloseIncidencia.ExisteArchivo = True Then + html += "
    FECHAInicio: " + fechaIni + "Final: " + fechaFin + "
    Inicio: " + fechaIni + "
    INCIDENCIA" + incidencia.Nombre + "
    HORARIO MAÑANAInicio: " + desgloseIncidencia.HoraInicioManana + "Final: " + desgloseIncidencia.HoraFinManana + "Total: " + desgloseIncidencia.HorasTraManana + "
    HORARIO TARDEInicio: " + desgloseIncidencia.HoraInicioTarde + "Final: " + desgloseIncidencia.HoraFinTarde + "Total: " + desgloseIncidencia.HorasTraTarde + "
    OBSERVACIONES" + desgloseIncidencia.Observaciones + "
    ESTADO" + estadoActual + "
    ARCHIVO ADJUNTOVISUALIZAR
    " + Else + html += "" + End If + + Else + If desgloseIncidencia.IdEstadoActual = Nothing Then + desgloseIncidencia.IdEstadoActual = 0 + End If + html += "" + + "" + + "" + + "OBSERVACIÓN ESTADO" + If desgloseIncidencia.ExisteArchivo = True Then + html += "ARCHIVO ADJUNTOVISUALIZAR" + Else + html += "" + End If + html += "
    " + If Session("modo") = "PROPIO" And (desgloseIncidencia.DesEstadoActual = "BORRADOR") Then + btnModIncDiv.InnerHtml = "" + Else + btnModIncDiv.InnerHtml = "" + End If + + If Session("modo") = "PROPIO" And desgloseIncidencia.DesEstadoActual = "BORRADOR" Then + btnBorrarIncDiv.InnerHtml = "" + Else + btnBorrarIncDiv.InnerHtml = "" + End If + End If + + tablaIncidencia.InnerHtml = html + Dim infAnexa + Dim observaciones + If desgloseIncidencia.EstadosAsistencia IsNot Nothing Then + htmllista += "" + + "" + + "" + + "" + + "" + + For Each est As EstadosdelaAsistencia In desgloseIncidencia.EstadosAsistencia + 'If est.IdTipoEstado = 3 And Session("modo") = "PERSONAL" Then + 'Else + htmllista += "" + + "" + + "" + If est.InformacionAnexa Is Nothing Then + infAnexa = "" + Else + infAnexa = est.InformacionAnexa + End If + htmllista += "" + If est.Observaciones Is Nothing Then + observaciones = "" + Else + observaciones = est.Observaciones + End If + + htmllista += "" + 'End If + Next + htmllista += "
    Fecha/HoraEstadoUsuarioInformación AnexaObservaciones
    " + CDate(est.FechaHora).ToString("dd/MM/yyyy") + "" + listaEstados.FirstOrDefault(Function(x) x.idEstado = est.IdTipoEstado).Descripcion + "" + est.Usuario + "" + infAnexa + "" + observaciones + "
    " + tablaEstadoInc.InnerHtml = htmllista + End If + + End If + + End Sub + + Public Shared Async Function CargarDesgloseAsis(i As String, h As String) As Task(Of String) + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim idAsistencia As String = i + 'Dim idAsistencia As String = HttpContext.Current.Session("idAsis") + Dim cl = h + Dim sCl2 = tsl5.crypt.SHA1("M3Soft." & idAsistencia.ToString) + If sCl2 <> cl Then + Dim json = "{""cuerpo"":""ERROR--1""}" + + Return json + 'HttpContext.Current.Response.Redirect("/Default.aspx", False) + Else + ' Dim incidencia As Incidencia = HttpContext.Current.Session("incidencia") + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenAsistencia?idAsistencia=" + idAsistencia + "&Nif=" + sessionUsuario + Dim credenciales2 As New Net.CredentialCache() + Dim clienteHTTP2 As New Net.WebClient() + clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + clienteHTTP2.Credentials = credenciales2 + Dim respuesta2 As String = clienteHTTP2.DownloadString(url2) + Dim deserializador2 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings2 As New Newtonsoft.Json.JsonSerializerSettings() + settings2.CheckAdditionalContent = True + Dim usu = sessionUsuario + Dim objetoDatos As ResultadoObtenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenAsistencia)(respuesta2, settings2) + Dim idAsis = objetoDatos.idAsistencia.ToString + Dim sCl = tsl5.crypt.SHA1("M3Soft." & objetoDatos.idAsistencia.ToString) + Dim urlfichero = "/ficheroParlamento.aspx?id=" + idAsis + "&t=INCIDENCIA&nif=" + sessionUsuario + "&cl=" + sCl + Dim desgloseIncidencia = objetoDatos + + Dim idIncidencia = desgloseIncidencia.idIncidenciaControlHorario + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/IncidenciasControlHorario" + ' Dim url3 As String = "http://192.168.41.14:81/api/IncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim listaPicada As List(Of Incidencia) = + deserializador3.Deserialize(Of List(Of Incidencia))(respuesta3) + + Dim incidencia = listaPicada.FirstOrDefault(Function(x) x.idIncidencias = idIncidencia) + + + 'Dim incidencia As Incidencia = HttpContext.Current.Session("incidencia") + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url4 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenAsistencia?idAsistencia=" + idAsistencia + "&Nif=" + sessionUsuario + Dim credenciales4 As New Net.CredentialCache() + Dim clienteHTTP4 As New Net.WebClient() + clienteHTTP4.Encoding = System.Text.Encoding.UTF8 + clienteHTTP4.Credentials = credenciales4 + Dim respuesta4 As String = clienteHTTP4.DownloadString(url4) + + Dim deserializador4 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + 'Dim usu = sessionUsuario + Dim objetoDatos1 As ResultadoObtenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenAsistencia)(respuesta4, settings) + + Dim listP As List(Of Personal) = HttpContext.Current.Session("persona").Personas + Dim persResponsable = listP.Where(Function(x) x.Dni = desgloseIncidencia.Nif).ToList + If persResponsable.Count = 0 OrElse (persResponsable(0).Dni = sessionUsuario AndAlso HttpContext.Current.Session("modo") = "PERSONAL") Then + Return "{""cuerpo"":""ERROR--1""}" + Exit Function + End If + ' Dim idAsis = objetoDatos.idAsistencia.ToString + 'Dim sCl = tsl5.crypt.SHA1("M3Soft." & objetoDatos.idAsistencia.ToString) + ' Dim urlfichero = "/fichero.aspx?id=" + idAsis + "&t=INCIDENCIA&nif=" + sessionUsuario + "&cl=" + sCl + Dim incidenciaActual = JsonConvert.SerializeObject(incidencia) + Dim json = "{""cuerpo"":" + respuesta4 + ",""link"":""" + urlfichero + """,""incidencia"":" + incidenciaActual + ",""modo"":""" + HttpContext.Current.Session("modo") + """}" + + + Return json + End If + End Function + + Public Shared Async Function CargarListadoEstados() As Task(Of String) + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url1 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EstadosAsistencias" + Dim credenciales1 As New Net.CredentialCache() + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + clienteHTTP1.Credentials = credenciales1 + Dim respuesta1 As String = clienteHTTP1.DownloadString(url1) + Dim deserializador1 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim listaEstados As List(Of Models.Estados) = + deserializador1.Deserialize(Of List(Of Models.Estados))(respuesta1) + 'liEstInc.Value = respuesta3 + Return respuesta1 + End Function + + Public Shared Function ModificarEstado(i As String, h As String, idEstado As Integer, FechaInicio As String, FechaFin As String, horainiciomanana As String, horafinmanana As String, + horastrabajadasmanana As String, horainiciotarde As String, horafintarde As String, horastrabajadastarde As String, observaciones As String, fichero As String) ', nif As String, expediente As String + + 'Dim desgloseIncidencia As ResultadoObtenAsistencia = HttpContext.Current.Session("idIncidencia") + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + 'Dim idAsistencia As String = HttpContext.Current.Session("idAsis") + + Dim idAsistencia As String = i + + Dim cl = h + Dim sCl2 = tsl5.crypt.SHA1("M3Soft." & idAsistencia.ToString) + If sCl2 <> cl Then + Dim json = "ERROR--1" + Return json + 'HttpContext.Current.Response.Redirect("/Default.aspx", False) + Else + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenAsistencia?idAsistencia=" + idAsistencia + "&Nif=" + sessionUsuario + Dim credenciales2 As New Net.CredentialCache() + Dim clienteHTTP2 As New Net.WebClient() + clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + clienteHTTP2.Credentials = credenciales2 + Dim respuesta2 As String = clienteHTTP2.DownloadString(url2) + Dim deserializador2 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings2 As New Newtonsoft.Json.JsonSerializerSettings() + settings2.CheckAdditionalContent = True + Dim usu = sessionUsuario + Dim objetoDatos As ResultadoObtenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenAsistencia)(respuesta2, settings2) + Dim idAsis = objetoDatos.idAsistencia.ToString + Dim sCl = tsl5.crypt.SHA1("M3Soft." & objetoDatos.idAsistencia.ToString) + Dim urlfichero = "/ficheroParlamento.aspx?id=" + idAsis + "&t=INCIDENCIA&nif=" + sessionUsuario + "&cl=" + sCl + Dim desgloseIncidencia = objetoDatos + + Dim listP As List(Of Personal) = HttpContext.Current.Session("persona").Personas + Dim persResponsable = listP.Where(Function(x) x.Dni = desgloseIncidencia.Nif).ToList + + If persResponsable.Count = 0 OrElse (persResponsable(0).Dni = sessionUsuario AndAlso HttpContext.Current.Session("modo") = "PERSONAL") Then + Return "ERROR--1" + Exit Function + End If + If idEstado = 0 Then + idEstado = desgloseIncidencia.IdEstadoActual + End If + horainiciomanana = If(horainiciomanana = "" Or horainiciomanana = "undefined", "00:00", horainiciomanana) + horafinmanana = If(horafinmanana = "" Or horafinmanana = "undefined", "00:00", horafinmanana) + horastrabajadasmanana = If(horastrabajadasmanana = "" Or horastrabajadasmanana = "undefined", "00:00", horastrabajadasmanana) + horainiciotarde = If(horainiciotarde = "" Or horainiciotarde = "undefined", "00:00", horainiciotarde) + horafintarde = If(horafintarde = "" Or horafintarde = "undefined", "00:00", horafintarde) + horastrabajadastarde = If(horastrabajadastarde = "" Or horastrabajadastarde = "undefined", "00:00", horastrabajadastarde) + + + If FechaFin = "" Or FechaFin = "undefined" Then + FechaFin = FechaInicio + End If + Dim nif = sessionUsuario + Dim expediente = "" + Dim us = sessionUsuario + Dim fcIn As Date = DateTime.Parse(FechaInicio) + Dim fcFn As Date = DateTime.Parse(FechaFin) + Dim fechaIni = fcIn.Month.ToString.PadLeft(2, "0") + "%2F" + fcIn.Day.ToString.PadLeft(2, "0") + "%2F" + fcIn.Year.ToString + Dim fechaEnd = fcFn.Month.ToString.PadLeft(2, "0") + "%2F" + fcFn.Day.ToString.PadLeft(2, "0") + "%2F" + fcFn.Year.ToString + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + Dim FechaI As String + Dim FechaF As String + Dim idIn As String + Dim HIM As String + Dim HFM As String + Dim HTM As String + Dim HIT As String + Dim HFT As String + Dim HTT As String + Dim Ob As String + + If (sessionUsuario <> desgloseIncidencia.Nif Or desgloseIncidencia.DesEstadoActual <> "BORRADOR") Then + FechaI = desgloseIncidencia.FechaInicio.Month.ToString.PadLeft(2, "0") + "%2F" + desgloseIncidencia.FechaInicio.Day.ToString.PadLeft(2, "0") + "%2F" + desgloseIncidencia.FechaInicio.Year.ToString + FechaF = desgloseIncidencia.FechaFin.Month.ToString.PadLeft(2, "0") + "%2F" + desgloseIncidencia.FechaFin.Day.ToString.PadLeft(2, "0") + "%2F" + desgloseIncidencia.FechaFin.Year.ToString + idIn = desgloseIncidencia.idIncidenciaControlHorario.ToString + HIM = desgloseIncidencia.HoraInicioManana.Replace(":", "%3A") + HFM = desgloseIncidencia.HoraFinManana.Replace(":", "%3A") + HTM = desgloseIncidencia.HorasTraManana.Replace(":", "%3A") + HIT = desgloseIncidencia.HoraInicioTarde.Replace(":", "%3A") + HFT = desgloseIncidencia.HoraFinTarde.Replace(":", "%3A") + HTT = desgloseIncidencia.HorasTraTarde.Replace(":", "%3A") + Ob = observaciones + Else + FechaI = fechaIni + FechaF = fechaEnd + idIn = desgloseIncidencia.idIncidenciaControlHorario.ToString + HIM = horainiciomanana.Replace(":", "%3A") + HFM = horafinmanana.Replace(":", "%3A") + HTM = horastrabajadasmanana.Replace(":", "%3A") + HIT = horainiciotarde.Replace(":", "%3A") + HFT = horafintarde.Replace(":", "%3A") + HTT = horastrabajadastarde.Replace(":", "%3A") + Ob = observaciones + End If + + Dim url1 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/CamEstAsis?usuario=" + us + "&idAsistencia=" + idAsistencia + "&idEstado=" + idEstado.ToString + "&nif=" + nif + + "&FechaInicio=" + FechaI + "&FechaFin=" + FechaF + "&idincidencia=" + idIn + "&horainiciomanana=" + HIM + "&horafinmanana=" + HFM + "&horastrabajadasmanana=" + HTM + + "&horainiciotarde=" + HIT + "&horafintarde=" + HFT + "&horastrabajadastarde=" + HTT + + "&observaciones=" + Ob + "&expediente=" + expediente + Dim sRespuesta1 As String = clienteHTTP1.UploadString(url1, "") + + '// Esta es una manera "genérica" de acceder a datos JSON mediante LINQ, + '// usando la biblioteca Newtonsoft.Json. + Dim datos As Newtonsoft.Json.Linq.JObject = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Newtonsoft.Json.Linq.JObject)(sRespuesta1) + + + Dim objetoaAlmacenar As New Models.AlmacenaFicheroIncidencia + objetoaAlmacenar.idAsistencia = idAsistencia + objetoaAlmacenar.Fichero = fichero + Dim jsonalmacenar As String = JsonConvert.SerializeObject(objetoaAlmacenar) + If fichero IsNot "" Then + 'Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/AlmacenaFicheroIncidencia" '?idAsistencia=" + objetoDatos.idAsistencia.ToString + "&Fichero=" + fichero + 'Dim sRespuesta2 As String = clienteHTTP2.UploadString(url2, Cuerpo) + Dim respuesta = Almacenafichero(idAsistencia, fichero) + End If + + '// Deserializar a una clase. + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos1 As ResultadoListPicaEntreFechas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoListPicaEntreFechas)(sRespuesta1, settings) + Dim Json = "[{""resultado"":""" + objetoDatos1.resultado.ToString + """,""mensaje"":""" + objetoDatos1.Mensaje + """}]" + Return Json + End If + End Function + + Public Shared Function BorrarIncidencia(id As String) + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim us = sessionUsuario + Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenAsistencia?idAsistencia=" + id + "&Nif=" + sessionUsuario + Dim credenciales2 As New Net.CredentialCache() + Dim clienteHTTP2 As New Net.WebClient() + clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + clienteHTTP2.Credentials = credenciales2 + Dim respuesta2 As String = clienteHTTP2.DownloadString(url2) + Dim deserializador2 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings2 As New Newtonsoft.Json.JsonSerializerSettings() + settings2.CheckAdditionalContent = True + Dim usu = sessionUsuario + Dim objetoDatos As ResultadoObtenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenAsistencia)(respuesta2, settings2) + Dim idAsis = objetoDatos.idAsistencia.ToString + Dim sCl = tsl5.crypt.SHA1("M3Soft." & objetoDatos.idAsistencia.ToString) + Dim urlfichero = "/ficheroParlamento.aspx?id=" + idAsis + "&t=INCIDENCIA&nif=" + sessionUsuario + "&cl=" + sCl + Dim desgloseIncidencia = objetoDatos + + Dim listP As List(Of Personal) = HttpContext.Current.Session("persona").Personas + Dim persResponsable = listP.Where(Function(x) x.Dni = desgloseIncidencia.Nif).ToList + + If persResponsable.Count = 0 OrElse (sessionUsuario <> desgloseIncidencia.Nif) Then + Return "ERROR--1" + Exit Function + End If + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim url1 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EliminarBorrador?idAsistencia=" + id + "&Nif=" + us + Dim sRespuesta1 As String = clienteHTTP1.UploadString(url1, "") + Return sRespuesta1 + + End Function + + Public Shared Async Function Almacenafichero(id As String, cuerpo As String) As Task(Of String) + Try + + Dim ruta = "incidencia/" + id + ".pdf" + + 'Dim archivo As Byte() = System.Text.Encoding.Unicode.GetBytes(file) + + Dim ObjetoConsulta As New FicheroAtrasnmitir + ObjetoConsulta.idRegistro = id + ObjetoConsulta.tabla = "INCIDENCIA" + 'ObjetoConsulta.Fichero = System.Convert.ToBase64String(archivo) + ObjetoConsulta.Fichero = cuerpo + + Dim jsonConsulta As String = JsonConvert.SerializeObject(ObjetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/AlmacenaFicheroAtransmitir" + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As ResultadoAlmacenaFicheroAtransmitir = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoAlmacenaFicheroAtransmitir)(sRespuesta, settings) + 'ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + 'Dim clienteHTTP2 As New Net.WebClient() + 'clienteHTTP2.Encoding = System.Text.Encoding.UTF8 + 'clienteHTTP2.Headers.Add("Content-Type", "application/json") + 'Dim url2 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/AlmacenaFicheroIncidencia" + 'Dim sRespuesta2 As String = clienteHTTP2.UploadString(url2, cuerpo) + Catch ex As Exception + Debug.Print(ex.Message) + Debug.Print(ex.StackTrace) + End Try + End Function +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/estadoInciPicada.aspx b/.codex-links/WebIntranet/estadoInciPicada.aspx new file mode 100644 index 0000000..753f14a --- /dev/null +++ b/.codex-links/WebIntranet/estadoInciPicada.aspx @@ -0,0 +1,179 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="estadoInciPicada.aspx.vb" Inherits="WebIntranet.estadoInciPicada" %> + + + + diff --git a/.codex-links/WebIntranet/estadoInciPicada.aspx.designer.vb b/.codex-links/WebIntranet/estadoInciPicada.aspx.designer.vb new file mode 100644 index 0000000..32c5124 --- /dev/null +++ b/.codex-links/WebIntranet/estadoInciPicada.aspx.designer.vb @@ -0,0 +1,78 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class estadoInciPicada + + ''' + '''Control intPicadaPersBL. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents intPicadaPersBL As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control Li1. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents Li1 As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control VAAPBCBLpers. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents VAAPBCBLpers As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control inpFechaInicio. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents inpFechaInicio As Global.System.Web.UI.HtmlControls.HtmlInputGenericControl + + ''' + '''Control inpFechaFin. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents inpFechaFin As Global.System.Web.UI.HtmlControls.HtmlInputGenericControl + + ''' + '''Control mensaje. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents mensaje As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control tablaincidencias. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents tablaincidencias As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/estadoInciPicada.aspx.vb b/.codex-links/WebIntranet/estadoInciPicada.aspx.vb new file mode 100644 index 0000000..aa1a8dd --- /dev/null +++ b/.codex-links/WebIntranet/estadoInciPicada.aspx.vb @@ -0,0 +1,97 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports DevExpress.Drawing.Internal.Images +Imports Newtonsoft.Json +Imports WebIntranet.Models + +Public Class estadoInciPicada + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + + If Session("persona").Personas(0).Dni <> "44286377S" AndAlso Session("modo") <> "PERSONAL" Then + Response.Redirect("/Default.aspx") + Else + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/IncidenciasControlHorario" + ' Dim url3 As String = "http://192.168.41.14:81/api/IncidenciasControlHorario" + Dim credenciales3 As New Net.CredentialCache() + credenciales3.Add(New Uri(url3), "Basic", New Net.NetworkCredential(usuario, contraseña)) + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim listaPicada As List(Of Incidencia) = + deserializador3.Deserialize(Of List(Of Incidencia))(respuesta3) + Dim ListIncidenciasNoReloj = listaPicada.Where(Function(x) x.EsInciReloj = False).OrderBy(Function(x) x.descripcionWeb).ToList + + Dim html = "" + html += "" + + "" + + "" + + "" + For Each itm As Incidencia In ListIncidenciasNoReloj + html += "" + + "" + + "" + Next + html += "
    Descripción
    " + itm.descripcionWeb + "
    " + tablaincidencias.InnerHtml = html + End If + End Sub + + + Public Shared Async Function obtenerEstado(chPi As String, chTe As String, liId As List(Of Integer), feIn As String, feFi As String) As Threading.Tasks.Task(Of String) + Try + + Dim listSeleccionados As New List(Of String) + listSeleccionados = HttpContext.Current.Session("usuariosSeleccionados") + If listSeleccionados.Contains(HttpContext.Current.Session("persona").Personas(0).Dni) = False Then + listSeleccionados.Add(HttpContext.Current.Session("persona").Personas(0).Dni) + End If + Dim objetoConsulta As New ObtenerEstado + objetoConsulta.Picada = chPi + objetoConsulta.Teletrabajo = chTe + objetoConsulta.listaIncidencia = liId + objetoConsulta.listaPersonas = listSeleccionados + objetoConsulta.feIn = Date.Parse(feIn) + objetoConsulta.feFi = Date.Parse(feFi) + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenEstadoInciPicada" ''meter nombre de la funcion + Dim clienteHTTP As New HttpClient + clienteHTTP.Timeout = TimeSpan.FromMinutes(10) + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As ResultadoExcelResumenAsistencia = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoExcelResumenAsistencia)(sRespuesta, settings) + Return sRespuesta + Catch ex As Exception + + End Try + + End Function + +End Class +Public Class ObtenerEstado + Public Property Picada As Boolean + Public Property Teletrabajo As Boolean + Public Property listaIncidencia As List(Of Integer) + Public Property listaPersonas As List(Of String) + Public Property feIn As Date + Public Property feFi As Date + +End Class + +'Public Class RespuestaObtenerEstado + +'End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/fichero.aspx b/.codex-links/WebIntranet/fichero.aspx new file mode 100644 index 0000000..f02530f --- /dev/null +++ b/.codex-links/WebIntranet/fichero.aspx @@ -0,0 +1,16 @@ +<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="fichero.aspx.vb" Inherits="WebIntranet.fichero" %> + + + + + + + + + +
    +
    +
    +
    + + diff --git a/.codex-links/WebIntranet/fichero.aspx.designer.vb b/.codex-links/WebIntranet/fichero.aspx.designer.vb new file mode 100644 index 0000000..6af0965 --- /dev/null +++ b/.codex-links/WebIntranet/fichero.aspx.designer.vb @@ -0,0 +1,25 @@ +'------------------------------------------------------------------------------ +' +' Este código lo generó una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se regenera el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + + +Partial Public Class fichero + + ''' + '''control form1. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents form1 As Global.System.Web.UI.HtmlControls.HtmlForm +End Class diff --git a/.codex-links/WebIntranet/fichero.aspx.vb b/.codex-links/WebIntranet/fichero.aspx.vb new file mode 100644 index 0000000..1b4266e --- /dev/null +++ b/.codex-links/WebIntranet/fichero.aspx.vb @@ -0,0 +1,40 @@ +Public Class fichero + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("Persona") Is Nothing Then + Response.Redirect("default.aspx") + End If + Dim idAsis = Request.QueryString("id") + Dim nif = Session("usuario") + Dim tabla = Request.QueryString("t") + Dim cl = Request.QueryString("cl") + Dim sCl = tsl5.crypt.SHA1("M3Soft." & idAsis.ToString) + If sCl <> cl Then + Session.Add("mensajeerror", "Trámite no válido") + Response.Redirect("/MensajesError.aspx", False) + Else + + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenFicheroAtransmitir?idRegistro=" + idAsis + "&Tabla=" + tabla + "&nif=" + nif + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + Dim datos As Newtonsoft.Json.Linq.JObject = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Newtonsoft.Json.Linq.JObject)(respuesta3) + Dim fichero As Byte() = datos.Item("pdf") + + Response.AddHeader("content-disposition", "inline;filename=""" + idAsis + ".pdf""") + 'Response.AddHeader("Cache-Control", "max-age=2592000") + If fichero IsNot Nothing Then + Response.ContentType = "application/pdf" + Response.BinaryWrite(fichero) + Response.Flush() + Response.End() + End If + End If + + + End Sub +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/gestDelegados.aspx b/.codex-links/WebIntranet/gestDelegados.aspx new file mode 100644 index 0000000..02c15a1 --- /dev/null +++ b/.codex-links/WebIntranet/gestDelegados.aspx @@ -0,0 +1,141 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="gestDelegados.aspx.vb" Async="true" Inherits="WebIntranet.gestDelegados" %> + +
    +
    +

    Gestionar delegados

    +
    + +
    +

    +
    +
    +

    Personas

    +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + +
    diff --git a/.codex-links/WebIntranet/gestDelegados.aspx.designer.vb b/.codex-links/WebIntranet/gestDelegados.aspx.designer.vb new file mode 100644 index 0000000..98980ac --- /dev/null +++ b/.codex-links/WebIntranet/gestDelegados.aspx.designer.vb @@ -0,0 +1,42 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class gestDelegados + + ''' + '''Control CambioRol. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents CambioRol As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control deparSelect. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents deparSelect As Global.System.Web.UI.HtmlControls.HtmlSelect + + ''' + '''Control cajaPersonas. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents cajaPersonas As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/gestDelegados.aspx.vb b/.codex-links/WebIntranet/gestDelegados.aspx.vb new file mode 100644 index 0000000..951bae4 --- /dev/null +++ b/.codex-links/WebIntranet/gestDelegados.aspx.vb @@ -0,0 +1,186 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Http.Headers +Imports System.Net.Security +Imports System.Threading.Tasks +Imports Newtonsoft.Json +Imports WebIntranet.Models + +Public Class gestDelegados + Inherits System.Web.UI.Page + 'Shared sessionUsuario As String + 'Shared usuariosSeleccionados As List(Of String) + 'Shared liPer As List(Of Personal) + Public liDepartamento As New List(Of String) + Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("Persona") Is Nothing Then + Response.Redirect("default.aspx", False) + Else + Dim usuario + Dim clave = Session("pass") + + If Session("LDAP") IsNot Nothing Then + usuario = Session("LDAP") + Else + usuario = Session("usuario") + End If + + + Dim RespIden As Models.ResultadoIdentificacion + Dim client = HttpClientFactory.Create() + client.BaseAddress = New Uri(UtilAntifraude.urlSwagger()) + client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Bearer", Session("token")) + Dim loginResponse = Await client.GetAsync("api/ResultadoIdentificacion/nif/" + usuario + "/Origen/WEBINTRANET").ConfigureAwait(False) + Dim responseContent = Await loginResponse.Content.ReadAsStringAsync().ConfigureAwait(False) + RespIden = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoIdentificacion)(responseContent) + + + 'Dim objetoConsulta As New Models.Identificacion + 'objetoConsulta.Nif = usuario + 'objetoConsulta.clave = clave + 'objetoConsulta.origen = "WEBINTRANET" + 'objetoConsulta.resultado = "" + + 'Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + 'Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/Identificacion" + + 'Dim clienteHTTP As New HttpClient + 'Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + 'Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + 'Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(True) + 'Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + 'Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(True) + 'Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + 'Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + + 'settings.CheckAdditionalContent = True + 'Dim objetoDatos As ResultadoIdentificacion = + ' Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoIdentificacion)(sRespuesta, settings) + + + 'ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + 'Dim url1 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/Identificacion?Nif=" & usuario & "&Clave=&Origen=GESTDELE" + 'Dim clienteHTTP1 As New Net.WebClient() + 'clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + 'Dim sRespuesta1 As String = clienteHTTP1.DownloadString(url1) + 'Dim datos As Newtonsoft.Json.Linq.JObject = + ' Newtonsoft.Json.JsonConvert.DeserializeObject(Of Newtonsoft.Json.Linq.JObject)(sRespuesta1) + ''mensajeError.InnerText = sRespuesta1 + 'Dim RespIden As Newtonsoft.Json.Linq.JObject = datos + 'Dim objetoDatos As Models.ResultadoIdentificacion = RespIden.ToObject(Of Models.ResultadoIdentificacion) + Dim liPer = RespIden.Personas + Session.Add("liPer", liPer) + Dim listPersonas = liPer + + + Dim listaDepartamentos = New List(Of String) + Dim liPer2 = liPer.Skip(1).ToList() + If Session("persona").Personas(0).Roll = "SUPERVISORDETODO" Then + liPer2 = liPer2.Where(Function(x) x.Departamento = Session("persona").Personas(0).Departamento).ToList + Else + liPer2 = liPer2.OrderBy(Function(x) x.Departamento).ThenBy(Function(x) x.Nombre).ToList + End If + Dim dep = "" + For Each item As Models.Personal In liPer2 + If dep <> item.Departamento Then + dep = item.Departamento + listaDepartamentos.Add(item.Departamento) + End If + Next + + If liDepartamento.Count > 1 Then + For Each depar As String In liDepartamento + deparSelect.Items.Add(New ListItem(depar, depar)) + Next + deparSelect.Style.Remove("display") + ElseIf Session("persona").Personas(0).Roll = "SUPERVISORDETODO" Then + For Each depar As String In listaDepartamentos + deparSelect.Items.Add(New ListItem("SUPTODO", "SUPTODO")) + Next + Else + deparSelect.Items.Add(New ListItem("0", "0")) + End If + End If + + End Sub + + Public Shared Function cargarPersonasDelegados(dep As String) + If UtilAntifraude.CheckCred() = False Then + Return "ERROR--1" + Exit Function + End If + Dim htmlPersonas = "" + Dim htmlDelegados = "" + Dim liPer As List(Of Personal) = HttpContext.Current.Session("liPer") + Dim usu As Personal = HttpContext.Current.Session("persona").Personas(0) + Dim cont = 0 + Dim personas As List(Of Personal) + If dep = "0" Then + personas = liPer.Skip(1).OrderBy(Function(x) x.Nombre).ToList + ElseIf dep = "SUPTODO" Then + personas = liPer.Skip(1).Where(Function(x) x.Departamento = usu.Departamento).ToList + Else + personas = liPer.Skip(0).Where(Function(x) x.Departamento = dep AndAlso x.Dni <> usu.Dni).ToList + End If + For Each item As Personal In personas + If (item.Roll = "DELEGADO" AndAlso (usu.Roll = "SUPERVISOR" Or usu.Roll = "SUPERVISORDETODO")) OrElse (item.Roll = "DELEGADOSUPERVISORDETODO" AndAlso usu.Roll = "SUPERVISORDETODO") Then + htmlPersonas += "

    " + item.Nombre.ToLower + "

    " + Else + htmlPersonas += "

    " + item.Nombre.ToLower + "

    " + + End If + Next + Return htmlPersonas + + End Function + + Public Shared Async Function GuardarCambiosDelegado(personas As String) As Task(Of String) + If UtilAntifraude.CheckCred() = False Then + Return "ERROR--1" + Exit Function + End If + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim listaPersonas As List(Of Personal) = HttpContext.Current.Session("liPer") + Dim ses As HttpContext = HttpContext.Current + settings.CheckAdditionalContent = True + Dim objetoConsulta As New ListaPersonasDelegadas + objetoConsulta.nifIdent = sessionUsuario + + Dim listapersonadel As List(Of PersonaDelegada) = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of List(Of PersonaDelegada))(personas, settings) + objetoConsulta.listaPersonasDel = listapersonadel + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ModificaPersonasDelegadas" + + 'Dim clienteHTTP As New HttpClient + 'Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + 'Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + 'Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + 'Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + 'Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + 'Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + + Dim objetoDatos As ResultadoModificaPersonasDelegadas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoModificaPersonasDelegadas)(sRespuesta, settings) + Dim listPer As List(Of Personal) = objetoDatos.Personas + 'HttpContext.Current.Session.Remove("liPer") + HttpContext.Current = ses + HttpContext.Current.Session.Add("liPer", listPer) + Return sRespuesta + + + End Function + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx new file mode 100644 index 0000000..d4ad738 --- /dev/null +++ b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx @@ -0,0 +1,109 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="gestionDepartamentoEmp.aspx.vb" Inherits="WebIntranet.gestionDepartamentoEmp" %> + + +
    + +
    +

    Gestion de departamento de personal

    +
    +
      +
    • / Gestion de departamento de personal
    • +
    +
    + +
    + +
    +
    +

    Persona:

    +
    +<%-- + --%> +
    +
    +

    Departamento:

    +
    +<%-- + --%> +
    + +
    + +
    + +
    + + +
    + +
    +
    + +
    +
    + + +
    diff --git a/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.designer.vb b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.designer.vb new file mode 100644 index 0000000..cc37a67 --- /dev/null +++ b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.designer.vb @@ -0,0 +1,42 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class gestionDepartamentoEmp + + ''' + '''Control DivSelPer. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents DivSelPer As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control DivSelDep. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents DivSelDep As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control mensajeResultado. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents mensajeResultado As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.vb b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.vb new file mode 100644 index 0000000..ac6073d --- /dev/null +++ b/.codex-links/WebIntranet/gestionDepartamentoEmp.aspx.vb @@ -0,0 +1,127 @@ +Imports System.Net.Http +Imports Newtonsoft.Json + +Public Class gestionDepartamentoEmp + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" OrElse Session("modo") <> "PERSONAL" Then + Response.Redirect("default.aspx") + End If + + Dim persons As List(Of Models.Personal) = Session("persona").Personas + Dim listaPersonas As New List(Of Models.Personal) + Dim listDni = Session("usuariosSeleccionados") + For Each pers As String In listDni + Dim per = persons.FirstOrDefault(Function(x) x.Dni = pers) + listaPersonas.Add(per) + Next + + Dim htmlSelPer = "" + htmlSelPer += "" + DivSelPer.InnerHtml = htmlSelPer + 'cbPersonas.DataSource = listaPersonas.OrderBy(Function(x) x.Nombre) + 'cbPersonas.DataBind() + + + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenerDepartamentos" + + Dim credenciales3 As New Net.CredentialCache() + credenciales3.Add(New Uri(url3), "Basic", New Net.NetworkCredential(usuario, contraseña)) + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + + Dim liDep As List(Of Models.EnumDepartamento) = + deserializador3.Deserialize(Of List(Of Models.EnumDepartamento))(respuesta3) + + Dim htmlSelDep = "" + htmlSelDep += "" + DivSelDep.InnerHtml = htmlSelDep + 'selDep.DataSource = liDep + 'selDep.DataBind() + + End Sub + + + + Public Shared Function getDep(usu As String) As String + If UtilAntifraude.CheckCred() = False Then + Return "ERROR--1" + Exit Function + End If + Dim usuarios As List(Of Models.Personal) = HttpContext.Current.Session("liPer") + Dim us = usuarios.FirstOrDefault(Function(x) x.idPersona = CInt(usu)) + + Dim usuario As String = "tecnosis" + Dim contraseña As String = "patata2022" + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenerDepartamentos" + + Dim credenciales3 As New Net.CredentialCache() + credenciales3.Add(New Uri(url3), "Basic", New Net.NetworkCredential(usuario, contraseña)) + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + deserializador3.MaxJsonLength = Integer.MaxValue + + Dim liDep As List(Of Models.EnumDepartamento) = + deserializador3.Deserialize(Of List(Of Models.EnumDepartamento))(respuesta3) + + Dim idDepSel = liDep.FirstOrDefault(Function(x) x.Descripcion = us.Departamento).idDep + + Return idDepSel + + + End Function + + + + Public Shared Async Function CambiarDep(usu As String, dep As String) As Threading.Tasks.Task(Of String) + Dim usuario = usu + Dim departamento = dep + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + Dim ses As HttpContext = HttpContext.Current + Dim consulta As New CambiarDep + consulta.usuario = usuario + consulta.departamento = departamento + Dim jsonConsulta As String = JsonConvert.SerializeObject(consulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/CambiarDepartamento" + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Dim objetoDatos As Models.ResultadoModificaPersonasDelegadas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoModificaPersonasDelegadas)(sRespuesta, settings) + Dim listPer As List(Of Models.Personal) = objetoDatos.Personas + 'HttpContext.Current.Session.Remove("liPer") + HttpContext.Current = ses + HttpContext.Current.Session.Add("liPer", listPer) + Return sRespuesta + Return sRespuesta + + End Function + + 'Private Sub cbPersonas_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbPersonas.SelectedIndexChanged + ' Dim personas As List(Of Models.Persona) = Session("persona").Personas + ' Dim persona = personas.First(Function(x) x.DNI = cbPersonas.Value) + 'End Sub +End Class +Public Class CambiarDep + Public Property usuario As Integer + Public Property departamento As Integer +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/gestionTeletrabajo.aspx b/.codex-links/WebIntranet/gestionTeletrabajo.aspx new file mode 100644 index 0000000..cf6bee5 --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajo.aspx @@ -0,0 +1,600 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="gestionTeletrabajo.aspx.vb" Inherits="WebIntranet.gestionTeletrabajo" %> + + +
    + + + + +
    +
    +
    +
    + +
    + +
    + +
    + +

    AGENDA

    + +
    + +
    + +
    + + + + + + + +

    + + + + + + + +
    + +
    + +
    + +
    + +
    Lunes
    + +
    Martes
    + +
    Miercoles
    + +
    Jueves
    + +
    Viernes
    + +
    Sábado
    + +
    Domingo
    + +
    +
    +
    +
    +

    1 DÍA

    +
    +
    +
    +

    2 DÍAS

    +
    +
    +
    +

    3 DÍAS

    +
    +
    +
    +

    EXCEPCIÓN

    +
    +
    +
    + <%--
    --%> +
    +
    +
    +
    + + +
    diff --git a/.codex-links/WebIntranet/gestionTeletrabajo.aspx.designer.vb b/.codex-links/WebIntranet/gestionTeletrabajo.aspx.designer.vb new file mode 100644 index 0000000..caedde8 --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajo.aspx.designer.vb @@ -0,0 +1,15 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class gestionTeletrabajo +End Class diff --git a/.codex-links/WebIntranet/gestionTeletrabajo.aspx.vb b/.codex-links/WebIntranet/gestionTeletrabajo.aspx.vb new file mode 100644 index 0000000..3b1bc9c --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajo.aspx.vb @@ -0,0 +1,196 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports System.Threading.Tasks +Imports DevExpress.XtraPrinting.Native +Imports Newtonsoft.Json +Imports WebIntranet.Models + +Public Class gestionTeletrabajo + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + If Session("modo") = "PERSONAL" AndAlso Session("persona").Personas(0).Roll = "SUPERVISORDETODO" Then + Else + Response.Redirect("default.aspx") + End If + + End Sub + + Public Shared Async Function comprobarFiestas(fechaInicio As String, fechaFinal As String) As Task(Of String) + + Dim fechaInicial As Date = DateTime.Parse(fechaInicio) + + Dim fcFinal As Date = DateTime.Parse(fechaFinal) + + + Dim fechaInicioFormato = fechaInicial.Year.ToString + "-" + fechaInicial.Month.ToString.PadLeft(2, "0") + "-" + fechaInicial.Day.ToString.PadLeft(2, "0") + "T00:00:00.000Z" + Dim fechaFinalFormato = fcFinal.Year.ToString + "-" + fcFinal.Month.ToString.PadLeft(2, "0") + "-" + fcFinal.Day.ToString.PadLeft(2, "0") + "T00:00:00.000Z" + Dim objetoconsulta As New FechaIniFin + objetoconsulta.fechaInicio = fechaInicioFormato + objetoconsulta.fechaFin = fechaFinalFormato + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoconsulta) + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/FiestasEntreFechas" + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + Return sRespuesta + + End Function + + Public Shared Async Function cargarListaTeletrabajo(fechaInicio As String) As Task(Of String) + '', fechaFinal As String + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + Dim nif = "" + Dim expediente = "" + Dim us As New List(Of String) + 'If usuariosSeleccionados IsNot Nothing Then + ' For Each per As String In usuariosSeleccionados + ' us.Add(per) + ' Next + 'Else + us.Add(sessionUsuario) + 'End If + + 'Dim fcIn As Date = DateTime.Parse(fechaInicio) + Dim fcIn As Date = Now + fcIn = New Date((fcIn.Year - 5).ToString, fcIn.Month.ToString, 1.ToString) + + 'Dim fcFn As Date = fcIn.AddMonths(1).AddDays(-1) ' DateTime.Parse(fechaFinal) + Dim fcFn As Date = fcIn.AddYears(5) + Dim fechaIni = fcIn.Month.ToString.PadLeft(2, "0") + "%2F01%2F" + fcIn.Year.ToString + Dim fechaEnd = fcFn.Month.ToString.PadLeft(2, "0") + "%2F" + fcFn.Day.ToString.PadLeft(2, "0") + "%2F" + fcFn.Year.ToString + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim objetoConsulta As New Models.Consulta + objetoConsulta.fechaInicio = fcIn + objetoConsulta.fechaFin = fcFn + objetoConsulta.listaNif = us + + + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/listTeletrabajoEntreFechas" + + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.ResultadoListTeletrabajoEntreFechas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoListTeletrabajoEntreFechas)(sRespuesta, settings) + Return sRespuesta + + End Function + + Public Shared Async Function cargarTeletrabajo(idTele As String) As Task(Of String) + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenerTeletrabajo?id=" + idTele + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Return respuesta3 + + End Function + + Public Shared Async Function ModTele(id As Integer, excepcion As Boolean, nuDias As Integer, lunes As Boolean, martes As Boolean, miercoles As Boolean, jueves As Boolean, viernes As Boolean, motivo As String, Fei As Date, Fef As Date) As Task(Of String) + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim objetoConsulta As New Models.TramosTeletrabajo + objetoConsulta.id = id + objetoConsulta.excepcion = excepcion + objetoConsulta.nuDias = nuDias + objetoConsulta.lunes = lunes + objetoConsulta.martes = martes + objetoConsulta.miercoles = miercoles + objetoConsulta.jueves = jueves + objetoConsulta.viernes = viernes + objetoConsulta.motivo = motivo + objetoConsulta.Fei = Fei + objetoConsulta.Fef = Fef + + + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/CrearModificarTeletrabajo" + + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.resultadoEditarPicadasAnuladas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.resultadoEditarPicadasAnuladas)(sRespuesta, settings) + Return sRespuesta + + End Function + + Public Shared Async Function DelTele(id As Integer) As Task(Of String) + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim objetoConsulta As New Models.TramosTeletrabajo + objetoConsulta.id = id + objetoConsulta.excepcion = False + objetoConsulta.nuDias = 0 + objetoConsulta.lunes = False + objetoConsulta.martes = False + objetoConsulta.miercoles = False + objetoConsulta.jueves = False + objetoConsulta.viernes = False + objetoConsulta.motivo = "" + objetoConsulta.Fei = Nothing + objetoConsulta.Fef = Nothing + + + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EliminarTeletrabajo" + + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.resultadoEditarPicadasAnuladas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.resultadoEditarPicadasAnuladas)(sRespuesta, settings) + Return sRespuesta + End Function + +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx new file mode 100644 index 0000000..c371cca --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx @@ -0,0 +1,290 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="gestionTeletrabajoPers.aspx.vb" Inherits="WebIntranet.gestionTeletrabajoPers" %> + + + + +
    +
    +
    +

    Introducir picada a personal

    +
    +
      +
    • / Control Horario
    • +
    • / Introducir picada a personal
    • +
    +
    + +
    + +
    + <%--
    +

    Persona:

    + + +
    --%> +
    + + <%----%> +
    + +
    + +
    +

    Mostrar teletrabajo ya disfrutado

    +
    +
    + <%--
    +
    --%> + + +
    +
    + +
    +

    +
    +
    + +
    +
    +
    + + +
    diff --git a/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.designer.vb b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.designer.vb new file mode 100644 index 0000000..e150262 --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.designer.vb @@ -0,0 +1,33 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class gestionTeletrabajoPers + + ''' + '''Control selPersonasDiv. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents selPersonasDiv As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control selPerDiv. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents selPerDiv As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.vb b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.vb new file mode 100644 index 0000000..bde4db5 --- /dev/null +++ b/.codex-links/WebIntranet/gestionTeletrabajoPers.aspx.vb @@ -0,0 +1,132 @@ +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports System.Threading.Tasks +Imports Newtonsoft.Json + +Public Class gestionTeletrabajoPers + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + If Session("modo") = "PERSONAL" AndAlso Session("persona").Personas(0).Roll = "SUPERVISORDETODO" Then + + Dim persons As List(Of Models.Personal) = Session("persona").Personas + Dim listaPersonas As New List(Of Models.Personal) + Dim listDni = Session("usuariosSeleccionados") + For Each pers As String In listDni + Dim per = persons.FirstOrDefault(Function(x) x.Dni = pers) + listaPersonas.Add(per) + Next + Dim usuario = Session("persona").Personas(0) + listaPersonas.Add(usuario) + listaPersonas = listaPersonas.OrderBy(Function(x) x.Nombre).ToList + Dim html = "" + html += "" + selPerDiv.InnerHtml = html + + 'cbPersonas.DataSource = listaPersonas.OrderBy(Function(x) x.Nombre) + 'cbPersonas.DataBind() + Else + Response.Redirect("default.aspx") + End If + + End Sub + + Public Shared Async Function AnadirEditarTT(idTT As String, Fei As String, Fef As String, motivo As String, idPers As String) As Task(Of String) + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim clienteHTTP1 As New Net.WebClient() + clienteHTTP1.Encoding = System.Text.Encoding.UTF8 + + Dim persons As List(Of Models.Personal) = HttpContext.Current.Session("persona").Personas + Dim idp = idPers ' persons.FirstOrDefault(Function(x) x.Dni = idPers).idPersona + If idp <> Nothing Then + Dim objetoConsulta As New Models.TramoTeletrabajoExcepcion + objetoConsulta.fechaInicio = New Date(Convert.ToInt64(Fei)) + objetoConsulta.fechaFin = New Date(Convert.ToInt64(Fef)) + objetoConsulta.idExcepTel = CInt(idTT) + objetoConsulta.idPersona = idp + objetoConsulta.motivo = motivo + + + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/AnadirEditarExcepcionTT" + + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.resultadoEditarPicadasAnuladas = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.resultadoEditarPicadasAnuladas)(sRespuesta, settings) + Return sRespuesta + Else + Dim result = New Models.resultadoEditarPicadasAnuladas With { + .resultado = 1, + .mensaje = "La persona a la que corresponde esta excepción no es accesible en este momento" + } + Dim JsonResult = Newtonsoft.Json.JsonConvert.SerializeObject(result) + Return JsonResult + End If + End Function + + Public Shared Async Function ObtTT(idPer As String, todas As Boolean) As Task(Of String) + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/listaExcepciones?id=" + idPer + "&todas=" + todas.ToString() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Return respuesta3 + End Function + + Public Shared Async Function EliminarTT(idTT As Integer) As Task(Of String) + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/EliminarExcepcion?id=" + idTT.ToString() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Return respuesta3 + End Function + + Public Shared Async Function TTbyId(idTT As Integer, idPer As String) As Task(Of String) + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/listaExcepciones?id=" + idPer + "&todas=true" + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.ResultadoListadoExcepciones = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoListadoExcepciones)(respuesta3, settings) + Dim TT = objetoDatos.listado.FirstOrDefault(Function(x) x.idExcepTel = idTT) + If TT IsNot Nothing Then + Dim listaTT = New List(Of Models.TramoTeletrabajoExcepcion) + listaTT.Add(TT) + Dim resultado = New Models.ResultadoListadoExcepciones With { + .listado = listaTT, + .resultado = 0, + .mensaje = "" + } + Return JsonConvert.SerializeObject(resultado) + Else + Dim resultado = New Models.ResultadoListadoExcepciones With { + .resultado = 1, + .mensaje = "No existe esta excepción" + } + Return JsonConvert.SerializeObject(resultado) + End If + Return respuesta3 + End Function +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/home.aspx b/.codex-links/WebIntranet/home.aspx new file mode 100644 index 0000000..1afa27d --- /dev/null +++ b/.codex-links/WebIntranet/home.aspx @@ -0,0 +1,20 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="home.aspx.vb" Inherits="WebIntranet.home" %> + +
    +
    + <%----%> +
    + + +
    + +
    diff --git a/.codex-links/WebIntranet/home.aspx.designer.vb b/.codex-links/WebIntranet/home.aspx.designer.vb new file mode 100644 index 0000000..c1dbb7e --- /dev/null +++ b/.codex-links/WebIntranet/home.aspx.designer.vb @@ -0,0 +1,60 @@ +'------------------------------------------------------------------------------ +' +' Este código fue generado por una herramienta. +' +' Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si +' se vuelve a generar el código. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Partial Public Class home + + ''' + '''Control divCH. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divCH As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control btnControlHorario. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents btnControlHorario As Global.System.Web.UI.HtmlControls.HtmlAnchor + + ''' + '''Control divSol. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divSol As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control divNom. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divNom As Global.System.Web.UI.HtmlControls.HtmlGenericControl + + ''' + '''Control divDP. + ''' + ''' + '''Campo generado automáticamente. + '''Para modificarlo, mueva la declaración del campo del archivo del diseñador al archivo de código subyacente. + ''' + Protected WithEvents divDP As Global.System.Web.UI.HtmlControls.HtmlGenericControl +End Class diff --git a/.codex-links/WebIntranet/home.aspx.vb b/.codex-links/WebIntranet/home.aspx.vb new file mode 100644 index 0000000..41d4b25 --- /dev/null +++ b/.codex-links/WebIntranet/home.aspx.vb @@ -0,0 +1,125 @@ +Imports Newtonsoft.Json +Imports System.Net +Imports System.Net.Http +Imports System.Net.Security +Imports System.Threading.Tasks +Imports WebIntranet.Models + +Public Class home + Inherits System.Web.UI.Page + + Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load + If Session("usuario") = "" Then + Response.Redirect("default.aspx") + End If + If Session("modo") = "PERSONAL" Then + divDP.Visible = False + divNom.Visible = False + divSol.Visible = False + btnControlHorario.Attributes.Add("href", "/listPicadas.aspx") + Else + btnControlHorario.Attributes.Add("href", "/intPicada.aspx") + End If + If Session("RET") = "RET" AndAlso Session("modo") = "PROPIO" Then + btnControlHorario.Visible = False + divSol.Visible = False + + End If + End Sub + + Public Shared Async Function ObtenerAcredDatos() As Task(Of String) + Try + Dim sessionUsuario As String = HttpContext.Current.Session("usuario") + 'Dim bd = New ODataService4.ODataService4Service(New Uri(UtilWebIntranet.UrlWebService)) + 'Dim persona = bd.parlamentoDB_PERSONAS.Where(Function(x) x.NIF = sessionUsuario).ToList.First + Dim ObjetoConsulta As New NifPersona + ObjetoConsulta.Nif = sessionUsuario + Dim persona = HttpContext.Current.Session("persona").personas(0) + + 'ObjetoConsulta.texto1 = "2" + Dim jsonConsulta As String = JsonConvert.SerializeObject(ObjetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/ObtenerHAD" + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As ResultadoObtenerHAD = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of ResultadoObtenerHAD)(sRespuesta, settings) + Dim resultado As Byte() = System.Convert.FromBase64String(objetoDatos.HAD) + Dim archivo = Convert.ToBase64String(resultado) + Dim Nombre = "HojaAcreditaciones_" + persona.Nombre.replace(",", "").replace(" ", "-") + ".pdf" + Dim respuesta = "{""archivo"":""" + archivo + """,""nombre"":""" + Nombre + """}" + 'Return respuesta + Return respuesta + Catch ex As Exception + 'If UtilWebIntranet.CheckCred() = False Then + ' Return "ERROR--1" + ' Exit Function + 'End If + End Try + + End Function + + Public Shared Async Function ObtenerConsolidacionGrado() As Task(Of String) + Try + + + ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(Function() True) + Dim sessionUsuario = HttpContext.Current.Session("usuario") + '// Aquí preparamos el objeto para la consulta. + Dim objetoConsulta As New Models.NifPersona + + objetoConsulta.Nif = sessionUsuario 'New List(Of String) + + '// Aquí convertimos el objeto en una cadena JSON. + Dim jsonConsulta As String = JsonConvert.SerializeObject(objetoConsulta) + Dim url As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/SolicitudConsolidacionGrado" + + Dim clienteHTTP As New HttpClient + Dim contenidoConsultaHTTP As New StringContent(jsonConsulta, Encoding.UTF8, "application/json") + Debug.WriteLine("CargarListadodePicadasAsync:1===" + Now.ToLongTimeString) + Dim respuestaHTTP As HttpResponseMessage = Await clienteHTTP.PostAsync(url, contenidoConsultaHTTP).ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:2===" + Now.ToLongTimeString) + Dim sRespuesta As String = Await respuestaHTTP.Content.ReadAsStringAsync().ConfigureAwait(False) + Debug.WriteLine("CargarListadodePicadasAsync:3===" + Now.ToLongTimeString) + '// danmun: Aquí SÍ hay que poner `.ConfigureAwait(False)` al final de las llamadas a métodos Async() + '// para que el control de ejecución vuelva a este hilo. + + ''// Deserializar a una clase. + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim objetoDatos As Models.ResultadoSolicitudConsolidacionGrado = + Newtonsoft.Json.JsonConvert.DeserializeObject(Of Models.ResultadoSolicitudConsolidacionGrado)(sRespuesta, settings) + + Debug.WriteLine("Resultado: " & objetoDatos.Resultado) + Return sRespuesta + Catch ex As Exception + + End Try + End Function + + + Public Shared Async Function SituacionEmpleados() As Task(Of String) + Dim url3 As String = ConfigurationManager.AppSettings("RutaRes").ToString + "/api/SituacionPersonal" + Dim credenciales3 As New Net.CredentialCache() + Dim clienteHTTP3 As New Net.WebClient() + clienteHTTP3.Encoding = System.Text.Encoding.UTF8 + clienteHTTP3.Credentials = credenciales3 + Dim respuesta3 As String = clienteHTTP3.DownloadString(url3) + Dim deserializador3 As New System.Web.Script.Serialization.JavaScriptSerializer() + Dim settings As New Newtonsoft.Json.JsonSerializerSettings() + settings.CheckAdditionalContent = True + Dim Datos As List(Of Models.SituacionPersonalOficina) = + deserializador3.Deserialize(Of List(Of Models.SituacionPersonalOficina))(respuesta3) + + Return respuesta3 + + + End Function +End Class \ No newline at end of file diff --git a/.codex-links/WebIntranet/intIncidencia.aspx b/.codex-links/WebIntranet/intIncidencia.aspx new file mode 100644 index 0000000..caa01db --- /dev/null +++ b/.codex-links/WebIntranet/intIncidencia.aspx @@ -0,0 +1,169 @@ +<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.master" CodeBehind="intIncidencia.aspx.vb" Inherits="WebIntranet.intIncidencia" %> + + +
    +
    +
    +
    +

    +
    +
    +

    Fecha*

    +
    +
    +
    + Inicio +
    + +
    + +
    +
    + Final +
    + +
    + +
    +
    +
    +
    +
    +
    +
    +

    Incidencia*:

    + + <%----%> +
    +
    +
    +
    +
    +
    +

    Horario mañana

    +
    +
    +
    + Inicio +
    + +
    + +
    +
    + Final +
    + +
    + +
    +
    + Total +
    + +
    + +
    + +
    +
    +
    +
    +
    +

    Horario tarde

    +
    +
    +
    + Inicio +
    + +
    +
    +
    + Final +
    + +
    +
    +
    + Total +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +

    Observaciones

    + ",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 element. This information allows you to progressively enhance - * your pages with a granular level of control over the experience. - * - * Modernizr has an optional (not included) conditional resource loader - * called Modernizr.load(), based on Yepnope.js (yepnopejs.com). - * To get a build that includes Modernizr.load(), as well as choosing - * which tests to include, go to www.modernizr.com/download/ - * - * Authors Faruk Ates, Paul Irish, Alex Sexton - * Contributors Ryan Seddon, Ben Alman - */ - -window.Modernizr = (function( window, document, undefined ) { - - var version = '2.8.3', - - Modernizr = {}, - - /*>>cssclasses*/ - // option for enabling the HTML classes to be added - enableClasses = true, - /*>>cssclasses*/ - - docElement = document.documentElement, - - /** - * Create our "modernizr" element that we do most feature tests on. - */ - mod = 'modernizr', - modElem = document.createElement(mod), - mStyle = modElem.style, - - /** - * Create the input element for various Web Forms feature tests. - */ - inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ , - - /*>>smile*/ - smile = ':)', - /*>>smile*/ - - toString = {}.toString, - - // TODO :: make the prefixes more granular - /*>>prefixes*/ - // List of property values to set for css tests. See ticket #21 - prefixes = ' -webkit- -moz- -o- -ms- '.split(' '), - /*>>prefixes*/ - - /*>>domprefixes*/ - // Following spec is to expose vendor-specific style properties as: - // elem.style.WebkitBorderRadius - // and the following would be incorrect: - // elem.style.webkitBorderRadius - - // Webkit ghosts their properties in lowercase but Opera & Moz do not. - // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+ - // erik.eae.net/archives/2008/03/10/21.48.10/ - - // More here: github.com/Modernizr/Modernizr/issues/issue/21 - omPrefixes = 'Webkit Moz O ms', - - cssomPrefixes = omPrefixes.split(' '), - - domPrefixes = omPrefixes.toLowerCase().split(' '), - /*>>domprefixes*/ - - /*>>ns*/ - ns = {'svg': 'http://www.w3.org/2000/svg'}, - /*>>ns*/ - - tests = {}, - inputs = {}, - attrs = {}, - - classes = [], - - slice = classes.slice, - - featureName, // used in testing loop - - - /*>>teststyles*/ - // Inject element with style element and some CSS rules - injectElementWithStyles = function( rule, callback, nodes, testnames ) { - - var style, ret, node, docOverflow, - div = document.createElement('div'), - // After page load injecting a fake body doesn't work so check if body exists - body = document.body, - // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it. - fakeBody = body || document.createElement('body'); - - if ( parseInt(nodes, 10) ) { - // In order not to give false positives we create a node for each test - // This also allows the method to scale for unspecified uses - while ( nodes-- ) { - node = document.createElement('div'); - node.id = testnames ? testnames[nodes] : mod + (nodes + 1); - div.appendChild(node); - } - } - - // '].join(''); - div.id = mod; - // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. - // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 - (body ? div : fakeBody).innerHTML += style; - fakeBody.appendChild(div); - if ( !body ) { - //avoid crashing IE8, if background image is used - fakeBody.style.background = ''; - //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible - fakeBody.style.overflow = 'hidden'; - docOverflow = docElement.style.overflow; - docElement.style.overflow = 'hidden'; - docElement.appendChild(fakeBody); - } - - ret = callback(div, rule); - // If this is done after page load we don't want to remove the body so check if body exists - if ( !body ) { - fakeBody.parentNode.removeChild(fakeBody); - docElement.style.overflow = docOverflow; - } else { - div.parentNode.removeChild(div); - } - - return !!ret; - - }, - /*>>teststyles*/ - - /*>>mq*/ - // adapted from matchMedia polyfill - // by Scott Jehl and Paul Irish - // gist.github.com/786768 - testMediaQuery = function( mq ) { - - var matchMedia = window.matchMedia || window.msMatchMedia; - if ( matchMedia ) { - return matchMedia(mq) && matchMedia(mq).matches || false; - } - - var bool; - - injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) { - bool = (window.getComputedStyle ? - getComputedStyle(node, null) : - node.currentStyle)['position'] == 'absolute'; - }); - - return bool; - - }, - /*>>mq*/ - - - /*>>hasevent*/ - // - // isEventSupported determines if a given element supports the given event - // kangax.github.com/iseventsupported/ - // - // The following results are known incorrects: - // Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative - // Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333 - // ... - isEventSupported = (function() { - - var TAGNAMES = { - 'select': 'input', 'change': 'input', - 'submit': 'form', 'reset': 'form', - 'error': 'img', 'load': 'img', 'abort': 'img' - }; - - function isEventSupported( eventName, element ) { - - element = element || document.createElement(TAGNAMES[eventName] || 'div'); - eventName = 'on' + eventName; - - // When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those - var isSupported = eventName in element; - - if ( !isSupported ) { - // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element - if ( !element.setAttribute ) { - element = document.createElement('div'); - } - if ( element.setAttribute && element.removeAttribute ) { - element.setAttribute(eventName, ''); - isSupported = is(element[eventName], 'function'); - - // If property was created, "remove it" (by setting value to `undefined`) - if ( !is(element[eventName], 'undefined') ) { - element[eventName] = undefined; - } - element.removeAttribute(eventName); - } - } - - element = null; - return isSupported; - } - return isEventSupported; - })(), - /*>>hasevent*/ - - // TODO :: Add flag for hasownprop ? didn't last time - - // hasOwnProperty shim by kangax needed for Safari 2.0 support - _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp; - - if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) { - hasOwnProp = function (object, property) { - return _hasOwnProperty.call(object, property); - }; - } - else { - hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */ - return ((property in object) && is(object.constructor.prototype[property], 'undefined')); - }; - } - - // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js - // es5.github.com/#x15.3.4.5 - - if (!Function.prototype.bind) { - Function.prototype.bind = function bind(that) { - - var target = this; - - if (typeof target != "function") { - throw new TypeError(); - } - - var args = slice.call(arguments, 1), - bound = function () { - - if (this instanceof bound) { - - var F = function(){}; - F.prototype = target.prototype; - var self = new F(); - - var result = target.apply( - self, - args.concat(slice.call(arguments)) - ); - if (Object(result) === result) { - return result; - } - return self; - - } else { - - return target.apply( - that, - args.concat(slice.call(arguments)) - ); - - } - - }; - - return bound; - }; - } - - /** - * setCss applies given styles to the Modernizr DOM node. - */ - function setCss( str ) { - mStyle.cssText = str; - } - - /** - * setCssAll extrapolates all vendor-specific css strings. - */ - function setCssAll( str1, str2 ) { - return setCss(prefixes.join(str1 + ';') + ( str2 || '' )); - } - - /** - * is returns a boolean for if typeof obj is exactly type. - */ - function is( obj, type ) { - return typeof obj === type; - } - - /** - * contains returns a boolean for if substr is found within str. - */ - function contains( str, substr ) { - return !!~('' + str).indexOf(substr); - } - - /*>>testprop*/ - - // testProps is a generic CSS / DOM property test. - - // In testing support for a given CSS property, it's legit to test: - // `elem.style[styleName] !== undefined` - // If the property is supported it will return an empty string, - // if unsupported it will return undefined. - - // We'll take advantage of this quick test and skip setting a style - // on our modernizr element, but instead just testing undefined vs - // empty string. - - // Because the testing of the CSS property names (with "-", as - // opposed to the camelCase DOM properties) is non-portable and - // non-standard but works in WebKit and IE (but not Gecko or Opera), - // we explicitly reject properties with dashes so that authors - // developing in WebKit or IE first don't end up with - // browser-specific content by accident. - - function testProps( props, prefixed ) { - for ( var i in props ) { - var prop = props[i]; - if ( !contains(prop, "-") && mStyle[prop] !== undefined ) { - return prefixed == 'pfx' ? prop : true; - } - } - return false; - } - /*>>testprop*/ - - // TODO :: add testDOMProps - /** - * testDOMProps is a generic DOM property test; if a browser supports - * a certain property, it won't return undefined for it. - */ - function testDOMProps( props, obj, elem ) { - for ( var i in props ) { - var item = obj[props[i]]; - if ( item !== undefined) { - - // return the property name as a string - if (elem === false) return props[i]; - - // let's bind a function - if (is(item, 'function')){ - // default to autobind unless override - return item.bind(elem || obj); - } - - // return the unbound function or obj or value - return item; - } - } - return false; - } - - /*>>testallprops*/ - /** - * testPropsAll tests a list of DOM properties we want to check against. - * We specify literally ALL possible (known and/or likely) properties on - * the element including the non-vendor prefixed one, for forward- - * compatibility. - */ - function testPropsAll( prop, prefixed, elem ) { - - var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1), - props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' '); - - // did they call .prefixed('boxSizing') or are we just testing a prop? - if(is(prefixed, "string") || is(prefixed, "undefined")) { - return testProps(props, prefixed); - - // otherwise, they called .prefixed('requestAnimationFrame', window[, elem]) - } else { - props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' '); - return testDOMProps(props, prefixed, elem); - } - } - /*>>testallprops*/ - - - /** - * Tests - * ----- - */ - - // The *new* flexbox - // dev.w3.org/csswg/css3-flexbox - - tests['flexbox'] = function() { - return testPropsAll('flexWrap'); - }; - - // The *old* flexbox - // www.w3.org/TR/2009/WD-css3-flexbox-20090723/ - - tests['flexboxlegacy'] = function() { - return testPropsAll('boxDirection'); - }; - - // On the S60 and BB Storm, getContext exists, but always returns undefined - // so we actually have to call getContext() to verify - // github.com/Modernizr/Modernizr/issues/issue/97/ - - tests['canvas'] = function() { - var elem = document.createElement('canvas'); - return !!(elem.getContext && elem.getContext('2d')); - }; - - tests['canvastext'] = function() { - return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function')); - }; - - // webk.it/70117 is tracking a legit WebGL feature detect proposal - - // We do a soft detect which may false positive in order to avoid - // an expensive context creation: bugzil.la/732441 - - tests['webgl'] = function() { - return !!window.WebGLRenderingContext; - }; - - /* - * The Modernizr.touch test only indicates if the browser supports - * touch events, which does not necessarily reflect a touchscreen - * device, as evidenced by tablets running Windows 7 or, alas, - * the Palm Pre / WebOS (touch) phones. - * - * Additionally, Chrome (desktop) used to lie about its support on this, - * but that has since been rectified: crbug.com/36415 - * - * We also test for Firefox 4 Multitouch Support. - * - * For more info, see: modernizr.github.com/Modernizr/touch.html - */ - - tests['touch'] = function() { - var bool; - - if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { - bool = true; - } else { - injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) { - bool = node.offsetTop === 9; - }); - } - - return bool; - }; - - - // geolocation is often considered a trivial feature detect... - // Turns out, it's quite tricky to get right: - // - // Using !!navigator.geolocation does two things we don't want. It: - // 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513 - // 2. Disables page caching in WebKit: webk.it/43956 - // - // Meanwhile, in Firefox < 8, an about:config setting could expose - // a false positive that would throw an exception: bugzil.la/688158 - - tests['geolocation'] = function() { - return 'geolocation' in navigator; - }; - - - tests['postmessage'] = function() { - return !!window.postMessage; - }; - - - // Chrome incognito mode used to throw an exception when using openDatabase - // It doesn't anymore. - tests['websqldatabase'] = function() { - return !!window.openDatabase; - }; - - // Vendors had inconsistent prefixing with the experimental Indexed DB: - // - Webkit's implementation is accessible through webkitIndexedDB - // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB - // For speed, we don't test the legacy (and beta-only) indexedDB - tests['indexedDB'] = function() { - return !!testPropsAll("indexedDB", window); - }; - - // documentMode logic from YUI to filter out IE8 Compat Mode - // which false positives. - tests['hashchange'] = function() { - return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7); - }; - - // Per 1.6: - // This used to be Modernizr.historymanagement but the longer - // name has been deprecated in favor of a shorter and property-matching one. - // The old API is still available in 1.6, but as of 2.0 will throw a warning, - // and in the first release thereafter disappear entirely. - tests['history'] = function() { - return !!(window.history && history.pushState); - }; - - tests['draganddrop'] = function() { - var div = document.createElement('div'); - return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div); - }; - - // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10 - // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17. - // FF10 still uses prefixes, so check for it until then. - // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/ - tests['websockets'] = function() { - return 'WebSocket' in window || 'MozWebSocket' in window; - }; - - - // css-tricks.com/rgba-browser-support/ - tests['rgba'] = function() { - // Set an rgba() color and check the returned value - - setCss('background-color:rgba(150,255,150,.5)'); - - return contains(mStyle.backgroundColor, 'rgba'); - }; - - tests['hsla'] = function() { - // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally, - // except IE9 who retains it as hsla - - setCss('background-color:hsla(120,40%,100%,.5)'); - - return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla'); - }; - - tests['multiplebgs'] = function() { - // Setting multiple images AND a color on the background shorthand property - // and then querying the style.background property value for the number of - // occurrences of "url(" is a reliable method for detecting ACTUAL support for this! - - setCss('background:url(https://),url(https://),red url(https://)'); - - // If the UA supports multiple backgrounds, there should be three occurrences - // of the string "url(" in the return value for elemStyle.background - - return (/(url\s*\(.*?){3}/).test(mStyle.background); - }; - - - - // this will false positive in Opera Mini - // github.com/Modernizr/Modernizr/issues/396 - - tests['backgroundsize'] = function() { - return testPropsAll('backgroundSize'); - }; - - tests['borderimage'] = function() { - return testPropsAll('borderImage'); - }; - - - // Super comprehensive table about all the unique implementations of - // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance - - tests['borderradius'] = function() { - return testPropsAll('borderRadius'); - }; - - // WebOS unfortunately false positives on this test. - tests['boxshadow'] = function() { - return testPropsAll('boxShadow'); - }; - - // FF3.0 will false positive on this test - tests['textshadow'] = function() { - return document.createElement('div').style.textShadow === ''; - }; - - - tests['opacity'] = function() { - // Browsers that actually have CSS Opacity implemented have done so - // according to spec, which means their return values are within the - // range of [0.0,1.0] - including the leading zero. - - setCssAll('opacity:.55'); - - // The non-literal . in this regex is intentional: - // German Chrome returns this value as 0,55 - // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632 - return (/^0.55$/).test(mStyle.opacity); - }; - - - // Note, Android < 4 will pass this test, but can only animate - // a single property at a time - // goo.gl/v3V4Gp - tests['cssanimations'] = function() { - return testPropsAll('animationName'); - }; - - - tests['csscolumns'] = function() { - return testPropsAll('columnCount'); - }; - - - tests['cssgradients'] = function() { - /** - * For CSS Gradients syntax, please see: - * webkit.org/blog/175/introducing-css-gradients/ - * developer.mozilla.org/en/CSS/-moz-linear-gradient - * developer.mozilla.org/en/CSS/-moz-radial-gradient - * dev.w3.org/csswg/css3-images/#gradients- - */ - - var str1 = 'background-image:', - str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));', - str3 = 'linear-gradient(left top,#9f9, white);'; - - setCss( - // legacy webkit syntax (FIXME: remove when syntax not in use anymore) - (str1 + '-webkit- '.split(' ').join(str2 + str1) + - // standard syntax // trailing 'background-image:' - prefixes.join(str3 + str1)).slice(0, -str1.length) - ); - - return contains(mStyle.backgroundImage, 'gradient'); - }; - - - tests['cssreflections'] = function() { - return testPropsAll('boxReflect'); - }; - - - tests['csstransforms'] = function() { - return !!testPropsAll('transform'); - }; - - - tests['csstransforms3d'] = function() { - - var ret = !!testPropsAll('perspective'); - - // Webkit's 3D transforms are passed off to the browser's own graphics renderer. - // It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in - // some conditions. As a result, Webkit typically recognizes the syntax but - // will sometimes throw a false positive, thus we must do a more thorough check: - if ( ret && 'webkitPerspective' in docElement.style ) { - - // Webkit allows this media query to succeed only if the feature is enabled. - // `@media (transform-3d),(-webkit-transform-3d){ ... }` - injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) { - ret = node.offsetLeft === 9 && node.offsetHeight === 3; - }); - } - return ret; - }; - - - tests['csstransitions'] = function() { - return testPropsAll('transition'); - }; - - - /*>>fontface*/ - // @font-face detection routine by Diego Perini - // javascript.nwbox.com/CSSSupport/ - - // false positives: - // WebOS github.com/Modernizr/Modernizr/issues/342 - // WP7 github.com/Modernizr/Modernizr/issues/538 - tests['fontface'] = function() { - var bool; - - injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) { - var style = document.getElementById('smodernizr'), - sheet = style.sheet || style.styleSheet, - cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : ''; - - bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0; - }); - - return bool; - }; - /*>>fontface*/ - - // CSS generated content detection - tests['generatedcontent'] = function() { - var bool; - - injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) { - bool = node.offsetHeight >= 3; - }); - - return bool; - }; - - - - // These tests evaluate support of the video/audio elements, as well as - // testing what types of content they support. - // - // We're using the Boolean constructor here, so that we can extend the value - // e.g. Modernizr.video // true - // Modernizr.video.ogg // 'probably' - // - // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845 - // thx to NielsLeenheer and zcorpan - - // Note: in some older browsers, "no" was a return value instead of empty string. - // It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2 - // It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5 - - tests['video'] = function() { - var elem = document.createElement('video'), - bool = false; - - // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224 - try { - if ( bool = !!elem.canPlayType ) { - bool = new Boolean(bool); - bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,''); - - // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546 - bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,''); - - bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,''); - } - - } catch(e) { } - - return bool; - }; - - tests['audio'] = function() { - var elem = document.createElement('audio'), - bool = false; - - try { - if ( bool = !!elem.canPlayType ) { - bool = new Boolean(bool); - bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,''); - bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,''); - - // Mimetypes accepted: - // developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements - // bit.ly/iphoneoscodecs - bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,''); - bool.m4a = ( elem.canPlayType('audio/x-m4a;') || - elem.canPlayType('audio/aac;')) .replace(/^no$/,''); - } - } catch(e) { } - - return bool; - }; - - - // In FF4, if disabled, window.localStorage should === null. - - // Normally, we could not test that directly and need to do a - // `('localStorage' in window) && ` test first because otherwise Firefox will - // throw bugzil.la/365772 if cookies are disabled - - // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem - // will throw the exception: - // QUOTA_EXCEEDED_ERRROR DOM Exception 22. - // Peculiarly, getItem and removeItem calls do not throw. - - // Because we are forced to try/catch this, we'll go aggressive. - - // Just FWIW: IE8 Compat mode supports these features completely: - // www.quirksmode.org/dom/html5.html - // But IE8 doesn't support either with local files - - tests['localstorage'] = function() { - try { - localStorage.setItem(mod, mod); - localStorage.removeItem(mod); - return true; - } catch(e) { - return false; - } - }; - - tests['sessionstorage'] = function() { - try { - sessionStorage.setItem(mod, mod); - sessionStorage.removeItem(mod); - return true; - } catch(e) { - return false; - } - }; - - - tests['webworkers'] = function() { - return !!window.Worker; - }; - - - tests['applicationcache'] = function() { - return !!window.applicationCache; - }; - - - // Thanks to Erik Dahlstrom - tests['svg'] = function() { - return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect; - }; - - // specifically for SVG inline in HTML, not within XHTML - // test page: paulirish.com/demo/inline-svg - tests['inlinesvg'] = function() { - var div = document.createElement('div'); - div.innerHTML = ''; - return (div.firstChild && div.firstChild.namespaceURI) == ns.svg; - }; - - // SVG SMIL animation - tests['smil'] = function() { - return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate'))); - }; - - // This test is only for clip paths in SVG proper, not clip paths on HTML content - // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg - - // However read the comments to dig into applying SVG clippaths to HTML content here: - // github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491 - tests['svgclippaths'] = function() { - return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath'))); - }; - - /*>>webforms*/ - // input features and input types go directly onto the ret object, bypassing the tests loop. - // Hold this guy to execute in a moment. - function webforms() { - /*>>input*/ - // Run through HTML5's new input attributes to see if the UA understands any. - // We're using f which is the element created early on - // Mike Taylr has created a comprehensive resource for testing these attributes - // when applied to all input types: - // miketaylr.com/code/input-type-attr.html - // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary - - // Only input placeholder is tested while textarea's placeholder is not. - // Currently Safari 4 and Opera 11 have support only for the input placeholder - // Both tests are available in feature-detects/forms-placeholder.js - Modernizr['input'] = (function( props ) { - for ( var i = 0, len = props.length; i < len; i++ ) { - attrs[ props[i] ] = !!(props[i] in inputElem); - } - if (attrs.list){ - // safari false positive's on datalist: webk.it/74252 - // see also github.com/Modernizr/Modernizr/issues/146 - attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement); - } - return attrs; - })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); - /*>>input*/ - - /*>>inputtypes*/ - // Run through HTML5's new input types to see if the UA understands any. - // This is put behind the tests runloop because it doesn't return a - // true/false like all the other tests; instead, it returns an object - // containing each input type with its corresponding true/false value - - // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/ - Modernizr['inputtypes'] = (function(props) { - - for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) { - - inputElem.setAttribute('type', inputElemType = props[i]); - bool = inputElem.type !== 'text'; - - // We first check to see if the type we give it sticks.. - // If the type does, we feed it a textual value, which shouldn't be valid. - // If the value doesn't stick, we know there's input sanitization which infers a custom UI - if ( bool ) { - - inputElem.value = smile; - inputElem.style.cssText = 'position:absolute;visibility:hidden;'; - - if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) { - - docElement.appendChild(inputElem); - defaultView = document.defaultView; - - // Safari 2-4 allows the smiley as a value, despite making a slider - bool = defaultView.getComputedStyle && - defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' && - // Mobile android web browser has false positive, so must - // check the height to see if the widget is actually there. - (inputElem.offsetHeight !== 0); - - docElement.removeChild(inputElem); - - } else if ( /^(search|tel)$/.test(inputElemType) ){ - // Spec doesn't define any special parsing or detectable UI - // behaviors so we pass these through as true - - // Interestingly, opera fails the earlier test, so it doesn't - // even make it here. - - } else if ( /^(url|email)$/.test(inputElemType) ) { - // Real url and email support comes with prebaked validation. - bool = inputElem.checkValidity && inputElem.checkValidity() === false; - - } else { - // If the upgraded input compontent rejects the :) text, we got a winner - bool = inputElem.value != smile; - } - } - - inputs[ props[i] ] = !!bool; - } - return inputs; - })('search tel url email datetime date month week time datetime-local number range color'.split(' ')); - /*>>inputtypes*/ - } - /*>>webforms*/ - - - // End of test definitions - // ----------------------- - - - - // Run through all tests and detect their support in the current UA. - // todo: hypothetically we could be doing an array of tests and use a basic loop here. - for ( var feature in tests ) { - if ( hasOwnProp(tests, feature) ) { - // run the test, throw the return value into the Modernizr, - // then based on that boolean, define an appropriate className - // and push it into an array of classes we'll join later. - featureName = feature.toLowerCase(); - Modernizr[featureName] = tests[feature](); - - classes.push((Modernizr[featureName] ? '' : 'no-') + featureName); - } - } - - /*>>webforms*/ - // input tests need to run. - Modernizr.input || webforms(); - /*>>webforms*/ - - - /** - * addTest allows the user to define their own feature tests - * the result will be added onto the Modernizr object, - * as well as an appropriate className set on the html element - * - * @param feature - String naming the feature - * @param test - Function returning true if feature is supported, false if not - */ - Modernizr.addTest = function ( feature, test ) { - if ( typeof feature == 'object' ) { - for ( var key in feature ) { - if ( hasOwnProp( feature, key ) ) { - Modernizr.addTest( key, feature[ key ] ); - } - } - } else { - - feature = feature.toLowerCase(); - - if ( Modernizr[feature] !== undefined ) { - // we're going to quit if you're trying to overwrite an existing test - // if we were to allow it, we'd do this: - // var re = new RegExp("\\b(no-)?" + feature + "\\b"); - // docElement.className = docElement.className.replace( re, '' ); - // but, no rly, stuff 'em. - return Modernizr; - } - - test = typeof test == 'function' ? test() : test; - - if (typeof enableClasses !== "undefined" && enableClasses) { - docElement.className += ' ' + (test ? '' : 'no-') + feature; - } - Modernizr[feature] = test; - - } - - return Modernizr; // allow chaining. - }; - - - // Reset modElem.cssText to nothing to reduce memory footprint. - setCss(''); - modElem = inputElem = null; - - /*>>shiv*/ - /** - * @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed - */ - ;(function(window, document) { - /*jshint evil:true */ - /** version */ - var version = '3.7.0'; - - /** Preset options */ - var options = window.html5 || {}; - - /** Used to skip problem elements */ - var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i; - - /** Not all elements can be cloned in IE **/ - var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i; - - /** Detect whether the browser supports default html5 styles */ - var supportsHtml5Styles; - - /** Name of the expando, to work with multiple documents or to re-shiv one document */ - var expando = '_html5shiv'; - - /** The id for the the documents expando */ - var expanID = 0; - - /** Cached data for each document */ - var expandoData = {}; - - /** Detect whether the browser supports unknown elements */ - var supportsUnknownElements; - - (function() { - try { - var a = document.createElement('a'); - a.innerHTML = ''; - //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles - supportsHtml5Styles = ('hidden' in a); - - supportsUnknownElements = a.childNodes.length == 1 || (function() { - // assign a false positive if unable to shiv - (document.createElement)('a'); - var frag = document.createDocumentFragment(); - return ( - typeof frag.cloneNode == 'undefined' || - typeof frag.createDocumentFragment == 'undefined' || - typeof frag.createElement == 'undefined' - ); - }()); - } catch(e) { - // assign a false positive if detection fails => unable to shiv - supportsHtml5Styles = true; - supportsUnknownElements = true; - } - - }()); - - /*--------------------------------------------------------------------------*/ - - /** - * Creates a style sheet with the given CSS text and adds it to the document. - * @private - * @param {Document} ownerDocument The document. - * @param {String} cssText The CSS text. - * @returns {StyleSheet} The style element. - */ - function addStyleSheet(ownerDocument, cssText) { - var p = ownerDocument.createElement('p'), - parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement; - - p.innerHTML = 'x'; - return parent.insertBefore(p.lastChild, parent.firstChild); - } - - /** - * Returns the value of `html5.elements` as an array. - * @private - * @returns {Array} An array of shived element node names. - */ - function getElements() { - var elements = html5.elements; - return typeof elements == 'string' ? elements.split(' ') : elements; - } - - /** - * Returns the data associated to the given document - * @private - * @param {Document} ownerDocument The document. - * @returns {Object} An object of data. - */ - function getExpandoData(ownerDocument) { - var data = expandoData[ownerDocument[expando]]; - if (!data) { - data = {}; - expanID++; - ownerDocument[expando] = expanID; - expandoData[expanID] = data; - } - return data; - } - - /** - * returns a shived element for the given nodeName and document - * @memberOf html5 - * @param {String} nodeName name of the element - * @param {Document} ownerDocument The context document. - * @returns {Object} The shived element. - */ - function createElement(nodeName, ownerDocument, data){ - if (!ownerDocument) { - ownerDocument = document; - } - if(supportsUnknownElements){ - return ownerDocument.createElement(nodeName); - } - if (!data) { - data = getExpandoData(ownerDocument); - } - var node; - - if (data.cache[nodeName]) { - node = data.cache[nodeName].cloneNode(); - } else if (saveClones.test(nodeName)) { - node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode(); - } else { - node = data.createElem(nodeName); - } - - // Avoid adding some elements to fragments in IE < 9 because - // * Attributes like `name` or `type` cannot be set/changed once an element - // is inserted into a document/fragment - // * Link elements with `src` attributes that are inaccessible, as with - // a 403 response, will cause the tab/window to crash - // * Script elements appended to fragments will execute when their `src` - // or `text` property is set - return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node; - } - - /** - * returns a shived DocumentFragment for the given document - * @memberOf html5 - * @param {Document} ownerDocument The context document. - * @returns {Object} The shived DocumentFragment. - */ - function createDocumentFragment(ownerDocument, data){ - if (!ownerDocument) { - ownerDocument = document; - } - if(supportsUnknownElements){ - return ownerDocument.createDocumentFragment(); - } - data = data || getExpandoData(ownerDocument); - var clone = data.frag.cloneNode(), - i = 0, - elems = getElements(), - l = elems.length; - for(;i>shiv*/ - - // Assign private properties to the return object with prefix - Modernizr._version = version; - - // expose these for the plugin API. Look in the source for how to join() them against your input - /*>>prefixes*/ - Modernizr._prefixes = prefixes; - /*>>prefixes*/ - /*>>domprefixes*/ - Modernizr._domPrefixes = domPrefixes; - Modernizr._cssomPrefixes = cssomPrefixes; - /*>>domprefixes*/ - - /*>>mq*/ - // Modernizr.mq tests a given media query, live against the current state of the window - // A few important notes: - // * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false - // * A max-width or orientation query will be evaluated against the current state, which may change later. - // * You must specify values. Eg. If you are testing support for the min-width media query use: - // Modernizr.mq('(min-width:0)') - // usage: - // Modernizr.mq('only screen and (max-width:768)') - Modernizr.mq = testMediaQuery; - /*>>mq*/ - - /*>>hasevent*/ - // Modernizr.hasEvent() detects support for a given event, with an optional element to test on - // Modernizr.hasEvent('gesturestart', elem) - Modernizr.hasEvent = isEventSupported; - /*>>hasevent*/ - - /*>>testprop*/ - // Modernizr.testProp() investigates whether a given style property is recognized - // Note that the property names must be provided in the camelCase variant. - // Modernizr.testProp('pointerEvents') - Modernizr.testProp = function(prop){ - return testProps([prop]); - }; - /*>>testprop*/ - - /*>>testallprops*/ - // Modernizr.testAllProps() investigates whether a given style property, - // or any of its vendor-prefixed variants, is recognized - // Note that the property names must be provided in the camelCase variant. - // Modernizr.testAllProps('boxSizing') - Modernizr.testAllProps = testPropsAll; - /*>>testallprops*/ - - - /*>>teststyles*/ - // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards - // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... }) - Modernizr.testStyles = injectElementWithStyles; - /*>>teststyles*/ - - - /*>>prefixed*/ - // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input - // Modernizr.prefixed('boxSizing') // 'MozBoxSizing' - - // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style. - // Return values will also be the camelCase variant, if you need to translate that to hypenated style use: - // - // str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-'); - - // If you're trying to ascertain which transition end event to bind to, you might do something like... - // - // var transEndEventNames = { - // 'WebkitTransition' : 'webkitTransitionEnd', - // 'MozTransition' : 'transitionend', - // 'OTransition' : 'oTransitionEnd', - // 'msTransition' : 'MSTransitionEnd', - // 'transition' : 'transitionend' - // }, - // transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ]; - - Modernizr.prefixed = function(prop, obj, elem){ - if(!obj) { - return testPropsAll(prop, 'pfx'); - } else { - // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame' - return testPropsAll(prop, obj, elem); - } - }; - /*>>prefixed*/ - - - /*>>cssclasses*/ - // Remove "no-js" class from element, if it exists: - docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') + - - // Add the new classes to the element. - (enableClasses ? ' js ' + classes.join(' ') : ''); - /*>>cssclasses*/ - - return Modernizr; - -})(this, this.document); diff --git a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Scripts/popper.min.js b/Antifraude.Net/GestionaDenunciasAN/wwwroot/Scripts/popper.min.js deleted file mode 100644 index 23122cc..0000000 --- a/Antifraude.Net/GestionaDenunciasAN/wwwroot/Scripts/popper.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @popperjs/core v2.9.2 - MIT License - */ - -"use strict";!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){function t(e){return{width:(e=e.getBoundingClientRect()).width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function n(e){return null==e?window:"[object Window]"!==e.toString()?(e=e.ownerDocument)&&e.defaultView||window:e}function o(e){return{scrollLeft:(e=n(e)).pageXOffset,scrollTop:e.pageYOffset}}function r(e){return e instanceof n(e).Element||e instanceof Element}function i(e){return e instanceof n(e).HTMLElement||e instanceof HTMLElement}function a(e){return"undefined"!=typeof ShadowRoot&&(e instanceof n(e).ShadowRoot||e instanceof ShadowRoot)}function s(e){return e?(e.nodeName||"").toLowerCase():null}function f(e){return((r(e)?e.ownerDocument:e.document)||window.document).documentElement}function p(e){return t(f(e)).left+o(e).scrollLeft}function c(e){return n(e).getComputedStyle(e)}function l(e){return e=c(e),/auto|scroll|overlay|hidden/.test(e.overflow+e.overflowY+e.overflowX)}function u(e,r,a){void 0===a&&(a=!1);var c=f(r);e=t(e);var u=i(r),d={scrollLeft:0,scrollTop:0},m={x:0,y:0};return(u||!u&&!a)&&(("body"!==s(r)||l(c))&&(d=r!==n(r)&&i(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:o(r)),i(r)?((m=t(r)).x+=r.clientLeft,m.y+=r.clientTop):c&&(m.x=p(c))),{x:e.left+d.scrollLeft-m.x,y:e.top+d.scrollTop-m.y,width:e.width,height:e.height}}function d(e){var n=t(e),o=e.offsetWidth,r=e.offsetHeight;return 1>=Math.abs(n.width-o)&&(o=n.width),1>=Math.abs(n.height-r)&&(r=n.height),{x:e.offsetLeft,y:e.offsetTop,width:o,height:r}}function m(e){return"html"===s(e)?e:e.assignedSlot||e.parentNode||(a(e)?e.host:null)||f(e)}function h(e){return 0<=["html","body","#document"].indexOf(s(e))?e.ownerDocument.body:i(e)&&l(e)?e:h(m(e))}function v(e,t){var o;void 0===t&&(t=[]);var r=h(e);return e=r===(null==(o=e.ownerDocument)?void 0:o.body),o=n(r),r=e?[o].concat(o.visualViewport||[],l(r)?r:[]):r,t=t.concat(r),e?t:t.concat(v(m(r)))}function g(e){return i(e)&&"fixed"!==c(e).position?e.offsetParent:null}function y(e){for(var t=n(e),o=g(e);o&&0<=["table","td","th"].indexOf(s(o))&&"static"===c(o).position;)o=g(o);if(o&&("html"===s(o)||"body"===s(o)&&"static"===c(o).position))return t;if(!o)e:{if(o=-1!==navigator.userAgent.toLowerCase().indexOf("firefox"),-1===navigator.userAgent.indexOf("Trident")||!i(e)||"fixed"!==c(e).position)for(e=m(e);i(e)&&0>["html","body"].indexOf(s(e));){var r=c(e);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||o&&"filter"===r.willChange||o&&r.filter&&"none"!==r.filter){o=e;break e}e=e.parentNode}o=null}return o||t}function b(e){function t(e){o.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){o.has(e)||(e=n.get(e))&&t(e)})),r.push(e)}var n=new Map,o=new Set,r=[];return e.forEach((function(e){n.set(e.name,e)})),e.forEach((function(e){o.has(e.name)||t(e)})),r}function w(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function x(e){return e.split("-")[0]}function O(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&a(n))do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function j(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function E(e,r){if("viewport"===r){r=n(e);var a=f(e);r=r.visualViewport;var s=a.clientWidth;a=a.clientHeight;var l=0,u=0;r&&(s=r.width,a=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=r.offsetLeft,u=r.offsetTop)),e=j(e={width:s,height:a,x:l+p(e),y:u})}else i(r)?((e=t(r)).top+=r.clientTop,e.left+=r.clientLeft,e.bottom=e.top+r.clientHeight,e.right=e.left+r.clientWidth,e.width=r.clientWidth,e.height=r.clientHeight,e.x=e.left,e.y=e.top):(u=f(e),e=f(u),s=o(u),r=null==(a=u.ownerDocument)?void 0:a.body,a=_(e.scrollWidth,e.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),l=_(e.scrollHeight,e.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),u=-s.scrollLeft+p(u),s=-s.scrollTop,"rtl"===c(r||e).direction&&(u+=_(e.clientWidth,r?r.clientWidth:0)-a),e=j({width:a,height:l,x:u,y:s}));return e}function D(e,t,n){return t="clippingParents"===t?function(e){var t=v(m(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?y(e):e;return r(n)?t.filter((function(e){return r(e)&&O(e,n)&&"body"!==s(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=E(e,n),t.top=_(n.top,t.top),t.right=U(n.right,t.right),t.bottom=U(n.bottom,t.bottom),t.left=_(n.left,t.left),t}),E(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function L(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function P(e){var t=e.reference,n=e.element,o=(e=e.placement)?x(e):null;e=e?e.split("-")[1]:null;var r=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(o){case"top":r={x:r,y:t.y-n.height};break;case"bottom":r={x:r,y:t.y+t.height};break;case"right":r={x:t.x+t.width,y:i};break;case"left":r={x:t.x-n.width,y:i};break;default:r={x:t.x,y:t.y}}if(null!=(o=o?L(o):null))switch(i="y"===o?"height":"width",e){case"start":r[o]-=t[i]/2-n[i]/2;break;case"end":r[o]+=t[i]/2-n[i]/2}return r}function M(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function k(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function A(e,n){void 0===n&&(n={});var o=n;n=void 0===(n=o.placement)?e.placement:n;var i=o.boundary,a=void 0===i?"clippingParents":i,s=void 0===(i=o.rootBoundary)?"viewport":i;i=void 0===(i=o.elementContext)?"popper":i;var p=o.altBoundary,c=void 0!==p&&p;o=M("number"!=typeof(o=void 0===(o=o.padding)?0:o)?o:k(o,C));var l=e.elements.reference;p=e.rects.popper,a=D(r(c=e.elements[c?"popper"===i?"reference":"popper":i])?c:c.contextElement||f(e.elements.popper),a,s),c=P({reference:s=t(l),element:p,strategy:"absolute",placement:n}),p=j(Object.assign({},p,c)),s="popper"===i?p:s;var u={top:a.top-s.top+o.top,bottom:s.bottom-a.bottom+o.bottom,left:a.left-s.left+o.left,right:s.right-a.right+o.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function W(){for(var e=arguments.length,t=Array(e),n=0;n(g.devicePixelRatio||1)?"translate("+e+"px, "+u+"px)":"translate3d("+e+"px, "+u+"px, 0)",m)):Object.assign({},o,((t={})[v]=a?u+"px":"",t[h]=d?e+"px":"",t.transform="",t))}function H(e){return e.replace(/left|right|bottom|top/g,(function(e){return $[e]}))}function R(e){return e.replace(/start|end/g,(function(e){return ee[e]}))}function S(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function q(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var C=["top","bottom","right","left"],N=C.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),V=[].concat(C,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),I="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),_=Math.max,U=Math.min,z=Math.round,F={placement:"bottom",modifiers:[],strategy:"absolute"},X={passive:!0},Y={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,o=e.instance,r=(e=e.options).scroll,i=void 0===r||r,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",o.update,X)})),a&&s.addEventListener("resize",o.update,X),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",o.update,X)})),a&&s.removeEventListener("resize",o.update,X)}},data:{}},G={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=P({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},J={top:"auto",right:"auto",bottom:"auto",left:"auto"},K={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var o=n.adaptive;o=void 0===o||o,n=void 0===(n=n.roundOffsets)||n,e={placement:x(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,T(Object.assign({},e,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,T(Object.assign({},e,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},Q={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},r=t.elements[e];i(r)&&s(r)&&(Object.assign(r.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?r.removeAttribute(e):r.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],r=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(o)&&s(o)&&(Object.assign(o.style,e),Object.keys(r).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]},Z={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,o=void 0===(e=e.options.offset)?[0,0]:e,r=(e=V.reduce((function(e,n){var r=t.rects,i=x(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof o?o(Object.assign({},r,{placement:n})):o;return r=(r=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:r}:{x:r,y:s},e[n]=i,e}),{}))[t.placement],i=r.x;r=r.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=r),t.modifiersData[n]=e}},$={left:"right",right:"left",bottom:"top",top:"bottom"},ee={start:"end",end:"start"},te={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var o=n.mainAxis;o=void 0===o||o;var r=n.altAxis;r=void 0===r||r;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,p=n.altBoundary,c=n.flipVariations,l=void 0===c||c,u=n.allowedAutoPlacements;c=x(n=t.options.placement),i=i||(c!==n&&l?function(e){if("auto"===x(e))return[];var t=H(e);return[R(e),t,R(t)]}(n):[H(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===x(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,o=t.rootBoundary,r=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?V:a,f=t.placement.split("-")[1];0===(i=(t=f?i?N:N.filter((function(e){return e.split("-")[1]===f})):C).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var p=i.reduce((function(t,i){return t[i]=A(e,{placement:i,boundary:n,rootBoundary:o,padding:r})[x(i)],t}),{});return Object.keys(p).sort((function(e,t){return p[e]-p[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;c=!0;for(var h=d[0],v=0;vi[O]&&(b=H(b)),O=H(b),w=[],o&&w.push(0>=j[y]),r&&w.push(0>=j[b],0>=j[O]),w.every((function(e){return e}))){h=g,c=!1;break}m.set(g,w)}if(c)for(o=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},r=l?3:1;0 { client.BaseAddress = new Uri(Utilidades.urlSwagger()); }); + builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; @@ -22,10 +25,28 @@ builder.Services.AddAuthentication(options => options.LoginPath = "/home"; options.AccessDeniedPath = "/AccessDenied"; }); -// Necesario para ver porqué está fallando ciertas cosas que dan el error Circuit + builder.Services.AddServerSideBlazor().AddCircuitOptions(option => { option.DetailedErrors = true; }); builder.Services.AddHttpContextAccessor(); builder.Services.AddDistributedMemoryCache(); +builder.Services.Configure(builder.Configuration.GetSection("CertificateLogin")); +builder.Services.Configure(options => +{ + options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedProto; + options.ForwardLimit = null; + options.KnownNetworks.Clear(); + options.KnownProxies.Clear(); + + var knownProxies = builder.Configuration.GetSection("ReverseProxy:KnownProxies").Get() ?? Array.Empty(); + foreach (var knownProxy in knownProxies) + { + if (IPAddress.TryParse(knownProxy, out var proxyIp)) + { + options.KnownProxies.Add(proxyIp); + } + } +}); + builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromHours(1); @@ -37,17 +58,20 @@ builder.Services.AddHttpClient("CertClient").ConfigurePrimaryHttpMessageHandler( { return new HttpClientHandler { - ClientCertificateOptions = ClientCertificateOption.Manual // Forzar la selección del certificado + ClientCertificateOptions = ClientCertificateOption.Manual }; }); builder.Services.AddBlazorBootstrap(); builder.Services.AddAntiforgery(); builder.Services.AddSingleton(); +builder.Services.AddScoped(); builder.Services.AddScoped(); var app = builder.Build(); +app.UseForwardedHeaders(); + if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); @@ -76,14 +100,17 @@ app.MapDelete("/auth/state", (HttpContext context, UserStateCookieStore cookieSt return Results.NoContent(); }).DisableAntiforgery(); +app.MapGet("/auth/login-cert-bridge", (HttpContext context, CertificateLoginBridgeService bridgeService) => + bridgeService.HandleAsync(context)); + app.Use(async (context, next) => { var userState = context.RequestServices.GetService(); var path = context.Request.Path; - // Permitir solicitudes internas y recursos necesarios if (path == "/" || path.StartsWithSegments("/auth/state") || + path.StartsWithSegments("/auth/login-cert-bridge") || path.StartsWithSegments("/_blazor") || path.StartsWithSegments("/Content") || path.StartsWithSegments("/Scripts") || @@ -95,7 +122,6 @@ app.Use(async (context, next) => return; } - // Redirigir al home si no hay token y la ruta no es pública if (string.IsNullOrWhiteSpace(userState?.Token)) { Console.WriteLine($"Redirigiendo al home desde: {path}"); @@ -103,7 +129,6 @@ app.Use(async (context, next) => return; } - // Continuar con la solicitud await next(); }); diff --git a/Antifraude.Net/RegistroPersonalAN/Services/CertificateLoginBridgeService.cs b/Antifraude.Net/RegistroPersonalAN/Services/CertificateLoginBridgeService.cs new file mode 100644 index 0000000..a190315 --- /dev/null +++ b/Antifraude.Net/RegistroPersonalAN/Services/CertificateLoginBridgeService.cs @@ -0,0 +1,322 @@ +using System.Security.Cryptography.X509Certificates; +using System.Text.Json; +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; + +namespace RegistroPersonalAN.Services +{ + public sealed class CertificateLoginBridgeService + { + private readonly IHttpClientFactory _httpClientFactory; + private readonly CertificateLoginOptions _options; + private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }; + + public CertificateLoginBridgeService( + IHttpClientFactory httpClientFactory, + IOptions options) + { + _httpClientFactory = httpClientFactory; + _options = options.Value; + } + + public async Task HandleAsync(HttpContext context) + { + if (!CertificateLoginBridgeHelper.IsCertificateHostRequest(context, _options.PublicUrl)) + { + return Results.NotFound(); + } + + var parentOrigin = context.Request.Query["parentOrigin"].ToString(); + if (!CertificateLoginBridgeHelper.IsAllowedParentOrigin(parentOrigin, _options.AllowedParentOrigins)) + { + return Results.BadRequest("El origen padre no está permitido."); + } + + var certificate = CertificateLoginBridgeHelper.ReadCertificate( + context, + _options.ForwardedCertificateHeader, + _options.AdditionalForwardedCertificateHeaders); + + if (certificate == null) + { + return Results.Unauthorized(); + } + + var dni = CertificateLoginBridgeHelper.ObtenerDni(certificate); + if (string.IsNullOrWhiteSpace(dni)) + { + return Results.Unauthorized(); + } + + var client = _httpClientFactory.CreateClient("DefaultClient"); + using var response = await client.PostAsJsonAsync("Auth/login-cert-proxy", new CertificateProxyLoginRequest + { + Dni = dni + }); + + var responseContent = await response.Content.ReadAsStringAsync(); + if (!response.IsSuccessStatusCode) + { + return Results.Content( + responseContent, + "text/plain; charset=utf-8", + statusCode: (int)response.StatusCode); + } + + var loginResponse = JsonSerializer.Deserialize(responseContent, _jsonOptions); + if (loginResponse?.User == null || string.IsNullOrWhiteSpace(loginResponse.Token)) + { + return Results.StatusCode(StatusCodes.Status502BadGateway); + } + + var iframe = string.Equals(context.Request.Query["iframe"], "true", StringComparison.OrdinalIgnoreCase); + if (iframe) + { + return Results.Content( + CertificateLoginBridgeHelper.BuildIframeHtml(loginResponse, parentOrigin), + "text/html; charset=utf-8"); + } + + return Results.Content(responseContent, "application/json; charset=utf-8"); + } + } + + public sealed class CertificateLoginOptions + { + public string PublicUrl { get; set; } = string.Empty; + public string ForwardedCertificateHeader { get; set; } = "X-ARR-ClientCert"; + public List AdditionalForwardedCertificateHeaders { get; set; } = new(); + public List AllowedParentOrigins { get; set; } = new(); + } + + public sealed class CertificateProxyLoginRequest + { + public string Dni { get; set; } = string.Empty; + } + + public sealed class CertificateProxyLoginResponse + { + public string Token { get; set; } = string.Empty; + public CertificateProxyUser? User { get; set; } + } + + public sealed class CertificateProxyUser + { + public string NIF { get; set; } = string.Empty; + public string NOMBRE { get; set; } = string.Empty; + public string APELLIDOS { get; set; } = string.Empty; + public bool? ADMINISTRARPTYREGISTRO { get; set; } + } + + internal static class CertificateLoginBridgeHelper + { + private static readonly string[] DefaultCertificateHeaders = + { + "X-ARR-ClientCert", + "X-Client-Cert", + "X-Client-Certificate", + "X-SSL-CERT", + "Ssl-Client-Cert" + }; + + public static bool IsCertificateHostRequest(HttpContext context, string publicUrl) + { + if (!Uri.TryCreate(publicUrl, UriKind.Absolute, out var configuredUri)) + { + return false; + } + + var requestHost = context.Request.Host.Host; + var requestPort = context.Request.Host.Port ?? GetDefaultPort(context.Request.Scheme); + var configuredPort = configuredUri.IsDefaultPort + ? GetDefaultPort(configuredUri.Scheme) + : configuredUri.Port; + + return string.Equals(context.Request.Scheme, configuredUri.Scheme, StringComparison.OrdinalIgnoreCase) && + string.Equals(requestHost, configuredUri.Host, StringComparison.OrdinalIgnoreCase) && + requestPort == configuredPort; + } + + public static bool IsAllowedParentOrigin(string parentOrigin, IEnumerable allowedParentOrigins) + { + if (!TryGetOrigin(parentOrigin, out var normalizedParentOrigin)) + { + return false; + } + + return allowedParentOrigins + .Where(origin => !string.IsNullOrWhiteSpace(origin)) + .Select(origin => NormalizeOrigin(origin)) + .Any(origin => string.Equals(origin, normalizedParentOrigin, StringComparison.OrdinalIgnoreCase)); + } + + public static X509Certificate2? ReadCertificate( + HttpContext context, + string forwardedCertificateHeader, + IEnumerable? additionalForwardedCertificateHeaders) + { + if (context.Connection.ClientCertificate != null) + { + return context.Connection.ClientCertificate; + } + + var headerCandidates = new List(); + AddHeaderName(headerCandidates, forwardedCertificateHeader); + + if (additionalForwardedCertificateHeaders != null) + { + foreach (var headerName in additionalForwardedCertificateHeaders) + { + AddHeaderName(headerCandidates, headerName); + } + } + + foreach (var headerName in DefaultCertificateHeaders) + { + AddHeaderName(headerCandidates, headerName); + } + + foreach (var headerName in headerCandidates.Distinct(StringComparer.OrdinalIgnoreCase)) + { + var rawHeader = context.Request.Headers[headerName].ToString(); + if (string.IsNullOrWhiteSpace(rawHeader)) + { + continue; + } + + var certificate = TryCreateCertificate(rawHeader); + if (certificate != null) + { + return certificate; + } + } + + return null; + } + + public static string ObtenerDni(X509Certificate2 certificado) + { + try + { + var subject = certificado.Subject; + var cnPrefix = "CN="; + var startIndex = subject.IndexOf(cnPrefix, StringComparison.OrdinalIgnoreCase); + if (startIndex == -1) + return string.Empty; + + startIndex += cnPrefix.Length; + var endIndex = subject.IndexOf(',', startIndex); + if (endIndex == -1) + { + endIndex = subject.Length; + } + + var commonName = subject.Substring(startIndex, endIndex - startIndex).Trim(); + var dniMatch = Regex.Match(commonName, @"\b\d{8}[A-Z]\b"); + return dniMatch.Success ? dniMatch.Value : string.Empty; + } + catch + { + return string.Empty; + } + } + + public static string BuildIframeHtml(CertificateProxyLoginResponse response, string parentOrigin) + { + var payloadJson = JsonSerializer.Serialize(new + { + token = response.Token, + user = response.User + }); + var targetOriginJson = JsonSerializer.Serialize(NormalizeOrigin(parentOrigin)); + + return $@" + + Autenticación Certificado + + + +"; + } + + private static X509Certificate2? TryCreateCertificate(string rawHeader) + { + var normalizedValue = Uri.UnescapeDataString(rawHeader).Trim(); + + if (normalizedValue.Contains("BEGIN CERTIFICATE", StringComparison.OrdinalIgnoreCase)) + { + try + { + return X509Certificate2.CreateFromPem(normalizedValue); + } + catch + { + return null; + } + } + + var compactValue = Regex.Replace(normalizedValue, @"\s+", string.Empty); + + if (compactValue.Length > 0 && + compactValue.Length % 2 == 0 && + Regex.IsMatch(compactValue, "^[0-9a-fA-F]+$")) + { + try + { + return new X509Certificate2(Convert.FromHexString(compactValue)); + } + catch + { + return null; + } + } + + try + { + return new X509Certificate2(Convert.FromBase64String(compactValue)); + } + catch + { + return null; + } + } + + private static bool TryGetOrigin(string value, out string origin) + { + origin = string.Empty; + if (!Uri.TryCreate(value, UriKind.Absolute, out var uri)) + { + return false; + } + + origin = uri.GetLeftPart(UriPartial.Authority).TrimEnd('/'); + return true; + } + + private static string NormalizeOrigin(string value) + { + return Uri.TryCreate(value, UriKind.Absolute, out var uri) + ? uri.GetLeftPart(UriPartial.Authority).TrimEnd('/') + : value.Trim().TrimEnd('/'); + } + + private static int GetDefaultPort(string scheme) + { + return string.Equals(scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) ? 80 : 443; + } + + private static void AddHeaderName(ICollection headerCandidates, string? headerName) + { + if (!string.IsNullOrWhiteSpace(headerName)) + { + headerCandidates.Add(headerName.Trim()); + } + } + } +} diff --git a/Antifraude.Net/RegistroPersonalAN/appsettings.Production.json b/Antifraude.Net/RegistroPersonalAN/appsettings.Production.json new file mode 100644 index 0000000..ce2e440 --- /dev/null +++ b/Antifraude.Net/RegistroPersonalAN/appsettings.Production.json @@ -0,0 +1,23 @@ +{ + "AllowedHosts": "registrodepersonal.antifraudeandalucia.es;rp-antifraude.tecnosis.online;crp-antifraude.tecnosis.online;localhost;127.0.0.1", + "SwaggerCC": "http://localhost:103/api/", + "SwaggerVB": "http://localhost:888/", + "CertificateLogin": { + "PublicUrl": "https://crp-antifraude.tecnosis.online/auth/login-cert-bridge", + "ForwardedCertificateHeader": "X-ARR-ClientCert", + "AdditionalForwardedCertificateHeaders": [ + "X-Client-Cert", + "X-Client-Certificate", + "X-SSL-CERT", + "Ssl-Client-Cert" + ], + "AllowedParentOrigins": [ + "https://rp-antifraude.tecnosis.online", + "https://registrodepersonal.antifraudeandalucia.es", + "http://192.168.41.122:5000" + ] + }, + "ReverseProxy": { + "KnownProxies": [] + } +} diff --git a/Antifraude.Net/RegistroPersonalAN/appsettings.json b/Antifraude.Net/RegistroPersonalAN/appsettings.json index 1a4c0d8..ff619b9 100644 --- a/Antifraude.Net/RegistroPersonalAN/appsettings.json +++ b/Antifraude.Net/RegistroPersonalAN/appsettings.json @@ -9,6 +9,14 @@ //SWAGGER DESARROLLO "SwaggerCC": "https://localhost:7135/api/", "SwaggerVB": "https://localhost:44300/", + "CertificateLogin": { + "PublicUrl": "https://localhost:7443/auth/login-cert-bridge", + "ForwardedCertificateHeader": "X-ARR-ClientCert", + "AllowedParentOrigins": [ + "https://localhost:7287", + "https://localhost:44355" + ] + }, //SWAGGER PUBLICADO //"SwaggerCC": "https://localhost:103/api/" //PRODUCCION diff --git a/Antifraude.Net/SwaggerAntifraude/Controllers/AuthController.cs b/Antifraude.Net/SwaggerAntifraude/Controllers/AuthController.cs index beea9b4..981f46e 100644 --- a/Antifraude.Net/SwaggerAntifraude/Controllers/AuthController.cs +++ b/Antifraude.Net/SwaggerAntifraude/Controllers/AuthController.cs @@ -1,14 +1,15 @@ -using bdAntifraude.db; -using bdAntifraude.dbcontext; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using Microsoft.IdentityModel.Tokens; -using SwaggerAntifraude.DTOs; using System.IdentityModel.Tokens.Jwt; +using System.Net; using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Text; +using System.Text.Json; +using bdAntifraude.db; +using bdAntifraude.dbcontext; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.IdentityModel.Tokens; +using SwaggerAntifraude.DTOs; namespace SwaggerAntifraude.Controllers { @@ -39,7 +40,100 @@ namespace SwaggerAntifraude.Controllers { return Unauthorized("Usuario no autorizado"); } - return Ok(new + + return Ok(BuildLoginResponse(persona, token)); + } + + [AllowAnonymous] + [HttpGet("login-cert")] + public IActionResult LoginWithCertificateGet([FromQuery] bool iframe = false) + { + var clientCert = HttpContext.Connection.ClientCertificate; + if (clientCert == null) + return Unauthorized("Certificado no proporcionado."); + + var dni = ObtenerDNI(clientCert); + if (string.IsNullOrWhiteSpace(dni)) + return Unauthorized("No se pudo obtener un DNI válido del certificado."); + + var result = AuthenticateCertificateDni(dni); + if (result.Token == null || result.Persona == null) + return Unauthorized(result.Error ?? "No se pudo autenticar el certificado."); + + if (iframe) + { + return Content(BuildIframeHtml(result.Token, result.Persona), "text/html; charset=utf-8"); + } + + return Ok(BuildLoginResponse(result.Persona, result.Token)); + } + + [AllowAnonymous] + [HttpPost("login-cert-proxy")] + public IActionResult LoginWithCertificateProxy([FromBody] CertificateProxyLoginDto request) + { + if (!EsPeticionLocal()) + { + return Forbid(); + } + + if (string.IsNullOrWhiteSpace(request.Dni)) + { + return BadRequest("Debe indicarse un DNI."); + } + + var result = AuthenticateCertificateDni(request.Dni); + if (result.Token == null || result.Persona == null) + return Unauthorized(result.Error ?? "No se pudo autenticar el certificado."); + + return Ok(BuildLoginResponse(result.Persona, result.Token)); + } + + private (string? Token, PERSONAS? Persona, string? Error) AuthenticateCertificateDni(string dni) + { + using var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true); + + dni = NormalizarDniCertificado(dni); + + var persona = context.PERSONAS.FirstOrDefault(p => p.NIF == dni); + if (persona == null) + { + return (null, null, "Usuario no encontrado en la base de datos."); + } + + var jwtToken = GenerateJwtToken(persona); + return (jwtToken, persona, null); + } + + private string GenerateJwtToken(PERSONAS persona) + { + var jwtSettings = _configuration.GetSection("Jwt"); + var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]!); + + var claims = new[] + { + new Claim(JwtRegisteredClaimNames.Sub, persona.NIF), + new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), + new Claim(ClaimTypes.Role, persona.ADMINISTRARPTYREGISTRO == true ? "Supervisor" : "Lectura") + }; + + var tokenDescriptor = new SecurityTokenDescriptor + { + Subject = new ClaimsIdentity(claims), + Expires = DateTime.UtcNow.AddMinutes(double.Parse(jwtSettings["ExpiresInMinutes"]!)), + Issuer = jwtSettings["Issuer"], + Audience = jwtSettings["Audience"], + SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) + }; + + var tokenHandler = new JwtSecurityTokenHandler(); + var token = tokenHandler.CreateToken(tokenDescriptor); + return tokenHandler.WriteToken(token); + } + + private static object BuildLoginResponse(PERSONAS persona, string token) + { + return new { Token = token, User = new @@ -49,101 +143,65 @@ namespace SwaggerAntifraude.Controllers persona.APELLIDOS, persona.ADMINISTRARPTYREGISTRO } - }); + }; } - [AllowAnonymous] - [HttpGet("login-cert")] - public IActionResult LoginWithCertificateGet([FromQuery] bool iframe = false) + private static string BuildIframeHtml(string token, PERSONAS persona) { - // Obtener el certificado enviado durante el handshake TLS - var clientCert = HttpContext.Connection.ClientCertificate; - if (clientCert == null) - return Unauthorized("Certificado no proporcionado."); - - // Extraer el DNI desde el certificado - var dni = ObtenerDNI(clientCert); - if (string.IsNullOrEmpty(dni)) - return Unauthorized("No se pudo obtener un DNI válido del certificado."); - - using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true)) + var payload = JsonSerializer.Serialize(new { - // Mapeo de ejemplo (como en tu código) - if (dni == "25621303Q" || dni == "52234173T" ||dni == "47201739N") - dni = "44286377S"; - - var persona = context.PERSONAS.FirstOrDefault(p => p.NIF == dni); - if (persona == null) - return Unauthorized("Usuario no encontrado en la base de datos."); - - // Generar token JWT - var jwtSettings = _configuration.GetSection("Jwt"); - var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]); - var claims = new[] + token, + user = new { - new Claim(JwtRegisteredClaimNames.Sub, persona.NIF), - new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - new Claim(ClaimTypes.Role, persona.ADMINISTRARPTYREGISTRO == true ? "Supervisor" : "Lectura") - }; + persona.NIF, + persona.NOMBRE, + persona.APELLIDOS, + persona.ADMINISTRARPTYREGISTRO + } + }); - - - var tokenDescriptor = new SecurityTokenDescriptor - { - Subject = new ClaimsIdentity(claims), - Expires = DateTime.UtcNow.AddMinutes(double.Parse(jwtSettings["ExpiresInMinutes"])), - Issuer = jwtSettings["Issuer"], - Audience = jwtSettings["Audience"], - SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) - }; - - var tokenHandler = new JwtSecurityTokenHandler(); - var token = tokenHandler.CreateToken(tokenDescriptor); - var jwtToken = tokenHandler.WriteToken(token); - - if (iframe) - { - // Generar una página HTML mínima que envíe el token y datos del usuario mediante postMessage al contexto padre - var html = $@" + return $@" Autenticación Certificado "; - return Content(html, "text/html; charset=utf-8"); - } - else - { - return Ok(new - { - Token = jwtToken, - User = new - { - persona.NIF, - persona.NOMBRE, - persona.APELLIDOS, - persona.ADMINISTRARPTYREGISTRO - } - }); - } - } } + + private static string NormalizarDniCertificado(string dni) + { + var dniNormalizado = dni.Trim().ToUpperInvariant(); + + if (dniNormalizado == "25621303Q" || dniNormalizado == "52234173T" || dniNormalizado == "47201739N") + return "44286377S"; + + return dniNormalizado; + } + + private bool EsPeticionLocal() + { + var remoteIp = HttpContext.Connection.RemoteIpAddress; + if (remoteIp == null) + { + return false; + } + + if (IPAddress.IsLoopback(remoteIp)) + { + return true; + } + + var localIp = HttpContext.Connection.LocalIpAddress; + return localIp != null && remoteIp.Equals(localIp); + } + private string ObtenerDNI(X509Certificate2 certificado) { try { - // Extraer el Common Name (CN) del Subject var subject = certificado.Subject; var cnPrefix = "CN="; var startIndex = subject.IndexOf(cnPrefix, StringComparison.OrdinalIgnoreCase); @@ -154,17 +212,15 @@ namespace SwaggerAntifraude.Controllers var endIndex = subject.IndexOf(',', startIndex); if (endIndex == -1) endIndex = subject.Length; - // Extraer el CN var commonName = subject.Substring(startIndex, endIndex - startIndex).Trim(); - // Extraer el DNI del CN usando una expresión regular var dniMatch = System.Text.RegularExpressions.Regex.Match(commonName, @"\b\d{8}[A-Z]\b"); if (dniMatch.Success) { - return dniMatch.Value; // Devuelve solo el DNI + return dniMatch.Value; } - return string.Empty; // No se encontró un DNI válido + return string.Empty; } catch { @@ -172,8 +228,6 @@ namespace SwaggerAntifraude.Controllers } } - - private (string token, PERSONAS persona) AuthenticateUser(LoginDto loginDto) { using (var context = tsGestionAntifraude.NuevoContexto(SoloLectura: true)) @@ -185,37 +239,14 @@ namespace SwaggerAntifraude.Controllers return (null, null); } - var jwtSettings = _configuration.GetSection("Jwt"); - var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]); - - var claims = new[] - { - new Claim(JwtRegisteredClaimNames.Sub, persona.NIF), - new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - new Claim(ClaimTypes.Role, persona.ADMINISTRARPTYREGISTRO == true ? "Supervisor" : "Lectura") - }; if (loginDto.Origen.Equals("Registro") && persona.ADMINISTRARPTYREGISTRO == false) { - return("no autorizado", null); + return ("no autorizado", null); } - var tokenDescriptor = new SecurityTokenDescriptor - { - Subject = new ClaimsIdentity(claims), - Expires = DateTime.UtcNow.AddMinutes(double.Parse(jwtSettings["ExpiresInMinutes"])), - Issuer = jwtSettings["Issuer"], - Audience = jwtSettings["Audience"], - SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) - }; - - var tokenHandler = new JwtSecurityTokenHandler(); - var token = tokenHandler.CreateToken(tokenDescriptor); - var jwtToken = tokenHandler.WriteToken(token); - + var jwtToken = GenerateJwtToken(persona); return (jwtToken, persona); } } - - } } diff --git a/Antifraude.Net/SwaggerAntifraude/DTOs/CertificateProxyLoginDto.cs b/Antifraude.Net/SwaggerAntifraude/DTOs/CertificateProxyLoginDto.cs new file mode 100644 index 0000000..5cb0f25 --- /dev/null +++ b/Antifraude.Net/SwaggerAntifraude/DTOs/CertificateProxyLoginDto.cs @@ -0,0 +1,7 @@ +namespace SwaggerAntifraude.DTOs +{ + public class CertificateProxyLoginDto + { + public string Dni { get; set; } = string.Empty; + } +} diff --git a/Antifraude.Net/SwaggerAntifraude/appsettings.Production.json b/Antifraude.Net/SwaggerAntifraude/appsettings.Production.json new file mode 100644 index 0000000..a604360 --- /dev/null +++ b/Antifraude.Net/SwaggerAntifraude/appsettings.Production.json @@ -0,0 +1,3 @@ +{ + "AllowedHosts": "localhost;127.0.0.1" +} diff --git a/Antifraude.Net/SwaggerAntifraude/appsettings.json b/Antifraude.Net/SwaggerAntifraude/appsettings.json index 8de5b19..16a73d3 100644 --- a/Antifraude.Net/SwaggerAntifraude/appsettings.json +++ b/Antifraude.Net/SwaggerAntifraude/appsettings.json @@ -5,15 +5,15 @@ "Audience": "TuDominio.com", "ExpiresInMinutes": 60 }, - "ConnectionStrings": { - "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO", - "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO" - }, - //PRODUCCION //"ConnectionStrings": { - // "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE", - // "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE" + // "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO", + // "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDEDESARROLLO" //}, + //PRODUCCION + "ConnectionStrings": { + "WriteConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE", + "ReadOnlyConnection": "DATA SOURCE=192.168.41.203:21521/XE;PASSWORD=antifraude2022;PERSIST SECURITY INFO=True;USER ID=ANTIFRAUDE" + }, "Logging": { "LogLevel": { "Default": "Information",