elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Mensajes
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1256
1  Foros Generales / Foro Libre / Re: Cómo los Campos Electromagnéticos Influyen en la Percepción de Presencias Paranormales: Teorías y Evidencias en: Hoy a las 17:44
What the fuck, viste la música?? yo quiero de eso que le dan al guru, lo tienen con ron?? Al ver ese testimonio de tremenda eminencia ahora si me la creo que los reptilianos existen

¿Ver música?, en todo caso sería escuchar, pero la verdad es que no, lo único que veo es una respuesta absurda y fuera de lugar, por que aquí estamos enfocando el tema en términos científicos, así que los reptilianos y los comentarios ofensivos que intenten ridiculizar algo no juegan ningún papel.

Un saludo.
2  Foros Generales / Foro Libre / Re: Cómo los Campos Electromagnéticos Influyen en la Percepción de Presencias Paranormales: Teorías y Evidencias en: Ayer a las 02:51
Leí bastante sobre ese tema en su momento, aunque ya no recuerdo los detalles. Se intentaba explicar científicamente la razón por la cual se dice que las personas son capaces alcanzar un estado de trance durante una meditación profunda. Se explicaba que este estado de la consciencia en realidad era una manifestación natural debida a ciertos procesos biológicos (y quizá también electromagnéticos) como la estimulación de una sustancia del cerebro cuyo nombre ahora no recuerdo.

Me pareció muy interesante y racional cuando lo leí.

Personalmente practiqué mucho la meditación, y con el tiempo descubrí que, cuando logras hacerlo en buenas condiciones (es decir, con plena concentración, sin distracciones y durante el tiempo suficiente) simplemente necesitas suficiente paciencia y voluntad para poder entrar en ese estado de la consciencia en el que empiezas a sentir una especie de juego de colores, luces y figuras destellantes en la oscuridad de tus párpados cerrados. A veces puedes ver cosas que parecen tener algún significado específico, por ejemplo una fotografía, un cuadro, o un lugar conocido.

Y, cuando llegas a ese estado, uno puede permanecer de forma indefinida, simplemente "observando" (percibiendo las colores y figuras, sintiendo la experiencia), y al abrir los ojos, no por un pensamiento sino por la voluntad de abrirlos, darte cuenta que han pasado muchos más minutos de los que eres capaz de corroborar, por que la percepción sensorial de cinco minutos durante ese estado de la consciencia podrían ser en realidad quince minutos tras abrir los ojos: se pierde la percepción del tiempo, algo así como cuando estamos durmiendo... sería insoportable ser conscientes del transcurso del tiempo mientras dormimos.

Descubrir y permanecer en ese estado de consciencia es una experiencia muy curiosa, e hipnótica. Cuanto más intentas comprender el significado preguntándonte a ti mismo: "¿por qué razón el ser humano es capaz de manifestar esta experiencia tan extraña? ¿qué sentido tiene?", más quieres practicar la meditación, y más te atrapa ese estado de consciencia, por que te absorbe el deseo de experimentarlo, analizarlo... y también de disfrutarlo.

Algunas personas llamarían a ese estado el "nirvana", la "iluminación", la apertura del "tercer ojo" o un trance entendiéndolo como el estado en que el alma se siente en unión mística con Dios, aunque personalmente prefiero buscarle una explicación científica. Y quizás por eso dejé de practicar la meditación, por que tras conocer este tipo de hipótesis científica dejaron de interesarme estos efectos tan curiosos durante ese estado. Empecé a practicar la meditación queriendo averiguar lo que es, lo que produce, lo que otras personas dicen que se siente, averiguar que termino sintiendo yo para comprender de lo que estamos hablando antes de tener la osadía de darle un significado científico o un significado espiritual, aunque siempre he estado más predispuesto hacia lo espiritual, la verdad... de lo contrario ni siquiera hubiera empezado a practicar la meditación.

En mi humilde opinión, considero que ese estado de consciencia solo puede causar paz interior si la persona tiene una mente susceptible que está predispuesta a creer que lo que experimenta durante ese estado tiene un significado místico o espiritual. Pero si la persona empieza a barajar la posibilidad científica entonces se perderá bastante de la magia que producen sus efectos, y puede que la única paz sea por el rato de silencio y de esa experiencia biológica tan curiosa que se manifiesta en el cerebro, y que percibes con tu sentido visual.



Por último, puedo daros un consejo para llegar a ese estado de trance o "nirvana": es estrictamente necesario no manifestar pensamientos, ni siquiera el pensamiento interno de: "no pienses en nada", por que al hacerlo ya estás pensando en algo. Y si escuchas un ruido del ambiente, como por ejemplo el tráfico de vehículos, mantén tu concentración, no pienses ni interpretes el ruido, haz lo posible por apagar el instinto de supervivencia del ser humano que necesita interpretar los sonidos del mundo a su alrededor: evita pensar en los ruidos a toda costa, concéntrate en un punto fijo imaginario de la oscuridad de tus párpados, pero también sin pensar en ello, simplemente hazlo.

Una distracción, como tener un pensamiento o escuchar un ruido o el contacto del viento en tu mejilla, solo es una distracción si le prestas atención. Así que aprende a no distraerte, por que la mínima distracción durante el proceso de meditación frenará en seco el avance hacia ese estado de la consciencia. No pasa nada si tienes distracciones, sigue practicando. Por que de eso se trata, de practicar, todo se aprende y se mejora mediante la práctica. Hasta que uno ya no se distraiga, no piense en nada, y finalmente pueda llegar al "nirvana".

De forma metafórica, hay que vaciar la mente de esas nubes de pensamientos y distracciones que revolotean constantemente, hasta que no quede ninguna, y, cuando percibas que ya no hay más nubes, no dejar que vuelva a aparecer ninguna más, por que si aparecen significa que todavía te queda más trabajo para silenciar completamente tus pensamientos.

Dejar de tener pensamientos durante la meditación creo que es lo que a la gente más le cuesta aprender, sobre todo si hablamos de personas que realmente no tienen la voluntad suficiente por que van con mentalidad muy escéptica y se lo toman en plan chorrada mística, en vez de tomárselo como una serie de requisitos imprescindibles para alcanzar una experiencia biológica / científica. Pero se puede, y no es difícil, lo prometo. Simplemente hay que manifestar la voluntad de silenciar tus pensamientos, para empezar a usar tus capacidades de percepción sensorial. Percibir, sentir, pero no pensar.

