SHARE
TWEET

Untitled

a guest Jun 20th, 2019 64 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. AWarn.DefaultValues = { awarn_kick = 1, awarn_kick_threshold = 3, awarn_ban = 1, awarn_ban_threshold = 5, awarn_ban_time = 30, awarn_decay = 1, awarn_decay_rate = 30, awarn_reasonrequired = 1 }
  2.  
  3. local loc = AWarn.localizations.localLang
  4.  
  5.  
  6. util.AddNetworkString("SendPlayerWarns")
  7. util.AddNetworkString("SendOwnWarns")
  8. util.AddNetworkString("AWarnMenu")
  9. util.AddNetworkString("AWarnClientMenu")
  10. util.AddNetworkString("AWarnOptionsMenu")
  11. util.AddNetworkString("AWarnNotification")
  12. util.AddNetworkString("AWarnNotification2")
  13. util.AddNetworkString("AWarnChatMessage")
  14. util.AddNetworkString("awarn_openoptions")
  15. util.AddNetworkString("awarn_openmenu")
  16. util.AddNetworkString("awarn_fetchwarnings")
  17. util.AddNetworkString("awarn_fetchwarnings_byid")
  18. util.AddNetworkString("awarn_fetchownwarnings")
  19. util.AddNetworkString("awarn_deletesinglewarn")
  20. util.AddNetworkString("awarn_deletewarningsid")
  21. util.AddNetworkString("awarn_deletewarnings")
  22. util.AddNetworkString("awarn_removewarningsid")
  23. util.AddNetworkString("awarn_removewarnings")
  24. util.AddNetworkString("awarn_removewarn")
  25. util.AddNetworkString("awarn_warn")
  26. util.AddNetworkString("awarn_warnid")
  27. util.AddNetworkString("awarn_changeconvarbool")
  28. util.AddNetworkString("awarn_changeconvar")
  29. util.AddNetworkString("Casier:Warn:Sanction")
  30. util.AddNetworkString("Casier:Warn:Msg")
  31.  
  32.  
  33. function awarn_loadscript()
  34.     awarn_tbl_exist()
  35. end
  36. hook.Add( "Initialize", "Awarn_Initialize", awarn_loadscript )
  37.  
  38.  
  39. function awarn_kick( ply, message )
  40.     if ulx then
  41.         ULib.kick( ply, message )
  42.     else
  43.         ply:Kick( message )
  44.     end
  45. end
  46.  
  47. function awarn_ban( ply, time, message )
  48.     if ulx then
  49.         ULib.kickban( ply, time, message )
  50.     else
  51.         ply:Ban( time, true, message )
  52.     end
  53. end
  54.  
  55. function awarn_playerdisconnected( ply )
  56.     timer.Remove( ply:SteamID64() .. "_awarn_decay" )
  57. end
  58. hook.Add( "PlayerDisconnected", "awarn_playerdisconnected", awarn_playerdisconnected )
  59.  
  60. net.Receive( "awarn_fetchwarnings", function( l, ply )
  61.  
  62.     if not awarn_checkadmin_view( ply ) then
  63.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  64.         return
  65.     end
  66.     local player_type = net.ReadString()
  67.     local player_target = net.ReadString()
  68.     if player_type == "playername" then
  69.         local target_ply = awarn_getUser( player_target )
  70.  
  71.         if target_ply then
  72.             awarn_sendwarnings( ply, target_ply )
  73.         else
  74.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl37)
  75.         end
  76.     elseif player_type == "playerid" then
  77.         awarn_sendwarnings_id( ply, player_target )
  78.     end
  79.  
  80. end )
  81.  
  82. net.Receive( "awarn_fetchownwarnings", function( l, ply )
  83.  
  84.     awarn_sendownwarnings( ply )
  85.  
  86. end )
  87.  
  88. net.Receive( "awarn_changeconvarbool", function( l, ply )
  89.  
  90.     local allowed = { "awarn_kick", "awarn_ban", "awarn_decay", "awarn_reasonrequired", "awarn_reset_warnings_after_ban", "awarn_logging" }
  91.     local convar = net.ReadString()
  92.     local val = net.ReadString()
  93.  
  94.     if not awarn_checkadmin_options( ply ) then
  95.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  96.         return
  97.     end
  98.  
  99.     if not table.HasValue( allowed, convar ) then
  100.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv2)
  101.         return
  102.     end
  103.  
  104.     if val == "true" then
  105.         GetConVar( convar ):SetBool( false )
  106.         return
  107.     end
  108.     GetConVar( convar ):SetBool( true )
  109.  
  110. end )
  111.  
  112. net.Receive( "awarn_changeconvar", function( l, ply )
  113.  
  114.     local allowed = { "awarn_kick_threshold", "awarn_ban_threshold", "awarn_ban_time", "awarn_decay_rate" }
  115.     local convar = net.ReadString()
  116.     local val = net.ReadInt(32)
  117.  
  118.     if not awarn_checkadmin_options( ply ) then
  119.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  120.         return
  121.     end
  122.  
  123.     if not table.HasValue( allowed, convar ) then
  124.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv2)
  125.         return
  126.     end
  127.  
  128.     if val < 0 then
  129.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv3)
  130.         return
  131.     end
  132.  
  133.     GetConVar( convar ):SetInt( val )
  134.  
  135. end )
  136.  
  137. function AWSendMessage( ply, message )
  138.     if IsValid(ply) then
  139.         ply:PrintMessage( HUD_PRINTTALK, message )
  140.     else
  141.         print( message )
  142.     end
  143. end
  144.  
  145. function AWarn_ChatWarn( ply, text, public )
  146.     if (string.sub(string.lower(text), 1, string.len( AWarn.Command ) ) == AWarn.Command ) then
  147.         local args = string.Explode( " ", text )
  148.         if #args == 1 then
  149.             ply:ConCommand( "awarn_menu" )
  150.         else
  151.             table.remove( args, 1 )
  152.             awarn_con_warn( ply, _, args )
  153.         end
  154.         return false
  155.     end
  156. end
  157. hook.Add( "PlayerSay", "AWarn_ChatWarn", AWarn_ChatWarn )
  158.  
  159. function awarn_con_warn( ply, _, args )
  160.  
  161.     if not ( #args >= 1 ) then return end
  162.     local tar = awarn_getUser( args[1] )
  163.     local reason = table.concat( args, " ", 2 )
  164.  
  165.     if (string.sub(string.lower(args[1]), 1, 5) == "steam") then
  166.         if string.len(args[1]) == 7 then
  167.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl36)
  168.             return
  169.         end
  170.         tid = AWarn_ConvertSteamID( args[1] )
  171.         awarn_warnplayerid( ply, tid, reason )
  172.         return
  173.     end
  174.  
  175.     if not (IsValid(tar)) then return end
  176.     awarn_warnplayer( ply, tar, reason )
  177.  
  178. end
  179. concommand.Add( "awarn_warn", awarn_con_warn )
  180.  
  181.  
  182. net.Receive( "awarn_warn", function( l, ply )
  183.  
  184.     awarn_warnplayer( ply, net.ReadEntity(), net.ReadString() )
  185.  
  186. end )
  187.  
  188. net.Receive( "awarn_warnid", function( l, ply )
  189.  
  190.     awarn_warnplayerid( ply, net.ReadString(), net.ReadString() )
  191.  
  192. end )
  193.  
  194.  
  195. function awarn_warnplayer( ply, tar, reason )
  196.  
  197.     if not awarn_checkadmin_warn( ply ) then
  198.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  199.         return
  200.     end
  201.  
  202.     if table.HasValue( AWarn.userBlacklist, tar:SteamID() ) then
  203.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv9)
  204.         return
  205.     end
  206.  
  207.     if table.HasValue( AWarn.groupBlacklist, tar:GetUserGroup() ) then
  208.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv10)
  209.         return
  210.     end
  211.  
  212.     if awarn_checkadmin_warn( tar ) and not GetConVar("awarn_allow_warnadmin"):GetBool() then
  213.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv4)
  214.         return
  215.     end
  216.  
  217.     target_ply = tar
  218.     if reason == nil then reason = "" end
  219.  
  220.     if not IsValid(target_ply) then return end
  221.     if not target_ply:IsPlayer() then return end
  222.  
  223.     --if tobool(GetGlobalInt( "awarn_reasonrequired", 1 )) then
  224.     if GetConVar("awarn_reasonrequired"):GetBool() then
  225.         if not reason then
  226.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv5)
  227.             return
  228.         end
  229.         if reason == "" then
  230.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv5)
  231.             return
  232.         end
  233.     end
  234.  
  235.     if not reason then reason = "NONE GIVEN" end
  236.     if reason == "" then reason = "NONE GIVEN" end
  237.  
  238.     if target_ply then
  239.         for k, v in pairs(player.GetAll()) do
  240.             if v ~= target_ply then
  241.                 net.Start("AWarnNotification")
  242.                     net.WriteEntity( ply )
  243.                     net.WriteEntity( target_ply )
  244.                     net.WriteString( reason )
  245.                 net.Send( v )
  246.             end
  247.         end
  248.  
  249.  
  250.         if IsValid(ply) then
  251.             awarn_addwarning( target_ply:SteamID64(), reason, ply:Nick() )
  252.             ServerLog( "[Casier] " .. ply:Nick() .. " à averti(e) " .. target_ply:Nick() .. " pour la raison: " .. reason.. "\n" )
  253.             if GetConVar("awarn_logging"):GetBool() then
  254.                 awarn_log( ply:Nick() .. " à averti(e) " .. target_ply:Nick() .. " pour la raison: " .. reason )
  255.             end
  256.         else
  257.             awarn_addwarning( target_ply:SteamID64(), reason, "[CONSOLE]" )
  258.             ServerLog( "[Casier] [CONSOLE] à averti(e) " .. target_ply:Nick() .. " pour la raison: " .. reason.. "\n" )
  259.             if GetConVar("awarn_logging"):GetBool() then
  260.                 awarn_log( "[CONSOLE] à averti(e) " .. target_ply:Nick() .. " pour la raison: " .. reason )
  261.             end
  262.         end
  263.         awarn_incwarnings( target_ply )
  264.  
  265.         local t1 = {}
  266.         if IsValid( ply ) then
  267.             t1 = { Color(60,60,60), "[", Color(30,90,150), "Casier", Color(60,60,60), "] ", Color(255,255,255), AWarn.localizations[loc].sv6 .. " ", ply, ": ", Color(150,40,40), reason }
  268.         else
  269.             t1 = { Color(60,60,60), "[", Color(30,90,150), "Casier", Color(60,60,60), "] ", Color(255,255,255), AWarn.localizations[loc].sv6 .. " ", Color(100,100,100), "[CONSOLE]", Color(255,255,255), ": ", Color(150,40,40), reason }
  270.         end
  271.         net.Start("AWarnChatMessage") net.WriteTable(t1) net.Send( target_ply )
  272.  
  273.         local t5 = { Color(60,60,60), "[", Color(30,90,150), "Casier", Color(60,60,60), "] ", Color(255,255,255), AWarn.localizations[loc].sv7 }
  274.         net.Start("AWarnChatMessage") net.WriteTable(t5) net.Send( target_ply )
  275.  
  276.         if IsValid( ply ) then
  277.             awarn_sendwarnings( ply, target_ply )
  278.         end
  279.  
  280.         local AWarnPlayerWarned = hook.Call( "AWarnPlayerWarned", GAMEMODE, target_ply, ply, reason )
  281.  
  282.     else
  283.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl37)
  284.     end
  285.  
  286. end
  287.  
  288. function awarn_warnplayerid( ply, tarid, reason )
  289.  
  290.     if not awarn_checkadmin_warn( ply ) then
  291.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  292.         return
  293.     end
  294.  
  295.     if table.HasValue( AWarn.userBlacklist, util.SteamIDFrom64( tarid ) ) then
  296.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv9)
  297.         return
  298.     end
  299.  
  300.     if GetConVar("awarn_reasonrequired"):GetBool() then
  301.         if not reason then
  302.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv5)
  303.             return
  304.         end
  305.         if reason == "" then
  306.             AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv5)
  307.             return
  308.         end
  309.     end
  310.  
  311.     if not reason then reason = "NONE GIVEN" end
  312.     if reason == "" then reason = "NONE GIVEN" end
  313.  
  314.     local tar_name = tarid
  315.     local tar_ply = nil
  316.     for k, v in pairs( player.GetAll() ) do
  317.         if v:SteamID64() == tostring(tarid) then
  318.             tar_name = v:Nick()
  319.             tar_ply = v
  320.             awarn_warnplayer( ply, tar_ply, reason )
  321.             return
  322.         end
  323.     end
  324.  
  325.     if not tar_ply then tar_ply = game.GetWorld() end
  326.     for k, v in pairs(player.GetAll()) do
  327.         if v ~= tar_ply then
  328.             net.Start("AWarnNotification")
  329.                 net.WriteEntity( ply )
  330.                 net.WriteEntity( tar_ply )
  331.                 net.WriteString( reason )
  332.                 net.WriteString( tostring(tarid) )
  333.             net.Send( v )
  334.         end
  335.     end
  336.  
  337.  
  338.     if IsValid(ply) then
  339.         awarn_addwarning( tarid, reason, ply:Nick() )
  340.         ServerLog( "[Casier] " .. ply:Nick() .. " warned " .. tostring(tar_name) .. " for reason: " .. reason.. "\n" )
  341.         if GetConVar("awarn_logging"):GetBool() then
  342.             awarn_log( ply:Nick() .. " warned " .. tostring(tar_name) .. " for reason: " .. reason )
  343.         end
  344.     else
  345.         awarn_addwarning( tarid, reason, "[CONSOLE]" )
  346.         ServerLog( "[Casier] [CONSOLE] warned " .. tostring(tar_name) .. " for reason: " .. reason.. "\n" )
  347.         if GetConVar("awarn_logging"):GetBool() then
  348.             awarn_log( "[CONSOLE] warned " .. tostring(tar_name) .. " for reason: " .. reason )
  349.         end
  350.     end
  351.     awarn_incwarningsid( tarid )
  352.  
  353.     local AWarnPlayerIDWarned = hook.Call( "AWarnPlayerIDWarned", GAMEMODE, tarid, ply, reason )
  354. end
  355.  
  356. function awarn_remwarn( ply, tar )
  357.  
  358.     if not awarn_checkadmin_remove( ply ) then
  359.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  360.         return
  361.     end
  362.  
  363.     local target_ply = awarn_getUser( tar )
  364.  
  365.     if target_ply then
  366.         awarn_decwarnings( target_ply, ply )
  367.         if IsValid( ply ) then
  368.             awarn_sendwarnings( ply, target_ply )
  369.         end
  370.     else
  371.         AWSendMessage( ply, "Casier: Player not found!")
  372.     end
  373.  
  374. end
  375.  
  376. net.Receive( "awarn_removewarnid", function( l, ply )
  377.  
  378.     if not awarn_checkadmin_remove( ply ) then
  379.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  380.         return
  381.     end
  382.  
  383.     local uid = net.ReadString()
  384.     awarn_decwarningsid( uid, ply )
  385.  
  386. end )
  387.  
  388. net.Receive( "awarn_removewarn", function( l, ply )
  389.     if not IsValid( ply ) then return end
  390.     local p_id = net.ReadString()
  391.  
  392.     if (string.sub(string.lower( p_id ), 1, 5) == "steam") then
  393.         if string.len(args[1]) == 7 then
  394.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl36)
  395.             return
  396.         end
  397.         id = AWarn_ConvertSteamID( p_id )
  398.         awarn_decwarningsid( id, ply )
  399.         return
  400.     end
  401.     awarn_remwarn( ply, p_id )
  402.  
  403. end )
  404.  
  405. net.Receive( "awarn_deletewarnings", function( l, ply )
  406.  
  407.     if not awarn_checkadmin_delete( ply ) then
  408.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  409.         return
  410.     end
  411.  
  412.     local target_ply = awarn_getUser( net.ReadString() )
  413.  
  414.     if target_ply then
  415.         awarn_delwarnings( target_ply, ply )
  416.     else
  417.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl37)
  418.     end
  419.  
  420. end )
  421.  
  422. concommand.Add( "awarn_deletewarnings", function( ply, _, args )
  423.     if IsValid(ply) then return end
  424.     if #args ~= 1 then return end
  425.     local target_ply = awarn_getUser( args[1] )
  426.  
  427.     if target_ply then
  428.         awarn_delwarnings( target_ply, ply )
  429.     else
  430.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].cl37)
  431.     end
  432. end )
  433.  
  434. net.Receive( "awarn_deletewarningsid", function( l, ply )
  435.     if not awarn_checkadmin_delete( ply ) then
  436.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  437.         return
  438.     end
  439.  
  440.     local uid = net.ReadString()
  441.  
  442.     awarn_delwarningsid( uid, ply )
  443. end )
  444.  
  445. concommand.Add( "awarn_deletewarningsid", function( ply, _, args )
  446.     if IsValid(ply) then return end
  447.     if #args ~= 1 then return end
  448.  
  449.     local uid = args[1]
  450.     awarn_delwarningsid( uid, ply )
  451. end )
  452.  
  453. net.Receive( "awarn_openmenu", function( l, ply )
  454.  
  455.     if not IsValid( ply ) then
  456.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv8)
  457.         return
  458.     end
  459.  
  460.     if not awarn_checkadmin_view( ply ) then
  461.         net.Start("AWarnClientMenu")
  462.         net.Send( ply )
  463.         return
  464.     end
  465.  
  466.  
  467.     net.Start("AWarnMenu")
  468.     net.Send( ply )
  469.  
  470. end )
  471.  
  472. net.Receive( "awarn_openoptions", function( l, ply )
  473.  
  474.     if not IsValid( ply ) then
  475.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv8)
  476.         return
  477.     end
  478.  
  479.     if not awarn_checkadmin_options( ply ) then
  480.         AWSendMessage( ply, "Casier: " .. AWarn.localizations[loc].sv1)
  481.         return
  482.     end
  483.  
  484.  
  485.     net.Start("AWarnOptionsMenu")
  486.     net.Send( ply )
  487.  
  488. end )
  489.  
  490. net.Receive( "awarn_deletesinglewarn", function( l, ply )
  491.  
  492.     if not awarn_checkadmin_delete( ply ) then
  493.         AWSendMessage( ply, "AWarn: " .. AWarn.localizations[loc].sv1)
  494.         return
  495.     end
  496.  
  497.     local warningid = net.ReadInt(16)
  498.  
  499.     awarn_delsinglewarning( ply, warningid )
  500.  
  501. end )
  502.  
  503. AWarn.PunishmentSequence = AWarn.PunishmentSequence or {}
  504.  
  505. function AWarn.RegisterPunishment( TBL )
  506.     AWarn.PunishmentSequence[ TBL.NumberOfWarnings ] = TBL
  507. end
  508.  
  509. local files, dirs = file.Find("awarn/modules/*.lua", "LUA")
  510. for k, v in pairs( files ) do
  511.     ServerLog("AWarn: Loading module (" .. v .. ")\n")
  512.     include( "awarn/modules/" .. v )
  513. end
  514.  
  515. local function GetPlayerByName( strName )
  516.     local strEnt = Entity( 0 )
  517.  
  518.     for k,v in pairs( player.GetAll() ) do
  519.         if v:Nick() == strName then
  520.             strEnt = v
  521.             break
  522.         end
  523.     end
  524.  
  525.     return strEnt
  526. end
  527.  
  528. net.Receive( "Casier:Warn:Sanction", function( _, pPlayer )
  529.     if !awarn_checkadmin_view( ply ) then return end
  530.  
  531.     local strName = net.ReadString()
  532.     local strKey = net.ReadString()
  533.     local strRaison = net.ReadString() or ""
  534.  
  535.     if !AWarn.Raisons[ strKey ] then return end
  536.  
  537.     local pVictim = GetPlayerByName( strName )
  538.  
  539.     if !IsValid( pVictim ) then return end
  540.  
  541.     local tblInfos = AWarn.Raisons[ strKey ]
  542.  
  543.     if tblInfos['sanction'] == "ban" then
  544.         if ULib then
  545.             ULib.ban( pVictim, tonumber( tblInfos['temps'] ), tblInfos['message'], pPlayer )
  546.         else
  547.             pVictim:Ban( tonumber( tblInfos['temps'] ), true )
  548.         end
  549.         awarn_warnplayer( pPlayer, pVictim, tblInfos['message'] )
  550.     end
  551.  
  552.     if tblInfos['sanction'] == "kick" then
  553.         ULib.kick( pVictim, tblInfos['message'], pPlayer )
  554.         awarn_warnplayer( pPlayer, pVictim, tblInfos['message'] )
  555.     end
  556.  
  557.     if tblInfos['sanction'] == "avert" then
  558.         awarn_warnplayer( pPlayer, pVictim, strRaison )
  559.     end
  560.  
  561.     for k,v in pairs( player.GetAll() ) do
  562.         if !awarn_checkadmin_view( v ) then continue end
  563.  
  564.         net.Start( "Casier:Warn:Msg" )
  565.         net.WriteEntity( pVictim )
  566.         net.Send( v )
  567.     end
  568. end)
  569.  
  570. hook.Add( "PlayerNoClip", "Casier:Warn:NoClip", function( pPlayer, boolState )
  571.     if awarn_checkadmin_view( pPlayer ) && !pPlayer.Casier_AdminMode then
  572.         return false
  573.     end
  574. end)
  575.  
  576. hook.Add( "PlayerSay", "Casier:Warn:Say", function( pPlayer, text )
  577.     if text == "!admin" then
  578.         if awarn_checkadmin_view( pPlayer ) then
  579.             if pPlayer.Casier_AdminMode then
  580.                 RunConsoleCommand( "ulx", "ungod", "$" .. pPlayer:SteamID() )
  581.                 if pPlayer:GetMoveType() != MOVETYPE_WALK then
  582.                     RunConsoleCommand( "ulx", "noclip", "$" .. pPlayer:SteamID() )
  583.                 end
  584.                 RunConsoleCommand( "FAdmin", "uncloak", "$" .. pPlayer:SteamID() )
  585.  
  586.                 pPlayer.Casier_AdminMode = false
  587.             else
  588.                 RunConsoleCommand( "ulx", "god", "$" .. pPlayer:SteamID() )
  589.                 RunConsoleCommand( "ulx", "noclip", "$" .. pPlayer:SteamID() )
  590.                 RunConsoleCommand( "FAdmin", "cloak", "$" .. pPlayer:SteamID() )
  591.  
  592.                 pPlayer.Casier_AdminMode = true
  593.             end
  594.  
  595.             return ""
  596.         end
  597.     end
  598. end)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top