function parse$2 (src) {
  const obj = {};

  // Convert buffer to string
  let lines = src.toString();

  // Convert line breaks to same format
  lines = lines.replace(/\r\n?/mg, '\n');

  let match;
  while ((match = LINE.exec(lines)) != null) {
    const key = match[1];

    // Default undefined or null to empty string
    let value = (match[2] || '');

    // Remove whitespace
    value = value.trim();

    // Check if double quoted
    const maybeQuote = value[0];

    // Remove surrounding quotes
    value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2');

    // Expand newlines if double quoted
    if (maybeQuote === '"') {
      value = value.replace(/\\n/g, '\n');
      value = value.replace(/\\r/g, '\r');
    }

    // Add to object
    obj[key] = value;
  }

  return obj
}
Parse `argv`, setting options and invoking commands when defined.

The default expectation is that the arguments are from node and have the application as argv[0]
and the script being run in argv[1], with user parameters after that.

Examples:

     program.parse(process.argv);
     program.parse(); // implicitly use process.argv and auto-detect node vs electron conventions
     program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0]

@param {string[]} [argv] - optional, defaults to process.argv
@param {Object} [parseOptions] - optionally specify style of options with from: node/user/electron
@param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron'
@return {Command} `this` command for chaining
@api public