Atentamente,
Elektro.
3  Foros Generales / Foro Libre / Re: La exigente condición de una soltera para encontrar el amor en 'First Dates': ''Tendría que ganar unos 8.000 o 10.00 en: Ayer a las 01:35




Pero que más dará esto en el fondo, si cada uno es libre de tener y mostrar las prioridades que quiera (aunque sean tan superficiales), y aparte, la mitad de los que aparecen en esos programas son actores.
4  Foros Generales / Foro Libre / Re: INVESTIGACIÓN PARANORMAL | La Casa de la Bruja Satánica - REGRESO MORTAL en: 31 Octubre 2025, 03:09 am
me parece ya demasiado la tomadura de pelo de ese señor

Entonces quizás lo más sensato por tu parte sería dejar de seguir dándole publicidad. Quiero decir, una vez que descubres que alguien es un estafador (como ya sabemos que lo es este personaje), lo más coherente en mi opinión personal es no darle más visibilidad, para evitar que siga engañando a otros incautos...

Por eso hace siglos que dejé de compartir videos de JL y del terraplanista ese de Oliver Ibáñez. Y ni siquiera mencionaría sus nombres para no hacerles publicidad, si no fuese por que lo veo necesario para darle un matiz a esta opinión.

vive para ello me parece bien y es lícito

No puede considerarse lícito vivir de la estafa, porque la base misma de esa actividad es la mentira y el perjuicio ajeno. Ganarse la vida aprovechándose de la buena fe, la ignorancia y la confianza de la gente para obtener beneficio propio en forma económica, a mi no me puede parecer bien. Estoy convencido de que a ti tampoco te parece bien. Solo que somos buenas personas, y terminamos cediendo y dejando pasar por alto ciertos comportamientos, tal vez pensando: "bueno, no le hacen daño a nadie", pero es un error, si que hacen daño. ¡Mano dura con todos los magufos y estafadores de cualquier índole!.



Vivir para engañar, para rascar unas comisiones por la venta de libros de otros magufos como él, y seguir engañando para rascar algo más. Es gente rastrera. Lo que me extraña es que no haya sacado ningún libro (o a lo mejor sí, desconozco el nombre de esta persona), pero tiempo al tiempo, todos los magufos lo terminan haciendo, y ahí es donde se consolida verdaderamente el término ESTAFADOR. Entre eso y los cursillos, etc.

¡Un saludo!
5  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 28 Octubre 2025, 18:39 pm
He actualizado una antigua función que creo haber compartido en el pasado, que toma un valor numérico y lo devuelve como un string hexadecimal con formato específico de VB.NET o C#, opcionalmente con sufijo de número literal y pudiendo elegir entre formato en mayúsculas y minsúculas.

