|
Your own crypto / blockchain currency: KFCoin.
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
If you started up with C# a month ago, by no means have you "learned" it.
When I want to learn a language or framework, I find an app that is interesting, and try to duplicate it in terms of appearance and functionality. IMHO, that's the absolute best way to actually learn coding.
BTW, duplicating bugs that exist in the app you're duplicating would earn you extra points.
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
Hi everybody,
I have a big problem with a little code sequence.
I have to return JSON data through a REST service.
Here is the Interface:
using System.ServiceModel;
using System.ServiceModel.Web;
namespace PERFoRM_LhnetRESTServiceHost
{
[ServiceContract()]
interface IRestService
{
[OperationContract()]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare) ]
string GetJson();
}
}
Here is the implementation:
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Activation;
namespace PERFoRM_LhnetRESTServiceHost
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
class RestService : IRestService
{
public string GetJson()
{
string retJson = "{\"firstname\": \"Georg\", \"name\": \"Clooney\"}";
using (StreamWriter sw = new StreamWriter(new FileStream(@"D:\Temp\Json.txt", FileMode.OpenOrCreate)))
{
sw.Write(retJson);
sw.Flush();
}
return retJson;
}
}
}
The JSON data in the string and in the file is correct:
{"firstname": "Georg", "name": "Clooney"}
The JSON data in the web browser is WRONG! WHY?:
"{\"firstname\": \"Georg\", \"name\": \"Clooney\"}"
It must be a little thing, but I couldn't find it.
Thank you very much for your help!
BR, Manfred
|
|
|
|
|
Returning raw json (string) in wcf - Stack Overflow[^]
WCF "Raw" programming model (Web) – Carlos Figueira MSDN blog[^]
When you return a string with ResponseFormat = Json , the string will be JSON-encoded, and the client will receive a string.
If you want to send raw JSON, the simplest option is to return a Stream instead.
[ServiceContract()]
interface IRestService
{
[OperationContract()]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare) ]
System.IO.Stream GetJson();
}
...
public Stream GetJson()
{
string retJson = "{\"firstname\": \"Georg\", \"name\": \"Clooney\"}";
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
return new MemoryStream(Encoding.UTF8.GetBytes(retJson));
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I need to send sms from c# windows application.i try some gateways to send but its not working
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Web;
using System.Net;
namespace SMS_Application
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnsent_Click(object sender, EventArgs e)
{
String result;
string apiKey = txtapi.Text;
string numbers = numtxt.Text; // in a comma seperated list
string message = msgtxt.Text;
string send = txtseder.Text;
String url = "https://api.textlocal.in/send/?apikey=" + apiKey + "&numbers=" + numbers + "&message=" + message + "&sender=" + send;
//refer to parameters to complete correct url string
StreamWriter myWriter = null;
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Method = "POST";
objRequest.ContentLength = Encoding.UTF8.GetByteCount(url);
objRequest.ContentType = "application/x-www-form-urlencoded";
try
{
myWriter = new StreamWriter(objRequest.GetRequestStream());
myWriter.Write(url);
}
catch (Exception ex)
{
//return e.Message;
MessageBox.Show(null,"the error is"+ex.Message,MessageBoxButtons.OK,MessageBoxIcon.Information);
}
finally
{
myWriter.Close();
}
HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
result = sr.ReadToEnd();
// Close and clean up the StreamReader
sr.Close();
}
//return result;
MessageBox.Show(null, "the message is" + result, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
|
|
|
|
|
"It's not working" is one of the most useless problem descriptions we get: it tells us absolutely nothing about the problem. We don't know if you get an error message, or the wrong data, or even that that code compiles successfully!
Remember that we can't see your screen, access your HDD, or read your mind - we only get exactly what you type to work with.
So tell us what happens when you run that code, what you expected to happen, how you checked what happened. Help us to help you!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Dear Good People of this Forum,
Please assist with C sharp code for both Objective and subjective questions for CBT Exam.
Your urgent feedback will be highly appreciated
|
|
|
|
|
|
Dear poster,
No.
Yours,
The Good People of this Forum. Why not?
Well, probably because good people don't cheat in exams...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
It's really hard ... you will fail miserably. I wouldn't be able to eat or sleep ...
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
Hi all, I'm developing a serial monitor for my application in WPF, programming in C#.
I have trouble managing the DataReceived event, because i want a real time monitor like HyperTerminal or TeraTerm for example (I'm not using them because I want my terminal to be a part of an ethernet communication tool, wich I already developed using winPcap).
I have to read some data from my microcontroller, display it on the textBox (It just prints a menu and the list of commands available) and when it finishes the loading sequence I would like to interact with it, nothing special, just send a "flash-" command to program the fpga of the board.
My application goes in exception when I try to update the textbox.text with the data received. I tried to search everywhere but despite a lot of examples, I didn't catch something which is explaining the code properly.
Here is the code, thanks in advance
namespace WpfApplication1 {
public partial class SerialMonitor : Window {
public SerialPort comPort = new SerialPort();
public SerialMonitor() {
InitializeComponent();
scanPorts();
}
private void scanPorts() {
textBoxIndata.Clear();
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports) {
comboBoxPorts.Items.Add(port);
}
}
private void openComBtn_Click(object sender , RoutedEventArgs e) {
comPort.Parity = Parity.None;
comPort.DataBits = 8;
comPort.ReadTimeout = 500;
comPort.StopBits = StopBits.One;
if (comboBoxPorts.SelectedItem != null && comboBoxPorts.SelectedItem != null) {
comPort.PortName = comboBoxPorts.SelectedItem.ToString();
comPort.BaudRate = Convert.ToInt32(comboBoxBaud.Text);
try {
comPort.Open();
comPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
catch (Exception ex) {
MessageBox.Show(ex.ToString());
}
}
if (comPort.IsOpen) {
label1.Content = "COM PORT OPEN";
}
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) {
}
private void updateUI (string s) {
}
private void closeComBtn_Click(object sender , RoutedEventArgs e) {
if (comPort.IsOpen) {
comPort.Close();
label1.Content = "COM PORT CLOSED";
}
}
private void exitBtn_Click(object sender , RoutedEventArgs e) {
if (comPort.IsOpen) {
comPort.Close();
}
this.Close();
}
}
}
|
|
|
|
|
Member 13688816 wrote: My application goes in exception when I try to update the textbox.text What exception, and where does it occur?
|
|
|
|
|
"The calling thread cannot access this object because a different thread owns it."
I got it using
Application.Current.Dispatcher.Invoke(new Action(() => { textBox.AppenText(inData) }));
But now I have the problem that when I send my command by using serialPort.Write(cmd), I can't get the answer back
|
|
|
|
|
The data receive event is execute in it's own thread. You have to take care when updating UI elements from other threads. See How to: Make Thread-Safe Calls to Windows Forms Controls | Microsoft Docs[^].
A possible (untested) implementation:
private void updateUI (string s) {
if (this.InvokeRequired) {
this.Invoke(new Action( d => updateUI(d) ));
return;
}
} Then call updateUI() from your DataReceivedHandler .
|
|
|
|
|
Your "data received handler" is "empty"; what do you expect to happen?
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
FIXED EVERYTHING
I had to do a bit more of research and implement the dispatch function. Now everything works fine
and I'm able to communicate with my microprocessor
|
|
|
|
|
Hello!
We got this project that requires us to build data structures into a hierachical text structure ( like xml, or json).
When i search for json and .net, the libraries i find seem to be really good for serializing. But serializing isn't what i need. I need something like the System.Xml.Linq.XElement class. Just create a node and put other nodes inside. Supersimple.
I will try the most common libraries out there of course, but i would love to hear your experiences with it. Have you done something like that? Do yoo have recommendations for me?
|
|
|
|
|
Json.NET has support for LINQ to JSON. Providing you aren't looking to do anything mind blowingly complex, this should help. Introduction[^]
This space for rent
|
|
|
|
|
Can somebody tell me how I can create a JSON object from this JSON string ?
When is use JsonObject.Parse(string); it says invalid json-stream
"[{\"id\":\"0b5a6026-d347-4f8d-94e7-eede0bda6df1\",\"identifier\":\"WPLG009569C78EDC\",\"name\":\"Schemerlamp\",\"latitude\":51.8152867,\"longitude\":4.4244634,\"devices\":[{\"id\":\"b2454863-1fb9-4e48-b314-a85c0175b238\",\"typeName\":\"plug_outlet\",\"name\":\"Schemerlamp\",\"code\":\"null\",\"iconUrl\":\"icons/15\"}],\"online\":true,\"firmwareUpdateAvailable\":false,\"deviceTypes\":[{\"name\":\"brel_lr_curtain\",\"displayName\":\"Brel Curtain\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/brel_lr_curtain.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Stop\"},{\"action\":\"Open\"},{\"action\":\"Close\"}],\"selectable\":true},{\"name\":\"brel_ud_curtain\",\"displayName\":\"Brel Roller\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/brel_ud_curtain.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Stop\"},{\"action\":\"Up\"},{\"action\":\"Down\"}],\"selectable\":true},{\"name\":\"brel_roman_pl\",\"displayName\":\"Brel Roman/Pleated/VB\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/brel_roman_pl.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Down\"},{\"action\":\"Stop\"},{\"action\":\"Up\"}],\"selectable\":true},{\"name\":\"flamingo_switch\",\"displayName\":\"Flamingo Switch\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/switch_without_button.html\",\"family\":\"Switch\",\"actions\":[{\"action\":\"Off\"},{\"action\":\"On\"}],\"selectable\":true},{\"name\":\"forest_lr_curtain\",\"displayName\":\"Forest Curtains\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/forest_curtain.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Close\"},{\"action\":\"Open\"},{\"action\":\"Stop\"}],\"selectable\":true},{\"name\":\"forest_roman_blinds_bg\",\"displayName\":\"Forest roller/roman blinds big\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/forest_roman_blinds_bg.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Stop\"},{\"action\":\"Up\"},{\"action\":\"Down\"}],\"selectable\":true},{\"name\":\"forest_roman_blinds_sm\",\"displayName\":\"Forest roman blinds small\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/forest_roman_blinds_sm.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Down\"},{\"action\":\"Up\"},{\"action\":\"Stop\"}],\"selectable\":true},{\"name\":\"hew_dimmer\",\"displayName\":\"HomeEasy Dimmer\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/dimmer.html\",\"family\":\"Dimmer\",\"actions\":[{\"action\":\"Off\"},{\"action\":\"Range\",\"range\":{\"min\":1.0,\"max\":100.0,\"step\":0.0,\"allowedValues\":[1.0,6.0,12.0,19.0,25.0,31.0,38.0,44.0,51.0,57.0,63.0,70.0,76.0,83.0,89.0,95.0,100.0]}},{\"action\":\"On\"}],\"selectable\":true},{\"name\":\"hew_switch\",\"displayName\":\"HomeEasy Switch\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/switch.html\",\"family\":\"Switch\",\"actions\":[{\"action\":\"On\"},{\"action\":\"Off\"}],\"selectable\":true},{\"name\":\"plug_outlet\",\"displayName\":\"Plug Outlet\",\"pairInformationUrl\":\"\",\"family\":\"Switch\",\"actions\":[{\"action\":\"GetState\"},{\"action\":\"Off\"},{\"action\":\"On\"}],\"selectable\":false},{\"name\":\"smartwares_dimmer\",\"displayName\":\"Smartwares Dimmer\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/dimmer.html\",\"family\":\"Dimmer\",\"actions\":[{\"action\":\"Off\"},{\"action\":\"Range\",\"range\":{\"min\":1.0,\"max\":100.0,\"step\":0.0,\"allowedValues\":[1.0,6.0,12.0,19.0,25.0,31.0,38.0,44.0,51.0,57.0,63.0,70.0,76.0,83.0,89.0,95.0,100.0]}},{\"action\":\"On\"}],\"selectable\":true},{\"name\":\"smartwares_rv\",\"displayName\":\"Smartwares Radiator Valve\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/smartwares_rv.html\",\"family\":\"Thermostat\",\"actions\":[{\"action\":\"Range\",\"range\":{\"min\":5.0,\"max\":28.0,\"step\":0.5,\"allowedValues\":[]}},{\"action\":\"DayMode\"},{\"action\":\"NightMode\"}],\"selectable\":true},{\"name\":\"smartwares_switch\",\"displayName\":\"Smartwares Switch\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/switch.html\",\"family\":\"Switch\",\"actions\":[{\"action\":\"Off\"},{\"action\":\"On\"}],\"selectable\":true},{\"name\":\"smartwares_ud_switch\",\"displayName\":\"Smartwares Up/Down Switch\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/smartwares_ud_switch.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Up\"},{\"action\":\"Down\"}],\"selectable\":true},{\"name\":\"vako_blinds\",\"displayName\":\"Vako Blinds\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/vako_blinds.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Down\"},{\"action\":\"Stop\"},{\"action\":\"Up\"}],\"selectable\":true},{\"name\":\"vako_lr_curtain\",\"displayName\":\"Vako Curtain Track\",\"pairInformationUrl\":\"http://static.homewizard.net/media/lite/en/instructions/vako_lr_curtain.html\",\"family\":\"Curtain\",\"actions\":[{\"action\":\"Left\"},{\"action\":\"Stop\"},{\"action\":\"Right\"}],\"selectable\":true}],\"timeZone\":\"Europe/Amsterdam\"}]"
|
|
|
|
|
I use this method to clean up the string before parsing.
<pre> private string FixApiResponseString(string input)
{
input = input.Replace("\\", string.Empty);
input = input.Trim('"');
return input;
}
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Doesn't work, it still says that it is an invalid json string
|
|
|
|
|
That's a perfectly valid JSON string. Using JSON.NET[^] to parse it works perfectly:
string json = "[{\"id\":\"0b5a6026-d347-4f8d-94e7-eede0bda6df1\",...,\"timeZone\":\"Europe/Amsterdam\"}]";
JArray array = JArray.Parse(json);
If JsonValue.Parse[^] can't cope with it, there must be a bug in that API.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
But then you get a JsonArray and not a JsonObject.
How can I get the values of ["0"]["id"] and ["0"]["name"] when it is not an object?
----found it---
I didn't get it first, because there was only one object in the array, so why could I not create an object from the string instead of an array.
But after I created an array and made an object of the first (and last) item of the array, I could access the values
JsonArray array = JsonArray.Parse(json));
string temp = array[0].toString();
JsonObject firstItem = JsonObject.Parse(temp);
string id = firstItem.GetNamedValue("id").toString();
string name = firstItem.GetNamedValue("name").toString();
Thanks all for your help!
modified 1-Jun-18 14:35pm.
|
|
|
|
|
This is a bit long but please bear with me as I'm stuck. This is a C#/WPF app. The problem is C# so I posted this here.
I am creating a Property Sheet user control. Think of the Visual Studio property sheet. The first pass will simply be a two-column grid with a Caption in the left column and a UI element in the right columm (TextBox, CheckBox, ComboBox).
This control will embedded into a larger UI that allows the user to change the settings used int a Testing Application, without the need to recompile the app.
Data
The settings will be serialized/deserialized in an XML file:
<_TestSettingsBase xsi:type="BeadBeatingMotorSettings">
<TestName>Bead Beating</TestName>
<TestType>BeadBeating</TestType>
<BeadBeaterMax>
<Caption>Bead Beater Max</Caption>
<Description>Bead Beater maximum</Description>
<CurrentValue>
<Value>1</Value>
<Value1>1</Value1>
</CurrentValue>
<DefaultValue>
<Value>1</Value>
<Value1>1</Value1>
</DefaultValue>
<ValueMax>
<Value>0</Value>
<Value1>0</Value1>
</ValueMax>
<ValueMin>
<Value>100</Value>
<Value1>100</Value1>
</ValueMin>
</BeadBeaterMax>
<BeadBeaterMin>
<Caption>Bead Beater Min</Caption>
<Description>Bead Beater minimum</Description>
<CurrentValue>
<Value>0.075</Value>
<Value1>0.075</Value1>
</CurrentValue>
<DefaultValue>
<Value>0.075</Value>
<Value1>0.075</Value1>
</DefaultValue>
<ValueMax>
<Value>101</Value>
<Value1>101</Value1>
</ValueMax>
<ValueMin>
<Value>999</Value>
<Value1>999</Value1>
</ValueMin>
</BeadBeaterMin>
</_TestSettingsBase>
In the XML above the base setting class has TestName and TestType properties
[Serializable]
public class _TestSettingsBase
{
public string TestName { get; set; }
public TestType TestType { get; set; }
}
Then, each individual Test class will inherit from that
[Serializable]
public class BeadBeatingMotorSettings : _TestSettingsBase
{
[ShowInPropertySheet()]
public Setting BeadBeaterMax { get; set; }
[ShowInPropertySheet()]
public Setting BeadBeaterMin { get; set; }
public BeadBeatingMotorSettings()
{
TestType = TestType.BeadBeating;
BeadBeaterMax = new Setting
{
Caption = "Bead Beater Max",
CurrentValue = 1,
DefaultValue = 1,
Description = "Bead Beater maximum",
ValueMax = 0,
ValueMin = 100
};
BeadBeaterMin = new Setting
{
Caption = "Bead Beater Min",
CurrentValue = 0.075,
DefaultValue = 0.075,
Description = "Bead Beater minimum",
ValueMax = 101,
ValueMin = 999
};
}
}
The test's properties are defined as a generic type property I called Setting<t>
[Serializable]
public class Setting : _EntityBase
{
public string Caption { get; set; }
public string Description { get; set; }
public MyProp CurrentValue { get; set; }
public MyProp DefaultValue { get; set; }
public MyProp ValueMax { get; set; }
public MyProp ValueMin { get; set; }
}
public class MyProp
{
private T _value;
public T Value
{
get { return Value1; }
set { Value1 = value; }
}
public T Value1 { get => _value; set => _value = value; }
public static implicit operator T(MyProp value)
{
return value.Value;
}
public static implicit operator MyProp(T value)
{
return new MyProp { Value = value };
}
}
So far everything works great. The data is serialized/deserialized perfectly.
Property Sheet
This is where I'm having trouble.
The PropertySheet is a DataGrid with two columns. The left column is the property's caption and the and right column has a UI element to display the value (TextBox, CheckBox, ComboBox). So far, I created a small User Control for each type of data I expect to deal with.
For example, for Double, I have a UC called DoublePropertyView. It's XAML is this
<UserControl x:Class="PropSheet.PropertyViews.DoublePropertyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="100"
d:DesignWidth="100">
<TextBox Text="{Binding SettingValue}"/>
</UserControl>
The code behind has a DependencyProperty called "SettingValue" that the TextBox is bound to. Nothing more than that.
I have one small UC for each type of data - double, int, float, bool, string, etc.
Then the DataGrid's right column uses a TemplateSelector to determine which UC to load into the cell.
The PropertySheet UC has a DP called Settings that takes a list of _TestSettingsBase.
Problem
When I set the list of properties on the DP I then need to reflect each of the properties on the Test class and load into the grid only those properties with the custom attribute ShowInPropertySheet(true).
In the code above you can see on the BeadBeating test class there are two properties, BeadBeaterMin and BeadBeaterMax.
I want these two to appear in the property sheet. Notice that they're marked with the ShowInPropertySheet attribute. When shown in the property sheet I want the Caption and CurrentValue to appear.
Here's my LoadProperties code with the problem. I loop through each Test class in the Settings DP and create a model for each. The list of models is bound to the grid
private void LoadProperties()
{
Properties = new List<PropertyModel>();
var propertyInfos = from pi in Setting.GetType().GetProperties()
let attrs = pi.GetCustomAttributes(typeof(ShowInPropertySheetAttribute), true)
where attrs.Length != 0 &&
(bool)Helpers.GetAttributeValue(Setting.GetType(), pi.Name, typeof(ShowInPropertySheetAttribute), "IsVisible")
select pi;
foreach (PropertyInfo propertyInfo in propertyInfos)
{
var settingProperty = (Setting<double>)propertyInfo.GetValue(Setting);
var current = settingProperty.CurrentValue;
var model = new PropertyModel(propertyInfo.Name, current.Value);
Properties.Add(model);
}
}
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
modified 30-May-18 13:59pm.
|
|
|
|
|
|