| 'use strict' | 
|   | 
| var jsonSafeStringify = require('json-stringify-safe') | 
| var crypto = require('crypto') | 
| var Buffer = require('safe-buffer').Buffer | 
|   | 
| var defer = typeof setImmediate === 'undefined' | 
|   ? process.nextTick | 
|   : setImmediate | 
|   | 
| function paramsHaveRequestBody (params) { | 
|   return ( | 
|     params.body || | 
|     params.requestBodyStream || | 
|     (params.json && typeof params.json !== 'boolean') || | 
|     params.multipart | 
|   ) | 
| } | 
|   | 
| function safeStringify (obj, replacer) { | 
|   var ret | 
|   try { | 
|     ret = JSON.stringify(obj, replacer) | 
|   } catch (e) { | 
|     ret = jsonSafeStringify(obj, replacer) | 
|   } | 
|   return ret | 
| } | 
|   | 
| function md5 (str) { | 
|   return crypto.createHash('md5').update(str).digest('hex') | 
| } | 
|   | 
| function isReadStream (rs) { | 
|   return rs.readable && rs.path && rs.mode | 
| } | 
|   | 
| function toBase64 (str) { | 
|   return Buffer.from(str || '', 'utf8').toString('base64') | 
| } | 
|   | 
| function copy (obj) { | 
|   var o = {} | 
|   Object.keys(obj).forEach(function (i) { | 
|     o[i] = obj[i] | 
|   }) | 
|   return o | 
| } | 
|   | 
| function version () { | 
|   var numbers = process.version.replace('v', '').split('.') | 
|   return { | 
|     major: parseInt(numbers[0], 10), | 
|     minor: parseInt(numbers[1], 10), | 
|     patch: parseInt(numbers[2], 10) | 
|   } | 
| } | 
|   | 
| exports.paramsHaveRequestBody = paramsHaveRequestBody | 
| exports.safeStringify = safeStringify | 
| exports.md5 = md5 | 
| exports.isReadStream = isReadStream | 
| exports.toBase64 = toBase64 | 
| exports.copy = copy | 
| exports.version = version | 
| exports.defer = defer |