Código
  1. ''' <summary>
  2. ''' Specifies a .NET document language.
  3. ''' </summary>
  4. Public Enum NetDocumentLanguage As Integer
  5.  
  6.    ''' <summary>
  7.    ''' C# language.
  8.    ''' </summary>
  9.    CSharp = 0
  10.  
  11.    ''' <summary>
  12.    ''' Visual Basic.NET language.
  13.    ''' </summary>
  14.    VbNet = 1
  15.  
  16. End Enum
  17.  

Código
  1. ''' <summary>
  2. ''' Converts a numeric value of type <typeparamref name="T"/> to its .NET hexadecimal string representation.
  3. ''' </summary>
  4. '''
  5. ''' <example> This is a code example.
  6. ''' <code language="VB">
  7. ''' Dim syntax As NetDocumentLanguage = NetDocumentLanguage.VbNet
  8. ''' Dim addLiteralSuffix As Boolean = True
  9. ''' Dim lowerCase As Boolean = False
  10. '''
  11. ''' Dim valueByte As Byte = Byte.MaxValue
  12. ''' Dim valueSByte As SByte = SByte.MaxValue
  13. ''' Dim valueShort As Short = Short.MaxValue
  14. ''' Dim valueUShort As UShort = UShort.MaxValue
  15. ''' Dim valueInteger As Integer = Integer.MaxValue
  16. ''' Dim valueUInteger As UInteger = UInteger.MaxValue
  17. ''' Dim valueLong As Long = Long.MaxValue
  18. ''' Dim valueULong As ULong = ULong.MaxValue
  19. '''
  20. ''' Dim valueByteHex As String = ConvertNumberToHexadecimal(valueByte, syntax, addLiteralSuffix, lowerCase)
  21. ''' Dim valueSByteHex As String = ConvertNumberToHexadecimal(valueSByte, syntax, addLiteralSuffix, lowerCase)
  22. ''' Dim valueShortHex As String = ConvertNumberToHexadecimal(valueShort, syntax, addLiteralSuffix, lowerCase)
  23. ''' Dim valueUShortHex As String = ConvertNumberToHexadecimal(valueUShort, syntax, addLiteralSuffix, lowerCase)
  24. ''' Dim valueIntegerHex As String = ConvertNumberToHexadecimal(valueInteger, syntax, addLiteralSuffix, lowerCase)
  25. ''' Dim valueUIntegerHex As String = ConvertNumberToHexadecimal(valueUInteger, syntax, addLiteralSuffix, lowerCase)
  26. ''' Dim valueLongHex As String = ConvertNumberToHexadecimal(valueLong, syntax, addLiteralSuffix, lowerCase)
  27. ''' Dim valueULongHex As String = ConvertNumberToHexadecimal(valueULong, syntax, addLiteralSuffix, lowerCase)
  28. '''
  29. ''' Debug.WriteLine($"{NameOf(valueByte)}: {valueByte}, Converted: {valueByteHex}")
  30. ''' Debug.WriteLine($"{NameOf(valueSByte)}: {valueSByte}, Converted: {valueSByteHex}")
  31. ''' Debug.WriteLine($"{NameOf(valueShort)}: {valueShort}, Converted: {valueShortHex}")
  32. ''' Debug.WriteLine($"{NameOf(valueUShort)}: {valueUShort}, Converted: {valueUShortHex}")
  33. ''' Debug.WriteLine($"{NameOf(valueInteger)}: {valueInteger}, Converted: {valueIntegerHex}")
  34. ''' Debug.WriteLine($"{NameOf(valueUInteger)}: {valueUInteger}, Converted: {valueUIntegerHex}")
  35. ''' Debug.WriteLine($"{NameOf(valueLong)}: {valueLong}, Converted: {valueLongHex}")
  36. ''' Debug.WriteLine($"{NameOf(valueULong)}: {valueULong}, Converted: {valueULongHex}")
  37. ''' </code>
  38. ''' </example>
  39. '''
  40. ''' <typeparam name="T">
  41. ''' The numeric value type.
  42. ''' </typeparam>
  43. '''
  44. ''' <param name="value">
  45. ''' The numeric value to convert.
  46. ''' </param>
  47. '''
  48. ''' <param name="syntax">
  49. ''' The target .NET language syntax to use for the literal prefix (CSharp or VbNet).
  50. ''' </param>
  51. '''
  52. ''' <param name="addLiteralSuffix">
  53. ''' If <see langword="True"/>, appends the language-specific type literal suffix (e.g., 'S' for Short, 'L' for Long).
  54. ''' </param>
  55. '''
  56. ''' <param name="lowerCase">
  57. ''' If <see langword="True"/>, returns the hexadecimal letters in lowercase; otherwise, in uppercase.
  58. ''' <para></para>
  59. ''' Default value is <see langword="False"/>.
  60. ''' </param>
  61. '''
  62. ''' <returns>
  63. ''' A string representing the hexadecimal literal of the given value, formatted according to the specified language and options.
  64. ''' </returns>
  65. <DebuggerStepThrough>
  66. <EditorBrowsable(EditorBrowsableState.Always)>
  67. Public Shared Function ConvertNumberToHexadecimal(Of T As {Structure, IComparable, IFormattable, IConvertible})(value As T,
  68.                                                                                                                syntax As NetDocumentLanguage,
  69.                                                                                                                addLiteralSuffix As Boolean,
  70.                                                                                                                Optional lowerCase As Boolean = False) As String
  71.  
  72.    If Not Information.IsNumeric(value) Then
  73.        Throw New ArgumentException("The specified type must be numeric.")
  74.    End If
  75.  
  76.    Dim strBuilder As New StringBuilder()
  77.  
  78.    Select Case syntax
  79.        Case NetDocumentLanguage.CSharp
  80.            strBuilder.Append("0x")
  81.  
  82.        Case NetDocumentLanguage.VbNet
  83.            strBuilder.Append("&H")
  84.  
  85.        Case Else
  86.            Throw New InvalidEnumArgumentException(argumentName:=NameOf(syntax),
  87.                                                   invalidValue:=syntax,
  88.                                                   enumClass:=GetType(NetDocumentLanguage))
  89.    End Select
  90.  
  91.    Dim strValue As String
  92.    Dim suffix As String = Nothing
  93.    Dim typeCode As TypeCode = Type.GetTypeCode(GetType(T))
  94.    Select Case typeCode
  95.        Case TypeCode.Byte
  96.            strValue = Conversion.CTypeDynamic(Of Byte)(value).ToString(If(lowerCase, "x"c, "X"c))
  97.  
  98.        Case TypeCode.SByte
  99.            strValue = Conversion.CTypeDynamic(Of SByte)(value).ToString(If(lowerCase, "x"c, "X"c))
  100.  
  101.        Case TypeCode.Int16
  102.            strValue = Conversion.CTypeDynamic(Of Short)(value).ToString(If(lowerCase, "x"c, "X"c))
  103.            If syntax = NetDocumentLanguage.VbNet Then
  104.                suffix = "S"
  105.            End If
  106.  
  107.        Case TypeCode.UInt16
  108.            strValue = Conversion.CTypeDynamic(Of UShort)(value).ToString(If(lowerCase, "x"c, "X"c))
  109.            If syntax = NetDocumentLanguage.VbNet Then
  110.                suffix = "US"
  111.            End If
  112.  
  113.        Case TypeCode.Int32
  114.            strValue = Conversion.CTypeDynamic(Of Integer)(value).ToString(If(lowerCase, "x"c, "X"c))
  115.            If syntax = NetDocumentLanguage.VbNet Then
  116.                suffix = "I"
  117.            End If
  118.  
  119.        Case TypeCode.UInt32
  120.            strValue = Conversion.CTypeDynamic(Of UInteger)(value).ToString(If(lowerCase, "x"c, "X"c))
  121.            suffix = If(syntax = NetDocumentLanguage.VbNet, "UI", "U")
  122.  
  123.        Case TypeCode.Int64
  124.            strValue = Conversion.CTypeDynamic(Of Long)(value).ToString(If(lowerCase, "x"c, "X"c))
  125.            suffix = "L"
  126.  
  127.        Case TypeCode.UInt64
  128.            strValue = Conversion.CTypeDynamic(Of ULong)(value).ToString(If(lowerCase, "x"c, "X"c))
  129.            suffix = "UL"
  130.  
  131.        Case Else
  132.            Throw New NotSupportedException($"The type {GetType(T).Name} is not supported for this conversion.")
  133.    End Select
  134.  
  135.    strBuilder.Append(strValue)
  136.  
  137.    If addLiteralSuffix Then
  138.        strBuilder.Append(suffix)
  139.    End If
  140.  
  141.    Return strBuilder.ToString()
  142. End Function

Ejemplo de uso:

Código
  1. Dim syntax As NetDocumentLanguage = NetDocumentLanguage.VbNet
  2. Dim addLiteralSuffix As Boolean = True
  3. Dim lowerCase As Boolean = False
  4.  
  5. Dim valueByte As Byte = Byte.MaxValue
  6. Dim valueSByte As SByte = SByte.MaxValue
  7. Dim valueShort As Short = Short.MaxValue
  8. Dim valueUShort As UShort = UShort.MaxValue
  9. Dim valueInteger As Integer = Integer.MaxValue
  10. Dim valueUInteger As UInteger = UInteger.MaxValue
  11. Dim valueLong As Long = Long.MaxValue
  12. Dim valueULong As ULong = ULong.MaxValue
  13.  
  14. Dim valueByteHex As String = ConvertNumberToHexadecimal(valueByte, syntax, addLiteralSuffix, lowerCase)
  15. Dim valueSByteHex As String = ConvertNumberToHexadecimal(valueSByte, syntax, addLiteralSuffix, lowerCase)
  16. Dim valueShortHex As String = ConvertNumberToHexadecimal(valueShort, syntax, addLiteralSuffix, lowerCase)
  17. Dim valueUShortHex As String = ConvertNumberToHexadecimal(valueUShort, syntax, addLiteralSuffix, lowerCase)
  18. Dim valueIntegerHex As String = ConvertNumberToHexadecimal(valueInteger, syntax, addLiteralSuffix, lowerCase)
  19. Dim valueUIntegerHex As String = ConvertNumberToHexadecimal(valueUInteger, syntax, addLiteralSuffix, lowerCase)
  20. Dim valueLongHex As String = ConvertNumberToHexadecimal(valueLong, syntax, addLiteralSuffix, lowerCase)
  21. Dim valueULongHex As String = ConvertNumberToHexadecimal(valueULong, syntax, addLiteralSuffix, lowerCase)
  22.  
  23. Console.WriteLine($"{NameOf(valueByte)}: {valueByte}, Converted: {valueByteHex}")
  24. Console.WriteLine($"{NameOf(valueSByte)}: {valueSByte}, Converted: {valueSByteHex}")
  25. Console.WriteLine($"{NameOf(valueShort)}: {valueShort}, Converted: {valueShortHex}")
  26. Console.WriteLine($"{NameOf(valueUShort)}: {valueUShort}, Converted: {valueUShortHex}")
  27. Console.WriteLine($"{NameOf(valueInteger)}: {valueInteger}, Converted: {valueIntegerHex}")
  28. Console.WriteLine($"{NameOf(valueUInteger)}: {valueUInteger}, Converted: {valueUIntegerHex}")
  29. Console.WriteLine($"{NameOf(valueLong)}: {valueLong}, Converted: {valueLongHex}")
  30. Console.WriteLine($"{NameOf(valueULong)}: {valueULong}, Converted: {valueULongHex}")

Salida con formato para VB.NET:
Citar
valueByte: 255, Converted: &HFF
valueSByte: 127, Converted: &H7F
valueShort: 32767, Converted: &H7FFFS
valueUShort: 65535, Converted: &HFFFFUS
valueInteger: 2147483647, Converted: &H7FFFFFFFI
valueUInteger: 4294967295, Converted: &HFFFFFFFFUI
valueLong: 9223372036854775807, Converted: &H7FFFFFFFFFFFFFFFL
valueULong: 18446744073709551615, Converted: &HFFFFFFFFFFFFFFFFUL

Salida con formato para C#:
Citar
valueByte: 255, Converted: 0xFF
valueSByte: 127, Converted: 0x7F
valueShort: 32767, Converted: 0x7FFF
valueUShort: 65535, Converted: 0xFFFF
valueInteger: 2147483647, Converted: 0x7FFFFFFF
valueUInteger: 4294967295, Converted: 0xFFFFFFFFU
valueLong: 9223372036854775807, Converted: 0x7FFFFFFFFFFFFFFFL
valueULong: 18446744073709551615, Converted: 0xFFFFFFFFFFFFFFFFUL
6  Programación / .NET (C#, VB.NET, ASP) / Re: Librería de Snippets para VB.NET !! (Compartan aquí sus snippets) en: 28 Octubre 2025, 15:43 pm
Una función universal para resolver un rompecabezas de tipo 'Lights Out':


https://www.logicgamesonline.com/lightsout/

Solucionador online de Lights Out: https://www.dcode.fr/solucionador-lights-out

¿Qué es el juego Lights Outs? (Definición)

Lights Out (o Flip Tiles) es un juego de puzles electrónico que consiste en una cuadrícula de cuadrados iluminados (a veces con bombillas o interruptores) o numerados (originalmente de 5x5). El objetivo es apagar todas las luces de la cuadrícula.

Al principio del juego, se ilumina un patrón de cuadrados (en diferentes estados). Al pulsar uno de los cuadrados, se activa un interruptor, cambiando su estado (de encendido a apagado, de apagado a encendido o de color), al igual que los cuatro cuadrados adyacentes (superiores, derecho, inferior e izquierdo).

El objetivo del juego es apagar (o encender) todas las luces, preferiblemente pulsando el menor número de cuadrados posible.

Este tipo de rompecabezas se puede encontrar en diversas formas pasando desapercibido en muchos video juegos actuales...

La siguiente imagen muestra un rompecabezas tipo 'Lights Out' en el survival horror 'Tormented Souls 2', donde hay un panel/grilla cuadrada de 3x3 cuyas piezas/celdas tienen dos posiciones: vertical y horizontal, y hay que ponerlas todas en vertical para solucionar el rompecabezas:







La siguiente clase contiene:

 - La función principal para resolver un rompecabezas.
 - Una función auxiliar para formatear visualmente un rompecabezas.
 - Una función auxiliar para formatear textualmente los pasos a seguir para resolver un rompecabezas.

Código:
' ***********************************************************************
' Author   : ElektroStudios
' Modified : 28-October-2025
' ***********************************************************************

#Region " Option Statements "

Option Explicit On
Option Strict On
Option Infer Off

#End Region

#Region " Imports "

Imports System.Collections
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.Diagnostics.CodeAnalysis
Imports System.Linq
Imports System.Text

#End Region

#Region " UtilLightsOut "

Namespace Gaming.PuzzleSolving

    ''' <remarks>
    ''' Provides utility methods related with 'Lights Out' puzzles.
    ''' <para></para>
    ''' Lights Out (or Flip Tiles) is an electronic puzzle game consisting of a grid of illuminated
    ''' (sometimes with light bulbs or switches) or numbered (originally 5x5) squares.
    ''' The goal is to turn off all the lights in the grid.
    ''' <para></para>
    ''' At the start of the game, a pattern of squares is illuminated (in different states).
    ''' Pressing one of the squares activates a switch, changing its state
    ''' (from on to off, from off to on, or to a different color),
    ''' as well as the four adjacent squares (up, right, down, and left).
    ''' <para></para>
    ''' The goal of the game is to turn off (or on) all the lights,
    ''' preferably by pressing as few squares as possible.
    ''' </remarks>
    Public NotInheritable Class UtilLightsOut

#Region " Constructors "

        ''' <summary>
        ''' Prevents a default instance of the <see cref="UtilLightsOut"/> class from being created.
        ''' </summary>
        Private Sub New()
        End Sub

#End Region

#Region " Public Methods "

        ''' <summary>
        ''' Solves a 'Lights Out' puzzle board.
        ''' <para></para>
        ''' However, note that not all board configurations have a solution.
        ''' If all rows have a solution except the last one—and this option can be disabled
        ''' by clicking only on the last row—the configuration has a solution;
        ''' otherwise, it is unsolvable.
        ''' <para></para>
        ''' Mathematically, solvability depends on the image of the matrix "A".
        ''' <para></para>
        ''' This is a visual representation of an unsolvable 3x3 board:
        ''' <para></para>◼◻◻   100
        ''' <para></para>◻◼◻   010
        ''' <para></para>◻◻◼   001
        ''' </summary>
        '''
        ''' <param name="board">
        ''' A two-dimensional <see cref="Byte(,)"/> array representing the initial configuration of the 'Lights Out' board grid.
        ''' <para></para>
        ''' Each element corresponds to a cell, where a value of zero indicates the cell is "off",
        ''' and non-zero indicates the cell is "on".
        ''' <para></para>
        ''' For example:
        ''' <code>
        ''' Dim board5x5 As Byte(,) = {
        '''     {1, 1, 0, 1, 1}, ' ◼ ◼ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 0}, ' ◼ ◼ ◻ ◻ ◻
        '''     {1, 0, 0, 1, 1}, ' ◼ ◻ ◻ ◼ ◼
        '''     {0, 1, 1, 0, 0}, ' ◻ ◼ ◼ ◻ ◻
        '''     {0, 0, 1, 0, 1}  ' ◻ ◻ ◼ ◻ ◼
        ''' }
        ''' </code>
        ''' </param>
        '''
        ''' <returns>
        ''' A two-dimensional <see cref="Byte(,)"/> array of the same dimensions as the input board.
        ''' <para></para>
        ''' Each element indicates whether the corresponding cell should be pressed to solve the puzzle:
        ''' 0 means the cell does not need to be pressed, 1 means it should be pressed once.
        ''' <para></para>
        ''' The order of pressing does not matter to solve the puzzle.
        ''' <para></para>
        ''' Example:
        ''' <code>
        ''' ' Input board (1 = on, 0 = off)
        ''' Dim board5x5 As Byte(,) = {
        '''     {1, 1, 0, 1, 1}, ' ◼ ◼ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 0}, ' ◼ ◼ ◻ ◻ ◻
        '''     {1, 0, 0, 1, 1}, ' ◼ ◻ ◻ ◼ ◼
        '''     {0, 1, 1, 0, 0}, ' ◻ ◼ ◼ ◻ ◻
        '''     {0, 0, 1, 0, 1}  ' ◻ ◻ ◼ ◻ ◼
        ''' }
        '''
        ''' ' Solution returned by this function
        ''' Dim solution5x5 As Byte(,) = {
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 0, 0, 1, 1}, ' ◻ ◻ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 1}, ' ◼ ◼ ◻ ◻ ◼
        '''     {0, 1, 0, 0, 0}  ' ◻ ◼ ◻ ◻ ◻
        ''' } ' ◼ = press once,
        '''   ' ◻ = do not press
        ''' </code>
        ''' </returns>
        <DebuggerStepperBoundary>
        Public Shared Function SolveLightsOutPuzzle(board As Byte(,)) As Byte(,)

            ' Get board dimensions
            Dim rows As Integer = board.GetLength(0)
            Dim cols As Integer = board.GetLength(1)
            Dim cells As Integer = rows * cols ' total number of cells.

            ' --- 1) Build the influence matrix "A".
            ' Each row represents the effect of pressing a single cell:
            ' toggling itself and its immediate neighbors (up, down, left, right).
            Dim A As BitArray() = Enumerable.Range(0, cells).Select(
            Function(i)
                Dim r As Integer = i \ cols
                Dim c As Integer = i Mod cols
                Dim row As New BitArray(cells)

                ' Pressing the cell toggles itself.
                row(i) = True

                ' Define neighbor offsets: up, down, left, right.
                Dim dr As Integer() = {-1, 1, 0, 0}
                Dim dc As Integer() = {0, 0, -1, 1}

                ' Toggle neighbors if are inside board bounds.
                For k As Integer = 0 To 3
                    Dim nr As Integer = r + dr(k)
                    Dim nc As Integer = c + dc(k)
                    If nr >= 0 AndAlso nr < rows AndAlso nc >= 0 AndAlso nc < cols Then
                        row(nr * cols + nc) = True
                    End If
                Next k

                Return row
            End Function).ToArray()

            ' --- 2) Build the initial state vector "b".
            ' b(i) = True if the cell is "on" (non-zero), False if "off" (0).
            Dim b As New BitArray(cells)
            For r As Integer = 0 To rows - 1
                For c As Integer = 0 To cols - 1
                    b(r * cols + c) = (board(r, c) <> 0)
                Next c
            Next r

            ' --- 3) Forward elimination (Gaussian elimination mod 2).
            ' Solve the linear system: "A * x = b" (mod 2).
            For i As Integer = 0 To cells - 1
                ' If diagonal is zero, try to swap with a row below.
                If Not A(i)(i) Then
                    For k As Integer = i + 1 To cells - 1
                        If A(k)(i) Then
                            A(i).Xor(A(k)) ' XOR rows (addition mod 2).
                            b(i) = b(i) Xor b(k) ' XOR corresponding element in "b".
                            Exit For
                        End If
                    Next
                End If

                ' Eliminate current column for all rows below.
                For j As Integer = i + 1 To cells - 1
                    If A(j)(i) Then
                        A(j).Xor(A(i))
                        b(j) = b(j) Xor b(i)
                    End If
                Next j
            Next i

            ' --- 4) Back substitution.
            ' Solve for x starting from bottom row.
            Dim x As New BitArray(cells)
            For i As Integer = cells - 1 To 0 Step -1
                ' Start with right-hand side value.
                Dim sum As Boolean = b(i)

                ' Subtract contributions from already solved variables (XOR is subtraction mod 2).
                For j As Integer = i + 1 To cells - 1
                    sum = sum Xor (A(i)(j) AndAlso x(j))
                Next

                ' Assign solution for cell "i".
                x(i) = sum
            Next

            ' --- 5) Build result board (Integer(,)) of 1-based indices to press.
            Dim result(rows - 1, cols - 1) As Byte
            For i As Integer = 0 To cells - 1
                Dim r As Byte = CByte(i \ cols)
                Dim c As Byte = CByte(i Mod cols)
                result(r, c) = CByte(If(x(i), 1, 0)) ' 1 = press, 0 = don't press.
            Next

            Return result
        End Function

        ''' <summary>
        ''' Returns a visual representation of a 'Lights Out' board using custom characters for ON and OFF states.
        ''' </summary>
        '''
        ''' <param name="board">
        ''' A two-dimensional <see cref="Byte"/> array representing the 'Lights Out' board grid.
        ''' <para></para>
        ''' Each element corresponds to a cell, where a value of zero indicates the cell is "off",
        ''' and non-zero indicates the cell is "on".
        ''' <para></para>
        ''' For example:
        ''' <code>
        ''' Dim board5x5 As Byte(,) = {
        '''     {1, 1, 0, 1, 1}, ' ◼ ◼ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 0}, ' ◼ ◼ ◻ ◻ ◻
        '''     {1, 0, 0, 1, 1}, ' ◼ ◻ ◻ ◼ ◼
        '''     {0, 1, 1, 0, 0}, ' ◻ ◼ ◼ ◻ ◻
        '''     {0, 0, 1, 0, 1}  ' ◻ ◻ ◼ ◻ ◼
        ''' }
        ''' </code>
        ''' </param>
        '''
        ''' <param name="onChar">
        ''' Optional.The character used to represent an ON (active) light.
        ''' <para></para>
        ''' Default is "◼"
        ''' </param>
        '''
        ''' <param name="offChar">
        ''' Optional. The character used to represent an OFF (inactive) light.
        ''' <para></para>
        ''' Default is "◻"
        ''' </param>
        '''
        ''' <returns>
        ''' A formatted <see cref="String"/> that visually represents the current 'Lights Out' board.
        ''' <para></para>
        ''' Example:
        ''' <code>
        ''' ' Input board (1 = on, 0 = off)
        ''' Dim board5x5 As Byte(,) = {
        '''     {1, 1, 0, 1, 1},
        '''     {1, 1, 0, 0, 0},
        '''     {1, 0, 0, 1, 1},
        '''     {0, 1, 1, 0, 0},
        '''     {0, 0, 1, 0, 1}
        ''' }
        '''
        ''' Format returned (◼ = on, ◻ = off):
        '''
        ''' ◼ ◼ ◻ ◼ ◼
        ''' ◼ ◼ ◻ ◻ ◻
        ''' ◼ ◻ ◻ ◼ ◼
        ''' ◻ ◼ ◼ ◻ ◻
        ''' ◻ ◻ ◼ ◻ ◼
        ''' </code>
        ''' </returns>
        <DebuggerStepperBoundary>
        Public Shared Function FormatLightsOutBoard(board As Byte(,),
                                                    Optional onChar As Char = "◼"c,
                                                    Optional offChar As Char = "◻"c) As String

            Dim rows As Integer = board.GetLength(0)
            Dim cols As Integer = board.GetLength(1)
            Dim maxCapacity As Integer = (rows * (cols * 2)) + rows ' (cells + white-spaces + line breaks)

            Dim sb As New StringBuilder(capacity:=maxCapacity, maxCapacity:=maxCapacity)

            For r As Integer = 0 To rows - 1
                For c As Integer = 0 To cols - 1
                    sb.Append(If(board(r, c) <> 0, onChar, offChar))
                    If c < (cols - 1) Then
                        sb.Append(" "c)
                    End If
                Next
                If r < (rows - 1) Then
                    sb.AppendLine()
                End If
            Next

            Return sb.ToString()
        End Function

        ''' <summary>
        ''' Returns a human-readable list of steps required to solve a 'Lights Out' puzzle board.
        ''' </summary>
        '''
        ''' <param name="board">
        ''' A two-dimensional <see cref="Byte"/> array representing the 'Lights Out' solution grid.
        ''' <para></para>
        ''' Each non-zero cell indicates that the corresponding cell should be pressed once.
        ''' <para></para>
        ''' For example:
        ''' <code>
        ''' Dim solution5x5 As Byte(,) = {
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 0, 0, 1, 1}, ' ◻ ◻ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 1}, ' ◼ ◼ ◻ ◻ ◼
        '''     {0, 1, 0, 0, 0}  ' ◻ ◼ ◻ ◻ ◻
        ''' } ' 1/◼ = press once,
        '''   ' 0/◻ = do not press
        ''' </code>
        ''' </param>
        '''
        ''' <returns>
        ''' A formatted <see cref="String"/> describing which cells to press, grouped by row.
        ''' <para></para>
        ''' Includes a total count of all required presses.
        ''' <para></para>
        ''' Example:
        ''' <code>
        ''' ' Input solution board.
        ''' Dim solution5x5 As Byte(,) = {
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 1, 1, 1, 0}, ' ◻ ◼ ◼ ◼ ◻
        '''     {0, 0, 0, 1, 1}, ' ◻ ◻ ◻ ◼ ◼
        '''     {1, 1, 0, 0, 1}, ' ◼ ◼ ◻ ◻ ◼
        '''     {0, 1, 0, 0, 0}  ' ◻ ◼ ◻ ◻ ◻
        ''' } ' 1/◼ = press once,
        '''   ' 0/◻ = do not press
        '''  
        ''' ' Example output:
        ''' Row 1, Cells: 2, 3, 4
        ''' Row 2, Cells: 2, 3, 4
        ''' Row 3, Cells: 4, 5
        ''' Row 4, Cells: 1, 2, 5
        ''' Row 5, Cell: 2
        '''
        ''' Total presses: 12
        ''' </code>
        ''' </returns>
        <DebuggerStepperBoundary>
        Public Shared Function FormatLightsOutSolutionSteps(board As Byte(,)) As String

            Dim rows As Integer = board.GetLength(0)
            Dim cols As Integer = board.GetLength(1)

            Dim sb As New StringBuilder()
            Dim totalPresses As Integer = 0

            For r As Integer = 0 To rows - 1
                Dim pressedCells As New List(Of Integer)

                For c As Integer = 0 To cols - 1
                    If board(r, c) <> 0 Then
                        pressedCells.Add(c + 1)
                        totalPresses += 1
                    End If
                Next

                If pressedCells.Count > 0 Then
                    sb.AppendLine($"Row {r + 1}, Cells: {String.Join(", ", pressedCells)}")
                End If
            Next

            If totalPresses = 0 Then
                sb.AppendLine("No presses needed — all lights are already off.")
            Else
                sb.AppendLine().AppendLine($"Total presses: {totalPresses}")
            End If

            Return sb.ToString()
        End Function

#End Region

    End Class

End Namespace

#End Region

Este código funciona con rompecabezas tradicionales Lights Out que utilizan dos estados binarios: encendido (on) y apagado (off). Tanto cuadrados,  como rectangulares.

PD: La implementación matemática subyacente fue generada en su totalidad por ChatGPT.



Modo de empleo:

Código:
Dim board5x5 As Byte(,) = {
     {1, 1, 0, 1, 1}, ' ◼ ◼ ◻ ◼ ◼
     {1, 1, 0, 0, 0}, ' ◼ ◼ ◻ ◻ ◻
     {1, 0, 0, 1, 1}, ' ◼ ◻ ◻ ◼ ◼
     {0, 1, 1, 0, 0}, ' ◻ ◼ ◼ ◻ ◻
     {0, 0, 1, 0, 1}  ' ◻ ◻ ◼ ◻ ◼
}

Dim solvedBoard As Byte(,) = UtilLightsOut.SolveLightsOutPuzzle(board5x5)

Dim formattedSolution As String = UtilLightsOut.FormatLightsOutBoard(solvedBoard)
formattedSolution &= String.Concat(Enumerable.Repeat(Environment.NewLine, 2)) &
                                   "◼ = Press once" & Environment.NewLine &
                                   "◻ = Do not press"

MessageBox.Show(formattedSolution)

Cita de: MessageBox.Show(formattedSolution)



O con un formato más textual, coherente con el estilo técnico de un informe de solución:

Código:
...
Dim solvedBoard As Byte(,) = UtilLightsOut.SolveLightsOutPuzzle(board5x5)
Dim formattedSolution As String = UtilLightsOut.FormatLightsOutSolutionSteps(solvedBoard)

Console.WriteLine(formattedSolution)

Salida:
Citar
Row 1, Cells 2, 3, 4
Row 2, Cells 2, 3, 4
Row 3, Cells 4, 5
Row 4, Cells 1, 2, 5
Row 5, Cell 2

Total presses: 12

7  Informática / Hardware / Re: DVDS GRABADOS EN COMBO DVD PASAR A UN FORMATO LEGIBLE en: 22 Octubre 2025, 10:54 am
Si deseas extraer y unir el contenido (pista de audio y video) de un DVD y hacerlo sin pérdida de calidad (lossless) para guardarlo en un formato de contenedor de video estándar como sería MKV (Matroska Video), entonces te recomiendo utilizar cualquiera de los siguientes programas:

  🔸 MakeMKV: https://www.makemkv.com/download/
  🔸 MKVToolnix: https://mkvtoolnix.download/downloads.html#windows

Ambos son gratuitos y fáciles de usar. En realidad MakeMKV es freemium pero para lo que tú lo quieres es completamente gratuito y funcional, y, además, es la opción preferible y la más sofisticada entre estos dos programas.

Opcionalmente también podrías utilizar ciertos programas para llevar a cabo un proceso de codificación de video, para convertir de MPEG2 (DVD), al estándar AVC/MPEG4, como por ejemplo Handbrake o FarmatFactory, sin embargo, este proceso implica la recomprensión del video, lo que conlleva una pérdida de calidad cuya perceptibilidad dependerá de los parámetros que utilices durante la codificación. Está claro que no tienes experiencia, así que no te lo recomiendo... a menos que realmente no te importase perder calidad de imagen del DVD. Pero lo que yo te he propuesto no implica ningún procedimiento de conversión de video, simplemente es un proceso de remultiplexación.

Atentamente,
Elektro.
8  Seguridad Informática / Seguridad / Re: VPN o programa que ubique mi IP en otra calle o barrio en: 26 Septiembre 2025, 13:06 pm
Vaya por delante que en temas relacionados con la privacidad y ciber seguridad tengo muchas flaquezas y puedo cometer errores, pero creo que puedo ofrecerte una respuesta que te sirva de mucha utilidad a falta de ninguna respuesta profesional por el momento...

Primero vamos a separar conceptos, por un lado están las VPN, que terminan enmascarando tu IP pública y por ende los servicios y sitios web te ubican en función de la IP de la región del servidor VPN (país/ciudad aproximada). Y por otro lado está el "GPS spoofing" o simulación de ubicación de GPS, que directamente altera las coordenadas que se reciben del hardware GPS para falsear tu ubicación por GPS.

Aquí el problema principal radica en que los PCs convencionales no tienen un dispositivo GPS integrado. Microsoft determina tu ubicación física en función de la IP y redes Wi-Fi cercanas, como se explica en el siguiente artículo oficial:

 ➔ https://support.microsoft.com/es-es/windows/windows-location-service-and-privacy-3a8eee0a-5b0b-dc07-eede-2a5ca1c49088

En el artículo además se dan indicaciones para explicarte como puedes modificar la ubicación predeterminada en la configuración de Windows. En teoría esa ubicación predeterminada solamente se utilizará cuando no sea posible determinar tu ubicación con mayor precisión.

Sin embargo, puedes conectar un GPS externo por USB a tu PC, y entonces tal vez si, podrías utilizar alguna aplicación de GPS spoofing como por ejemplo esta: https://apps.microsoft.com/detail/9p5rqldq3ln4 - No lo he probado ya que no tengo dispositivo GPS.

También se podría falsificar mediante el desarrollo de un driver que emule un dispositivo receptor GPS (es decir, crear un dispositivo virtual que actúa como si fuera un GPS real). Aquí un ejemplo: https://github.com/juliankay/FakeGPS - y aquí la descarga directa del programa/driver: https://github.com/juliankay/FakeGPS/releases/download/v1.0.0-alpha2/FakeGPS-v1.0.0-alpha2.zip

No lo he probado tampoco (no me apetece instalar un driver de terceros), pero el modo de empleo es muy sencillo:

Command Line Options

Usage: FakeGPS -command
Código:
FakeGPS -g              get current status
FakeGPS -s <lat,long>   set latitude and longitude

Probablemente este driver le sirva a cualquiera como forma definitiva para falsificar la ubicación GPS.



Ahora bien, lo que he mencionado sobre el GPS estaba relacionado con llevar a cabo una falsificación de ubicación GPS a nivel global de sistema/hardware. Si tu única intención es engañar a la API de geolocalización de Google dentro del navegador actual, que es el servicio que la mayoría de sitios webs utilizan para determinar tu ubicación por "GPS", esto resulta más sencillo usando la API de javascript que forma parte del propio navegador...

Para Firefox y Chrome puedes instalar la extensión 'Spoof Geolocation':

 ➔ https://addons.mozilla.org/en-US/firefox/addon/spoof-geolocation/
 ➔ https://chromewebstore.google.com/detail/spoof-geolocation/ihdobppgelceaoeojmhpmbnaljhhmhlc

(existen otras alternativas de pago, como 'Location Guard')

Después de instalar la extensión, la activas (no desactives los permisos de acceso a todos los sitios web, o dejará de funcionar), te diriges a esta página web: https://webbrowsertools.com/geolocation/ y por último introduces las coordenadas que quieras.

Para ubicarte en el Estadio Olímpico de Monjuic deberías introducir las siguientes coordenadas: 41.365194,2.155611,17z



Y esto será lo que Reportará la API de geolocalización de Google:







Si alguna vez necesitas modificar la geolocalización en esta extensión, no he encontrado una forma sencilla, ni eliminando cookies ni preferencias. Lo único que me ha funcionado es desinstalar y reinstalar la extensión, o directamente eliminar manualmente los archivos de la extensión, que en mi caso se encuentran ubicados en:
Código:
C:\Users\***\AppData\Roaming\Mozilla\Firefox\Profiles\***\storage\default\moz-extension+++641400e4-592e-46c4-aad3-d72870ebfeb9^userContextId=4294967295\idb
Y ahora sí, al volver a acceder al sitio web https://webbrowsertools.com/geolocation/ te volverá a pedir introducir coordenadas.

Ten en cuenta que este procedimiento no engañará a la API de geolocalización de Microsoft:

 ➔ https://www.bing.com/maps

(al entrar en ese sitio web debería mostrarse un mapa de tu geolocalización real)

Espero que te haya servido de algo.

Atentamente,
Elektro.
9  Seguridad Informática / Seguridad / Re: wise risk cleaner y wise registry cleaner en: 25 Septiembre 2025, 20:19 pm
1) No entiendo muy bien eso de : Descargas el CCleaner por un lado, lo instalas, descargas el CCenhancer y lo colocas en el directorio donde hayas instalado CCleaner, ejecutas el CCenhancer -solamente una única vez- y le das al botoncito en el programa para descargar/generar el archivo WinApp2.Ini, y ya puedes empezar a usar el CCleaner mejorado

2) Ccleaner permite modificar una vez descargado al español ?

Llegados a este punto lo mejor es que mires un tutorial en Youtube, como por ejemplo:

Ccleaner y Ccenhacer detallado


How to use CCEnhancer with CCleaner to Remove More Junk Files
10  Seguridad Informática / Seguridad / Re: wise risk cleaner y wise registry cleaner en: 25 Septiembre 2025, 10:09 am
Te agradezco mucho compañero Elektro por la información actualizada, el Argente Registry Cleaner lo he usado por última vez en el año 2017 ya ves tu hace cuánto tiempo, por eso no sabía que versiones actuales eran de pago ni que habían cambiado su interfaz gráfica, que por cirrto la que tenía antes era mucho mejor, más intuitiva y mejor diseño.

Es comprensible y era obvio, de repente hacen un cambio drástico en la interfaz gráfica y no hay por qué saberlo, no hay de qué preocuparse. Además en la mayoría de imágenes que aparecen en Google son de esas versiones antiguas, a mi también me confundió un poco al principio xD.

Y sí, menudo mojón de interfaz gráfica tiene ahora, siendo honestos, es demasiado abstracto todo, antes todos los detalles estaban al alcance de la vista, haciéndolo más fácil y productivo, mucho mejor en general.

1) los 2 son gratis ?
2) descargando los 2 no tengo que "fusionarlos" para que como dijiste "usar CCleaner con CCEnhancer (WinApp2.Ini) y adicionalmente reglas personales definidas" ?
3) a que te refieres con reglas personales definidas ?

1. CCleaner no es completamente gratis, es freemium. Pero para lo que lo necesitas te sirve la versión "gratis" (freemium) sin pasar por caja. 💰

2. El procedimiento es el siguiente: Descargas el CCleaner por un lado, lo instalas, descargas el CCenhancer y lo colocas en el directorio donde hayas instalado CCleaner, ejecutas el CCenhancer -solamente una única vez- y le das al botoncito en el programa para descargar/generar el archivo WinApp2.Ini, y ya puedes empezar a usar el CCleaner mejorado.

3. CCleaner permite especificar reglas de limpieza personalizadas, por ejemplo: 'Quiero borrar todos los archivos *.txt en el directorio "C:\basura temporal\"'.



es mejor que me quede con el Wise Registry Cleaner y utilice si es facil la combinacion de CCleaner con CCEnhancer (WinApp2.Ini) y adicionalmente reglas personales definidas.

Sí, para limpiar el registro Wise Registry Cleaner es mejor que CCleaner. El Argente también. Usa el que te parezca más fácil. Y no tienes por qué complicarte la vida con reglas personales definidas en el CCLeaner, es algo opcional.
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 1256
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines