buttplug 1.0.13 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi.d.ts +9 -4
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi.js +2 -2
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg.js +6 -630
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg.wasm +0 -0
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg.wasm.d.ts +6 -6
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg_node.js +799 -0
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg_web.js +788 -0
- package/dist/module/buttplug_ffi.d.ts +2 -1
- package/dist/module/buttplug_ffi.js +2747 -2105
- package/dist/module/client.d.ts +2 -2
- package/dist/module/client.js +13 -13
- package/dist/module/client.js.map +1 -1
- package/dist/module/connectors.d.ts +2 -2
- package/dist/module/connectors.js +19 -14
- package/dist/module/connectors.js.map +1 -1
- package/dist/module/device.d.ts +4 -3
- package/dist/module/device.js +15 -14
- package/dist/module/device.js.map +1 -1
- package/dist/module/errors.d.ts +1 -1
- package/dist/module/errors.js +1 -1
- package/dist/module/errors.js.map +1 -1
- package/dist/module/ffi.d.ts +19 -19
- package/dist/module/ffi.js +52 -47
- package/dist/module/ffi.js.map +1 -1
- package/dist/module/index.d.ts +8 -8
- package/dist/module/index.js +8 -6
- package/dist/module/index.js.map +1 -1
- package/dist/module/sorter.d.ts +1 -1
- package/dist/module/sorter.js +1 -1
- package/dist/module/sorter.js.map +1 -1
- package/dist/module/web_index.d.ts +1 -1
- package/dist/module/web_index.js +1 -1
- package/dist/module/web_index.js.map +1 -1
- package/dist/web/0.buttplug.js +663 -384
- package/dist/web/1.buttplug.min.js +1 -1
- package/dist/web/1.buttplug.min.js.map +1 -1
- package/dist/web/b0219b34bc18e1ad0240.module.wasm +0 -0
- package/dist/web/buttplug.js +825 -740
- package/dist/web/buttplug.min.js +8 -8
- package/dist/web/buttplug.min.js.map +1 -1
- package/dist/web/e5566a8b6a3fda978549.module.wasm +0 -0
- package/index.html +6 -10
- package/package.json +28 -17
- package/tsconfig.json +0 -1
- package/{webpack.base.js → webpack.base.cjs} +30 -6
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi.js.map +0 -1
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg.d.ts +0 -117
- package/dist/module/buttplug-rs-ffi/buttplug_rs_ffi_bg.js.map +0 -1
- package/dist/module/buttplug_ffi.js.map +0 -1
- package/dist/web/17a5dc1db11d74b795d7.module.wasm +0 -0
- package/dist/web/7cd0851698bfb0cd22ea.module.wasm +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://Buttplug/webpack/universalModuleDefinition","webpack://Buttplug/webpack/bootstrap","webpack://Buttplug/./node_modules/@protobufjs/aspromise/index.js","webpack://Buttplug/./node_modules/@protobufjs/base64/index.js","webpack://Buttplug/./node_modules/@protobufjs/eventemitter/index.js","webpack://Buttplug/./node_modules/@protobufjs/float/index.js","webpack://Buttplug/./node_modules/@protobufjs/inquire/index.js","webpack://Buttplug/./node_modules/@protobufjs/pool/index.js","webpack://Buttplug/./node_modules/@protobufjs/utf8/index.js","webpack://Buttplug/./node_modules/base64-js/index.js","webpack://Buttplug/./node_modules/buffer/index.js","webpack://Buttplug/./node_modules/events/events.js","webpack://Buttplug/./node_modules/ieee754/index.js","webpack://Buttplug/./node_modules/isarray/index.js","webpack://Buttplug/./node_modules/protobufjs/minimal.js","webpack://Buttplug/./node_modules/protobufjs/src/index-minimal.js","webpack://Buttplug/./node_modules/protobufjs/src/reader.js","webpack://Buttplug/./node_modules/protobufjs/src/reader_buffer.js","webpack://Buttplug/./node_modules/protobufjs/src/roots.js","webpack://Buttplug/./node_modules/protobufjs/src/rpc.js","webpack://Buttplug/./node_modules/protobufjs/src/rpc/service.js","webpack://Buttplug/./node_modules/protobufjs/src/util/longbits.js","webpack://Buttplug/./node_modules/protobufjs/src/util/minimal.js","webpack://Buttplug/./node_modules/protobufjs/src/writer.js","webpack://Buttplug/./node_modules/protobufjs/src/writer_buffer.js","webpack://Buttplug/(webpack)/buildin/global.js","webpack://Buttplug/./src/buttplug_ffi.js","webpack://Buttplug/./src/ffi.ts","webpack://Buttplug/./src/errors.ts","webpack://Buttplug/./src/connectors.ts","webpack://Buttplug/./src/sorter.ts","webpack://Buttplug/./src/device.ts","webpack://Buttplug/./src/client.ts","webpack://Buttplug/./src/web_index.ts"],"names":["root","factory","exports","module","define","amd","window","webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","prefetchChunks","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","forEach","undefined","link","document","createElement","__webpack_require__","nc","setAttribute","rel","as","href","jsonpScriptSrc","head","appendChild","shift","installedModules","0","p","installedWasmModules","wasmImportObjects","p0i32","p1i32","p2i32","p3i32","p4i32","p5i32","p6i32","p7i32","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","charset","timeout","src","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","setTimeout","wasmModuleId","installedWasmModuleData","importObject","req","fetch","WebAssembly","compileStreaming","all","then","items","instantiate","instantiateStreaming","x","arrayBuffer","bytes","res","w","instance","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","oldJsonpFunction","slice","startupResult","s","fn","ctx","params","Array","arguments","offset","index","pending","apply","base64","string","charAt","Math","ceil","b64","s64","encode","buffer","start","end","parts","j","b","String","fromCharCode","join","decode","charCodeAt","test","EventEmitter","this","_listeners","on","evt","off","listeners","splice","emit","args","Float32Array","f32","f8b","Uint8Array","le","writeFloat_f32_cpy","val","buf","pos","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","writeFloatLE","writeFloatBE","readFloatLE","readFloatBE","writeFloat_ieee754","writeUint","sign","isNaN","round","exponent","floor","log","LN2","pow","readFloat_ieee754","readUint","uint","mantissa","NaN","Infinity","writeUintLE","writeUintBE","readUintLE","readUintBE","Float64Array","f64","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","writeDoubleLE","writeDoubleBE","readDoubleLE","readDoubleBE","writeDouble_ieee754","off0","off1","readDouble_ieee754","lo","hi","inquire","moduleName","mod","eval","replace","keys","alloc","size","SIZE","MAX","slab","utf8","len","read","write","c1","c2","byteLength","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","revLookup","fromByteArray","uint8","extraBytes","len2","encodeChunk","lookup","code","indexOf","num","output","ieee754","isArray","kMaxLength","Buffer","TYPED_ARRAY_SUPPORT","createBuffer","that","RangeError","__proto__","arg","encodingOrOffset","allocUnsafe","from","TypeError","ArrayBuffer","array","byteOffset","fromArrayLike","fromArrayBuffer","encoding","isEncoding","actual","fromString","obj","isBuffer","checked","copy","fromObject","assertSize","toString","isView","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","dir","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","readUInt16BE","foundIndex","found","hexWrite","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","utf16leToBytes","min","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","decodeCodePointsArray","SlowBuffer","INSPECT_MAX_BYTES","global","foo","subarray","typedArraySupport","poolSize","_augment","species","configurable","fill","allocUnsafeSlow","_isBuffer","compare","a","y","concat","list","swap16","swap32","swap64","equals","inspect","max","match","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","ret","out","toHex","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","targetStart","set","INVALID_BASE64_RE","leadSurrogate","trim","stringtrim","base64clean","dst","ReflectOwnKeys","R","Reflect","ReflectApply","receiver","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","init","once","emitter","eventListener","errorListener","removeListener","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","_addListener","prepend","events","existing","warning","newListener","unshift","warned","count","warn","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","unwrap","evlistener","unwrapListeners","arrayClone","listenerCount","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","handler","addListener","prependListener","prependOnceListener","position","originalListener","pop","spliceOne","removeAllListeners","rawListeners","eventNames","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","abs","protobuf","configure","util","_configure","Writer","BufferWriter","Reader","BufferReader","build","rpc","roots","LongBits","indexOutOfRange","reader","writeLength","create_array","readLongVarint","bits","readFixed32_end","readFixed64","_slice","uint32","int32","sint32","bool","fixed32","sfixed32","float","double","constructor","skip","skipType","wireType","BufferReader_","Long","merge","int64","uint64","sint64","zzDecode","fixed64","sfixed64","Service","rpcImpl","requestDelimited","responseDelimited","Boolean","rpcCall","method","requestCtor","responseCtor","callback","self","asPromise","finish","response","endedByRPC","zero","toNumber","zzEncode","zeroHash","fromNumber","isString","low","high","unsigned","toLong","fromHash","hash","toHash","mask","part0","part1","part2","ifNotSet","newError","CustomError","properties","captureStackTrace","stack","pool","isNode","process","versions","node","emptyArray","freeze","emptyObject","isInteger","isObject","isset","isSet","prop","_Buffer_from","_Buffer_allocUnsafe","newBuffer","sizeOrArray","dcodeIO","key2Re","key32Re","key64Re","longToHash","longFromHash","fromBits","lcFirst","substring","ProtocolError","oneOfGetter","fieldNames","fieldMap","oneOfSetter","toJSONOptions","longs","enums","json","Op","next","noop","State","writer","tail","states","writeByte","VarintOp","writeVarint64","writeFixed32","_push","writeBytes","fork","reset","ldelim","BufferWriter_","writeStringBuffer","writeBytesBuffer","g","valuesById","values","Buttplug","$protobuf","$Reader","$Writer","$util","$root","Endpoint","ClientMessage","id","FFIMessage","encodeDelimited","tag","decodeDelimited","verify","toObject","options","defaults","DeviceCommunicationManagerTypes","ConnectLocal","serverName","maxPingTime","allowRawMessages","deviceConfigurationJson","userDeviceConfigurationJson","commManagerTypes","ConnectWebsocket","address","bypassCertVerification","StartScanning","StopScanning","StopAllDevices","Disconnect","Ping","$oneOfFields","connectLocal","connectWebsocket","startScanning","stopScanning","stopAllDevices","disconnect","ping","msg","oneofs","DeviceMessage","VibrateComponent","speed","VibrateCmd","speeds","arrays","RotateComponent","clockwise","RotateCmd","rotations","LinearComponent","duration","LinearCmd","movements","StopDeviceCmd","RawReadCmd","endpoint","expectedLength","RawWriteCmd","writeWithResponse","RawSubscribeCmd","RawUnsubscribeCmd","BatteryLevelCmd","RSSILevelCmd","vibrateCmd","rotateCmd","linearCmd","stopDeviceCmd","rawReadCmd","rawWriteCmd","rawSubscribeCmd","rawUnsubscribeCmd","batteryLevelCmd","rssiLevelCmd","ServerMessage","ok","scanningFinished","deviceAdded","deviceRemoved","Ok","ScanningFinished","DeviceAdded","DeviceRemoved","ButtplugErrorType","MessageAttributeType","MessageAttributes","stepCount","endpoints","maxDuration","messageType","featureCount","end2","backtrace","messageAttributes","DeviceEvent","batteryLevelReading","rssiLevelReading","rawReading","BatteryLevelReading","RSSILevelReading","RawReading","reading","ButtplugFFIServerMessage","serverMessage","deviceEvent","must_run_init_1","must_run_init_2","buttplug_create_client","buttplug_free_client","buttplug_parse_client_message","buttplug_activate_env_logger","buttplug_free_device","buttplug_create_device","buttplug_parse_device_message","buttplug_has_init_run","async","buttplugInit","catch","sendClientMessage","sorter","clientPtr","PrepareOutgoingMessage","connectEmbedded","ServerName","AllowRawMessages","DeviceConfigJSON","UserDeviceConfigJSON","MaxPingTime","Address","sendDeviceMessage","devicePtr","vibrate","rotate","linear","vectors","stopDevice","batteryLevel","rssiLevel","rawRead","rawWrite","rawSubscribe","rawUnsubscribe","createClientPtr","eventCallback","clientName","createDevicePtr","deviceIndex","freeClientPtr","freeDevicePtr","activateConsoleLogger","logLevel","ButtplugError","aMessage","aId","aInner","super","innerError","messageId","ButtplugHandshakeError","ButtplugDeviceError","ButtplugMessageError","ButtplugPingError","ButtplugUnknownError","ButtplugClientConnectorError","convertPBufError","ButtplugConnectorError","ButtplugEmbeddedConnectorOptions","ButtplugWebsocketConnectorOptions","_counter","_waitingMsgs","Map","aMsg","rej","msgPromise","has","ButtplugDeviceMessageType","attributes","VibrationCmd","Index","Speed","RotationCmd","Clockwise","VectorCmd","Duration","Position","allowedMsgsObj","_messageAttributes","_devicePtr","_sorter","_index","_name","messageName","msgSpeeds","checkAllowedMessageType","features","_","every","map","msgRotations","msgVectors","batteryMsg","rssiMsg","readingMsg","_devices","_clientPtr","_isScanning","_connected","connect","sorterCallback","ParseIncomingMessages","addedMsg","device","removedMsg","removedDevice","emitDisconnected","delete","_clientName","CheckConnector","devices","Connected","scripts","getElementsByTagName","lastScript"],"mappings":"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mB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACDvmB,EAAQumB,SAAW,GACnB,MACJ,IAAK,Y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","file":"buttplug.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"buttplug-commonjs\"] = factory();\n\telse\n\t\troot[\"Buttplug\"] = factory();\n})(window, function() {\nreturn "," \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n \t\tvar prefetchChunks = data[3] || [];\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n \t\t// chunk prefetching for javascript\n \t\tprefetchChunks.forEach(function(chunkId) {\n \t\t\tif(installedChunks[chunkId] === undefined) {\n \t\t\t\tinstalledChunks[chunkId] = null;\n \t\t\t\tvar link = document.createElement('link');\n\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tlink.rel = \"prefetch\";\n \t\t\t\tlink.as = \"script\";\n \t\t\t\tlink.href = jsonpScriptSrc(chunkId);\n \t\t\t\tdocument.head.appendChild(link);\n \t\t\t}\n \t\t});\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".buttplug.min.js\"\n \t}\n\n \t// object to store loaded and loading wasm modules\n \tvar installedWasmModules = {};\n\n \tfunction promiseResolve() { return Promise.resolve(); }\n\n \tvar wasmImportObjects = {\n \t\t\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.wasm\": function() {\n \t\t\treturn {\n \t\t\t\t\"./buttplug_rs_ffi_bg.js\": {\n \t\t\t\t\t\"__wbindgen_object_drop_ref\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Bb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_object_clone_ref\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Ab\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_e6bbcfdff8337573\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"A\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_string_new\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Db\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_cb_drop\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"pb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_59cb74e423758ede\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"I\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_stack_558ba5917b466edd\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"gb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_error_4bb6c2a97407129a\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"o\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_b7dcb3facc73166d\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"z\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_96295d68ab8338df\": function(p0i32,p1i32,p2i32,p3i32,p4i32,p5i32,p6i32,p7i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"y\"](p0i32,p1i32,p2i32,p3i32,p4i32,p5i32,p6i32,p7i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_mark_55c5ecfe509deb6a\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"B\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_measure_608563106d70d48a\": function(p0i32,p1i32,p2i32,p3i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"C\"](p0i32,p1i32,p2i32,p3i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_Window_f826a1dec163bacb\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"a\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_is_undefined\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"yb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_WorkerGlobalScope_967d186155183d38\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"b\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_instanceof_Window_5993230e7331f098\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"w\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_navigator_da501e0baab77d64\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"F\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_clearTimeout_4fe71f721d0606af\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"i\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setTimeout_d75246e77e993c5d\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Y\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getCharacteristic_c7f9dcc72f7a86f6\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"q\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_value_ce5e4fe742d36a1c\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"mb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setoncharacteristicvaluechanged_ece60eda828cb0ef\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"bb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_readValue_988440034a0e12ce\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Q\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_startNotifications_c88eeb920d1eb45c\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"hb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_writeValue_1c451e0da8c56ca9\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"ob\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_target_90b16facc122062f\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"jb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_requestDevice_2d1b71cc28a67a5a\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"R\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_id_45ecf3258c9f7dd7\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"v\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_name_fe9ee17e821ecea5\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"E\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_gatt_99df2e5380097484\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"p\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setongattserverdisconnected_80e78a9d86abdf7b\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"db\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_clearTimeout_af54ac34efe00770\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"j\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setTimeout_c5be4c054c4d7da5\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"X\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_bluetooth_18ee05df03af2352\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"c\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonopen_c3975a4f895a052a\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"fb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonerror_add0a293158012fc\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"cb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonmessage_0d42c79be06de84f\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"eb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_fd9f3bfb89d96362\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"K\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_close_3797d4fae932c9b9\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"k\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_send_ca85b0e6799803ef\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"W\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_connect_d31afa0760e2294e\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"l\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getPrimaryService_903e198e60097b4a\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"r\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_data_437e74b835241e70\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"n\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_call_e5847d15cc228e4f\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"h\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_7c995f2adeba6fb5\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"J\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_push_3f7c76b58919ce0d\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"O\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_buffer_32296c67828fee6c\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"e\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_byteLength_da948e1afd83c8f8\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"f\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newnoargs_2349ba6aefe72376\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"L\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_call_d63edb857edf16f6\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"g\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_59986c8731bebaa1\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"H\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_resolve_e0690143406c88cb\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"T\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_then_9caf23122e4fd5d3\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"lb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_then_16663faf60ffbe95\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"kb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_self_35a0fda3eb965abe\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"U\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_window_88a6f88dd3a474f1\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"nb\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_globalThis_1d843c4ad7b6a1f5\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"t\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_global_294ce70448e8fbbf\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"u\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_buffer_0be9fb426f2dd82b\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"d\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newwithbyteoffsetandlength_85b7ce82b001ea08\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"N\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_length_3a5138f465b971ad\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"x\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_4e8d18dbf9cd5240\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"G\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_set_4769de301eb521d7\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Z\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newwithbyteoffset_0a6b0ce9d45270c3\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"M\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_set_7e15d36563072b19\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"ab\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getRandomValues_11115a852729f4e8\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"s\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_randomFillSync_a2d002fc3b8e30f7\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"P\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_self_a5f0fe5564782787\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"V\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_static_accessor_MODULE_7f278c5446c126c8\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"ib\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_require_29e58b5f6f133563\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"S\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_crypto_d91429ea1a087f70\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"m\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_msCrypto_c8be2bb4fc7d8cd3\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"D\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_is_string\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"xb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_string_get\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Cb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_debug_string\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"wb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_throw\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"Eb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_memory\": function() {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"zb\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper677\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"sb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper679\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"tb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper681\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"ub\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper683\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"vb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper2493\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"qb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper4268\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.js\"].exports[\"rb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t};\n \t\t},\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n\n \t\t// Fetch + compile chunk loading for webassembly\n\n \t\tvar wasmModules = {\"1\":[\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.wasm\"]}[chunkId] || [];\n\n \t\twasmModules.forEach(function(wasmModuleId) {\n \t\t\tvar installedWasmModuleData = installedWasmModules[wasmModuleId];\n\n \t\t\t// a Promise means \"currently loading\" or \"already loaded\".\n \t\t\tif(installedWasmModuleData)\n \t\t\t\tpromises.push(installedWasmModuleData);\n \t\t\telse {\n \t\t\t\tvar importObject = wasmImportObjects[wasmModuleId]();\n \t\t\t\tvar req = fetch(__webpack_require__.p + \"\" + {\"./src/buttplug-rs-ffi/buttplug_rs_ffi_bg.wasm\":\"7cd0851698bfb0cd22ea\"}[wasmModuleId] + \".module.wasm\");\n \t\t\t\tvar promise;\n \t\t\t\tif(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {\n \t\t\t\t\tpromise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {\n \t\t\t\t\t\treturn WebAssembly.instantiate(items[0], items[1]);\n \t\t\t\t\t});\n \t\t\t\t} else if(typeof WebAssembly.instantiateStreaming === 'function') {\n \t\t\t\t\tpromise = WebAssembly.instantiateStreaming(req, importObject);\n \t\t\t\t} else {\n \t\t\t\t\tvar bytesPromise = req.then(function(x) { return x.arrayBuffer(); });\n \t\t\t\t\tpromise = bytesPromise.then(function(bytes) {\n \t\t\t\t\t\treturn WebAssembly.instantiate(bytes, importObject);\n \t\t\t\t\t});\n \t\t\t\t}\n \t\t\t\tpromises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) {\n \t\t\t\t\treturn __webpack_require__.w[wasmModuleId] = (res.instance || res).exports;\n \t\t\t\t}));\n \t\t\t}\n \t\t});\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \t// object with all WebAssembly.instance exports\n \t__webpack_require__.w = {};\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \tvar startupResult = (function() {\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./src/web_index.ts\");\n \t})();\n\n \twebpackJsonpCallback([[], {}, 0, [1]]);\n \treturn startupResult;\n","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.<string,*>}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function eventListener() {\n if (errorListener !== undefined) {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n var errorListener;\n\n // Adding an error listener is not optional because\n // if an error is thrown on an event emitter we cannot\n // guarantee that the actual event we are waiting will\n // be fired. The result could be a silent way to create\n // memory or file descriptor leaks, which is something\n // we should avoid.\n if (name !== 'error') {\n errorListener = function errorListener(err) {\n emitter.removeListener(name, eventListener);\n reject(err);\n };\n\n emitter.once('error', errorListener);\n }\n\n emitter.once(name, eventListener);\n });\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util = require(\"./util/minimal\");\nprotobuf.rpc = require(\"./rpc\");\nprotobuf.roots = require(\"./roots\");\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n ? new this.buf.constructor(0)\n : this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available accross modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError;\n\n Object.defineProperty(CustomError.prototype, \"name\", { get: function() { return name; } });\n\n CustomError.prototype.toString = function toString() {\n return this.name + \": \" + this.message;\n };\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\r\n\"use strict\";\r\n\r\nvar $protobuf = require(\"protobufjs/minimal\");\r\n\r\n// Common aliases\r\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\r\n\r\n// Exported root namespace\r\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\r\n\r\n$root.Buttplug = (function() {\r\n\r\n /**\r\n * Namespace Buttplug.\r\n * @exports Buttplug\r\n * @namespace\r\n */\r\n var Buttplug = {};\r\n\r\n /**\r\n * Endpoint enum.\r\n * @name Buttplug.Endpoint\r\n * @enum {number}\r\n * @property {number} Command=0 Command value\r\n * @property {number} Firmware=1 Firmware value\r\n * @property {number} Rx=2 Rx value\r\n * @property {number} RxAccel=3 RxAccel value\r\n * @property {number} RxBLEBattery=4 RxBLEBattery value\r\n * @property {number} RxPressure=5 RxPressure value\r\n * @property {number} RxTouch=6 RxTouch value\r\n * @property {number} Tx=7 Tx value\r\n * @property {number} TxMode=8 TxMode value\r\n * @property {number} TxShock=9 TxShock value\r\n * @property {number} TxVibrate=10 TxVibrate value\r\n * @property {number} TxVendorControl=11 TxVendorControl value\r\n * @property {number} Whitelist=12 Whitelist value\r\n * @property {number} Generic0=13 Generic0 value\r\n * @property {number} Generic1=14 Generic1 value\r\n * @property {number} Generic2=15 Generic2 value\r\n * @property {number} Generic3=16 Generic3 value\r\n * @property {number} Generic4=17 Generic4 value\r\n * @property {number} Generic5=18 Generic5 value\r\n * @property {number} Generic6=19 Generic6 value\r\n * @property {number} Generic7=20 Generic7 value\r\n * @property {number} Generic8=21 Generic8 value\r\n * @property {number} Generic9=22 Generic9 value\r\n * @property {number} Generic10=23 Generic10 value\r\n * @property {number} Generic11=24 Generic11 value\r\n * @property {number} Generic12=25 Generic12 value\r\n * @property {number} Generic13=26 Generic13 value\r\n * @property {number} Generic14=27 Generic14 value\r\n * @property {number} Generic15=28 Generic15 value\r\n * @property {number} Generic16=29 Generic16 value\r\n * @property {number} Generic17=30 Generic17 value\r\n * @property {number} Generic18=31 Generic18 value\r\n * @property {number} Generic19=32 Generic19 value\r\n * @property {number} Generic20=33 Generic20 value\r\n * @property {number} Generic21=34 Generic21 value\r\n * @property {number} Generic22=35 Generic22 value\r\n * @property {number} Generic23=36 Generic23 value\r\n * @property {number} Generic24=37 Generic24 value\r\n * @property {number} Generic25=38 Generic25 value\r\n * @property {number} Generic26=39 Generic26 value\r\n * @property {number} Generic27=40 Generic27 value\r\n * @property {number} Generic28=41 Generic28 value\r\n * @property {number} Generic29=42 Generic29 value\r\n * @property {number} Generic30=43 Generic30 value\r\n * @property {number} Generic31=44 Generic31 value\r\n */\r\n Buttplug.Endpoint = (function() {\r\n var valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"Command\"] = 0;\r\n values[valuesById[1] = \"Firmware\"] = 1;\r\n values[valuesById[2] = \"Rx\"] = 2;\r\n values[valuesById[3] = \"RxAccel\"] = 3;\r\n values[valuesById[4] = \"RxBLEBattery\"] = 4;\r\n values[valuesById[5] = \"RxPressure\"] = 5;\r\n values[valuesById[6] = \"RxTouch\"] = 6;\r\n values[valuesById[7] = \"Tx\"] = 7;\r\n values[valuesById[8] = \"TxMode\"] = 8;\r\n values[valuesById[9] = \"TxShock\"] = 9;\r\n values[valuesById[10] = \"TxVibrate\"] = 10;\r\n values[valuesById[11] = \"TxVendorControl\"] = 11;\r\n values[valuesById[12] = \"Whitelist\"] = 12;\r\n values[valuesById[13] = \"Generic0\"] = 13;\r\n values[valuesById[14] = \"Generic1\"] = 14;\r\n values[valuesById[15] = \"Generic2\"] = 15;\r\n values[valuesById[16] = \"Generic3\"] = 16;\r\n values[valuesById[17] = \"Generic4\"] = 17;\r\n values[valuesById[18] = \"Generic5\"] = 18;\r\n values[valuesById[19] = \"Generic6\"] = 19;\r\n values[valuesById[20] = \"Generic7\"] = 20;\r\n values[valuesById[21] = \"Generic8\"] = 21;\r\n values[valuesById[22] = \"Generic9\"] = 22;\r\n values[valuesById[23] = \"Generic10\"] = 23;\r\n values[valuesById[24] = \"Generic11\"] = 24;\r\n values[valuesById[25] = \"Generic12\"] = 25;\r\n values[valuesById[26] = \"Generic13\"] = 26;\r\n values[valuesById[27] = \"Generic14\"] = 27;\r\n values[valuesById[28] = \"Generic15\"] = 28;\r\n values[valuesById[29] = \"Generic16\"] = 29;\r\n values[valuesById[30] = \"Generic17\"] = 30;\r\n values[valuesById[31] = \"Generic18\"] = 31;\r\n values[valuesById[32] = \"Generic19\"] = 32;\r\n values[valuesById[33] = \"Generic20\"] = 33;\r\n values[valuesById[34] = \"Generic21\"] = 34;\r\n values[valuesById[35] = \"Generic22\"] = 35;\r\n values[valuesById[36] = \"Generic23\"] = 36;\r\n values[valuesById[37] = \"Generic24\"] = 37;\r\n values[valuesById[38] = \"Generic25\"] = 38;\r\n values[valuesById[39] = \"Generic26\"] = 39;\r\n values[valuesById[40] = \"Generic27\"] = 40;\r\n values[valuesById[41] = \"Generic28\"] = 41;\r\n values[valuesById[42] = \"Generic29\"] = 42;\r\n values[valuesById[43] = \"Generic30\"] = 43;\r\n values[valuesById[44] = \"Generic31\"] = 44;\r\n return values;\r\n })();\r\n\r\n Buttplug.ClientMessage = (function() {\r\n\r\n /**\r\n * Properties of a ClientMessage.\r\n * @memberof Buttplug\r\n * @interface IClientMessage\r\n * @property {number|null} [id] ClientMessage id\r\n * @property {Buttplug.ClientMessage.IFFIMessage|null} [message] ClientMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new ClientMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ClientMessage.\r\n * @implements IClientMessage\r\n * @constructor\r\n * @param {Buttplug.IClientMessage=} [properties] Properties to set\r\n */\r\n function ClientMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ClientMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n */\r\n ClientMessage.prototype.id = 0;\r\n\r\n /**\r\n * ClientMessage message.\r\n * @member {Buttplug.ClientMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n */\r\n ClientMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new ClientMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage} ClientMessage instance\r\n */\r\n ClientMessage.create = function create(properties) {\r\n return new ClientMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ClientMessage message. Does not implicitly {@link Buttplug.ClientMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage} message ClientMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ClientMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.ClientMessage.FFIMessage.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ClientMessage message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage} message ClientMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ClientMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ClientMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ClientMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.message = $root.Buttplug.ClientMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ClientMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ClientMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ClientMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ClientMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n var error = $root.Buttplug.ClientMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ClientMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n */\r\n ClientMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage)\r\n return object;\r\n var message = new $root.Buttplug.ClientMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.message: object expected\");\r\n message.message = $root.Buttplug.ClientMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ClientMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage} message ClientMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ClientMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.ClientMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ClientMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ClientMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n /**\r\n * DeviceCommunicationManagerTypes enum.\r\n * @name Buttplug.ClientMessage.DeviceCommunicationManagerTypes\r\n * @enum {number}\r\n * @property {number} All=0 All value\r\n * @property {number} Btleplug=1 Btleplug value\r\n * @property {number} XInput=2 XInput value\r\n * @property {number} SerialPort=4 SerialPort value\r\n * @property {number} LovenseHIDDongle=8 LovenseHIDDongle value\r\n * @property {number} LovenseSerialDongle=16 LovenseSerialDongle value\r\n */\r\n ClientMessage.DeviceCommunicationManagerTypes = (function() {\r\n var valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"All\"] = 0;\r\n values[valuesById[1] = \"Btleplug\"] = 1;\r\n values[valuesById[2] = \"XInput\"] = 2;\r\n values[valuesById[4] = \"SerialPort\"] = 4;\r\n values[valuesById[8] = \"LovenseHIDDongle\"] = 8;\r\n values[valuesById[16] = \"LovenseSerialDongle\"] = 16;\r\n return values;\r\n })();\r\n\r\n ClientMessage.ConnectLocal = (function() {\r\n\r\n /**\r\n * Properties of a ConnectLocal.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IConnectLocal\r\n * @property {string|null} [serverName] ConnectLocal serverName\r\n * @property {number|null} [maxPingTime] ConnectLocal maxPingTime\r\n * @property {boolean|null} [allowRawMessages] ConnectLocal allowRawMessages\r\n * @property {string|null} [deviceConfigurationJson] ConnectLocal deviceConfigurationJson\r\n * @property {string|null} [userDeviceConfigurationJson] ConnectLocal userDeviceConfigurationJson\r\n * @property {number|null} [commManagerTypes] ConnectLocal commManagerTypes\r\n */\r\n\r\n /**\r\n * Constructs a new ConnectLocal.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a ConnectLocal.\r\n * @implements IConnectLocal\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IConnectLocal=} [properties] Properties to set\r\n */\r\n function ConnectLocal(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ConnectLocal serverName.\r\n * @member {string} serverName\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.serverName = \"\";\r\n\r\n /**\r\n * ConnectLocal maxPingTime.\r\n * @member {number} maxPingTime\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.maxPingTime = 0;\r\n\r\n /**\r\n * ConnectLocal allowRawMessages.\r\n * @member {boolean} allowRawMessages\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.allowRawMessages = false;\r\n\r\n /**\r\n * ConnectLocal deviceConfigurationJson.\r\n * @member {string} deviceConfigurationJson\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.deviceConfigurationJson = \"\";\r\n\r\n /**\r\n * ConnectLocal userDeviceConfigurationJson.\r\n * @member {string} userDeviceConfigurationJson\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.userDeviceConfigurationJson = \"\";\r\n\r\n /**\r\n * ConnectLocal commManagerTypes.\r\n * @member {number} commManagerTypes\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.commManagerTypes = 0;\r\n\r\n /**\r\n * Creates a new ConnectLocal instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal instance\r\n */\r\n ConnectLocal.create = function create(properties) {\r\n return new ConnectLocal(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectLocal message. Does not implicitly {@link Buttplug.ClientMessage.ConnectLocal.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal} message ConnectLocal message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectLocal.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.serverName != null && Object.hasOwnProperty.call(message, \"serverName\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.serverName);\r\n if (message.maxPingTime != null && Object.hasOwnProperty.call(message, \"maxPingTime\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.maxPingTime);\r\n if (message.allowRawMessages != null && Object.hasOwnProperty.call(message, \"allowRawMessages\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.allowRawMessages);\r\n if (message.deviceConfigurationJson != null && Object.hasOwnProperty.call(message, \"deviceConfigurationJson\"))\r\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.deviceConfigurationJson);\r\n if (message.userDeviceConfigurationJson != null && Object.hasOwnProperty.call(message, \"userDeviceConfigurationJson\"))\r\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.userDeviceConfigurationJson);\r\n if (message.commManagerTypes != null && Object.hasOwnProperty.call(message, \"commManagerTypes\"))\r\n writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.commManagerTypes);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectLocal message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.ConnectLocal.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal} message ConnectLocal message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectLocal.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ConnectLocal message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectLocal.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.ConnectLocal();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.serverName = reader.string();\r\n break;\r\n case 2:\r\n message.maxPingTime = reader.uint32();\r\n break;\r\n case 3:\r\n message.allowRawMessages = reader.bool();\r\n break;\r\n case 4:\r\n message.deviceConfigurationJson = reader.string();\r\n break;\r\n case 5:\r\n message.userDeviceConfigurationJson = reader.string();\r\n break;\r\n case 6:\r\n message.commManagerTypes = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ConnectLocal message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectLocal.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ConnectLocal message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ConnectLocal.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.serverName != null && message.hasOwnProperty(\"serverName\"))\r\n if (!$util.isString(message.serverName))\r\n return \"serverName: string expected\";\r\n if (message.maxPingTime != null && message.hasOwnProperty(\"maxPingTime\"))\r\n if (!$util.isInteger(message.maxPingTime))\r\n return \"maxPingTime: integer expected\";\r\n if (message.allowRawMessages != null && message.hasOwnProperty(\"allowRawMessages\"))\r\n if (typeof message.allowRawMessages !== \"boolean\")\r\n return \"allowRawMessages: boolean expected\";\r\n if (message.deviceConfigurationJson != null && message.hasOwnProperty(\"deviceConfigurationJson\"))\r\n if (!$util.isString(message.deviceConfigurationJson))\r\n return \"deviceConfigurationJson: string expected\";\r\n if (message.userDeviceConfigurationJson != null && message.hasOwnProperty(\"userDeviceConfigurationJson\"))\r\n if (!$util.isString(message.userDeviceConfigurationJson))\r\n return \"userDeviceConfigurationJson: string expected\";\r\n if (message.commManagerTypes != null && message.hasOwnProperty(\"commManagerTypes\"))\r\n if (!$util.isInteger(message.commManagerTypes))\r\n return \"commManagerTypes: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ConnectLocal message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n */\r\n ConnectLocal.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.ConnectLocal)\r\n return object;\r\n var message = new $root.Buttplug.ClientMessage.ConnectLocal();\r\n if (object.serverName != null)\r\n message.serverName = String(object.serverName);\r\n if (object.maxPingTime != null)\r\n message.maxPingTime = object.maxPingTime >>> 0;\r\n if (object.allowRawMessages != null)\r\n message.allowRawMessages = Boolean(object.allowRawMessages);\r\n if (object.deviceConfigurationJson != null)\r\n message.deviceConfigurationJson = String(object.deviceConfigurationJson);\r\n if (object.userDeviceConfigurationJson != null)\r\n message.userDeviceConfigurationJson = String(object.userDeviceConfigurationJson);\r\n if (object.commManagerTypes != null)\r\n message.commManagerTypes = object.commManagerTypes >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ConnectLocal message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.ConnectLocal} message ConnectLocal\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ConnectLocal.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.serverName = \"\";\r\n object.maxPingTime = 0;\r\n object.allowRawMessages = false;\r\n object.deviceConfigurationJson = \"\";\r\n object.userDeviceConfigurationJson = \"\";\r\n object.commManagerTypes = 0;\r\n }\r\n if (message.serverName != null && message.hasOwnProperty(\"serverName\"))\r\n object.serverName = message.serverName;\r\n if (message.maxPingTime != null && message.hasOwnProperty(\"maxPingTime\"))\r\n object.maxPingTime = message.maxPingTime;\r\n if (message.allowRawMessages != null && message.hasOwnProperty(\"allowRawMessages\"))\r\n object.allowRawMessages = message.allowRawMessages;\r\n if (message.deviceConfigurationJson != null && message.hasOwnProperty(\"deviceConfigurationJson\"))\r\n object.deviceConfigurationJson = message.deviceConfigurationJson;\r\n if (message.userDeviceConfigurationJson != null && message.hasOwnProperty(\"userDeviceConfigurationJson\"))\r\n object.userDeviceConfigurationJson = message.userDeviceConfigurationJson;\r\n if (message.commManagerTypes != null && message.hasOwnProperty(\"commManagerTypes\"))\r\n object.commManagerTypes = message.commManagerTypes;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ConnectLocal to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ConnectLocal.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ConnectLocal;\r\n })();\r\n\r\n ClientMessage.ConnectWebsocket = (function() {\r\n\r\n /**\r\n * Properties of a ConnectWebsocket.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IConnectWebsocket\r\n * @property {string|null} [address] ConnectWebsocket address\r\n * @property {boolean|null} [bypassCertVerification] ConnectWebsocket bypassCertVerification\r\n */\r\n\r\n /**\r\n * Constructs a new ConnectWebsocket.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a ConnectWebsocket.\r\n * @implements IConnectWebsocket\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket=} [properties] Properties to set\r\n */\r\n function ConnectWebsocket(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ConnectWebsocket address.\r\n * @member {string} address\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n */\r\n ConnectWebsocket.prototype.address = \"\";\r\n\r\n /**\r\n * ConnectWebsocket bypassCertVerification.\r\n * @member {boolean} bypassCertVerification\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n */\r\n ConnectWebsocket.prototype.bypassCertVerification = false;\r\n\r\n /**\r\n * Creates a new ConnectWebsocket instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket instance\r\n */\r\n ConnectWebsocket.create = function create(properties) {\r\n return new ConnectWebsocket(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectWebsocket message. Does not implicitly {@link Buttplug.ClientMessage.ConnectWebsocket.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket} message ConnectWebsocket message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectWebsocket.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.address != null && Object.hasOwnProperty.call(message, \"address\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.address);\r\n if (message.bypassCertVerification != null && Object.hasOwnProperty.call(message, \"bypassCertVerification\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).bool(message.bypassCertVerification);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectWebsocket message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.ConnectWebsocket.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket} message ConnectWebsocket message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectWebsocket.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ConnectWebsocket message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectWebsocket.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.ConnectWebsocket();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.address = reader.string();\r\n break;\r\n case 2:\r\n message.bypassCertVerification = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ConnectWebsocket message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectWebsocket.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ConnectWebsocket message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ConnectWebsocket.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.address != null && message.hasOwnProperty(\"address\"))\r\n if (!$util.isString(message.address))\r\n return \"address: string expected\";\r\n if (message.bypassCertVerification != null && message.hasOwnProperty(\"bypassCertVerification\"))\r\n if (typeof message.bypassCertVerification !== \"boolean\")\r\n return \"bypassCertVerification: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ConnectWebsocket message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n */\r\n ConnectWebsocket.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.ConnectWebsocket)\r\n return object;\r\n var message = new $root.Buttplug.ClientMessage.ConnectWebsocket();\r\n if (object.address != null)\r\n message.address = String(object.address);\r\n if (object.bypassCertVerification != null)\r\n message.bypassCertVerification = Boolean(object.bypassCertVerification);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ConnectWebsocket message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.ConnectWebsocket} message ConnectWebsocket\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ConnectWebsocket.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.address = \"\";\r\n object.bypassCertVerification = false;\r\n }\r\n if (message.address != null && message.hasOwnProperty(\"address\"))\r\n object.address = message.address;\r\n if (message.bypassCertVerification != null && message.hasOwnProperty(\"bypassCertVerification\"))\r\n object.bypassCertVerification = message.bypassCertVerification;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ConnectWebsocket to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ConnectWebsocket.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ConnectWebsocket;\r\n })();\r\n\r\n ClientMessage.StartScanning = (function() {\r\n\r\n /**\r\n * Properties of a StartScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStartScanning\r\n */\r\n\r\n /**\r\n * Constructs a new StartScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StartScanning.\r\n * @implements IStartScanning\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStartScanning=} [properties] Properties to set\r\n */\r\n function StartScanning(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StartScanning instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning instance\r\n */\r\n StartScanning.create = function create(properties) {\r\n return new StartScanning(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StartScanning message. Does not implicitly {@link Buttplug.ClientMessage.StartScanning.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning} message StartScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StartScanning.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StartScanning message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StartScanning.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning} message StartScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StartScanning.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StartScanning message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StartScanning.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StartScanning();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StartScanning message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StartScanning.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StartScanning message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StartScanning.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StartScanning message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n */\r\n StartScanning.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StartScanning)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StartScanning();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StartScanning message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.StartScanning} message StartScanning\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StartScanning.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StartScanning to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StartScanning.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StartScanning;\r\n })();\r\n\r\n ClientMessage.StopScanning = (function() {\r\n\r\n /**\r\n * Properties of a StopScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStopScanning\r\n */\r\n\r\n /**\r\n * Constructs a new StopScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StopScanning.\r\n * @implements IStopScanning\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStopScanning=} [properties] Properties to set\r\n */\r\n function StopScanning(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopScanning instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning instance\r\n */\r\n StopScanning.create = function create(properties) {\r\n return new StopScanning(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopScanning message. Does not implicitly {@link Buttplug.ClientMessage.StopScanning.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning} message StopScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopScanning.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopScanning message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StopScanning.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning} message StopScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopScanning.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopScanning message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopScanning.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StopScanning();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopScanning message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopScanning.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopScanning message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopScanning.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopScanning message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n */\r\n StopScanning.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StopScanning)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StopScanning();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopScanning message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.StopScanning} message StopScanning\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopScanning.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopScanning to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopScanning.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopScanning;\r\n })();\r\n\r\n ClientMessage.StopAllDevices = (function() {\r\n\r\n /**\r\n * Properties of a StopAllDevices.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStopAllDevices\r\n */\r\n\r\n /**\r\n * Constructs a new StopAllDevices.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StopAllDevices.\r\n * @implements IStopAllDevices\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStopAllDevices=} [properties] Properties to set\r\n */\r\n function StopAllDevices(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopAllDevices instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices instance\r\n */\r\n StopAllDevices.create = function create(properties) {\r\n return new StopAllDevices(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopAllDevices message. Does not implicitly {@link Buttplug.ClientMessage.StopAllDevices.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices} message StopAllDevices message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopAllDevices.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopAllDevices message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StopAllDevices.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices} message StopAllDevices message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopAllDevices.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopAllDevices message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopAllDevices.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StopAllDevices();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopAllDevices message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopAllDevices.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopAllDevices message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopAllDevices.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopAllDevices message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n */\r\n StopAllDevices.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StopAllDevices)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StopAllDevices();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopAllDevices message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.StopAllDevices} message StopAllDevices\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopAllDevices.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopAllDevices to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopAllDevices.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopAllDevices;\r\n })();\r\n\r\n ClientMessage.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IDisconnect\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.ClientMessage.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.Disconnect();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.Disconnect)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.Disconnect();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n ClientMessage.Ping = (function() {\r\n\r\n /**\r\n * Properties of a Ping.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IPing\r\n */\r\n\r\n /**\r\n * Constructs a new Ping.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a Ping.\r\n * @implements IPing\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IPing=} [properties] Properties to set\r\n */\r\n function Ping(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Ping instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.Ping} Ping instance\r\n */\r\n Ping.create = function create(properties) {\r\n return new Ping(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Ping message. Does not implicitly {@link Buttplug.ClientMessage.Ping.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing} message Ping message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ping.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Ping message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.Ping.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing} message Ping message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ping.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Ping message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ping.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.Ping();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Ping message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ping.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Ping message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Ping.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Ping message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n */\r\n Ping.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.Ping)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.Ping();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Ping message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.Ping} message Ping\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Ping.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Ping to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Ping.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Ping;\r\n })();\r\n\r\n ClientMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.ClientMessage.IConnectLocal|null} [connectLocal] FFIMessage connectLocal\r\n * @property {Buttplug.ClientMessage.IConnectWebsocket|null} [connectWebsocket] FFIMessage connectWebsocket\r\n * @property {Buttplug.ClientMessage.IStartScanning|null} [startScanning] FFIMessage startScanning\r\n * @property {Buttplug.ClientMessage.IStopScanning|null} [stopScanning] FFIMessage stopScanning\r\n * @property {Buttplug.ClientMessage.IStopAllDevices|null} [stopAllDevices] FFIMessage stopAllDevices\r\n * @property {Buttplug.ClientMessage.IDisconnect|null} [disconnect] FFIMessage disconnect\r\n * @property {Buttplug.ClientMessage.IPing|null} [ping] FFIMessage ping\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage connectLocal.\r\n * @member {Buttplug.ClientMessage.IConnectLocal|null|undefined} connectLocal\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.connectLocal = null;\r\n\r\n /**\r\n * FFIMessage connectWebsocket.\r\n * @member {Buttplug.ClientMessage.IConnectWebsocket|null|undefined} connectWebsocket\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.connectWebsocket = null;\r\n\r\n /**\r\n * FFIMessage startScanning.\r\n * @member {Buttplug.ClientMessage.IStartScanning|null|undefined} startScanning\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.startScanning = null;\r\n\r\n /**\r\n * FFIMessage stopScanning.\r\n * @member {Buttplug.ClientMessage.IStopScanning|null|undefined} stopScanning\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopScanning = null;\r\n\r\n /**\r\n * FFIMessage stopAllDevices.\r\n * @member {Buttplug.ClientMessage.IStopAllDevices|null|undefined} stopAllDevices\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopAllDevices = null;\r\n\r\n /**\r\n * FFIMessage disconnect.\r\n * @member {Buttplug.ClientMessage.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.disconnect = null;\r\n\r\n /**\r\n * FFIMessage ping.\r\n * @member {Buttplug.ClientMessage.IPing|null|undefined} ping\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.ping = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n var $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"connectLocal\"|\"connectWebsocket\"|\"startScanning\"|\"stopScanning\"|\"stopAllDevices\"|\"disconnect\"|\"ping\"|undefined} msg\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"connectLocal\", \"connectWebsocket\", \"startScanning\", \"stopScanning\", \"stopAllDevices\", \"disconnect\", \"ping\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.ClientMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.connectLocal != null && Object.hasOwnProperty.call(message, \"connectLocal\"))\r\n $root.Buttplug.ClientMessage.ConnectLocal.encode(message.connectLocal, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.connectWebsocket != null && Object.hasOwnProperty.call(message, \"connectWebsocket\"))\r\n $root.Buttplug.ClientMessage.ConnectWebsocket.encode(message.connectWebsocket, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.startScanning != null && Object.hasOwnProperty.call(message, \"startScanning\"))\r\n $root.Buttplug.ClientMessage.StartScanning.encode(message.startScanning, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.stopScanning != null && Object.hasOwnProperty.call(message, \"stopScanning\"))\r\n $root.Buttplug.ClientMessage.StopScanning.encode(message.stopScanning, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.stopAllDevices != null && Object.hasOwnProperty.call(message, \"stopAllDevices\"))\r\n $root.Buttplug.ClientMessage.StopAllDevices.encode(message.stopAllDevices, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.ClientMessage.Disconnect.encode(message.disconnect, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n if (message.ping != null && Object.hasOwnProperty.call(message, \"ping\"))\r\n $root.Buttplug.ClientMessage.Ping.encode(message.ping, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.startScanning = $root.Buttplug.ClientMessage.StartScanning.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.stopScanning = $root.Buttplug.ClientMessage.StopScanning.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.disconnect = $root.Buttplug.ClientMessage.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n case 7:\r\n message.ping = $root.Buttplug.ClientMessage.Ping.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n var properties = {};\r\n if (message.connectLocal != null && message.hasOwnProperty(\"connectLocal\")) {\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.ConnectLocal.verify(message.connectLocal);\r\n if (error)\r\n return \"connectLocal.\" + error;\r\n }\r\n }\r\n if (message.connectWebsocket != null && message.hasOwnProperty(\"connectWebsocket\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.ConnectWebsocket.verify(message.connectWebsocket);\r\n if (error)\r\n return \"connectWebsocket.\" + error;\r\n }\r\n }\r\n if (message.startScanning != null && message.hasOwnProperty(\"startScanning\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.StartScanning.verify(message.startScanning);\r\n if (error)\r\n return \"startScanning.\" + error;\r\n }\r\n }\r\n if (message.stopScanning != null && message.hasOwnProperty(\"stopScanning\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.StopScanning.verify(message.stopScanning);\r\n if (error)\r\n return \"stopScanning.\" + error;\r\n }\r\n }\r\n if (message.stopAllDevices != null && message.hasOwnProperty(\"stopAllDevices\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.StopAllDevices.verify(message.stopAllDevices);\r\n if (error)\r\n return \"stopAllDevices.\" + error;\r\n }\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ClientMessage.Ping.verify(message.ping);\r\n if (error)\r\n return \"ping.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.FFIMessage)\r\n return object;\r\n var message = new $root.Buttplug.ClientMessage.FFIMessage();\r\n if (object.connectLocal != null) {\r\n if (typeof object.connectLocal !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.connectLocal: object expected\");\r\n message.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.fromObject(object.connectLocal);\r\n }\r\n if (object.connectWebsocket != null) {\r\n if (typeof object.connectWebsocket !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.connectWebsocket: object expected\");\r\n message.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.fromObject(object.connectWebsocket);\r\n }\r\n if (object.startScanning != null) {\r\n if (typeof object.startScanning !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.startScanning: object expected\");\r\n message.startScanning = $root.Buttplug.ClientMessage.StartScanning.fromObject(object.startScanning);\r\n }\r\n if (object.stopScanning != null) {\r\n if (typeof object.stopScanning !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.stopScanning: object expected\");\r\n message.stopScanning = $root.Buttplug.ClientMessage.StopScanning.fromObject(object.stopScanning);\r\n }\r\n if (object.stopAllDevices != null) {\r\n if (typeof object.stopAllDevices !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.stopAllDevices: object expected\");\r\n message.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.fromObject(object.stopAllDevices);\r\n }\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.ClientMessage.Disconnect.fromObject(object.disconnect);\r\n }\r\n if (object.ping != null) {\r\n if (typeof object.ping !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.ping: object expected\");\r\n message.ping = $root.Buttplug.ClientMessage.Ping.fromObject(object.ping);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (message.connectLocal != null && message.hasOwnProperty(\"connectLocal\")) {\r\n object.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.toObject(message.connectLocal, options);\r\n if (options.oneofs)\r\n object.msg = \"connectLocal\";\r\n }\r\n if (message.connectWebsocket != null && message.hasOwnProperty(\"connectWebsocket\")) {\r\n object.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.toObject(message.connectWebsocket, options);\r\n if (options.oneofs)\r\n object.msg = \"connectWebsocket\";\r\n }\r\n if (message.startScanning != null && message.hasOwnProperty(\"startScanning\")) {\r\n object.startScanning = $root.Buttplug.ClientMessage.StartScanning.toObject(message.startScanning, options);\r\n if (options.oneofs)\r\n object.msg = \"startScanning\";\r\n }\r\n if (message.stopScanning != null && message.hasOwnProperty(\"stopScanning\")) {\r\n object.stopScanning = $root.Buttplug.ClientMessage.StopScanning.toObject(message.stopScanning, options);\r\n if (options.oneofs)\r\n object.msg = \"stopScanning\";\r\n }\r\n if (message.stopAllDevices != null && message.hasOwnProperty(\"stopAllDevices\")) {\r\n object.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.toObject(message.stopAllDevices, options);\r\n if (options.oneofs)\r\n object.msg = \"stopAllDevices\";\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.ClientMessage.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\r\n object.ping = $root.Buttplug.ClientMessage.Ping.toObject(message.ping, options);\r\n if (options.oneofs)\r\n object.msg = \"ping\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return ClientMessage;\r\n })();\r\n\r\n Buttplug.DeviceMessage = (function() {\r\n\r\n /**\r\n * Properties of a DeviceMessage.\r\n * @memberof Buttplug\r\n * @interface IDeviceMessage\r\n * @property {number|null} [id] DeviceMessage id\r\n * @property {number|null} [index] DeviceMessage index\r\n * @property {Buttplug.DeviceMessage.IFFIMessage|null} [message] DeviceMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a DeviceMessage.\r\n * @implements IDeviceMessage\r\n * @constructor\r\n * @param {Buttplug.IDeviceMessage=} [properties] Properties to set\r\n */\r\n function DeviceMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.id = 0;\r\n\r\n /**\r\n * DeviceMessage index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.index = 0;\r\n\r\n /**\r\n * DeviceMessage message.\r\n * @member {Buttplug.DeviceMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new DeviceMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage instance\r\n */\r\n DeviceMessage.create = function create(properties) {\r\n return new DeviceMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceMessage message. Does not implicitly {@link Buttplug.DeviceMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage} message DeviceMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.index);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.DeviceMessage.FFIMessage.encode(message.message, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceMessage message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage} message DeviceMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.index = reader.uint32();\r\n break;\r\n case 3:\r\n message.message = $root.Buttplug.DeviceMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceMessage message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n var error = $root.Buttplug.DeviceMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n */\r\n DeviceMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.message: object expected\");\r\n message.message = $root.Buttplug.DeviceMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage} message DeviceMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.index = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.DeviceMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n DeviceMessage.VibrateComponent = (function() {\r\n\r\n /**\r\n * Properties of a VibrateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IVibrateComponent\r\n * @property {number|null} [index] VibrateComponent index\r\n * @property {number|null} [speed] VibrateComponent speed\r\n */\r\n\r\n /**\r\n * Constructs a new VibrateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a VibrateComponent.\r\n * @implements IVibrateComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent=} [properties] Properties to set\r\n */\r\n function VibrateComponent(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * VibrateComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n */\r\n VibrateComponent.prototype.index = 0;\r\n\r\n /**\r\n * VibrateComponent speed.\r\n * @member {number} speed\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n */\r\n VibrateComponent.prototype.speed = 0;\r\n\r\n /**\r\n * Creates a new VibrateComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent instance\r\n */\r\n VibrateComponent.create = function create(properties) {\r\n return new VibrateComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateComponent message. Does not implicitly {@link Buttplug.DeviceMessage.VibrateComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent} message VibrateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.speed != null && Object.hasOwnProperty.call(message, \"speed\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.speed);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.VibrateComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent} message VibrateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a VibrateComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.VibrateComponent();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.speed = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a VibrateComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a VibrateComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n VibrateComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n if (typeof message.speed !== \"number\")\r\n return \"speed: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a VibrateComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n */\r\n VibrateComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.VibrateComponent)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.VibrateComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.speed != null)\r\n message.speed = Number(object.speed);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a VibrateComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.VibrateComponent} message VibrateComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n VibrateComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.speed = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n object.speed = options.json && !isFinite(message.speed) ? String(message.speed) : message.speed;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this VibrateComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n VibrateComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return VibrateComponent;\r\n })();\r\n\r\n DeviceMessage.VibrateCmd = (function() {\r\n\r\n /**\r\n * Properties of a VibrateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IVibrateCmd\r\n * @property {Array.<Buttplug.DeviceMessage.IVibrateComponent>|null} [speeds] VibrateCmd speeds\r\n */\r\n\r\n /**\r\n * Constructs a new VibrateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a VibrateCmd.\r\n * @implements IVibrateCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd=} [properties] Properties to set\r\n */\r\n function VibrateCmd(properties) {\r\n this.speeds = [];\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * VibrateCmd speeds.\r\n * @member {Array.<Buttplug.DeviceMessage.IVibrateComponent>} speeds\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @instance\r\n */\r\n VibrateCmd.prototype.speeds = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new VibrateCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd instance\r\n */\r\n VibrateCmd.create = function create(properties) {\r\n return new VibrateCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateCmd message. Does not implicitly {@link Buttplug.DeviceMessage.VibrateCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd} message VibrateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.speeds != null && message.speeds.length)\r\n for (var i = 0; i < message.speeds.length; ++i)\r\n $root.Buttplug.DeviceMessage.VibrateComponent.encode(message.speeds[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.VibrateCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd} message VibrateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a VibrateCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.VibrateCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.speeds && message.speeds.length))\r\n message.speeds = [];\r\n message.speeds.push($root.Buttplug.DeviceMessage.VibrateComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a VibrateCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a VibrateCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n VibrateCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.speeds != null && message.hasOwnProperty(\"speeds\")) {\r\n if (!Array.isArray(message.speeds))\r\n return \"speeds: array expected\";\r\n for (var i = 0; i < message.speeds.length; ++i) {\r\n var error = $root.Buttplug.DeviceMessage.VibrateComponent.verify(message.speeds[i]);\r\n if (error)\r\n return \"speeds.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a VibrateCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n */\r\n VibrateCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.VibrateCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.VibrateCmd();\r\n if (object.speeds) {\r\n if (!Array.isArray(object.speeds))\r\n throw TypeError(\".Buttplug.DeviceMessage.VibrateCmd.speeds: array expected\");\r\n message.speeds = [];\r\n for (var i = 0; i < object.speeds.length; ++i) {\r\n if (typeof object.speeds[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.VibrateCmd.speeds: object expected\");\r\n message.speeds[i] = $root.Buttplug.DeviceMessage.VibrateComponent.fromObject(object.speeds[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a VibrateCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.VibrateCmd} message VibrateCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n VibrateCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.arrays || options.defaults)\r\n object.speeds = [];\r\n if (message.speeds && message.speeds.length) {\r\n object.speeds = [];\r\n for (var j = 0; j < message.speeds.length; ++j)\r\n object.speeds[j] = $root.Buttplug.DeviceMessage.VibrateComponent.toObject(message.speeds[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this VibrateCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n VibrateCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return VibrateCmd;\r\n })();\r\n\r\n DeviceMessage.RotateComponent = (function() {\r\n\r\n /**\r\n * Properties of a RotateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRotateComponent\r\n * @property {number|null} [index] RotateComponent index\r\n * @property {number|null} [speed] RotateComponent speed\r\n * @property {boolean|null} [clockwise] RotateComponent clockwise\r\n */\r\n\r\n /**\r\n * Constructs a new RotateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RotateComponent.\r\n * @implements IRotateComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRotateComponent=} [properties] Properties to set\r\n */\r\n function RotateComponent(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RotateComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.index = 0;\r\n\r\n /**\r\n * RotateComponent speed.\r\n * @member {number} speed\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.speed = 0;\r\n\r\n /**\r\n * RotateComponent clockwise.\r\n * @member {boolean} clockwise\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.clockwise = false;\r\n\r\n /**\r\n * Creates a new RotateComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent instance\r\n */\r\n RotateComponent.create = function create(properties) {\r\n return new RotateComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateComponent message. Does not implicitly {@link Buttplug.DeviceMessage.RotateComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent} message RotateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.speed != null && Object.hasOwnProperty.call(message, \"speed\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.speed);\r\n if (message.clockwise != null && Object.hasOwnProperty.call(message, \"clockwise\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.clockwise);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RotateComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent} message RotateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RotateComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RotateComponent();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.speed = reader.double();\r\n break;\r\n case 3:\r\n message.clockwise = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RotateComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RotateComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RotateComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n if (typeof message.speed !== \"number\")\r\n return \"speed: number expected\";\r\n if (message.clockwise != null && message.hasOwnProperty(\"clockwise\"))\r\n if (typeof message.clockwise !== \"boolean\")\r\n return \"clockwise: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RotateComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n */\r\n RotateComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RotateComponent)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RotateComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.speed != null)\r\n message.speed = Number(object.speed);\r\n if (object.clockwise != null)\r\n message.clockwise = Boolean(object.clockwise);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RotateComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RotateComponent} message RotateComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RotateComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.speed = 0;\r\n object.clockwise = false;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n object.speed = options.json && !isFinite(message.speed) ? String(message.speed) : message.speed;\r\n if (message.clockwise != null && message.hasOwnProperty(\"clockwise\"))\r\n object.clockwise = message.clockwise;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RotateComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RotateComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RotateComponent;\r\n })();\r\n\r\n DeviceMessage.RotateCmd = (function() {\r\n\r\n /**\r\n * Properties of a RotateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRotateCmd\r\n * @property {Array.<Buttplug.DeviceMessage.IRotateComponent>|null} [rotations] RotateCmd rotations\r\n */\r\n\r\n /**\r\n * Constructs a new RotateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RotateCmd.\r\n * @implements IRotateCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRotateCmd=} [properties] Properties to set\r\n */\r\n function RotateCmd(properties) {\r\n this.rotations = [];\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RotateCmd rotations.\r\n * @member {Array.<Buttplug.DeviceMessage.IRotateComponent>} rotations\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @instance\r\n */\r\n RotateCmd.prototype.rotations = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new RotateCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd instance\r\n */\r\n RotateCmd.create = function create(properties) {\r\n return new RotateCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RotateCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd} message RotateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.rotations != null && message.rotations.length)\r\n for (var i = 0; i < message.rotations.length; ++i)\r\n $root.Buttplug.DeviceMessage.RotateComponent.encode(message.rotations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RotateCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd} message RotateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RotateCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RotateCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.rotations && message.rotations.length))\r\n message.rotations = [];\r\n message.rotations.push($root.Buttplug.DeviceMessage.RotateComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RotateCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RotateCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RotateCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.rotations != null && message.hasOwnProperty(\"rotations\")) {\r\n if (!Array.isArray(message.rotations))\r\n return \"rotations: array expected\";\r\n for (var i = 0; i < message.rotations.length; ++i) {\r\n var error = $root.Buttplug.DeviceMessage.RotateComponent.verify(message.rotations[i]);\r\n if (error)\r\n return \"rotations.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RotateCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n */\r\n RotateCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RotateCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RotateCmd();\r\n if (object.rotations) {\r\n if (!Array.isArray(object.rotations))\r\n throw TypeError(\".Buttplug.DeviceMessage.RotateCmd.rotations: array expected\");\r\n message.rotations = [];\r\n for (var i = 0; i < object.rotations.length; ++i) {\r\n if (typeof object.rotations[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.RotateCmd.rotations: object expected\");\r\n message.rotations[i] = $root.Buttplug.DeviceMessage.RotateComponent.fromObject(object.rotations[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RotateCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RotateCmd} message RotateCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RotateCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.arrays || options.defaults)\r\n object.rotations = [];\r\n if (message.rotations && message.rotations.length) {\r\n object.rotations = [];\r\n for (var j = 0; j < message.rotations.length; ++j)\r\n object.rotations[j] = $root.Buttplug.DeviceMessage.RotateComponent.toObject(message.rotations[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RotateCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RotateCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RotateCmd;\r\n })();\r\n\r\n DeviceMessage.LinearComponent = (function() {\r\n\r\n /**\r\n * Properties of a LinearComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface ILinearComponent\r\n * @property {number|null} [index] LinearComponent index\r\n * @property {number|null} [duration] LinearComponent duration\r\n * @property {number|null} [position] LinearComponent position\r\n */\r\n\r\n /**\r\n * Constructs a new LinearComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a LinearComponent.\r\n * @implements ILinearComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.ILinearComponent=} [properties] Properties to set\r\n */\r\n function LinearComponent(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * LinearComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.index = 0;\r\n\r\n /**\r\n * LinearComponent duration.\r\n * @member {number} duration\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.duration = 0;\r\n\r\n /**\r\n * LinearComponent position.\r\n * @member {number} position\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.position = 0;\r\n\r\n /**\r\n * Creates a new LinearComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent instance\r\n */\r\n LinearComponent.create = function create(properties) {\r\n return new LinearComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearComponent message. Does not implicitly {@link Buttplug.DeviceMessage.LinearComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent} message LinearComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.duration != null && Object.hasOwnProperty.call(message, \"duration\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.duration);\r\n if (message.position != null && Object.hasOwnProperty.call(message, \"position\"))\r\n writer.uint32(/* id 3, wireType 1 =*/25).double(message.position);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.LinearComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent} message LinearComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a LinearComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.LinearComponent();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.duration = reader.uint32();\r\n break;\r\n case 3:\r\n message.position = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a LinearComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a LinearComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n LinearComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.duration != null && message.hasOwnProperty(\"duration\"))\r\n if (!$util.isInteger(message.duration))\r\n return \"duration: integer expected\";\r\n if (message.position != null && message.hasOwnProperty(\"position\"))\r\n if (typeof message.position !== \"number\")\r\n return \"position: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a LinearComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n */\r\n LinearComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.LinearComponent)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.LinearComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.duration != null)\r\n message.duration = object.duration >>> 0;\r\n if (object.position != null)\r\n message.position = Number(object.position);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a LinearComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.LinearComponent} message LinearComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n LinearComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.duration = 0;\r\n object.position = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.duration != null && message.hasOwnProperty(\"duration\"))\r\n object.duration = message.duration;\r\n if (message.position != null && message.hasOwnProperty(\"position\"))\r\n object.position = options.json && !isFinite(message.position) ? String(message.position) : message.position;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this LinearComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n LinearComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return LinearComponent;\r\n })();\r\n\r\n DeviceMessage.LinearCmd = (function() {\r\n\r\n /**\r\n * Properties of a LinearCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface ILinearCmd\r\n * @property {Array.<Buttplug.DeviceMessage.ILinearComponent>|null} [movements] LinearCmd movements\r\n */\r\n\r\n /**\r\n * Constructs a new LinearCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a LinearCmd.\r\n * @implements ILinearCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.ILinearCmd=} [properties] Properties to set\r\n */\r\n function LinearCmd(properties) {\r\n this.movements = [];\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * LinearCmd movements.\r\n * @member {Array.<Buttplug.DeviceMessage.ILinearComponent>} movements\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @instance\r\n */\r\n LinearCmd.prototype.movements = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new LinearCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd instance\r\n */\r\n LinearCmd.create = function create(properties) {\r\n return new LinearCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearCmd message. Does not implicitly {@link Buttplug.DeviceMessage.LinearCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd} message LinearCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.movements != null && message.movements.length)\r\n for (var i = 0; i < message.movements.length; ++i)\r\n $root.Buttplug.DeviceMessage.LinearComponent.encode(message.movements[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.LinearCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd} message LinearCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a LinearCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.LinearCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.movements && message.movements.length))\r\n message.movements = [];\r\n message.movements.push($root.Buttplug.DeviceMessage.LinearComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a LinearCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a LinearCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n LinearCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.movements != null && message.hasOwnProperty(\"movements\")) {\r\n if (!Array.isArray(message.movements))\r\n return \"movements: array expected\";\r\n for (var i = 0; i < message.movements.length; ++i) {\r\n var error = $root.Buttplug.DeviceMessage.LinearComponent.verify(message.movements[i]);\r\n if (error)\r\n return \"movements.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a LinearCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n */\r\n LinearCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.LinearCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.LinearCmd();\r\n if (object.movements) {\r\n if (!Array.isArray(object.movements))\r\n throw TypeError(\".Buttplug.DeviceMessage.LinearCmd.movements: array expected\");\r\n message.movements = [];\r\n for (var i = 0; i < object.movements.length; ++i) {\r\n if (typeof object.movements[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.LinearCmd.movements: object expected\");\r\n message.movements[i] = $root.Buttplug.DeviceMessage.LinearComponent.fromObject(object.movements[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a LinearCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.LinearCmd} message LinearCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n LinearCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.arrays || options.defaults)\r\n object.movements = [];\r\n if (message.movements && message.movements.length) {\r\n object.movements = [];\r\n for (var j = 0; j < message.movements.length; ++j)\r\n object.movements[j] = $root.Buttplug.DeviceMessage.LinearComponent.toObject(message.movements[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this LinearCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n LinearCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return LinearCmd;\r\n })();\r\n\r\n DeviceMessage.StopDeviceCmd = (function() {\r\n\r\n /**\r\n * Properties of a StopDeviceCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IStopDeviceCmd\r\n */\r\n\r\n /**\r\n * Constructs a new StopDeviceCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a StopDeviceCmd.\r\n * @implements IStopDeviceCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd=} [properties] Properties to set\r\n */\r\n function StopDeviceCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopDeviceCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd instance\r\n */\r\n StopDeviceCmd.create = function create(properties) {\r\n return new StopDeviceCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopDeviceCmd message. Does not implicitly {@link Buttplug.DeviceMessage.StopDeviceCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd} message StopDeviceCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopDeviceCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopDeviceCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.StopDeviceCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd} message StopDeviceCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopDeviceCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopDeviceCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopDeviceCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.StopDeviceCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopDeviceCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopDeviceCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopDeviceCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopDeviceCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopDeviceCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n */\r\n StopDeviceCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.StopDeviceCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.StopDeviceCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopDeviceCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.StopDeviceCmd} message StopDeviceCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopDeviceCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopDeviceCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopDeviceCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopDeviceCmd;\r\n })();\r\n\r\n DeviceMessage.RawReadCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawReadCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawReadCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawReadCmd endpoint\r\n * @property {Uint8Array|null} [data] RawReadCmd data\r\n * @property {number|null} [expectedLength] RawReadCmd expectedLength\r\n * @property {number|null} [timeout] RawReadCmd timeout\r\n */\r\n\r\n /**\r\n * Constructs a new RawReadCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawReadCmd.\r\n * @implements IRawReadCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd=} [properties] Properties to set\r\n */\r\n function RawReadCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawReadCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawReadCmd data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * RawReadCmd expectedLength.\r\n * @member {number} expectedLength\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.expectedLength = 0;\r\n\r\n /**\r\n * RawReadCmd timeout.\r\n * @member {number} timeout\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.timeout = 0;\r\n\r\n /**\r\n * Creates a new RawReadCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd instance\r\n */\r\n RawReadCmd.create = function create(properties) {\r\n return new RawReadCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReadCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawReadCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd} message RawReadCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReadCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.data);\r\n if (message.expectedLength != null && Object.hasOwnProperty.call(message, \"expectedLength\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.expectedLength);\r\n if (message.timeout != null && Object.hasOwnProperty.call(message, \"timeout\"))\r\n writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.timeout);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReadCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawReadCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd} message RawReadCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReadCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawReadCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReadCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawReadCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 2:\r\n message.data = reader.bytes();\r\n break;\r\n case 3:\r\n message.expectedLength = reader.uint32();\r\n break;\r\n case 4:\r\n message.timeout = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawReadCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReadCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawReadCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawReadCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n if (message.expectedLength != null && message.hasOwnProperty(\"expectedLength\"))\r\n if (!$util.isInteger(message.expectedLength))\r\n return \"expectedLength: integer expected\";\r\n if (message.timeout != null && message.hasOwnProperty(\"timeout\"))\r\n if (!$util.isInteger(message.timeout))\r\n return \"timeout: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawReadCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n */\r\n RawReadCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawReadCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RawReadCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n if (object.expectedLength != null)\r\n message.expectedLength = object.expectedLength >>> 0;\r\n if (object.timeout != null)\r\n message.timeout = object.timeout >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawReadCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawReadCmd} message RawReadCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawReadCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n object.expectedLength = 0;\r\n object.timeout = 0;\r\n }\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n if (message.expectedLength != null && message.hasOwnProperty(\"expectedLength\"))\r\n object.expectedLength = message.expectedLength;\r\n if (message.timeout != null && message.hasOwnProperty(\"timeout\"))\r\n object.timeout = message.timeout;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawReadCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawReadCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawReadCmd;\r\n })();\r\n\r\n DeviceMessage.RawWriteCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawWriteCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawWriteCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawWriteCmd endpoint\r\n * @property {Uint8Array|null} [data] RawWriteCmd data\r\n * @property {boolean|null} [writeWithResponse] RawWriteCmd writeWithResponse\r\n */\r\n\r\n /**\r\n * Constructs a new RawWriteCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawWriteCmd.\r\n * @implements IRawWriteCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd=} [properties] Properties to set\r\n */\r\n function RawWriteCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawWriteCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawWriteCmd data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * RawWriteCmd writeWithResponse.\r\n * @member {boolean} writeWithResponse\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.writeWithResponse = false;\r\n\r\n /**\r\n * Creates a new RawWriteCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd instance\r\n */\r\n RawWriteCmd.create = function create(properties) {\r\n return new RawWriteCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawWriteCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawWriteCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd} message RawWriteCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawWriteCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.data);\r\n if (message.writeWithResponse != null && Object.hasOwnProperty.call(message, \"writeWithResponse\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writeWithResponse);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawWriteCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawWriteCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd} message RawWriteCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawWriteCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawWriteCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawWriteCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawWriteCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 2:\r\n message.data = reader.bytes();\r\n break;\r\n case 3:\r\n message.writeWithResponse = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawWriteCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawWriteCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawWriteCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawWriteCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n if (message.writeWithResponse != null && message.hasOwnProperty(\"writeWithResponse\"))\r\n if (typeof message.writeWithResponse !== \"boolean\")\r\n return \"writeWithResponse: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawWriteCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n */\r\n RawWriteCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawWriteCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RawWriteCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n if (object.writeWithResponse != null)\r\n message.writeWithResponse = Boolean(object.writeWithResponse);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawWriteCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawWriteCmd} message RawWriteCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawWriteCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n object.writeWithResponse = false;\r\n }\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n if (message.writeWithResponse != null && message.hasOwnProperty(\"writeWithResponse\"))\r\n object.writeWithResponse = message.writeWithResponse;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawWriteCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawWriteCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawWriteCmd;\r\n })();\r\n\r\n DeviceMessage.RawSubscribeCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawSubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawSubscribeCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawSubscribeCmd endpoint\r\n */\r\n\r\n /**\r\n * Constructs a new RawSubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawSubscribeCmd.\r\n * @implements IRawSubscribeCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd=} [properties] Properties to set\r\n */\r\n function RawSubscribeCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawSubscribeCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @instance\r\n */\r\n RawSubscribeCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * Creates a new RawSubscribeCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd instance\r\n */\r\n RawSubscribeCmd.create = function create(properties) {\r\n return new RawSubscribeCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawSubscribeCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawSubscribeCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd} message RawSubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawSubscribeCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawSubscribeCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawSubscribeCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd} message RawSubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawSubscribeCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawSubscribeCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawSubscribeCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawSubscribeCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawSubscribeCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawSubscribeCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawSubscribeCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawSubscribeCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawSubscribeCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n */\r\n RawSubscribeCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawSubscribeCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RawSubscribeCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawSubscribeCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawSubscribeCmd} message RawSubscribeCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawSubscribeCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults)\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawSubscribeCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawSubscribeCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawSubscribeCmd;\r\n })();\r\n\r\n DeviceMessage.RawUnsubscribeCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawUnsubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawUnsubscribeCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawUnsubscribeCmd endpoint\r\n */\r\n\r\n /**\r\n * Constructs a new RawUnsubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawUnsubscribeCmd.\r\n * @implements IRawUnsubscribeCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd=} [properties] Properties to set\r\n */\r\n function RawUnsubscribeCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawUnsubscribeCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @instance\r\n */\r\n RawUnsubscribeCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * Creates a new RawUnsubscribeCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd instance\r\n */\r\n RawUnsubscribeCmd.create = function create(properties) {\r\n return new RawUnsubscribeCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawUnsubscribeCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawUnsubscribeCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd} message RawUnsubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawUnsubscribeCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawUnsubscribeCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawUnsubscribeCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd} message RawUnsubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawUnsubscribeCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawUnsubscribeCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawUnsubscribeCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawUnsubscribeCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawUnsubscribeCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawUnsubscribeCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawUnsubscribeCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawUnsubscribeCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawUnsubscribeCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n */\r\n RawUnsubscribeCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawUnsubscribeCmd)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.RawUnsubscribeCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawUnsubscribeCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawUnsubscribeCmd} message RawUnsubscribeCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawUnsubscribeCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults)\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawUnsubscribeCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawUnsubscribeCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawUnsubscribeCmd;\r\n })();\r\n\r\n DeviceMessage.BatteryLevelCmd = (function() {\r\n\r\n /**\r\n * Properties of a BatteryLevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IBatteryLevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new BatteryLevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a BatteryLevelCmd.\r\n * @implements IBatteryLevelCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd=} [properties] Properties to set\r\n */\r\n function BatteryLevelCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new BatteryLevelCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd instance\r\n */\r\n BatteryLevelCmd.create = function create(properties) {\r\n return new BatteryLevelCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelCmd message. Does not implicitly {@link Buttplug.DeviceMessage.BatteryLevelCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd} message BatteryLevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.BatteryLevelCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd} message BatteryLevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.BatteryLevelCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a BatteryLevelCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n BatteryLevelCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a BatteryLevelCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n */\r\n BatteryLevelCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.BatteryLevelCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.BatteryLevelCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a BatteryLevelCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.BatteryLevelCmd} message BatteryLevelCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n BatteryLevelCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this BatteryLevelCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n BatteryLevelCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return BatteryLevelCmd;\r\n })();\r\n\r\n DeviceMessage.RSSILevelCmd = (function() {\r\n\r\n /**\r\n * Properties of a RSSILevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRSSILevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new RSSILevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RSSILevelCmd.\r\n * @implements IRSSILevelCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd=} [properties] Properties to set\r\n */\r\n function RSSILevelCmd(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new RSSILevelCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd instance\r\n */\r\n RSSILevelCmd.create = function create(properties) {\r\n return new RSSILevelCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RSSILevelCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd} message RSSILevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RSSILevelCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd} message RSSILevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RSSILevelCmd();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RSSILevelCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RSSILevelCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RSSILevelCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n */\r\n RSSILevelCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RSSILevelCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.RSSILevelCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RSSILevelCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RSSILevelCmd} message RSSILevelCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RSSILevelCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this RSSILevelCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RSSILevelCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RSSILevelCmd;\r\n })();\r\n\r\n DeviceMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.DeviceMessage.IVibrateCmd|null} [vibrateCmd] FFIMessage vibrateCmd\r\n * @property {Buttplug.DeviceMessage.IRotateCmd|null} [rotateCmd] FFIMessage rotateCmd\r\n * @property {Buttplug.DeviceMessage.ILinearCmd|null} [linearCmd] FFIMessage linearCmd\r\n * @property {Buttplug.DeviceMessage.IStopDeviceCmd|null} [stopDeviceCmd] FFIMessage stopDeviceCmd\r\n * @property {Buttplug.DeviceMessage.IRawReadCmd|null} [rawReadCmd] FFIMessage rawReadCmd\r\n * @property {Buttplug.DeviceMessage.IRawWriteCmd|null} [rawWriteCmd] FFIMessage rawWriteCmd\r\n * @property {Buttplug.DeviceMessage.IRawSubscribeCmd|null} [rawSubscribeCmd] FFIMessage rawSubscribeCmd\r\n * @property {Buttplug.DeviceMessage.IRawUnsubscribeCmd|null} [rawUnsubscribeCmd] FFIMessage rawUnsubscribeCmd\r\n * @property {Buttplug.DeviceMessage.IBatteryLevelCmd|null} [batteryLevelCmd] FFIMessage batteryLevelCmd\r\n * @property {Buttplug.DeviceMessage.IRSSILevelCmd|null} [rssiLevelCmd] FFIMessage rssiLevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage vibrateCmd.\r\n * @member {Buttplug.DeviceMessage.IVibrateCmd|null|undefined} vibrateCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.vibrateCmd = null;\r\n\r\n /**\r\n * FFIMessage rotateCmd.\r\n * @member {Buttplug.DeviceMessage.IRotateCmd|null|undefined} rotateCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rotateCmd = null;\r\n\r\n /**\r\n * FFIMessage linearCmd.\r\n * @member {Buttplug.DeviceMessage.ILinearCmd|null|undefined} linearCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.linearCmd = null;\r\n\r\n /**\r\n * FFIMessage stopDeviceCmd.\r\n * @member {Buttplug.DeviceMessage.IStopDeviceCmd|null|undefined} stopDeviceCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopDeviceCmd = null;\r\n\r\n /**\r\n * FFIMessage rawReadCmd.\r\n * @member {Buttplug.DeviceMessage.IRawReadCmd|null|undefined} rawReadCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawReadCmd = null;\r\n\r\n /**\r\n * FFIMessage rawWriteCmd.\r\n * @member {Buttplug.DeviceMessage.IRawWriteCmd|null|undefined} rawWriteCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawWriteCmd = null;\r\n\r\n /**\r\n * FFIMessage rawSubscribeCmd.\r\n * @member {Buttplug.DeviceMessage.IRawSubscribeCmd|null|undefined} rawSubscribeCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawSubscribeCmd = null;\r\n\r\n /**\r\n * FFIMessage rawUnsubscribeCmd.\r\n * @member {Buttplug.DeviceMessage.IRawUnsubscribeCmd|null|undefined} rawUnsubscribeCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawUnsubscribeCmd = null;\r\n\r\n /**\r\n * FFIMessage batteryLevelCmd.\r\n * @member {Buttplug.DeviceMessage.IBatteryLevelCmd|null|undefined} batteryLevelCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.batteryLevelCmd = null;\r\n\r\n /**\r\n * FFIMessage rssiLevelCmd.\r\n * @member {Buttplug.DeviceMessage.IRSSILevelCmd|null|undefined} rssiLevelCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rssiLevelCmd = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n var $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"vibrateCmd\"|\"rotateCmd\"|\"linearCmd\"|\"stopDeviceCmd\"|\"rawReadCmd\"|\"rawWriteCmd\"|\"rawSubscribeCmd\"|\"rawUnsubscribeCmd\"|\"batteryLevelCmd\"|\"rssiLevelCmd\"|undefined} msg\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"vibrateCmd\", \"rotateCmd\", \"linearCmd\", \"stopDeviceCmd\", \"rawReadCmd\", \"rawWriteCmd\", \"rawSubscribeCmd\", \"rawUnsubscribeCmd\", \"batteryLevelCmd\", \"rssiLevelCmd\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.DeviceMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.vibrateCmd != null && Object.hasOwnProperty.call(message, \"vibrateCmd\"))\r\n $root.Buttplug.DeviceMessage.VibrateCmd.encode(message.vibrateCmd, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.rotateCmd != null && Object.hasOwnProperty.call(message, \"rotateCmd\"))\r\n $root.Buttplug.DeviceMessage.RotateCmd.encode(message.rotateCmd, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.linearCmd != null && Object.hasOwnProperty.call(message, \"linearCmd\"))\r\n $root.Buttplug.DeviceMessage.LinearCmd.encode(message.linearCmd, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.stopDeviceCmd != null && Object.hasOwnProperty.call(message, \"stopDeviceCmd\"))\r\n $root.Buttplug.DeviceMessage.StopDeviceCmd.encode(message.stopDeviceCmd, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.rawReadCmd != null && Object.hasOwnProperty.call(message, \"rawReadCmd\"))\r\n $root.Buttplug.DeviceMessage.RawReadCmd.encode(message.rawReadCmd, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.rawWriteCmd != null && Object.hasOwnProperty.call(message, \"rawWriteCmd\"))\r\n $root.Buttplug.DeviceMessage.RawWriteCmd.encode(message.rawWriteCmd, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n if (message.rawSubscribeCmd != null && Object.hasOwnProperty.call(message, \"rawSubscribeCmd\"))\r\n $root.Buttplug.DeviceMessage.RawSubscribeCmd.encode(message.rawSubscribeCmd, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\r\n if (message.rawUnsubscribeCmd != null && Object.hasOwnProperty.call(message, \"rawUnsubscribeCmd\"))\r\n $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.encode(message.rawUnsubscribeCmd, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\r\n if (message.batteryLevelCmd != null && Object.hasOwnProperty.call(message, \"batteryLevelCmd\"))\r\n $root.Buttplug.DeviceMessage.BatteryLevelCmd.encode(message.batteryLevelCmd, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\r\n if (message.rssiLevelCmd != null && Object.hasOwnProperty.call(message, \"rssiLevelCmd\"))\r\n $root.Buttplug.DeviceMessage.RSSILevelCmd.encode(message.rssiLevelCmd, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.decode(reader, reader.uint32());\r\n break;\r\n case 7:\r\n message.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.decode(reader, reader.uint32());\r\n break;\r\n case 8:\r\n message.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.decode(reader, reader.uint32());\r\n break;\r\n case 9:\r\n message.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.decode(reader, reader.uint32());\r\n break;\r\n case 10:\r\n message.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n var properties = {};\r\n if (message.vibrateCmd != null && message.hasOwnProperty(\"vibrateCmd\")) {\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.VibrateCmd.verify(message.vibrateCmd);\r\n if (error)\r\n return \"vibrateCmd.\" + error;\r\n }\r\n }\r\n if (message.rotateCmd != null && message.hasOwnProperty(\"rotateCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RotateCmd.verify(message.rotateCmd);\r\n if (error)\r\n return \"rotateCmd.\" + error;\r\n }\r\n }\r\n if (message.linearCmd != null && message.hasOwnProperty(\"linearCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.LinearCmd.verify(message.linearCmd);\r\n if (error)\r\n return \"linearCmd.\" + error;\r\n }\r\n }\r\n if (message.stopDeviceCmd != null && message.hasOwnProperty(\"stopDeviceCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.StopDeviceCmd.verify(message.stopDeviceCmd);\r\n if (error)\r\n return \"stopDeviceCmd.\" + error;\r\n }\r\n }\r\n if (message.rawReadCmd != null && message.hasOwnProperty(\"rawReadCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RawReadCmd.verify(message.rawReadCmd);\r\n if (error)\r\n return \"rawReadCmd.\" + error;\r\n }\r\n }\r\n if (message.rawWriteCmd != null && message.hasOwnProperty(\"rawWriteCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RawWriteCmd.verify(message.rawWriteCmd);\r\n if (error)\r\n return \"rawWriteCmd.\" + error;\r\n }\r\n }\r\n if (message.rawSubscribeCmd != null && message.hasOwnProperty(\"rawSubscribeCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RawSubscribeCmd.verify(message.rawSubscribeCmd);\r\n if (error)\r\n return \"rawSubscribeCmd.\" + error;\r\n }\r\n }\r\n if (message.rawUnsubscribeCmd != null && message.hasOwnProperty(\"rawUnsubscribeCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.verify(message.rawUnsubscribeCmd);\r\n if (error)\r\n return \"rawUnsubscribeCmd.\" + error;\r\n }\r\n }\r\n if (message.batteryLevelCmd != null && message.hasOwnProperty(\"batteryLevelCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.BatteryLevelCmd.verify(message.batteryLevelCmd);\r\n if (error)\r\n return \"batteryLevelCmd.\" + error;\r\n }\r\n }\r\n if (message.rssiLevelCmd != null && message.hasOwnProperty(\"rssiLevelCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceMessage.RSSILevelCmd.verify(message.rssiLevelCmd);\r\n if (error)\r\n return \"rssiLevelCmd.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.FFIMessage)\r\n return object;\r\n var message = new $root.Buttplug.DeviceMessage.FFIMessage();\r\n if (object.vibrateCmd != null) {\r\n if (typeof object.vibrateCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.vibrateCmd: object expected\");\r\n message.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.fromObject(object.vibrateCmd);\r\n }\r\n if (object.rotateCmd != null) {\r\n if (typeof object.rotateCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rotateCmd: object expected\");\r\n message.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.fromObject(object.rotateCmd);\r\n }\r\n if (object.linearCmd != null) {\r\n if (typeof object.linearCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.linearCmd: object expected\");\r\n message.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.fromObject(object.linearCmd);\r\n }\r\n if (object.stopDeviceCmd != null) {\r\n if (typeof object.stopDeviceCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.stopDeviceCmd: object expected\");\r\n message.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.fromObject(object.stopDeviceCmd);\r\n }\r\n if (object.rawReadCmd != null) {\r\n if (typeof object.rawReadCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawReadCmd: object expected\");\r\n message.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.fromObject(object.rawReadCmd);\r\n }\r\n if (object.rawWriteCmd != null) {\r\n if (typeof object.rawWriteCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawWriteCmd: object expected\");\r\n message.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.fromObject(object.rawWriteCmd);\r\n }\r\n if (object.rawSubscribeCmd != null) {\r\n if (typeof object.rawSubscribeCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawSubscribeCmd: object expected\");\r\n message.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.fromObject(object.rawSubscribeCmd);\r\n }\r\n if (object.rawUnsubscribeCmd != null) {\r\n if (typeof object.rawUnsubscribeCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawUnsubscribeCmd: object expected\");\r\n message.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.fromObject(object.rawUnsubscribeCmd);\r\n }\r\n if (object.batteryLevelCmd != null) {\r\n if (typeof object.batteryLevelCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.batteryLevelCmd: object expected\");\r\n message.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.fromObject(object.batteryLevelCmd);\r\n }\r\n if (object.rssiLevelCmd != null) {\r\n if (typeof object.rssiLevelCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rssiLevelCmd: object expected\");\r\n message.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.fromObject(object.rssiLevelCmd);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (message.vibrateCmd != null && message.hasOwnProperty(\"vibrateCmd\")) {\r\n object.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.toObject(message.vibrateCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"vibrateCmd\";\r\n }\r\n if (message.rotateCmd != null && message.hasOwnProperty(\"rotateCmd\")) {\r\n object.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.toObject(message.rotateCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rotateCmd\";\r\n }\r\n if (message.linearCmd != null && message.hasOwnProperty(\"linearCmd\")) {\r\n object.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.toObject(message.linearCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"linearCmd\";\r\n }\r\n if (message.stopDeviceCmd != null && message.hasOwnProperty(\"stopDeviceCmd\")) {\r\n object.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.toObject(message.stopDeviceCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"stopDeviceCmd\";\r\n }\r\n if (message.rawReadCmd != null && message.hasOwnProperty(\"rawReadCmd\")) {\r\n object.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.toObject(message.rawReadCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawReadCmd\";\r\n }\r\n if (message.rawWriteCmd != null && message.hasOwnProperty(\"rawWriteCmd\")) {\r\n object.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.toObject(message.rawWriteCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawWriteCmd\";\r\n }\r\n if (message.rawSubscribeCmd != null && message.hasOwnProperty(\"rawSubscribeCmd\")) {\r\n object.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.toObject(message.rawSubscribeCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawSubscribeCmd\";\r\n }\r\n if (message.rawUnsubscribeCmd != null && message.hasOwnProperty(\"rawUnsubscribeCmd\")) {\r\n object.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.toObject(message.rawUnsubscribeCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawUnsubscribeCmd\";\r\n }\r\n if (message.batteryLevelCmd != null && message.hasOwnProperty(\"batteryLevelCmd\")) {\r\n object.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.toObject(message.batteryLevelCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"batteryLevelCmd\";\r\n }\r\n if (message.rssiLevelCmd != null && message.hasOwnProperty(\"rssiLevelCmd\")) {\r\n object.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.toObject(message.rssiLevelCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rssiLevelCmd\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return DeviceMessage;\r\n })();\r\n\r\n Buttplug.ServerMessage = (function() {\r\n\r\n /**\r\n * Properties of a ServerMessage.\r\n * @memberof Buttplug\r\n * @interface IServerMessage\r\n * @property {Buttplug.ServerMessage.IOk|null} [ok] ServerMessage ok\r\n * @property {Buttplug.ServerMessage.IError|null} [error] ServerMessage error\r\n * @property {Buttplug.ServerMessage.IScanningFinished|null} [scanningFinished] ServerMessage scanningFinished\r\n * @property {Buttplug.ServerMessage.IDeviceAdded|null} [deviceAdded] ServerMessage deviceAdded\r\n * @property {Buttplug.ServerMessage.IDeviceRemoved|null} [deviceRemoved] ServerMessage deviceRemoved\r\n * @property {Buttplug.ServerMessage.IDisconnect|null} [disconnect] ServerMessage disconnect\r\n */\r\n\r\n /**\r\n * Constructs a new ServerMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ServerMessage.\r\n * @implements IServerMessage\r\n * @constructor\r\n * @param {Buttplug.IServerMessage=} [properties] Properties to set\r\n */\r\n function ServerMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ServerMessage ok.\r\n * @member {Buttplug.ServerMessage.IOk|null|undefined} ok\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.ok = null;\r\n\r\n /**\r\n * ServerMessage error.\r\n * @member {Buttplug.ServerMessage.IError|null|undefined} error\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.error = null;\r\n\r\n /**\r\n * ServerMessage scanningFinished.\r\n * @member {Buttplug.ServerMessage.IScanningFinished|null|undefined} scanningFinished\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.scanningFinished = null;\r\n\r\n /**\r\n * ServerMessage deviceAdded.\r\n * @member {Buttplug.ServerMessage.IDeviceAdded|null|undefined} deviceAdded\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.deviceAdded = null;\r\n\r\n /**\r\n * ServerMessage deviceRemoved.\r\n * @member {Buttplug.ServerMessage.IDeviceRemoved|null|undefined} deviceRemoved\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.deviceRemoved = null;\r\n\r\n /**\r\n * ServerMessage disconnect.\r\n * @member {Buttplug.ServerMessage.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.disconnect = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n var $oneOfFields;\r\n\r\n /**\r\n * ServerMessage msg.\r\n * @member {\"ok\"|\"error\"|\"scanningFinished\"|\"deviceAdded\"|\"deviceRemoved\"|\"disconnect\"|undefined} msg\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n Object.defineProperty(ServerMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"ok\", \"error\", \"scanningFinished\", \"deviceAdded\", \"deviceRemoved\", \"disconnect\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new ServerMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage} ServerMessage instance\r\n */\r\n ServerMessage.create = function create(properties) {\r\n return new ServerMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ServerMessage message. Does not implicitly {@link Buttplug.ServerMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage} message ServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ServerMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.ok != null && Object.hasOwnProperty.call(message, \"ok\"))\r\n $root.Buttplug.ServerMessage.Ok.encode(message.ok, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.error != null && Object.hasOwnProperty.call(message, \"error\"))\r\n $root.Buttplug.ServerMessage.Error.encode(message.error, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.scanningFinished != null && Object.hasOwnProperty.call(message, \"scanningFinished\"))\r\n $root.Buttplug.ServerMessage.ScanningFinished.encode(message.scanningFinished, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.deviceAdded != null && Object.hasOwnProperty.call(message, \"deviceAdded\"))\r\n $root.Buttplug.ServerMessage.DeviceAdded.encode(message.deviceAdded, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.deviceRemoved != null && Object.hasOwnProperty.call(message, \"deviceRemoved\"))\r\n $root.Buttplug.ServerMessage.DeviceRemoved.encode(message.deviceRemoved, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.ServerMessage.Disconnect.encode(message.disconnect, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ServerMessage message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage} message ServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ServerMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ServerMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ServerMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.ok = $root.Buttplug.ServerMessage.Ok.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.error = $root.Buttplug.ServerMessage.Error.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.disconnect = $root.Buttplug.ServerMessage.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ServerMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ServerMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ServerMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ServerMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n var properties = {};\r\n if (message.ok != null && message.hasOwnProperty(\"ok\")) {\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.Ok.verify(message.ok);\r\n if (error)\r\n return \"ok.\" + error;\r\n }\r\n }\r\n if (message.error != null && message.hasOwnProperty(\"error\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.Error.verify(message.error);\r\n if (error)\r\n return \"error.\" + error;\r\n }\r\n }\r\n if (message.scanningFinished != null && message.hasOwnProperty(\"scanningFinished\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.ScanningFinished.verify(message.scanningFinished);\r\n if (error)\r\n return \"scanningFinished.\" + error;\r\n }\r\n }\r\n if (message.deviceAdded != null && message.hasOwnProperty(\"deviceAdded\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.DeviceAdded.verify(message.deviceAdded);\r\n if (error)\r\n return \"deviceAdded.\" + error;\r\n }\r\n }\r\n if (message.deviceRemoved != null && message.hasOwnProperty(\"deviceRemoved\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.DeviceRemoved.verify(message.deviceRemoved);\r\n if (error)\r\n return \"deviceRemoved.\" + error;\r\n }\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ServerMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n */\r\n ServerMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage)\r\n return object;\r\n var message = new $root.Buttplug.ServerMessage();\r\n if (object.ok != null) {\r\n if (typeof object.ok !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.ok: object expected\");\r\n message.ok = $root.Buttplug.ServerMessage.Ok.fromObject(object.ok);\r\n }\r\n if (object.error != null) {\r\n if (typeof object.error !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.error: object expected\");\r\n message.error = $root.Buttplug.ServerMessage.Error.fromObject(object.error);\r\n }\r\n if (object.scanningFinished != null) {\r\n if (typeof object.scanningFinished !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.scanningFinished: object expected\");\r\n message.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.fromObject(object.scanningFinished);\r\n }\r\n if (object.deviceAdded != null) {\r\n if (typeof object.deviceAdded !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.deviceAdded: object expected\");\r\n message.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.fromObject(object.deviceAdded);\r\n }\r\n if (object.deviceRemoved != null) {\r\n if (typeof object.deviceRemoved !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.deviceRemoved: object expected\");\r\n message.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.fromObject(object.deviceRemoved);\r\n }\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.ServerMessage.Disconnect.fromObject(object.disconnect);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ServerMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.ServerMessage} message ServerMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ServerMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (message.ok != null && message.hasOwnProperty(\"ok\")) {\r\n object.ok = $root.Buttplug.ServerMessage.Ok.toObject(message.ok, options);\r\n if (options.oneofs)\r\n object.msg = \"ok\";\r\n }\r\n if (message.error != null && message.hasOwnProperty(\"error\")) {\r\n object.error = $root.Buttplug.ServerMessage.Error.toObject(message.error, options);\r\n if (options.oneofs)\r\n object.msg = \"error\";\r\n }\r\n if (message.scanningFinished != null && message.hasOwnProperty(\"scanningFinished\")) {\r\n object.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.toObject(message.scanningFinished, options);\r\n if (options.oneofs)\r\n object.msg = \"scanningFinished\";\r\n }\r\n if (message.deviceAdded != null && message.hasOwnProperty(\"deviceAdded\")) {\r\n object.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.toObject(message.deviceAdded, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceAdded\";\r\n }\r\n if (message.deviceRemoved != null && message.hasOwnProperty(\"deviceRemoved\")) {\r\n object.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.toObject(message.deviceRemoved, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceRemoved\";\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.ServerMessage.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ServerMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ServerMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n /**\r\n * ButtplugErrorType enum.\r\n * @name Buttplug.ServerMessage.ButtplugErrorType\r\n * @enum {number}\r\n * @property {number} ButtplugConnectorError=0 ButtplugConnectorError value\r\n * @property {number} ButtplugHandshakeError=1 ButtplugHandshakeError value\r\n * @property {number} ButtplugDeviceError=2 ButtplugDeviceError value\r\n * @property {number} ButtplugPingError=3 ButtplugPingError value\r\n * @property {number} ButtplugMessageError=4 ButtplugMessageError value\r\n * @property {number} ButtplugUnknownError=5 ButtplugUnknownError value\r\n */\r\n ServerMessage.ButtplugErrorType = (function() {\r\n var valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"ButtplugConnectorError\"] = 0;\r\n values[valuesById[1] = \"ButtplugHandshakeError\"] = 1;\r\n values[valuesById[2] = \"ButtplugDeviceError\"] = 2;\r\n values[valuesById[3] = \"ButtplugPingError\"] = 3;\r\n values[valuesById[4] = \"ButtplugMessageError\"] = 4;\r\n values[valuesById[5] = \"ButtplugUnknownError\"] = 5;\r\n return values;\r\n })();\r\n\r\n /**\r\n * MessageAttributeType enum.\r\n * @name Buttplug.ServerMessage.MessageAttributeType\r\n * @enum {number}\r\n * @property {number} VibrateCmd=0 VibrateCmd value\r\n * @property {number} RotateCmd=1 RotateCmd value\r\n * @property {number} LinearCmd=2 LinearCmd value\r\n * @property {number} StopDeviceCmd=3 StopDeviceCmd value\r\n * @property {number} RawReadCmd=4 RawReadCmd value\r\n * @property {number} RawWriteCmd=5 RawWriteCmd value\r\n * @property {number} RawSubscribeCmd=6 RawSubscribeCmd value\r\n * @property {number} RawUnsubscribeCmd=7 RawUnsubscribeCmd value\r\n * @property {number} BatteryLevelCmd=8 BatteryLevelCmd value\r\n * @property {number} RSSILevelCmd=9 RSSILevelCmd value\r\n */\r\n ServerMessage.MessageAttributeType = (function() {\r\n var valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"VibrateCmd\"] = 0;\r\n values[valuesById[1] = \"RotateCmd\"] = 1;\r\n values[valuesById[2] = \"LinearCmd\"] = 2;\r\n values[valuesById[3] = \"StopDeviceCmd\"] = 3;\r\n values[valuesById[4] = \"RawReadCmd\"] = 4;\r\n values[valuesById[5] = \"RawWriteCmd\"] = 5;\r\n values[valuesById[6] = \"RawSubscribeCmd\"] = 6;\r\n values[valuesById[7] = \"RawUnsubscribeCmd\"] = 7;\r\n values[valuesById[8] = \"BatteryLevelCmd\"] = 8;\r\n values[valuesById[9] = \"RSSILevelCmd\"] = 9;\r\n return values;\r\n })();\r\n\r\n ServerMessage.MessageAttributes = (function() {\r\n\r\n /**\r\n * Properties of a MessageAttributes.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IMessageAttributes\r\n * @property {Buttplug.ServerMessage.MessageAttributeType|null} [messageType] MessageAttributes messageType\r\n * @property {number|null} [featureCount] MessageAttributes featureCount\r\n * @property {Array.<number>|null} [stepCount] MessageAttributes stepCount\r\n * @property {Array.<Buttplug.Endpoint>|null} [endpoints] MessageAttributes endpoints\r\n * @property {Array.<number>|null} [maxDuration] MessageAttributes maxDuration\r\n */\r\n\r\n /**\r\n * Constructs a new MessageAttributes.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a MessageAttributes.\r\n * @implements IMessageAttributes\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IMessageAttributes=} [properties] Properties to set\r\n */\r\n function MessageAttributes(properties) {\r\n this.stepCount = [];\r\n this.endpoints = [];\r\n this.maxDuration = [];\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * MessageAttributes messageType.\r\n * @member {Buttplug.ServerMessage.MessageAttributeType} messageType\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.messageType = 0;\r\n\r\n /**\r\n * MessageAttributes featureCount.\r\n * @member {number} featureCount\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.featureCount = 0;\r\n\r\n /**\r\n * MessageAttributes stepCount.\r\n * @member {Array.<number>} stepCount\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.stepCount = $util.emptyArray;\r\n\r\n /**\r\n * MessageAttributes endpoints.\r\n * @member {Array.<Buttplug.Endpoint>} endpoints\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.endpoints = $util.emptyArray;\r\n\r\n /**\r\n * MessageAttributes maxDuration.\r\n * @member {Array.<number>} maxDuration\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.maxDuration = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new MessageAttributes instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes instance\r\n */\r\n MessageAttributes.create = function create(properties) {\r\n return new MessageAttributes(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified MessageAttributes message. Does not implicitly {@link Buttplug.ServerMessage.MessageAttributes.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes} message MessageAttributes message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n MessageAttributes.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.messageType != null && Object.hasOwnProperty.call(message, \"messageType\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.messageType);\r\n if (message.featureCount != null && Object.hasOwnProperty.call(message, \"featureCount\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.featureCount);\r\n if (message.stepCount != null && message.stepCount.length) {\r\n writer.uint32(/* id 3, wireType 2 =*/26).fork();\r\n for (var i = 0; i < message.stepCount.length; ++i)\r\n writer.uint32(message.stepCount[i]);\r\n writer.ldelim();\r\n }\r\n if (message.endpoints != null && message.endpoints.length) {\r\n writer.uint32(/* id 4, wireType 2 =*/34).fork();\r\n for (var i = 0; i < message.endpoints.length; ++i)\r\n writer.int32(message.endpoints[i]);\r\n writer.ldelim();\r\n }\r\n if (message.maxDuration != null && message.maxDuration.length) {\r\n writer.uint32(/* id 5, wireType 2 =*/42).fork();\r\n for (var i = 0; i < message.maxDuration.length; ++i)\r\n writer.uint32(message.maxDuration[i]);\r\n writer.ldelim();\r\n }\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified MessageAttributes message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.MessageAttributes.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes} message MessageAttributes message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n MessageAttributes.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a MessageAttributes message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n MessageAttributes.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.MessageAttributes();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.messageType = reader.int32();\r\n break;\r\n case 2:\r\n message.featureCount = reader.uint32();\r\n break;\r\n case 3:\r\n if (!(message.stepCount && message.stepCount.length))\r\n message.stepCount = [];\r\n if ((tag & 7) === 2) {\r\n var end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.stepCount.push(reader.uint32());\r\n } else\r\n message.stepCount.push(reader.uint32());\r\n break;\r\n case 4:\r\n if (!(message.endpoints && message.endpoints.length))\r\n message.endpoints = [];\r\n if ((tag & 7) === 2) {\r\n var end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.endpoints.push(reader.int32());\r\n } else\r\n message.endpoints.push(reader.int32());\r\n break;\r\n case 5:\r\n if (!(message.maxDuration && message.maxDuration.length))\r\n message.maxDuration = [];\r\n if ((tag & 7) === 2) {\r\n var end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.maxDuration.push(reader.uint32());\r\n } else\r\n message.maxDuration.push(reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a MessageAttributes message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n MessageAttributes.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a MessageAttributes message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n MessageAttributes.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.messageType != null && message.hasOwnProperty(\"messageType\"))\r\n switch (message.messageType) {\r\n default:\r\n return \"messageType: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n break;\r\n }\r\n if (message.featureCount != null && message.hasOwnProperty(\"featureCount\"))\r\n if (!$util.isInteger(message.featureCount))\r\n return \"featureCount: integer expected\";\r\n if (message.stepCount != null && message.hasOwnProperty(\"stepCount\")) {\r\n if (!Array.isArray(message.stepCount))\r\n return \"stepCount: array expected\";\r\n for (var i = 0; i < message.stepCount.length; ++i)\r\n if (!$util.isInteger(message.stepCount[i]))\r\n return \"stepCount: integer[] expected\";\r\n }\r\n if (message.endpoints != null && message.hasOwnProperty(\"endpoints\")) {\r\n if (!Array.isArray(message.endpoints))\r\n return \"endpoints: array expected\";\r\n for (var i = 0; i < message.endpoints.length; ++i)\r\n switch (message.endpoints[i]) {\r\n default:\r\n return \"endpoints: enum value[] expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n }\r\n if (message.maxDuration != null && message.hasOwnProperty(\"maxDuration\")) {\r\n if (!Array.isArray(message.maxDuration))\r\n return \"maxDuration: array expected\";\r\n for (var i = 0; i < message.maxDuration.length; ++i)\r\n if (!$util.isInteger(message.maxDuration[i]))\r\n return \"maxDuration: integer[] expected\";\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a MessageAttributes message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n */\r\n MessageAttributes.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.MessageAttributes)\r\n return object;\r\n var message = new $root.Buttplug.ServerMessage.MessageAttributes();\r\n switch (object.messageType) {\r\n case \"VibrateCmd\":\r\n case 0:\r\n message.messageType = 0;\r\n break;\r\n case \"RotateCmd\":\r\n case 1:\r\n message.messageType = 1;\r\n break;\r\n case \"LinearCmd\":\r\n case 2:\r\n message.messageType = 2;\r\n break;\r\n case \"StopDeviceCmd\":\r\n case 3:\r\n message.messageType = 3;\r\n break;\r\n case \"RawReadCmd\":\r\n case 4:\r\n message.messageType = 4;\r\n break;\r\n case \"RawWriteCmd\":\r\n case 5:\r\n message.messageType = 5;\r\n break;\r\n case \"RawSubscribeCmd\":\r\n case 6:\r\n message.messageType = 6;\r\n break;\r\n case \"RawUnsubscribeCmd\":\r\n case 7:\r\n message.messageType = 7;\r\n break;\r\n case \"BatteryLevelCmd\":\r\n case 8:\r\n message.messageType = 8;\r\n break;\r\n case \"RSSILevelCmd\":\r\n case 9:\r\n message.messageType = 9;\r\n break;\r\n }\r\n if (object.featureCount != null)\r\n message.featureCount = object.featureCount >>> 0;\r\n if (object.stepCount) {\r\n if (!Array.isArray(object.stepCount))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.stepCount: array expected\");\r\n message.stepCount = [];\r\n for (var i = 0; i < object.stepCount.length; ++i)\r\n message.stepCount[i] = object.stepCount[i] >>> 0;\r\n }\r\n if (object.endpoints) {\r\n if (!Array.isArray(object.endpoints))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.endpoints: array expected\");\r\n message.endpoints = [];\r\n for (var i = 0; i < object.endpoints.length; ++i)\r\n switch (object.endpoints[i]) {\r\n default:\r\n case \"Command\":\r\n case 0:\r\n message.endpoints[i] = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoints[i] = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoints[i] = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoints[i] = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoints[i] = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoints[i] = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoints[i] = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoints[i] = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoints[i] = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoints[i] = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoints[i] = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoints[i] = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoints[i] = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoints[i] = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoints[i] = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoints[i] = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoints[i] = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoints[i] = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoints[i] = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoints[i] = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoints[i] = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoints[i] = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoints[i] = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoints[i] = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoints[i] = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoints[i] = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoints[i] = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoints[i] = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoints[i] = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoints[i] = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoints[i] = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoints[i] = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoints[i] = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoints[i] = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoints[i] = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoints[i] = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoints[i] = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoints[i] = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoints[i] = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoints[i] = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoints[i] = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoints[i] = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoints[i] = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoints[i] = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoints[i] = 44;\r\n break;\r\n }\r\n }\r\n if (object.maxDuration) {\r\n if (!Array.isArray(object.maxDuration))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.maxDuration: array expected\");\r\n message.maxDuration = [];\r\n for (var i = 0; i < object.maxDuration.length; ++i)\r\n message.maxDuration[i] = object.maxDuration[i] >>> 0;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a MessageAttributes message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.MessageAttributes} message MessageAttributes\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n MessageAttributes.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.arrays || options.defaults) {\r\n object.stepCount = [];\r\n object.endpoints = [];\r\n object.maxDuration = [];\r\n }\r\n if (options.defaults) {\r\n object.messageType = options.enums === String ? \"VibrateCmd\" : 0;\r\n object.featureCount = 0;\r\n }\r\n if (message.messageType != null && message.hasOwnProperty(\"messageType\"))\r\n object.messageType = options.enums === String ? $root.Buttplug.ServerMessage.MessageAttributeType[message.messageType] : message.messageType;\r\n if (message.featureCount != null && message.hasOwnProperty(\"featureCount\"))\r\n object.featureCount = message.featureCount;\r\n if (message.stepCount && message.stepCount.length) {\r\n object.stepCount = [];\r\n for (var j = 0; j < message.stepCount.length; ++j)\r\n object.stepCount[j] = message.stepCount[j];\r\n }\r\n if (message.endpoints && message.endpoints.length) {\r\n object.endpoints = [];\r\n for (var j = 0; j < message.endpoints.length; ++j)\r\n object.endpoints[j] = options.enums === String ? $root.Buttplug.Endpoint[message.endpoints[j]] : message.endpoints[j];\r\n }\r\n if (message.maxDuration && message.maxDuration.length) {\r\n object.maxDuration = [];\r\n for (var j = 0; j < message.maxDuration.length; ++j)\r\n object.maxDuration[j] = message.maxDuration[j];\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this MessageAttributes to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n MessageAttributes.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return MessageAttributes;\r\n })();\r\n\r\n ServerMessage.Ok = (function() {\r\n\r\n /**\r\n * Properties of an Ok.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IOk\r\n */\r\n\r\n /**\r\n * Constructs a new Ok.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents an Ok.\r\n * @implements IOk\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IOk=} [properties] Properties to set\r\n */\r\n function Ok(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Ok instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Ok} Ok instance\r\n */\r\n Ok.create = function create(properties) {\r\n return new Ok(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Ok message. Does not implicitly {@link Buttplug.ServerMessage.Ok.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk} message Ok message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ok.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Ok message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Ok.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk} message Ok message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ok.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes an Ok message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ok.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Ok();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes an Ok message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ok.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies an Ok message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Ok.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates an Ok message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n */\r\n Ok.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Ok)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.Ok();\r\n };\r\n\r\n /**\r\n * Creates a plain object from an Ok message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.Ok} message Ok\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Ok.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Ok to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Ok.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Ok;\r\n })();\r\n\r\n ServerMessage.Error = (function() {\r\n\r\n /**\r\n * Properties of an Error.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IError\r\n * @property {Buttplug.ServerMessage.ButtplugErrorType|null} [errorType] Error errorType\r\n * @property {string|null} [message] Error message\r\n * @property {string|null} [backtrace] Error backtrace\r\n */\r\n\r\n /**\r\n * Constructs a new Error.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents an Error.\r\n * @implements IError\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IError=} [properties] Properties to set\r\n */\r\n function Error(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Error errorType.\r\n * @member {Buttplug.ServerMessage.ButtplugErrorType} errorType\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.errorType = 0;\r\n\r\n /**\r\n * Error message.\r\n * @member {string} message\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.message = \"\";\r\n\r\n /**\r\n * Error backtrace.\r\n * @member {string} backtrace\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.backtrace = \"\";\r\n\r\n /**\r\n * Creates a new Error instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Error} Error instance\r\n */\r\n Error.create = function create(properties) {\r\n return new Error(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Error message. Does not implicitly {@link Buttplug.ServerMessage.Error.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError} message Error message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Error.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.errorType != null && Object.hasOwnProperty.call(message, \"errorType\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.errorType);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.message);\r\n if (message.backtrace != null && Object.hasOwnProperty.call(message, \"backtrace\"))\r\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.backtrace);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Error message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Error.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError} message Error message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Error.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes an Error message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Error.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Error();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.errorType = reader.int32();\r\n break;\r\n case 2:\r\n message.message = reader.string();\r\n break;\r\n case 3:\r\n message.backtrace = reader.string();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes an Error message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Error.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies an Error message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Error.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.errorType != null && message.hasOwnProperty(\"errorType\"))\r\n switch (message.errorType) {\r\n default:\r\n return \"errorType: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n break;\r\n }\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n if (!$util.isString(message.message))\r\n return \"message: string expected\";\r\n if (message.backtrace != null && message.hasOwnProperty(\"backtrace\"))\r\n if (!$util.isString(message.backtrace))\r\n return \"backtrace: string expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates an Error message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n */\r\n Error.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Error)\r\n return object;\r\n var message = new $root.Buttplug.ServerMessage.Error();\r\n switch (object.errorType) {\r\n case \"ButtplugConnectorError\":\r\n case 0:\r\n message.errorType = 0;\r\n break;\r\n case \"ButtplugHandshakeError\":\r\n case 1:\r\n message.errorType = 1;\r\n break;\r\n case \"ButtplugDeviceError\":\r\n case 2:\r\n message.errorType = 2;\r\n break;\r\n case \"ButtplugPingError\":\r\n case 3:\r\n message.errorType = 3;\r\n break;\r\n case \"ButtplugMessageError\":\r\n case 4:\r\n message.errorType = 4;\r\n break;\r\n case \"ButtplugUnknownError\":\r\n case 5:\r\n message.errorType = 5;\r\n break;\r\n }\r\n if (object.message != null)\r\n message.message = String(object.message);\r\n if (object.backtrace != null)\r\n message.backtrace = String(object.backtrace);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from an Error message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.Error} message Error\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Error.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.errorType = options.enums === String ? \"ButtplugConnectorError\" : 0;\r\n object.message = \"\";\r\n object.backtrace = \"\";\r\n }\r\n if (message.errorType != null && message.hasOwnProperty(\"errorType\"))\r\n object.errorType = options.enums === String ? $root.Buttplug.ServerMessage.ButtplugErrorType[message.errorType] : message.errorType;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = message.message;\r\n if (message.backtrace != null && message.hasOwnProperty(\"backtrace\"))\r\n object.backtrace = message.backtrace;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this Error to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Error.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Error;\r\n })();\r\n\r\n ServerMessage.ScanningFinished = (function() {\r\n\r\n /**\r\n * Properties of a ScanningFinished.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IScanningFinished\r\n */\r\n\r\n /**\r\n * Constructs a new ScanningFinished.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a ScanningFinished.\r\n * @implements IScanningFinished\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IScanningFinished=} [properties] Properties to set\r\n */\r\n function ScanningFinished(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new ScanningFinished instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished instance\r\n */\r\n ScanningFinished.create = function create(properties) {\r\n return new ScanningFinished(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ScanningFinished message. Does not implicitly {@link Buttplug.ServerMessage.ScanningFinished.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished} message ScanningFinished message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ScanningFinished.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ScanningFinished message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.ScanningFinished.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished} message ScanningFinished message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ScanningFinished.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ScanningFinished message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ScanningFinished.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.ScanningFinished();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ScanningFinished message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ScanningFinished.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ScanningFinished message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ScanningFinished.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ScanningFinished message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n */\r\n ScanningFinished.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.ScanningFinished)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.ScanningFinished();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ScanningFinished message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.ScanningFinished} message ScanningFinished\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ScanningFinished.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this ScanningFinished to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ScanningFinished.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ScanningFinished;\r\n })();\r\n\r\n ServerMessage.DeviceAdded = (function() {\r\n\r\n /**\r\n * Properties of a DeviceAdded.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDeviceAdded\r\n * @property {string|null} [name] DeviceAdded name\r\n * @property {number|null} [index] DeviceAdded index\r\n * @property {Array.<Buttplug.ServerMessage.IMessageAttributes>|null} [messageAttributes] DeviceAdded messageAttributes\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceAdded.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a DeviceAdded.\r\n * @implements IDeviceAdded\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDeviceAdded=} [properties] Properties to set\r\n */\r\n function DeviceAdded(properties) {\r\n this.messageAttributes = [];\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceAdded name.\r\n * @member {string} name\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.name = \"\";\r\n\r\n /**\r\n * DeviceAdded index.\r\n * @member {number} index\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.index = 0;\r\n\r\n /**\r\n * DeviceAdded messageAttributes.\r\n * @member {Array.<Buttplug.ServerMessage.IMessageAttributes>} messageAttributes\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.messageAttributes = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new DeviceAdded instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded instance\r\n */\r\n DeviceAdded.create = function create(properties) {\r\n return new DeviceAdded(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceAdded message. Does not implicitly {@link Buttplug.ServerMessage.DeviceAdded.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded} message DeviceAdded message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceAdded.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.index);\r\n if (message.messageAttributes != null && message.messageAttributes.length)\r\n for (var i = 0; i < message.messageAttributes.length; ++i)\r\n $root.Buttplug.ServerMessage.MessageAttributes.encode(message.messageAttributes[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceAdded message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.DeviceAdded.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded} message DeviceAdded message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceAdded.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceAdded message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceAdded.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.DeviceAdded();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.name = reader.string();\r\n break;\r\n case 2:\r\n message.index = reader.uint32();\r\n break;\r\n case 3:\r\n if (!(message.messageAttributes && message.messageAttributes.length))\r\n message.messageAttributes = [];\r\n message.messageAttributes.push($root.Buttplug.ServerMessage.MessageAttributes.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceAdded message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceAdded.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceAdded message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceAdded.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.name != null && message.hasOwnProperty(\"name\"))\r\n if (!$util.isString(message.name))\r\n return \"name: string expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.messageAttributes != null && message.hasOwnProperty(\"messageAttributes\")) {\r\n if (!Array.isArray(message.messageAttributes))\r\n return \"messageAttributes: array expected\";\r\n for (var i = 0; i < message.messageAttributes.length; ++i) {\r\n var error = $root.Buttplug.ServerMessage.MessageAttributes.verify(message.messageAttributes[i]);\r\n if (error)\r\n return \"messageAttributes.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceAdded message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n */\r\n DeviceAdded.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.DeviceAdded)\r\n return object;\r\n var message = new $root.Buttplug.ServerMessage.DeviceAdded();\r\n if (object.name != null)\r\n message.name = String(object.name);\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.messageAttributes) {\r\n if (!Array.isArray(object.messageAttributes))\r\n throw TypeError(\".Buttplug.ServerMessage.DeviceAdded.messageAttributes: array expected\");\r\n message.messageAttributes = [];\r\n for (var i = 0; i < object.messageAttributes.length; ++i) {\r\n if (typeof object.messageAttributes[i] !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.DeviceAdded.messageAttributes: object expected\");\r\n message.messageAttributes[i] = $root.Buttplug.ServerMessage.MessageAttributes.fromObject(object.messageAttributes[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceAdded message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.DeviceAdded} message DeviceAdded\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceAdded.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.arrays || options.defaults)\r\n object.messageAttributes = [];\r\n if (options.defaults) {\r\n object.name = \"\";\r\n object.index = 0;\r\n }\r\n if (message.name != null && message.hasOwnProperty(\"name\"))\r\n object.name = message.name;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.messageAttributes && message.messageAttributes.length) {\r\n object.messageAttributes = [];\r\n for (var j = 0; j < message.messageAttributes.length; ++j)\r\n object.messageAttributes[j] = $root.Buttplug.ServerMessage.MessageAttributes.toObject(message.messageAttributes[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceAdded to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceAdded.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return DeviceAdded;\r\n })();\r\n\r\n ServerMessage.DeviceRemoved = (function() {\r\n\r\n /**\r\n * Properties of a DeviceRemoved.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDeviceRemoved\r\n * @property {number|null} [index] DeviceRemoved index\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceRemoved.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a DeviceRemoved.\r\n * @implements IDeviceRemoved\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved=} [properties] Properties to set\r\n */\r\n function DeviceRemoved(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceRemoved index.\r\n * @member {number} index\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @instance\r\n */\r\n DeviceRemoved.prototype.index = 0;\r\n\r\n /**\r\n * Creates a new DeviceRemoved instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved instance\r\n */\r\n DeviceRemoved.create = function create(properties) {\r\n return new DeviceRemoved(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceRemoved message. Does not implicitly {@link Buttplug.ServerMessage.DeviceRemoved.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved} message DeviceRemoved message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceRemoved.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceRemoved message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.DeviceRemoved.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved} message DeviceRemoved message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceRemoved.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceRemoved message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceRemoved.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.DeviceRemoved();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceRemoved message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceRemoved.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceRemoved message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceRemoved.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceRemoved message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n */\r\n DeviceRemoved.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.DeviceRemoved)\r\n return object;\r\n var message = new $root.Buttplug.ServerMessage.DeviceRemoved();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceRemoved message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.DeviceRemoved} message DeviceRemoved\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceRemoved.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults)\r\n object.index = 0;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceRemoved to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceRemoved.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return DeviceRemoved;\r\n })();\r\n\r\n ServerMessage.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDisconnect\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.ServerMessage.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Disconnect();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Disconnect)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.Disconnect();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n return ServerMessage;\r\n })();\r\n\r\n Buttplug.DeviceEvent = (function() {\r\n\r\n /**\r\n * Properties of a DeviceEvent.\r\n * @memberof Buttplug\r\n * @interface IDeviceEvent\r\n * @property {Buttplug.DeviceEvent.IDisconnect|null} [disconnect] DeviceEvent disconnect\r\n * @property {Buttplug.DeviceEvent.IBatteryLevelReading|null} [batteryLevelReading] DeviceEvent batteryLevelReading\r\n * @property {Buttplug.DeviceEvent.IRSSILevelReading|null} [rssiLevelReading] DeviceEvent rssiLevelReading\r\n * @property {Buttplug.DeviceEvent.IRawReading|null} [rawReading] DeviceEvent rawReading\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceEvent.\r\n * @memberof Buttplug\r\n * @classdesc Represents a DeviceEvent.\r\n * @implements IDeviceEvent\r\n * @constructor\r\n * @param {Buttplug.IDeviceEvent=} [properties] Properties to set\r\n */\r\n function DeviceEvent(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceEvent disconnect.\r\n * @member {Buttplug.DeviceEvent.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.disconnect = null;\r\n\r\n /**\r\n * DeviceEvent batteryLevelReading.\r\n * @member {Buttplug.DeviceEvent.IBatteryLevelReading|null|undefined} batteryLevelReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.batteryLevelReading = null;\r\n\r\n /**\r\n * DeviceEvent rssiLevelReading.\r\n * @member {Buttplug.DeviceEvent.IRSSILevelReading|null|undefined} rssiLevelReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.rssiLevelReading = null;\r\n\r\n /**\r\n * DeviceEvent rawReading.\r\n * @member {Buttplug.DeviceEvent.IRawReading|null|undefined} rawReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.rawReading = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n var $oneOfFields;\r\n\r\n /**\r\n * DeviceEvent msg.\r\n * @member {\"disconnect\"|\"batteryLevelReading\"|\"rssiLevelReading\"|\"rawReading\"|undefined} msg\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n Object.defineProperty(DeviceEvent.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"disconnect\", \"batteryLevelReading\", \"rssiLevelReading\", \"rawReading\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new DeviceEvent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent instance\r\n */\r\n DeviceEvent.create = function create(properties) {\r\n return new DeviceEvent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceEvent message. Does not implicitly {@link Buttplug.DeviceEvent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent} message DeviceEvent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceEvent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.DeviceEvent.Disconnect.encode(message.disconnect, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.batteryLevelReading != null && Object.hasOwnProperty.call(message, \"batteryLevelReading\"))\r\n $root.Buttplug.DeviceEvent.BatteryLevelReading.encode(message.batteryLevelReading, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.rssiLevelReading != null && Object.hasOwnProperty.call(message, \"rssiLevelReading\"))\r\n $root.Buttplug.DeviceEvent.RSSILevelReading.encode(message.rssiLevelReading, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.rawReading != null && Object.hasOwnProperty.call(message, \"rawReading\"))\r\n $root.Buttplug.DeviceEvent.RawReading.encode(message.rawReading, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceEvent message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent} message DeviceEvent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceEvent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceEvent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceEvent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.disconnect = $root.Buttplug.DeviceEvent.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.rawReading = $root.Buttplug.DeviceEvent.RawReading.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceEvent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceEvent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceEvent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceEvent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n var properties = {};\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceEvent.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n if (message.batteryLevelReading != null && message.hasOwnProperty(\"batteryLevelReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceEvent.BatteryLevelReading.verify(message.batteryLevelReading);\r\n if (error)\r\n return \"batteryLevelReading.\" + error;\r\n }\r\n }\r\n if (message.rssiLevelReading != null && message.hasOwnProperty(\"rssiLevelReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceEvent.RSSILevelReading.verify(message.rssiLevelReading);\r\n if (error)\r\n return \"rssiLevelReading.\" + error;\r\n }\r\n }\r\n if (message.rawReading != null && message.hasOwnProperty(\"rawReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceEvent.RawReading.verify(message.rawReading);\r\n if (error)\r\n return \"rawReading.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceEvent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n */\r\n DeviceEvent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent)\r\n return object;\r\n var message = new $root.Buttplug.DeviceEvent();\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.DeviceEvent.Disconnect.fromObject(object.disconnect);\r\n }\r\n if (object.batteryLevelReading != null) {\r\n if (typeof object.batteryLevelReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.batteryLevelReading: object expected\");\r\n message.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.fromObject(object.batteryLevelReading);\r\n }\r\n if (object.rssiLevelReading != null) {\r\n if (typeof object.rssiLevelReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.rssiLevelReading: object expected\");\r\n message.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.fromObject(object.rssiLevelReading);\r\n }\r\n if (object.rawReading != null) {\r\n if (typeof object.rawReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.rawReading: object expected\");\r\n message.rawReading = $root.Buttplug.DeviceEvent.RawReading.fromObject(object.rawReading);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceEvent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.DeviceEvent} message DeviceEvent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceEvent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.DeviceEvent.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n if (message.batteryLevelReading != null && message.hasOwnProperty(\"batteryLevelReading\")) {\r\n object.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.toObject(message.batteryLevelReading, options);\r\n if (options.oneofs)\r\n object.msg = \"batteryLevelReading\";\r\n }\r\n if (message.rssiLevelReading != null && message.hasOwnProperty(\"rssiLevelReading\")) {\r\n object.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.toObject(message.rssiLevelReading, options);\r\n if (options.oneofs)\r\n object.msg = \"rssiLevelReading\";\r\n }\r\n if (message.rawReading != null && message.hasOwnProperty(\"rawReading\")) {\r\n object.rawReading = $root.Buttplug.DeviceEvent.RawReading.toObject(message.rawReading, options);\r\n if (options.oneofs)\r\n object.msg = \"rawReading\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceEvent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceEvent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n DeviceEvent.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IDisconnect\r\n * @property {number|null} [index] Disconnect index\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Disconnect index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @instance\r\n */\r\n Disconnect.prototype.index = 0;\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.DeviceEvent.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.Disconnect();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.Disconnect)\r\n return object;\r\n var message = new $root.Buttplug.DeviceEvent.Disconnect();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults)\r\n object.index = 0;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n DeviceEvent.RawReading = (function() {\r\n\r\n /**\r\n * Properties of a RawReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IRawReading\r\n * @property {number|null} [index] RawReading index\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawReading endpoint\r\n * @property {Uint8Array|null} [data] RawReading data\r\n */\r\n\r\n /**\r\n * Constructs a new RawReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a RawReading.\r\n * @implements IRawReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IRawReading=} [properties] Properties to set\r\n */\r\n function RawReading(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.index = 0;\r\n\r\n /**\r\n * RawReading endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawReading data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * Creates a new RawReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading instance\r\n */\r\n RawReading.create = function create(properties) {\r\n return new RawReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReading message. Does not implicitly {@link Buttplug.DeviceEvent.RawReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading} message RawReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.data);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.RawReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading} message RawReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.RawReading();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 3:\r\n message.data = reader.bytes();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n */\r\n RawReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.RawReading)\r\n return object;\r\n var message = new $root.Buttplug.DeviceEvent.RawReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.RawReading} message RawReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawReading;\r\n })();\r\n\r\n DeviceEvent.BatteryLevelReading = (function() {\r\n\r\n /**\r\n * Properties of a BatteryLevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IBatteryLevelReading\r\n * @property {number|null} [index] BatteryLevelReading index\r\n * @property {number|null} [reading] BatteryLevelReading reading\r\n */\r\n\r\n /**\r\n * Constructs a new BatteryLevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a BatteryLevelReading.\r\n * @implements IBatteryLevelReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading=} [properties] Properties to set\r\n */\r\n function BatteryLevelReading(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * BatteryLevelReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n */\r\n BatteryLevelReading.prototype.index = 0;\r\n\r\n /**\r\n * BatteryLevelReading reading.\r\n * @member {number} reading\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n */\r\n BatteryLevelReading.prototype.reading = 0;\r\n\r\n /**\r\n * Creates a new BatteryLevelReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading instance\r\n */\r\n BatteryLevelReading.create = function create(properties) {\r\n return new BatteryLevelReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelReading message. Does not implicitly {@link Buttplug.DeviceEvent.BatteryLevelReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading} message BatteryLevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.reading != null && Object.hasOwnProperty.call(message, \"reading\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.reading);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.BatteryLevelReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading} message BatteryLevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.BatteryLevelReading();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.reading = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a BatteryLevelReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n BatteryLevelReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n if (typeof message.reading !== \"number\")\r\n return \"reading: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a BatteryLevelReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n */\r\n BatteryLevelReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.BatteryLevelReading)\r\n return object;\r\n var message = new $root.Buttplug.DeviceEvent.BatteryLevelReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.reading != null)\r\n message.reading = Number(object.reading);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a BatteryLevelReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.BatteryLevelReading} message BatteryLevelReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n BatteryLevelReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.reading = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n object.reading = options.json && !isFinite(message.reading) ? String(message.reading) : message.reading;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this BatteryLevelReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n BatteryLevelReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return BatteryLevelReading;\r\n })();\r\n\r\n DeviceEvent.RSSILevelReading = (function() {\r\n\r\n /**\r\n * Properties of a RSSILevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IRSSILevelReading\r\n * @property {number|null} [index] RSSILevelReading index\r\n * @property {number|null} [reading] RSSILevelReading reading\r\n */\r\n\r\n /**\r\n * Constructs a new RSSILevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a RSSILevelReading.\r\n * @implements IRSSILevelReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading=} [properties] Properties to set\r\n */\r\n function RSSILevelReading(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RSSILevelReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n */\r\n RSSILevelReading.prototype.index = 0;\r\n\r\n /**\r\n * RSSILevelReading reading.\r\n * @member {number} reading\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n */\r\n RSSILevelReading.prototype.reading = 0;\r\n\r\n /**\r\n * Creates a new RSSILevelReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading instance\r\n */\r\n RSSILevelReading.create = function create(properties) {\r\n return new RSSILevelReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelReading message. Does not implicitly {@link Buttplug.DeviceEvent.RSSILevelReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading} message RSSILevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.reading != null && Object.hasOwnProperty.call(message, \"reading\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.reading);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.RSSILevelReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading} message RSSILevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.RSSILevelReading();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.reading = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RSSILevelReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RSSILevelReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n if (!$util.isInteger(message.reading))\r\n return \"reading: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RSSILevelReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n */\r\n RSSILevelReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.RSSILevelReading)\r\n return object;\r\n var message = new $root.Buttplug.DeviceEvent.RSSILevelReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.reading != null)\r\n message.reading = object.reading | 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RSSILevelReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.RSSILevelReading} message RSSILevelReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RSSILevelReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.reading = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n object.reading = message.reading;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RSSILevelReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RSSILevelReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RSSILevelReading;\r\n })();\r\n\r\n return DeviceEvent;\r\n })();\r\n\r\n Buttplug.ButtplugFFIServerMessage = (function() {\r\n\r\n /**\r\n * Properties of a ButtplugFFIServerMessage.\r\n * @memberof Buttplug\r\n * @interface IButtplugFFIServerMessage\r\n * @property {number|null} [id] ButtplugFFIServerMessage id\r\n * @property {Buttplug.ButtplugFFIServerMessage.IFFIMessage|null} [message] ButtplugFFIServerMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new ButtplugFFIServerMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ButtplugFFIServerMessage.\r\n * @implements IButtplugFFIServerMessage\r\n * @constructor\r\n * @param {Buttplug.IButtplugFFIServerMessage=} [properties] Properties to set\r\n */\r\n function ButtplugFFIServerMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ButtplugFFIServerMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n */\r\n ButtplugFFIServerMessage.prototype.id = 0;\r\n\r\n /**\r\n * ButtplugFFIServerMessage message.\r\n * @member {Buttplug.ButtplugFFIServerMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n */\r\n ButtplugFFIServerMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new ButtplugFFIServerMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage instance\r\n */\r\n ButtplugFFIServerMessage.create = function create(properties) {\r\n return new ButtplugFFIServerMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ButtplugFFIServerMessage message. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage} message ButtplugFFIServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ButtplugFFIServerMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ButtplugFFIServerMessage message, length delimited. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage} message ButtplugFFIServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ButtplugFFIServerMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ButtplugFFIServerMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ButtplugFFIServerMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ButtplugFFIServerMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ButtplugFFIServerMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ButtplugFFIServerMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ButtplugFFIServerMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ButtplugFFIServerMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n var error = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ButtplugFFIServerMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n */\r\n ButtplugFFIServerMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ButtplugFFIServerMessage)\r\n return object;\r\n var message = new $root.Buttplug.ButtplugFFIServerMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.message: object expected\");\r\n message.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ButtplugFFIServerMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage} message ButtplugFFIServerMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ButtplugFFIServerMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ButtplugFFIServerMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ButtplugFFIServerMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n ButtplugFFIServerMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.IServerMessage|null} [serverMessage] FFIMessage serverMessage\r\n * @property {Buttplug.IDeviceEvent|null} [deviceEvent] FFIMessage deviceEvent\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage serverMessage.\r\n * @member {Buttplug.IServerMessage|null|undefined} serverMessage\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.serverMessage = null;\r\n\r\n /**\r\n * FFIMessage deviceEvent.\r\n * @member {Buttplug.IDeviceEvent|null|undefined} deviceEvent\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.deviceEvent = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n var $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"serverMessage\"|\"deviceEvent\"|undefined} msg\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"serverMessage\", \"deviceEvent\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.serverMessage != null && Object.hasOwnProperty.call(message, \"serverMessage\"))\r\n $root.Buttplug.ServerMessage.encode(message.serverMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.deviceEvent != null && Object.hasOwnProperty.call(message, \"deviceEvent\"))\r\n $root.Buttplug.DeviceEvent.encode(message.deviceEvent, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ButtplugFFIServerMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n var tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.serverMessage = $root.Buttplug.ServerMessage.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.deviceEvent = $root.Buttplug.DeviceEvent.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n var properties = {};\r\n if (message.serverMessage != null && message.hasOwnProperty(\"serverMessage\")) {\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.ServerMessage.verify(message.serverMessage);\r\n if (error)\r\n return \"serverMessage.\" + error;\r\n }\r\n }\r\n if (message.deviceEvent != null && message.hasOwnProperty(\"deviceEvent\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n var error = $root.Buttplug.DeviceEvent.verify(message.deviceEvent);\r\n if (error)\r\n return \"deviceEvent.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ButtplugFFIServerMessage.FFIMessage)\r\n return object;\r\n var message = new $root.Buttplug.ButtplugFFIServerMessage.FFIMessage();\r\n if (object.serverMessage != null) {\r\n if (typeof object.serverMessage !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.FFIMessage.serverMessage: object expected\");\r\n message.serverMessage = $root.Buttplug.ServerMessage.fromObject(object.serverMessage);\r\n }\r\n if (object.deviceEvent != null) {\r\n if (typeof object.deviceEvent !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.FFIMessage.deviceEvent: object expected\");\r\n message.deviceEvent = $root.Buttplug.DeviceEvent.fromObject(object.deviceEvent);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n var object = {};\r\n if (message.serverMessage != null && message.hasOwnProperty(\"serverMessage\")) {\r\n object.serverMessage = $root.Buttplug.ServerMessage.toObject(message.serverMessage, options);\r\n if (options.oneofs)\r\n object.msg = \"serverMessage\";\r\n }\r\n if (message.deviceEvent != null && message.hasOwnProperty(\"deviceEvent\")) {\r\n object.deviceEvent = $root.Buttplug.DeviceEvent.toObject(message.deviceEvent, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceEvent\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return ButtplugFFIServerMessage;\r\n })();\r\n\r\n return Buttplug;\r\n})();\r\n\r\nmodule.exports = $root;\r\n","\r\nimport { ButtplugEmbeddedConnectorOptions, ButtplugWebsocketConnectorOptions } from \"./connectors\";\r\nimport { ButtplugMessageSorter } from \"./sorter\";\r\nimport { Buttplug } from \"./buttplug_ffi\";\r\n\r\nfunction must_run_init_1(a: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n\r\nfunction must_run_init_2(a: any | undefined, b: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n// import { buttplug_create_client, buttplug_free_client, buttplug_parse_client_message, buttplug_activate_env_logger, buttplug_free_device, buttplug_create_device, buttplug_parse_device_message } from \"./buttplug-rs-ffi/buttplug_rs_ffi\";\r\n\r\nlet buttplug_create_client = must_run_init_2;\r\nlet buttplug_free_client = must_run_init_1;\r\nlet buttplug_parse_client_message = must_run_init_2;\r\nlet buttplug_activate_env_logger = must_run_init_1;\r\nlet buttplug_free_device = must_run_init_1;\r\nlet buttplug_create_device = must_run_init_2;\r\nlet buttplug_parse_device_message = must_run_init_2;\r\nlet buttplug_has_init_run = false;\r\n\r\nexport async function buttplugInit() {\r\n if (buttplug_has_init_run) {\r\n console.log(\"buttplugInit function has already run successfully. This only needs to be run once, but doesn't affect anything (other than printing this message) if called again.\");\r\n return;\r\n }\r\n let index = await import(/* webpackPrefetch: 1 */ \"./buttplug-rs-ffi/buttplug_rs_ffi\").catch((e) => {\r\n console.log(e);\r\n return Promise.reject(e);\r\n });\r\n console.log(index);\r\n buttplug_create_client = index.buttplug_create_client;\r\n buttplug_free_client = index.buttplug_free_client;\r\n buttplug_parse_client_message = index.buttplug_parse_client_message;\r\n buttplug_activate_env_logger = index.buttplug_activate_env_logger;\r\n buttplug_free_device = index.buttplug_free_device;\r\n buttplug_create_device = index.buttplug_create_device;\r\n buttplug_parse_device_message = index.buttplug_parse_device_message;\r\n buttplug_has_init_run = true;\r\n}\r\n\r\nfunction sendClientMessage(sorter: ButtplugMessageSorter, clientPtr: number, message: Buttplug.ClientMessage): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let promise = sorter.PrepareOutgoingMessage(message);\r\n let buffer = Buffer.from(Buttplug.ClientMessage.encode(message).finish())\r\n buttplug_parse_client_message(clientPtr, buffer);\r\n return promise;\r\n}\r\n\r\nexport function connectEmbedded(sorter: ButtplugMessageSorter, clientPtr: number, options: ButtplugEmbeddedConnectorOptions): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n connectLocal: Buttplug.ClientMessage.ConnectLocal.create({\r\n serverName: options.ServerName,\r\n allowRawMessages: options.AllowRawMessages,\r\n deviceConfigurationJson: options.DeviceConfigJSON,\r\n userDeviceConfigurationJson: options.UserDeviceConfigJSON,\r\n commManagerTypes: options.DeviceCommunicationManagerTypes,\r\n maxPingTime: options.MaxPingTime\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nexport function connectWebsocket(sorter: ButtplugMessageSorter, clientPtr: number, options: ButtplugWebsocketConnectorOptions): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n connectWebsocket: Buttplug.ClientMessage.ConnectWebsocket.create({\r\n address: options.Address\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nexport function disconnect(sorter: ButtplugMessageSorter, clientPtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n disconnect: Buttplug.ClientMessage.Disconnect.create({})\r\n })\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nexport function startScanning(sorter: ButtplugMessageSorter, clientPtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n startScanning: Buttplug.ClientMessage.StartScanning.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nexport function stopScanning(sorter: ButtplugMessageSorter, clientPtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n stopScanning: Buttplug.ClientMessage.StopScanning.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nexport function stopAllDevices(sorter: ButtplugMessageSorter, clientPtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n stopAllDevices: Buttplug.ClientMessage.StopAllDevices.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg);\r\n}\r\n\r\nfunction sendDeviceMessage(sorter: ButtplugMessageSorter, devicePtr: number, message: Buttplug.DeviceMessage): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let promise = sorter.PrepareOutgoingMessage(message);\r\n let buffer = Buffer.from(Buttplug.DeviceMessage.encode(message).finish())\r\n buttplug_parse_device_message(devicePtr, buffer);\r\n return promise;\r\n}\r\n\r\nexport function vibrate(sorter: ButtplugMessageSorter, devicePtr: number, speeds: Buttplug.DeviceMessage.VibrateComponent[]): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n vibrateCmd: Buttplug.DeviceMessage.VibrateCmd.create({\r\n speeds: speeds\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rotate(sorter: ButtplugMessageSorter, devicePtr: number, rotations: Buttplug.DeviceMessage.RotateComponent[]): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rotateCmd: Buttplug.DeviceMessage.RotateCmd.create({\r\n rotations: rotations\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function linear(sorter: ButtplugMessageSorter, devicePtr: number, vectors: Buttplug.DeviceMessage.LinearComponent[]): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n linearCmd: Buttplug.DeviceMessage.LinearCmd.create({\r\n movements: vectors\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function stopDevice(sorter: ButtplugMessageSorter, devicePtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n stopDeviceCmd: Buttplug.DeviceMessage.StopDeviceCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function batteryLevel(sorter: ButtplugMessageSorter, devicePtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n batteryLevelCmd: Buttplug.DeviceMessage.BatteryLevelCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rssiLevel(sorter: ButtplugMessageSorter, devicePtr: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rssiLevelCmd: Buttplug.DeviceMessage.RSSILevelCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rawRead(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, expectedLength: number, timeout: number): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawReadCmd: Buttplug.DeviceMessage.RawReadCmd.create({\r\n endpoint: endpoint,\r\n expectedLength: expectedLength,\r\n timeout: timeout\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rawWrite(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, data: Uint8Array, writeWithResponse: boolean): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawWriteCmd: Buttplug.DeviceMessage.RawWriteCmd.create({\r\n endpoint: endpoint,\r\n data: data,\r\n writeWithResponse: writeWithResponse\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rawSubscribe(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawSubscribeCmd: Buttplug.DeviceMessage.RawSubscribeCmd.create({\r\n endpoint: endpoint\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function rawUnsubscribe(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawUnsubscribeCmd: Buttplug.DeviceMessage.RawUnsubscribeCmd.create({\r\n endpoint: endpoint\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg);\r\n}\r\n\r\nexport function createClientPtr(eventCallback: Function, clientName: string): number {\r\n return buttplug_create_client(eventCallback, clientName);\r\n}\r\n\r\nexport function createDevicePtr(clientPtr: number, deviceIndex: number): number | null {\r\n return buttplug_create_device(clientPtr, deviceIndex);\r\n}\r\n\r\nexport function freeClientPtr(clientPtr: number) {\r\n buttplug_free_client(clientPtr);\r\n}\r\n\r\nexport function freeDevicePtr(devicePtr: number) {\r\n buttplug_free_device(devicePtr);\r\n}\r\n\r\nexport function activateConsoleLogger(logLevel: \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\") {\r\n buttplug_activate_env_logger(logLevel);\r\n}\r\n\r\n/*\r\nexport function addLogHandler(logCallback: Function, logLevel: \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\", useJSON: boolean) {\r\n buttplug_add_log_handler(logCallback, logLevel, useJSON);\r\n}\r\n*/","import { Buttplug } from \"./buttplug_ffi\";\r\n\r\nexport class ButtplugError extends Error {\r\n /*\r\n\r\n public get ErrorClass(): Messages.ErrorClass {\r\n return this.errorClass;\r\n }\r\n\r\n public get InnerError(): Error | undefined {\r\n return this.innerError;\r\n }\r\n\r\n public get Id(): number | undefined {\r\n return this.messageId;\r\n }\r\n\r\n public get ErrorMessage(): Messages.ButtplugMessage {\r\n return new Messages.Error(this.message, this.ErrorClass, this.Id);\r\n }\r\n\r\n public static FromError(aError: Messages.Error) {\r\n switch (aError.ErrorCode) {\r\n case Messages.ErrorClass.ERROR_DEVICE:\r\n return new ButtplugDeviceError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_INIT:\r\n return new ButtplugInitError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_UNKNOWN:\r\n return new ButtplugUnknownError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_PING:\r\n return new ButtplugPingError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_MSG:\r\n return new ButtplugMessageError(aError.ErrorMessage, aError.Id);\r\n default:\r\n throw new Error(`Message type ${aError.ErrorCode} not handled`);\r\n }\r\n }\r\n*/\r\n public innerError: Error | undefined;\r\n public messageId: number | undefined;\r\n\r\n protected constructor(aMessage: string,\r\n aId: number = 0,\r\n aInner?: Error) {\r\n super(aMessage);\r\n this.innerError = aInner;\r\n this.messageId = aId;\r\n }\r\n}\r\n\r\nexport class ButtplugHandshakeError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugDeviceError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugMessageError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugPingError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugUnknownError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugClientConnectorError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport function convertPBufError(err: Buttplug.ServerMessage.IError, id: number): ButtplugError {\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugConnectorError) {\r\n return new ButtplugClientConnectorError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugDeviceError) {\r\n return new ButtplugDeviceError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugHandshakeError) {\r\n return new ButtplugHandshakeError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugMessageError) {\r\n return new ButtplugMessageError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugPingError) {\r\n return new ButtplugPingError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugUnknownError) {\r\n return new ButtplugUnknownError(err.message!, id);\r\n }\r\n throw new ButtplugUnknownError(\"Cannot convert error: \" + err);\r\n}\r\n","export class ButtplugEmbeddedConnectorOptions {\r\n public ServerName: string = \"Buttplug WASM Embedded Server\";\r\n // Empty string means ignore.\r\n public DeviceConfigJSON: string = \"\";\r\n // Empty string means ignore.\r\n public UserDeviceConfigJSON: string = \"\";\r\n // 0 here means all device.\r\n public DeviceCommunicationManagerTypes: number = 0;\r\n // Require opt-in on raw messages.\r\n public AllowRawMessages: boolean = false;\r\n public MaxPingTime: number = 0;\r\n\r\n public constructor() {}\r\n}\r\n\r\nexport class ButtplugWebsocketConnectorOptions {\r\n // Default to the insecure port.\r\n public Address: string = \"ws://127.0.0.1:12345\";\r\n\r\n public constructor() {}\r\n}","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\nimport { Buttplug } from \"./buttplug_ffi\";\r\nimport { convertPBufError } from \"./errors\";\r\n\r\nexport class ButtplugMessageSorter {\r\n protected _counter: number = 1;\r\n protected _waitingMsgs: Map<number, [(val: Buttplug.ServerMessage) => void, (err: Error) => void]> = new Map();\r\n\r\n public constructor() {\r\n }\r\n\r\n // One of the places we should actually return a promise, as we need to store\r\n // them while waiting for them to return across the line.\r\n // tslint:disable:promise-function-async\r\n public PrepareOutgoingMessage(aMsg: Buttplug.ClientMessage | Buttplug.DeviceMessage) : Promise<Buttplug.ButtplugFFIServerMessage> {\r\n aMsg.id = this._counter;\r\n // Always increment last, otherwise we might lose sync\r\n this._counter += 1;\r\n let res;\r\n let rej;\r\n const msgPromise = new Promise<Buttplug.ButtplugFFIServerMessage>((resolve, reject) => { res = resolve; rej = reject; });\r\n this._waitingMsgs.set(aMsg.id, [res, rej]);\r\n return msgPromise;\r\n }\r\n\r\n public ParseIncomingMessages(msg: Buttplug.ButtplugFFIServerMessage): Buttplug.ServerMessage | null {\r\n if (msg.id !== 0 && this._waitingMsgs.has(msg.id)) {\r\n const [res, rej] = this._waitingMsgs.get(msg.id)!;\r\n // If we've gotten back an error, reject the related promise using a\r\n // ButtplugException derived type.\r\n if (msg.message?.serverMessage?.error) {\r\n rej(convertPBufError(msg.message?.serverMessage?.error, msg.id));\r\n return null;\r\n }\r\n res(msg);\r\n return null;\r\n }\r\n return msg;\r\n }\r\n}\r\n","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n\"use strict\";\r\nimport { Buttplug } from \"./buttplug_ffi\";\r\nimport { ButtplugDeviceError } from \"./errors\";\r\nimport { EventEmitter } from \"events\";\r\nimport { vibrate, rotate, stopDevice, linear, batteryLevel,\r\n rssiLevel, rawRead, rawWrite, rawSubscribe, rawUnsubscribe } from \"./ffi\";\r\nimport { ButtplugMessageSorter } from \"./sorter\";\r\n\r\n// Re-export the protobuf enum, so we don't require users to have to know the\r\n// full resolution path.\r\nexport import ButtplugDeviceMessageType = Buttplug.ServerMessage.MessageAttributeType;\r\n\r\nexport class MessageAttributes {\r\n /** MessageAttributes featureCount */\r\n featureCount?: (number | null);\r\n\r\n /** MessageAttributes stepCount */\r\n stepCount?: (number[] | null);\r\n\r\n /** MessageAttributes endpoints */\r\n endpoints?: (Buttplug.Endpoint[] | null);\r\n\r\n /** MessageAttributes maxDuration */\r\n maxDuration?: (number[] | null);\r\n\r\n constructor(attributes: Buttplug.ServerMessage.IMessageAttributes) {\r\n this.featureCount = attributes.featureCount;\r\n this.stepCount = attributes.stepCount;\r\n this.maxDuration = attributes.maxDuration;\r\n this.endpoints = attributes.endpoints;\r\n }\r\n}\r\n\r\nexport class VibrationCmd {\r\n public readonly Index: number;\r\n public readonly Speed: number;\r\n\r\n constructor(index: number, speed: number) {\r\n this.Index = index;\r\n this.Speed = speed;\r\n }\r\n}\r\n\r\nexport class RotationCmd {\r\n public readonly Index: number;\r\n public readonly Speed: number;\r\n public readonly Clockwise: boolean;\r\n\r\n constructor(index: number, speed: number, clockwise: boolean) {\r\n this.Index = index;\r\n this.Speed = speed;\r\n this.Clockwise = clockwise;\r\n }\r\n}\r\n\r\nexport class VectorCmd {\r\n public readonly Index: number;\r\n public readonly Duration: number;\r\n public readonly Position: number;\r\n\r\n constructor(index: number, duration: number, position: number) {\r\n this.Index = index;\r\n this.Duration = duration;\r\n this.Position = position;\r\n }\r\n}\r\n\r\n/**\r\n * Represents an abstract device, capable of taking certain kinds of messages.\r\n */\r\nexport class ButtplugClientDevice extends EventEmitter {\r\n\r\n private _name: string;\r\n private _index: number;\r\n private _devicePtr: number;\r\n private _messageAttributes: Map<ButtplugDeviceMessageType, MessageAttributes> = new Map();\r\n private _sorter: ButtplugMessageSorter;\r\n\r\n /**\r\n * Return the name of the device.\r\n */\r\n public get Name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Return the index of the device.\r\n */\r\n public get Index(): number {\r\n return this._index;\r\n }\r\n\r\n /**\r\n * Return a list of message types the device accepts.\r\n */\r\n public get AllowedMessages(): ButtplugDeviceMessageType[] {\r\n return Array.from(this._messageAttributes.keys());\r\n }\r\n\r\n /**\r\n * @param _index Index of the device, as created by the device manager.\r\n * @param _name Name of the device.\r\n * @param allowedMsgs Buttplug messages the device can receive.\r\n */\r\n constructor(\r\n devicePtr: number,\r\n sorter: ButtplugMessageSorter,\r\n index: number,\r\n name: string,\r\n allowedMsgsObj: Buttplug.ServerMessage.IMessageAttributes[]) {\r\n super();\r\n this._devicePtr = devicePtr;\r\n this._sorter = sorter;\r\n this._index = index;\r\n this._name = name;\r\n for (let attributes of allowedMsgsObj) {\r\n this._messageAttributes.set(attributes.messageType!, new MessageAttributes(attributes));\r\n }\r\n }\r\n\r\n /**\r\n * Return the message attributes related to the given message\r\n */\r\n public messageAttributes(messageName: ButtplugDeviceMessageType): MessageAttributes | undefined {\r\n return this._messageAttributes.get(messageName);\r\n }\r\n\r\n protected checkAllowedMessageType(messageType: ButtplugDeviceMessageType) {\r\n if (!this._messageAttributes.has(messageType)) {\r\n throw new ButtplugDeviceError(`Message ${ButtplugDeviceMessageType[messageType]} does not exist on device ${this._name}`);\r\n }\r\n }\r\n\r\n public async vibrate(speeds: number | Array<VibrationCmd | number>): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.VibrateCmd);\r\n let msgSpeeds: Buttplug.DeviceMessage.VibrateComponent[];\r\n if (typeof (speeds) === \"number\") {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.VibrateCmd)!.featureCount!;\r\n msgSpeeds = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: i,\r\n speed: speeds,\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => typeof(x) === \"number\")) {\r\n msgSpeeds = speeds.map((x, index) => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: index,\r\n speed: x as number\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => x instanceof VibrationCmd)) {\r\n msgSpeeds = (speeds as VibrationCmd[]).map(x => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: x.Index,\r\n speed: x.Speed\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"vibrate can only take numbers or arrays of numbers or VibrationCmds.\");\r\n }\r\n await vibrate(this._sorter, this._devicePtr, msgSpeeds);\r\n }\r\n\r\n public async rotate(speeds: number | RotationCmd[], clockwise: boolean | undefined): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RotateCmd);\r\n let msgRotations: Buttplug.DeviceMessage.RotateComponent[];\r\n if (typeof (speeds) === \"number\" && clockwise !== undefined) {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.RotateCmd)!.featureCount!;\r\n msgRotations = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.RotateComponent.create({\r\n index: i,\r\n speed: speeds,\r\n clockwise: clockwise\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => x instanceof RotationCmd)) {\r\n msgRotations = (speeds as any).map(x => Buttplug.DeviceMessage.RotateComponent.create({\r\n index: x.Index,\r\n speed: x.Speed,\r\n clockwise: x.Clockwise\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"rotate can only take number/boolean or arrays of RotateCmds.\");\r\n }\r\n await rotate(this._sorter, this._devicePtr, msgRotations);\r\n }\r\n\r\n public async linear(position: number | VectorCmd[], duration: number | undefined): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.LinearCmd);\r\n let msgVectors: Buttplug.DeviceMessage.LinearComponent[];\r\n if (typeof (position) === \"number\" && duration !== undefined) {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.LinearCmd)!.featureCount!;\r\n msgVectors = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.LinearComponent.create({\r\n index: i,\r\n position: position,\r\n duration: duration\r\n }));\r\n } else if (Array.isArray(position) && position.every(x => x instanceof VectorCmd)) {\r\n msgVectors = position.map(x => Buttplug.DeviceMessage.LinearComponent.create({\r\n index: x.Index,\r\n position: x.Position,\r\n duration: x.Duration\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"linear can only take number/number or arrays of VectorCmds.\");\r\n }\r\n await linear(this._sorter, this._devicePtr, msgVectors);\r\n }\r\n\r\n public async batteryLevel(): Promise<number> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.BatteryLevelCmd);\r\n let batteryMsg = await batteryLevel(this._sorter, this._devicePtr);\r\n if (batteryMsg.message?.deviceEvent?.batteryLevelReading) {\r\n let reading = batteryMsg.message?.deviceEvent?.batteryLevelReading;\r\n return reading.reading!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for batteryLevel: \" + batteryMsg);\r\n }\r\n\r\n public async rssiLevel(): Promise<number> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RSSILevelCmd);\r\n let rssiMsg = await rssiLevel(this._sorter, this._devicePtr);\r\n if (rssiMsg.message?.deviceEvent?.rssiLevelReading) {\r\n return rssiMsg.message?.deviceEvent?.rssiLevelReading.reading!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for rssiLevel: \" + rssiMsg);\r\n }\r\n\r\n public async rawRead(endpoint: Buttplug.Endpoint, expectedLength: number, timeout: number): Promise<Uint8Array> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawReadCmd);\r\n let readingMsg = await rawRead(this._sorter, this._devicePtr, endpoint, expectedLength, timeout);\r\n if (readingMsg.message?.deviceEvent?.rawReading) {\r\n return readingMsg.message.deviceEvent.rawReading.data!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for rawRead: \" + readingMsg);\r\n }\r\n\r\n public async rawWrite(endpoint: Buttplug.Endpoint, data: Uint8Array, writeWithResponse: boolean): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawWriteCmd);\r\n await rawWrite(this._sorter, this._devicePtr, endpoint, data, writeWithResponse);\r\n }\r\n\r\n public async rawSubscribe(endpoint: Buttplug.Endpoint): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawSubscribeCmd);\r\n await rawSubscribe(this._sorter, this._devicePtr, endpoint);\r\n }\r\n\r\n public async rawUnsubscribe(endpoint: Buttplug.Endpoint): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawUnsubscribeCmd);\r\n await rawUnsubscribe(this._sorter, this._devicePtr, endpoint);\r\n }\r\n\r\n public async stop(): Promise<void> {\r\n await stopDevice(this._sorter, this._devicePtr);\r\n }\r\n\r\n public emitDisconnected() {\r\n this.emit(\"deviceremoved\");\r\n }\r\n}\r\n","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { Buttplug } from \"./buttplug_ffi\";\r\nimport { ButtplugClientConnectorError } from \"./errors\";\r\nimport { createClientPtr, createDevicePtr, connectEmbedded, connectWebsocket, startScanning, stopScanning, stopAllDevices, disconnect } from \"./ffi\";\r\nimport { ButtplugEmbeddedConnectorOptions, ButtplugWebsocketConnectorOptions } from \"./connectors\";\r\nimport { ButtplugMessageSorter } from \"./sorter\";\r\nimport { ButtplugClientDevice } from \"./device\";\r\nexport class ButtplugClient extends EventEmitter {\r\n protected _devices: Map<number, ButtplugClientDevice> = new Map();\r\n protected _clientName: string;\r\n // This will either be null, or our WASM heap pointer for our connected client object.\r\n private _clientPtr?: number = undefined;\r\n protected _isScanning = false;\r\n private _connected = false;\r\n private _sorter: ButtplugMessageSorter = new ButtplugMessageSorter();\r\n\r\n constructor(clientName: string = \"Generic Buttplug Client\") {\r\n super();\r\n this._clientName = clientName;\r\n this._clientPtr = createClientPtr(this.sorterCallback, clientName);\r\n }\r\n\r\n public get Connected(): boolean {\r\n return this._connected;\r\n }\r\n\r\n public get Devices(): ButtplugClientDevice[] {\r\n // While this function doesn't actually send a message, if we don't have a\r\n // connector, we shouldn't have devices.\r\n this.CheckConnector();\r\n const devices: ButtplugClientDevice[] = [];\r\n this._devices.forEach((d, i) => {\r\n devices.push(d);\r\n });\r\n return devices;\r\n }\r\n\r\n public get isScanning(): boolean {\r\n return this._isScanning;\r\n }\r\n\r\n public connect = async (options: ButtplugEmbeddedConnectorOptions | ButtplugWebsocketConnectorOptions): Promise<void> => {\r\n if (this._connected) {\r\n throw new ButtplugClientConnectorError(\"Client already connected.\");\r\n }\r\n if (options instanceof ButtplugEmbeddedConnectorOptions) {\r\n await connectEmbedded(this._sorter, this._clientPtr!, options);\r\n } else if (options instanceof ButtplugWebsocketConnectorOptions) {\r\n await connectWebsocket(this._sorter, this._clientPtr!, options);\r\n } else {\r\n throw new ButtplugClientConnectorError(\"Invalid connector type.\");\r\n }\r\n this._connected = true;\r\n }\r\n\r\n public disconnect = async () => {\r\n if (!this._clientPtr) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await disconnect(this._sorter, this._clientPtr);\r\n }\r\n\r\n public startScanning = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await startScanning(this._sorter, this._clientPtr!);\r\n this._isScanning = true;\r\n }\r\n\r\n public stopScanning = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await stopScanning(this._sorter, this._clientPtr!);\r\n this._isScanning = false;\r\n }\r\n\r\n public stopAllDevices = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await stopAllDevices(this._sorter, this._clientPtr!);\r\n }\r\n\r\n protected CheckConnector() {\r\n if (!this.Connected) {\r\n throw new ButtplugClientConnectorError(\"ButtplugClient not connected\");\r\n }\r\n }\r\n\r\n private sorterCallback = (buf: Uint8Array) => {\r\n const msg = Buttplug.ButtplugFFIServerMessage.decode(buf);\r\n if (msg.id > 0) {\r\n this._sorter.ParseIncomingMessages(msg);\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.deviceAdded) {\r\n const addedMsg = msg.message?.serverMessage?.deviceAdded;\r\n const devicePtr = createDevicePtr(this._clientPtr!, addedMsg.index!);\r\n const device = new ButtplugClientDevice(devicePtr!, this._sorter, addedMsg.index!, addedMsg.name!, addedMsg.messageAttributes!);\r\n this._devices.set(addedMsg.index!, device);\r\n this.emit(\"deviceadded\", device);\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.deviceRemoved) {\r\n const removedMsg = msg.message?.serverMessage?.deviceRemoved;\r\n if (this._devices.has(removedMsg.index!)) {\r\n const removedDevice = this._devices.get(removedMsg.index!);\r\n removedDevice?.emitDisconnected();\r\n this._devices.delete(removedMsg.index!);\r\n this.emit(\"deviceremoved\", removedDevice);\r\n }\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.scanningFinished) {\r\n this._isScanning = false;\r\n this.emit(\"scanningfinished\");\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.disconnect) {\r\n this._connected = false;\r\n this.emit(\"serverdisconnect\");\r\n }\r\n }\r\n}\r\n","/*!\r\n * Buttplug WASM Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright 2020-2021 (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n// Godawful hack for CDN support.\r\n//\r\n// Since users are used to being able to include the library off CDNs, I wanted\r\n// to keep supporting that with the new WASM package. Unfortunately WASM\r\n// requires webpack to chunk loading due to the async nature of WASM loads,\r\n// which means dynamic import() calls. In order to make sure the import always\r\n// includes itself on the correct domain, we have to:\r\n//\r\n// - Get the URL of the CDN we're on (via querying the currently processed\r\n// script. Hacky as hell.)\r\n// - Override Webpack's special __webpack_public_path__ variable with that path.\r\n// - Have the user call the buttplugInit() method to actually load the WASM\r\n// blob.\r\n//\r\n// Gross, but it does the job.\r\n\r\ndeclare var __webpack_public_path__: any;\r\n\r\nvar scripts = document.getElementsByTagName( \"script\" );\r\nvar lastScript = scripts[scripts.length - 1].src;\r\n__webpack_public_path__ = lastScript.substr(0, lastScript.lastIndexOf('/') + 1);\r\n\r\nexport * from \"./index\";"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack://Buttplug/webpack/universalModuleDefinition","webpack://Buttplug/webpack/bootstrap","webpack://Buttplug/./src/buttplug_ffi.js","webpack://Buttplug/./node_modules/protobufjs/minimal.js","webpack://Buttplug/./src/ffi.ts","webpack://Buttplug/./node_modules/protobufjs/src/util/minimal.js","webpack://Buttplug/./node_modules/events/events.js","webpack://Buttplug/(webpack)/buildin/global.js","webpack://Buttplug/./node_modules/protobufjs/src/writer.js","webpack://Buttplug/./node_modules/protobufjs/src/reader.js","webpack://Buttplug/./node_modules/protobufjs/src/index-minimal.js","webpack://Buttplug/./node_modules/@protobufjs/aspromise/index.js","webpack://Buttplug/./node_modules/@protobufjs/base64/index.js","webpack://Buttplug/./node_modules/@protobufjs/eventemitter/index.js","webpack://Buttplug/./node_modules/@protobufjs/float/index.js","webpack://Buttplug/./node_modules/@protobufjs/inquire/index.js","webpack://Buttplug/./node_modules/@protobufjs/utf8/index.js","webpack://Buttplug/./node_modules/@protobufjs/pool/index.js","webpack://Buttplug/./node_modules/protobufjs/src/util/longbits.js","webpack://Buttplug/./node_modules/protobufjs/src/writer_buffer.js","webpack://Buttplug/./node_modules/protobufjs/src/reader_buffer.js","webpack://Buttplug/./node_modules/protobufjs/src/rpc.js","webpack://Buttplug/./node_modules/protobufjs/src/rpc/service.js","webpack://Buttplug/./node_modules/protobufjs/src/roots.js","webpack://Buttplug/./node_modules/buffer/index.js","webpack://Buttplug/./node_modules/base64-js/index.js","webpack://Buttplug/./node_modules/ieee754/index.js","webpack://Buttplug/./node_modules/isarray/index.js","webpack://Buttplug/./src/errors.ts","webpack://Buttplug/./src/connectors.ts","webpack://Buttplug/./src/sorter.ts","webpack://Buttplug/./src/device.ts","webpack://Buttplug/./src/client.ts","webpack://Buttplug/./src/index.ts","webpack://Buttplug/./src/web_index.ts"],"names":["root","factory","exports","module","define","amd","window","webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","prefetchChunks","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","forEach","undefined","link","document","createElement","__webpack_require__","nc","setAttribute","rel","as","href","jsonpScriptSrc","head","appendChild","shift","installedModules","0","p","installedWasmModules","wasmImportObjects","30","p0i32","p1i32","p2i32","p3i32","p4i32","p5i32","p6i32","p7i32","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","charset","timeout","src","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","setTimeout","wasmModuleId","installedWasmModuleData","importObject","req","fetch","WebAssembly","compileStreaming","all","then","items","instantiate","instantiateStreaming","x","arrayBuffer","bytes","res","w","instance","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","oldJsonpFunction","slice","startupResult","s","$Reader","Reader","$Writer","Writer","$util","util","$root","roots","Buttplug","Endpoint","valuesById","values","ClientMessage","properties","keys","this","id","encode","writer","uint32","FFIMessage","fork","ldelim","encodeDelimited","decode","reader","end","len","pos","tag","skipType","decodeDelimited","verify","isInteger","fromObject","TypeError","toObject","options","defaults","toJSON","constructor","toJSONOptions","DeviceCommunicationManagerTypes","ConnectLocal","serverName","maxPingTime","allowRawMessages","deviceConfigurationJson","userDeviceConfigurationJson","commManagerTypes","string","bool","isString","String","Boolean","ConnectWebsocket","address","bypassCertVerification","StartScanning","StopScanning","StopAllDevices","Disconnect","Ping","$oneOfFields","connectLocal","connectWebsocket","startScanning","stopScanning","stopAllDevices","disconnect","ping","oneOfGetter","set","oneOfSetter","msg","oneofs","DeviceMessage","index","VibrateComponent","speed","double","Number","json","isFinite","VibrateCmd","speeds","emptyArray","Array","isArray","arrays","j","RotateComponent","clockwise","RotateCmd","rotations","LinearComponent","duration","position","LinearCmd","movements","StopDeviceCmd","RawReadCmd","endpoint","newBuffer","expectedLength","int32","base64","enums","RawWriteCmd","writeWithResponse","RawSubscribeCmd","RawUnsubscribeCmd","BatteryLevelCmd","RSSILevelCmd","vibrateCmd","rotateCmd","linearCmd","stopDeviceCmd","rawReadCmd","rawWriteCmd","rawSubscribeCmd","rawUnsubscribeCmd","batteryLevelCmd","rssiLevelCmd","ServerMessage","ok","scanningFinished","deviceAdded","deviceRemoved","Ok","ScanningFinished","DeviceAdded","DeviceRemoved","ButtplugErrorType","MessageAttributeType","MessageAttributes","stepCount","endpoints","maxDuration","messageType","featureCount","end2","backtrace","messageAttributes","DeviceEvent","batteryLevelReading","rssiLevelReading","rawReading","BatteryLevelReading","RSSILevelReading","RawReading","reading","ButtplugFFIServerMessage","serverMessage","deviceEvent","must_run_init_1","a","must_run_init_4","b","buttplug_create_protobuf_client","buttplug_free_client","buttplug_client_protobuf_message","buttplug_activate_env_logger","buttplug_free_device","buttplug_create_device","buttplug_device_protobuf_message","buttplug_has_init_run","async","buttplugInit","log","catch","sendClientMessage","sorter","clientPtr","callback","PrepareOutgoingMessage","buffer","Buffer","from","finish","connectEmbedded","ServerName","AllowRawMessages","DeviceConfigJSON","UserDeviceConfigJSON","MaxPingTime","Address","sendDeviceMessage","devicePtr","vibrate","rotate","linear","vectors","stopDevice","batteryLevel","rssiLevel","rawRead","rawWrite","rawSubscribe","rawUnsubscribe","createClientPtr","eventCallback","clientName","createDevicePtr","deviceIndex","freeClientPtr","freeDevicePtr","activateConsoleLogger","logLevel","merge","dst","ifNotSet","newError","CustomError","captureStackTrace","stack","toString","asPromise","EventEmitter","float","inquire","utf8","pool","LongBits","isNode","global","process","versions","node","self","freeze","emptyObject","Math","floor","isObject","isset","isSet","obj","prop","utf8Write","_Buffer_from","_Buffer_allocUnsafe","sizeOrArray","Uint8Array","Long","dcodeIO","key2Re","key32Re","key64Re","longToHash","toHash","zeroHash","longFromHash","hash","unsigned","bits","fromHash","fromBits","lo","hi","toNumber","lcFirst","str","charAt","toLowerCase","substring","ProtocolError","fieldNames","fieldMap","longs","_configure","encoding","allocUnsafe","size","ReflectOwnKeys","R","Reflect","ReflectApply","apply","receiver","args","Function","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","NumberIsNaN","isNaN","init","once","emitter","errorListener","removeListener","resolver","arguments","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","that","_addListener","prepend","events","existing","warning","newListener","emit","unshift","warned","count","warn","onceWrapper","fired","wrapFn","_onceWrap","state","wrapped","_listeners","unwrap","evlistener","arr","ret","unwrapListeners","arrayClone","listenerCount","copy","addEventListener","wrapListener","arg","removeEventListener","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","listeners","addListener","prependListener","prependOnceListener","list","originalListener","pop","spliceOne","off","removeAllListeners","rawListeners","eventNames","g","BufferWriter","Op","fn","val","next","noop","State","tail","states","writeByte","buf","VarintOp","writeVarint64","writeFixed32","alloc","subarray","_push","fromNumber","sint32","uint64","int64","sint64","zzEncode","fixed32","sfixed32","fixed64","sfixed64","writeFloatLE","writeDoubleLE","writeBytes","write","reset","BufferWriter_","BufferReader","indexOutOfRange","writeLength","create_array","isBuffer","readLongVarint","readFixed32_end","readFixed64","_slice","readFloatLE","readDoubleLE","start","read","skip","wireType","BufferReader_","zzDecode","protobuf","configure","build","rpc","ctx","params","offset","pending","ceil","b64","s64","parts","fromCharCode","join","charCodeAt","test","evt","splice","Float32Array","f32","f8b","le","writeFloat_f32_cpy","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","writeFloatBE","readFloatBE","writeFloat_ieee754","writeUint","sign","round","exponent","LN2","pow","readFloat_ieee754","readUint","uint","mantissa","NaN","Infinity","writeUintLE","writeUintBE","readUintLE","readUintBE","Float64Array","f64","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","writeDoubleBE","readDoubleBE","writeDouble_ieee754","off0","off1","readDouble_ieee754","moduleName","mod","eval","replace","c1","c2","SIZE","MAX","slab","zero","parseInt","fromString","low","high","toLong","mask","part0","part1","part2","writeStringBuffer","writeBytesBuffer","byteLength","utf8Slice","min","Service","rpcImpl","requestDelimited","responseDelimited","rpcCall","method","requestCtor","responseCtor","response","endedByRPC","ieee754","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","__proto__","encodingOrOffset","ArrayBuffer","array","byteOffset","fromArrayLike","fromArrayBuffer","isEncoding","actual","checked","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","dir","arrayIndexOf","indexOf","lastIndexOf","indexSize","arrLength","valLength","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","parsed","substr","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","utf16leToBytes","fromByteArray","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","decodeCodePointsArray","SlowBuffer","INSPECT_MAX_BYTES","foo","typedArraySupport","poolSize","_augment","species","configurable","fill","allocUnsafeSlow","_isBuffer","compare","y","swap16","swap32","swap64","equals","inspect","max","match","thisStart","thisEnd","thisCopy","targetCopy","includes","_arr","out","toHex","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","targetStart","code","INVALID_BASE64_RE","leadSurrogate","toByteArray","trim","stringtrim","base64clean","lens","getLens","validLen","placeHoldersLen","tmp","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","len2","encodeChunk","lookup","num","output","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","rt","abs","ButtplugError","aMessage","aId","aInner","super","innerError","messageId","ButtplugHandshakeError","ButtplugDeviceError","ButtplugMessageError","ButtplugPingError","ButtplugUnknownError","ButtplugClientConnectorError","convertPBufError","ButtplugConnectorError","ButtplugEmbeddedConnectorOptions","ButtplugWebsocketConnectorOptions","_counter","_waitingMsgs","Map","aMsg","rej","msgPromise","has","ButtplugDeviceMessageType","attributes","VibrationCmd","Index","Speed","RotationCmd","Clockwise","VectorCmd","Duration","Position","sorter_callback","allowedMsgsObj","_messageAttributes","_devicePtr","_sorter","_index","_name","_sorterCallback","messageName","msgSpeeds","checkAllowedMessageType","features","_","every","map","msgRotations","msgVectors","batteryMsg","rssiMsg","readingMsg","_devices","_clientPtr","_isScanning","_connected","connect","sorterCallback","ParseIncomingMessages","addedMsg","device","removedMsg","removedDevice","emitDisconnected","delete","_clientName","CheckConnector","devices","Connected","scripts","getElementsByTagName","lastScript"],"mappings":"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EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YA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CJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0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AAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,WACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SAAW,GACnB,MACJ,IAAK,YACL,KAAK,GACD1J,EAAQ0J,SA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","file":"buttplug.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"buttplug-commonjs\"] = factory();\n\telse\n\t\troot[\"Buttplug\"] = factory();\n})(window, function() {\nreturn "," \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n\n \t\tvar prefetchChunks = data[3] || [];\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n \t\t// chunk prefetching for javascript\n \t\tprefetchChunks.forEach(function(chunkId) {\n \t\t\tif(installedChunks[chunkId] === undefined) {\n \t\t\t\tinstalledChunks[chunkId] = null;\n \t\t\t\tvar link = document.createElement('link');\n\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tlink.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tlink.rel = \"prefetch\";\n \t\t\t\tlink.as = \"script\";\n \t\t\t\tlink.href = jsonpScriptSrc(chunkId);\n \t\t\t\tdocument.head.appendChild(link);\n \t\t\t}\n \t\t});\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t};\n\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + chunkId + \".buttplug.min.js\"\n \t}\n\n \t// object to store loaded and loading wasm modules\n \tvar installedWasmModules = {};\n\n \tfunction promiseResolve() { return Promise.resolve(); }\n\n \tvar wasmImportObjects = {\n \t\t30: function() {\n \t\t\treturn {\n \t\t\t\t\"./buttplug_rs_ffi_bg.js\": {\n \t\t\t\t\t\"__wbindgen_object_drop_ref\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Fb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_cb_drop\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"sb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_aedd6896ca471fe6\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"A\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_string_new\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Hb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_object_clone_ref\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Eb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_is_string\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Bb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_02e20a3c32305fb7\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"y\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_log_5c7513aa8c164502\": function(p0i32,p1i32,p2i32,p3i32,p4i32,p5i32,p6i32,p7i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"z\"](p0i32,p1i32,p2i32,p3i32,p4i32,p5i32,p6i32,p7i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_mark_abc7631bdced64f0\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"B\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_measure_c528ff64085b7146\": function(p0i32,p1i32,p2i32,p3i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"C\"](p0i32,p1i32,p2i32,p3i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_693216e109162396\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"I\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_stack_0ddaca5d1abfb52f\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"ib\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_error_09919627ac0992f5\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"o\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_Window_f826a1dec163bacb\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"a\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_is_undefined\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Cb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_WorkerGlobalScope_967d186155183d38\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"b\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_instanceof_Window_c4b70662a0d2c5ec\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"w\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_navigator_480e592af6ad365b\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"G\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_clearTimeout_2c1ba0016d8bca41\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"i\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setTimeout_df66d951b1726b78\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"ab\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_data_9e55e7d79ab13ef1\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"n\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_value_84cefeb2408dfe15\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"ob\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setoncharacteristicvaluechanged_75ec7773e310719c\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"db\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_readValue_eeee467eee29d9ab\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"U\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_startNotifications_89d52c5da12f4a73\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"jb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_writeValue_5045e53d65cf4416\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"rb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_target_cc69dde6c2d9ec90\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"lb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_string_get\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Gb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_requestDevice_94797563349e93d8\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"V\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_id_a762586fc34a710d\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"v\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_name_48ead2aa58c91524\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"F\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_gatt_bca8d85b97b18ec3\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"p\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setongattserverdisconnected_5e832e08b6b5f423\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"fb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_clearTimeout_c1f246d6874c0679\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"j\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setTimeout_5314850184d61a44\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Z\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_bluetooth_cc8e053613d8eeca\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"c\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonopen_33b75427f7db7ce1\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"hb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonerror_cb55f0521ac0da3a\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"eb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_setonmessage_ca5f75e4a84134ef\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"gb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_982fe22cd93d67f7\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"K\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_close_f2a10c1de90df5f0\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"k\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_send_503c2e7652e95bf5\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Y\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_connect_e3ccb7d88e903a95\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"l\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getPrimaryService_e624e0982bcd83b1\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"r\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getCharacteristic_7d2869d1ad7151d2\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"q\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_getRandomValues_98117e9a7e993920\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"s\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_randomFillSync_64cc7d048f228ca8\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"T\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_process_2f24d6544ea7b200\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"R\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_is_object\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Ab\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_versions_6164651e75405d4a\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"pb\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_node_4b517d861cbcb3bc\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Q\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_modulerequire_3440a4bcf44437db\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"D\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_crypto_98fc271021c7d2ad\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"m\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_msCrypto_a2cdb043d2bfe57f\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"E\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_949bbc1147195c4e\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"J\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newnoargs_be86524d73f67598\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"M\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_call_888d259a5fefc347\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"h\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_0b83d3df67ecb33e\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"H\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_push_284486ca27c6aa8b\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"S\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_buffer_45280fecb82c83df\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"e\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_byteLength_c9e4f1b2bae8fc4d\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"f\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_call_346669c262382ad7\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"g\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_resolve_d23068002f584f22\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"W\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_then_2fcac196782070cc\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"mb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_then_8c2d62e8ae5978f7\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"nb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_self_c6fbdfc2918d5e58\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"X\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_window_baec038b5ab35c54\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"qb\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_globalThis_3f735a5746d41fbd\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"t\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_global_1bc0b39582740e95\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"u\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_buffer_397eaa4d72ee94dd\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"d\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newwithbyteoffsetandlength_4b9b8c4e3f5adbff\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"O\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_new_a7ce447f15ff496f\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"L\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_set_969ad0a60e51d320\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"cb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_length_1eb8fc608a0d4cdb\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"x\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newwithlength_929232475839a482\": function(p0i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"P\"](p0i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_newwithbyteoffset_b638bad8cc090f32\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"N\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_subarray_8b658422a224f479\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"kb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbg_set_82a4e8a85e31ac42\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"bb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_debug_string\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"zb\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_throw\": function(p0i32,p1i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Ib\"](p0i32,p1i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_memory\": function() {\n \t\t\t\t\t\treturn installedModules[28].exports[\"Db\"]();\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper256\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"tb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper258\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"ub\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper260\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"vb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper262\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"wb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper2880\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"xb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t},\n \t\t\t\t\t\"__wbindgen_closure_wrapper4637\": function(p0i32,p1i32,p2i32) {\n \t\t\t\t\t\treturn installedModules[28].exports[\"yb\"](p0i32,p1i32,p2i32);\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t};\n \t\t},\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n\n \t\t// Fetch + compile chunk loading for webassembly\n\n \t\tvar wasmModules = {\"1\":[30]}[chunkId] || [];\n\n \t\twasmModules.forEach(function(wasmModuleId) {\n \t\t\tvar installedWasmModuleData = installedWasmModules[wasmModuleId];\n\n \t\t\t// a Promise means \"currently loading\" or \"already loaded\".\n \t\t\tif(installedWasmModuleData)\n \t\t\t\tpromises.push(installedWasmModuleData);\n \t\t\telse {\n \t\t\t\tvar importObject = wasmImportObjects[wasmModuleId]();\n \t\t\t\tvar req = fetch(__webpack_require__.p + \"\" + {\"30\":\"b0219b34bc18e1ad0240\"}[wasmModuleId] + \".module.wasm\");\n \t\t\t\tvar promise;\n \t\t\t\tif(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {\n \t\t\t\t\tpromise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {\n \t\t\t\t\t\treturn WebAssembly.instantiate(items[0], items[1]);\n \t\t\t\t\t});\n \t\t\t\t} else if(typeof WebAssembly.instantiateStreaming === 'function') {\n \t\t\t\t\tpromise = WebAssembly.instantiateStreaming(req, importObject);\n \t\t\t\t} else {\n \t\t\t\t\tvar bytesPromise = req.then(function(x) { return x.arrayBuffer(); });\n \t\t\t\t\tpromise = bytesPromise.then(function(bytes) {\n \t\t\t\t\t\treturn WebAssembly.instantiate(bytes, importObject);\n \t\t\t\t\t});\n \t\t\t\t}\n \t\t\t\tpromises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) {\n \t\t\t\t\treturn __webpack_require__.w[wasmModuleId] = (res.instance || res).exports;\n \t\t\t\t}));\n \t\t\t}\n \t\t});\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \t// object with all WebAssembly.instance exports\n \t__webpack_require__.w = {};\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \tvar startupResult = (function() {\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 26);\n \t})();\n\n \twebpackJsonpCallback([[], {}, 0, [1]]);\n \treturn startupResult;\n","// BEGIN_MODULARIZE\r\n// This file was modified by scripts/modularize.js to create Node ESM-compatible bindings.\r\n// Do not modify this file directly as your changes will be overwritten.\r\n// END_MODULARIZE\r\n/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\r\nimport $protobuf from \"protobufjs/minimal.js\";\r\n\r\n// Common aliases\r\nconst $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\r\n\r\n// Exported root namespace\r\nconst $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\r\n\r\nexport const Buttplug = $root.Buttplug = (() => {\r\n\r\n /**\r\n * Namespace Buttplug.\r\n * @exports Buttplug\r\n * @namespace\r\n */\r\n const Buttplug = {};\r\n\r\n /**\r\n * Endpoint enum.\r\n * @name Buttplug.Endpoint\r\n * @enum {number}\r\n * @property {number} Command=0 Command value\r\n * @property {number} Firmware=1 Firmware value\r\n * @property {number} Rx=2 Rx value\r\n * @property {number} RxAccel=3 RxAccel value\r\n * @property {number} RxBLEBattery=4 RxBLEBattery value\r\n * @property {number} RxPressure=5 RxPressure value\r\n * @property {number} RxTouch=6 RxTouch value\r\n * @property {number} Tx=7 Tx value\r\n * @property {number} TxMode=8 TxMode value\r\n * @property {number} TxShock=9 TxShock value\r\n * @property {number} TxVibrate=10 TxVibrate value\r\n * @property {number} TxVendorControl=11 TxVendorControl value\r\n * @property {number} Whitelist=12 Whitelist value\r\n * @property {number} Generic0=13 Generic0 value\r\n * @property {number} Generic1=14 Generic1 value\r\n * @property {number} Generic2=15 Generic2 value\r\n * @property {number} Generic3=16 Generic3 value\r\n * @property {number} Generic4=17 Generic4 value\r\n * @property {number} Generic5=18 Generic5 value\r\n * @property {number} Generic6=19 Generic6 value\r\n * @property {number} Generic7=20 Generic7 value\r\n * @property {number} Generic8=21 Generic8 value\r\n * @property {number} Generic9=22 Generic9 value\r\n * @property {number} Generic10=23 Generic10 value\r\n * @property {number} Generic11=24 Generic11 value\r\n * @property {number} Generic12=25 Generic12 value\r\n * @property {number} Generic13=26 Generic13 value\r\n * @property {number} Generic14=27 Generic14 value\r\n * @property {number} Generic15=28 Generic15 value\r\n * @property {number} Generic16=29 Generic16 value\r\n * @property {number} Generic17=30 Generic17 value\r\n * @property {number} Generic18=31 Generic18 value\r\n * @property {number} Generic19=32 Generic19 value\r\n * @property {number} Generic20=33 Generic20 value\r\n * @property {number} Generic21=34 Generic21 value\r\n * @property {number} Generic22=35 Generic22 value\r\n * @property {number} Generic23=36 Generic23 value\r\n * @property {number} Generic24=37 Generic24 value\r\n * @property {number} Generic25=38 Generic25 value\r\n * @property {number} Generic26=39 Generic26 value\r\n * @property {number} Generic27=40 Generic27 value\r\n * @property {number} Generic28=41 Generic28 value\r\n * @property {number} Generic29=42 Generic29 value\r\n * @property {number} Generic30=43 Generic30 value\r\n * @property {number} Generic31=44 Generic31 value\r\n * @property {number} RxBLEModel=45 RxBLEModel value\r\n */\r\n Buttplug.Endpoint = (function() {\r\n const valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"Command\"] = 0;\r\n values[valuesById[1] = \"Firmware\"] = 1;\r\n values[valuesById[2] = \"Rx\"] = 2;\r\n values[valuesById[3] = \"RxAccel\"] = 3;\r\n values[valuesById[4] = \"RxBLEBattery\"] = 4;\r\n values[valuesById[5] = \"RxPressure\"] = 5;\r\n values[valuesById[6] = \"RxTouch\"] = 6;\r\n values[valuesById[7] = \"Tx\"] = 7;\r\n values[valuesById[8] = \"TxMode\"] = 8;\r\n values[valuesById[9] = \"TxShock\"] = 9;\r\n values[valuesById[10] = \"TxVibrate\"] = 10;\r\n values[valuesById[11] = \"TxVendorControl\"] = 11;\r\n values[valuesById[12] = \"Whitelist\"] = 12;\r\n values[valuesById[13] = \"Generic0\"] = 13;\r\n values[valuesById[14] = \"Generic1\"] = 14;\r\n values[valuesById[15] = \"Generic2\"] = 15;\r\n values[valuesById[16] = \"Generic3\"] = 16;\r\n values[valuesById[17] = \"Generic4\"] = 17;\r\n values[valuesById[18] = \"Generic5\"] = 18;\r\n values[valuesById[19] = \"Generic6\"] = 19;\r\n values[valuesById[20] = \"Generic7\"] = 20;\r\n values[valuesById[21] = \"Generic8\"] = 21;\r\n values[valuesById[22] = \"Generic9\"] = 22;\r\n values[valuesById[23] = \"Generic10\"] = 23;\r\n values[valuesById[24] = \"Generic11\"] = 24;\r\n values[valuesById[25] = \"Generic12\"] = 25;\r\n values[valuesById[26] = \"Generic13\"] = 26;\r\n values[valuesById[27] = \"Generic14\"] = 27;\r\n values[valuesById[28] = \"Generic15\"] = 28;\r\n values[valuesById[29] = \"Generic16\"] = 29;\r\n values[valuesById[30] = \"Generic17\"] = 30;\r\n values[valuesById[31] = \"Generic18\"] = 31;\r\n values[valuesById[32] = \"Generic19\"] = 32;\r\n values[valuesById[33] = \"Generic20\"] = 33;\r\n values[valuesById[34] = \"Generic21\"] = 34;\r\n values[valuesById[35] = \"Generic22\"] = 35;\r\n values[valuesById[36] = \"Generic23\"] = 36;\r\n values[valuesById[37] = \"Generic24\"] = 37;\r\n values[valuesById[38] = \"Generic25\"] = 38;\r\n values[valuesById[39] = \"Generic26\"] = 39;\r\n values[valuesById[40] = \"Generic27\"] = 40;\r\n values[valuesById[41] = \"Generic28\"] = 41;\r\n values[valuesById[42] = \"Generic29\"] = 42;\r\n values[valuesById[43] = \"Generic30\"] = 43;\r\n values[valuesById[44] = \"Generic31\"] = 44;\r\n values[valuesById[45] = \"RxBLEModel\"] = 45;\r\n return values;\r\n })();\r\n\r\n Buttplug.ClientMessage = (function() {\r\n\r\n /**\r\n * Properties of a ClientMessage.\r\n * @memberof Buttplug\r\n * @interface IClientMessage\r\n * @property {number|null} [id] ClientMessage id\r\n * @property {Buttplug.ClientMessage.IFFIMessage|null} [message] ClientMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new ClientMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ClientMessage.\r\n * @implements IClientMessage\r\n * @constructor\r\n * @param {Buttplug.IClientMessage=} [properties] Properties to set\r\n */\r\n function ClientMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ClientMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n */\r\n ClientMessage.prototype.id = 0;\r\n\r\n /**\r\n * ClientMessage message.\r\n * @member {Buttplug.ClientMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n */\r\n ClientMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new ClientMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage} ClientMessage instance\r\n */\r\n ClientMessage.create = function create(properties) {\r\n return new ClientMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ClientMessage message. Does not implicitly {@link Buttplug.ClientMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage} message ClientMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ClientMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.ClientMessage.FFIMessage.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ClientMessage message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.IClientMessage} message ClientMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ClientMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ClientMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ClientMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.message = $root.Buttplug.ClientMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ClientMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ClientMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ClientMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ClientMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n let error = $root.Buttplug.ClientMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ClientMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage} ClientMessage\r\n */\r\n ClientMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage)\r\n return object;\r\n let message = new $root.Buttplug.ClientMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.message: object expected\");\r\n message.message = $root.Buttplug.ClientMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ClientMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage} message ClientMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ClientMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.ClientMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ClientMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ClientMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n /**\r\n * DeviceCommunicationManagerTypes enum.\r\n * @name Buttplug.ClientMessage.DeviceCommunicationManagerTypes\r\n * @enum {number}\r\n * @property {number} All=0 All value\r\n * @property {number} Btleplug=1 Btleplug value\r\n * @property {number} XInput=2 XInput value\r\n * @property {number} SerialPort=4 SerialPort value\r\n * @property {number} LovenseHIDDongle=8 LovenseHIDDongle value\r\n * @property {number} LovenseSerialDongle=16 LovenseSerialDongle value\r\n */\r\n ClientMessage.DeviceCommunicationManagerTypes = (function() {\r\n const valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"All\"] = 0;\r\n values[valuesById[1] = \"Btleplug\"] = 1;\r\n values[valuesById[2] = \"XInput\"] = 2;\r\n values[valuesById[4] = \"SerialPort\"] = 4;\r\n values[valuesById[8] = \"LovenseHIDDongle\"] = 8;\r\n values[valuesById[16] = \"LovenseSerialDongle\"] = 16;\r\n return values;\r\n })();\r\n\r\n ClientMessage.ConnectLocal = (function() {\r\n\r\n /**\r\n * Properties of a ConnectLocal.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IConnectLocal\r\n * @property {string|null} [serverName] ConnectLocal serverName\r\n * @property {number|null} [maxPingTime] ConnectLocal maxPingTime\r\n * @property {boolean|null} [allowRawMessages] ConnectLocal allowRawMessages\r\n * @property {string|null} [deviceConfigurationJson] ConnectLocal deviceConfigurationJson\r\n * @property {string|null} [userDeviceConfigurationJson] ConnectLocal userDeviceConfigurationJson\r\n * @property {number|null} [commManagerTypes] ConnectLocal commManagerTypes\r\n */\r\n\r\n /**\r\n * Constructs a new ConnectLocal.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a ConnectLocal.\r\n * @implements IConnectLocal\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IConnectLocal=} [properties] Properties to set\r\n */\r\n function ConnectLocal(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ConnectLocal serverName.\r\n * @member {string} serverName\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.serverName = \"\";\r\n\r\n /**\r\n * ConnectLocal maxPingTime.\r\n * @member {number} maxPingTime\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.maxPingTime = 0;\r\n\r\n /**\r\n * ConnectLocal allowRawMessages.\r\n * @member {boolean} allowRawMessages\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.allowRawMessages = false;\r\n\r\n /**\r\n * ConnectLocal deviceConfigurationJson.\r\n * @member {string} deviceConfigurationJson\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.deviceConfigurationJson = \"\";\r\n\r\n /**\r\n * ConnectLocal userDeviceConfigurationJson.\r\n * @member {string} userDeviceConfigurationJson\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.userDeviceConfigurationJson = \"\";\r\n\r\n /**\r\n * ConnectLocal commManagerTypes.\r\n * @member {number} commManagerTypes\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n */\r\n ConnectLocal.prototype.commManagerTypes = 0;\r\n\r\n /**\r\n * Creates a new ConnectLocal instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal instance\r\n */\r\n ConnectLocal.create = function create(properties) {\r\n return new ConnectLocal(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectLocal message. Does not implicitly {@link Buttplug.ClientMessage.ConnectLocal.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal} message ConnectLocal message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectLocal.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.serverName != null && Object.hasOwnProperty.call(message, \"serverName\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.serverName);\r\n if (message.maxPingTime != null && Object.hasOwnProperty.call(message, \"maxPingTime\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.maxPingTime);\r\n if (message.allowRawMessages != null && Object.hasOwnProperty.call(message, \"allowRawMessages\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.allowRawMessages);\r\n if (message.deviceConfigurationJson != null && Object.hasOwnProperty.call(message, \"deviceConfigurationJson\"))\r\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.deviceConfigurationJson);\r\n if (message.userDeviceConfigurationJson != null && Object.hasOwnProperty.call(message, \"userDeviceConfigurationJson\"))\r\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.userDeviceConfigurationJson);\r\n if (message.commManagerTypes != null && Object.hasOwnProperty.call(message, \"commManagerTypes\"))\r\n writer.uint32(/* id 6, wireType 0 =*/48).uint32(message.commManagerTypes);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectLocal message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.ConnectLocal.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectLocal} message ConnectLocal message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectLocal.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ConnectLocal message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectLocal.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.ConnectLocal();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.serverName = reader.string();\r\n break;\r\n case 2:\r\n message.maxPingTime = reader.uint32();\r\n break;\r\n case 3:\r\n message.allowRawMessages = reader.bool();\r\n break;\r\n case 4:\r\n message.deviceConfigurationJson = reader.string();\r\n break;\r\n case 5:\r\n message.userDeviceConfigurationJson = reader.string();\r\n break;\r\n case 6:\r\n message.commManagerTypes = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ConnectLocal message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectLocal.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ConnectLocal message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ConnectLocal.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.serverName != null && message.hasOwnProperty(\"serverName\"))\r\n if (!$util.isString(message.serverName))\r\n return \"serverName: string expected\";\r\n if (message.maxPingTime != null && message.hasOwnProperty(\"maxPingTime\"))\r\n if (!$util.isInteger(message.maxPingTime))\r\n return \"maxPingTime: integer expected\";\r\n if (message.allowRawMessages != null && message.hasOwnProperty(\"allowRawMessages\"))\r\n if (typeof message.allowRawMessages !== \"boolean\")\r\n return \"allowRawMessages: boolean expected\";\r\n if (message.deviceConfigurationJson != null && message.hasOwnProperty(\"deviceConfigurationJson\"))\r\n if (!$util.isString(message.deviceConfigurationJson))\r\n return \"deviceConfigurationJson: string expected\";\r\n if (message.userDeviceConfigurationJson != null && message.hasOwnProperty(\"userDeviceConfigurationJson\"))\r\n if (!$util.isString(message.userDeviceConfigurationJson))\r\n return \"userDeviceConfigurationJson: string expected\";\r\n if (message.commManagerTypes != null && message.hasOwnProperty(\"commManagerTypes\"))\r\n if (!$util.isInteger(message.commManagerTypes))\r\n return \"commManagerTypes: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ConnectLocal message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.ConnectLocal} ConnectLocal\r\n */\r\n ConnectLocal.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.ConnectLocal)\r\n return object;\r\n let message = new $root.Buttplug.ClientMessage.ConnectLocal();\r\n if (object.serverName != null)\r\n message.serverName = String(object.serverName);\r\n if (object.maxPingTime != null)\r\n message.maxPingTime = object.maxPingTime >>> 0;\r\n if (object.allowRawMessages != null)\r\n message.allowRawMessages = Boolean(object.allowRawMessages);\r\n if (object.deviceConfigurationJson != null)\r\n message.deviceConfigurationJson = String(object.deviceConfigurationJson);\r\n if (object.userDeviceConfigurationJson != null)\r\n message.userDeviceConfigurationJson = String(object.userDeviceConfigurationJson);\r\n if (object.commManagerTypes != null)\r\n message.commManagerTypes = object.commManagerTypes >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ConnectLocal message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @static\r\n * @param {Buttplug.ClientMessage.ConnectLocal} message ConnectLocal\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ConnectLocal.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.serverName = \"\";\r\n object.maxPingTime = 0;\r\n object.allowRawMessages = false;\r\n object.deviceConfigurationJson = \"\";\r\n object.userDeviceConfigurationJson = \"\";\r\n object.commManagerTypes = 0;\r\n }\r\n if (message.serverName != null && message.hasOwnProperty(\"serverName\"))\r\n object.serverName = message.serverName;\r\n if (message.maxPingTime != null && message.hasOwnProperty(\"maxPingTime\"))\r\n object.maxPingTime = message.maxPingTime;\r\n if (message.allowRawMessages != null && message.hasOwnProperty(\"allowRawMessages\"))\r\n object.allowRawMessages = message.allowRawMessages;\r\n if (message.deviceConfigurationJson != null && message.hasOwnProperty(\"deviceConfigurationJson\"))\r\n object.deviceConfigurationJson = message.deviceConfigurationJson;\r\n if (message.userDeviceConfigurationJson != null && message.hasOwnProperty(\"userDeviceConfigurationJson\"))\r\n object.userDeviceConfigurationJson = message.userDeviceConfigurationJson;\r\n if (message.commManagerTypes != null && message.hasOwnProperty(\"commManagerTypes\"))\r\n object.commManagerTypes = message.commManagerTypes;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ConnectLocal to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.ConnectLocal\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ConnectLocal.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ConnectLocal;\r\n })();\r\n\r\n ClientMessage.ConnectWebsocket = (function() {\r\n\r\n /**\r\n * Properties of a ConnectWebsocket.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IConnectWebsocket\r\n * @property {string|null} [address] ConnectWebsocket address\r\n * @property {boolean|null} [bypassCertVerification] ConnectWebsocket bypassCertVerification\r\n */\r\n\r\n /**\r\n * Constructs a new ConnectWebsocket.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a ConnectWebsocket.\r\n * @implements IConnectWebsocket\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket=} [properties] Properties to set\r\n */\r\n function ConnectWebsocket(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ConnectWebsocket address.\r\n * @member {string} address\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n */\r\n ConnectWebsocket.prototype.address = \"\";\r\n\r\n /**\r\n * ConnectWebsocket bypassCertVerification.\r\n * @member {boolean} bypassCertVerification\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n */\r\n ConnectWebsocket.prototype.bypassCertVerification = false;\r\n\r\n /**\r\n * Creates a new ConnectWebsocket instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket instance\r\n */\r\n ConnectWebsocket.create = function create(properties) {\r\n return new ConnectWebsocket(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectWebsocket message. Does not implicitly {@link Buttplug.ClientMessage.ConnectWebsocket.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket} message ConnectWebsocket message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectWebsocket.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.address != null && Object.hasOwnProperty.call(message, \"address\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.address);\r\n if (message.bypassCertVerification != null && Object.hasOwnProperty.call(message, \"bypassCertVerification\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).bool(message.bypassCertVerification);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ConnectWebsocket message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.ConnectWebsocket.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.IConnectWebsocket} message ConnectWebsocket message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ConnectWebsocket.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ConnectWebsocket message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectWebsocket.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.ConnectWebsocket();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.address = reader.string();\r\n break;\r\n case 2:\r\n message.bypassCertVerification = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ConnectWebsocket message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ConnectWebsocket.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ConnectWebsocket message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ConnectWebsocket.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.address != null && message.hasOwnProperty(\"address\"))\r\n if (!$util.isString(message.address))\r\n return \"address: string expected\";\r\n if (message.bypassCertVerification != null && message.hasOwnProperty(\"bypassCertVerification\"))\r\n if (typeof message.bypassCertVerification !== \"boolean\")\r\n return \"bypassCertVerification: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ConnectWebsocket message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.ConnectWebsocket} ConnectWebsocket\r\n */\r\n ConnectWebsocket.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.ConnectWebsocket)\r\n return object;\r\n let message = new $root.Buttplug.ClientMessage.ConnectWebsocket();\r\n if (object.address != null)\r\n message.address = String(object.address);\r\n if (object.bypassCertVerification != null)\r\n message.bypassCertVerification = Boolean(object.bypassCertVerification);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ConnectWebsocket message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @static\r\n * @param {Buttplug.ClientMessage.ConnectWebsocket} message ConnectWebsocket\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ConnectWebsocket.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.address = \"\";\r\n object.bypassCertVerification = false;\r\n }\r\n if (message.address != null && message.hasOwnProperty(\"address\"))\r\n object.address = message.address;\r\n if (message.bypassCertVerification != null && message.hasOwnProperty(\"bypassCertVerification\"))\r\n object.bypassCertVerification = message.bypassCertVerification;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ConnectWebsocket to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.ConnectWebsocket\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ConnectWebsocket.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ConnectWebsocket;\r\n })();\r\n\r\n ClientMessage.StartScanning = (function() {\r\n\r\n /**\r\n * Properties of a StartScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStartScanning\r\n */\r\n\r\n /**\r\n * Constructs a new StartScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StartScanning.\r\n * @implements IStartScanning\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStartScanning=} [properties] Properties to set\r\n */\r\n function StartScanning(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StartScanning instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning instance\r\n */\r\n StartScanning.create = function create(properties) {\r\n return new StartScanning(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StartScanning message. Does not implicitly {@link Buttplug.ClientMessage.StartScanning.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning} message StartScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StartScanning.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StartScanning message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StartScanning.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStartScanning} message StartScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StartScanning.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StartScanning message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StartScanning.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StartScanning();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StartScanning message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StartScanning.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StartScanning message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StartScanning.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StartScanning message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StartScanning} StartScanning\r\n */\r\n StartScanning.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StartScanning)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StartScanning();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StartScanning message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.StartScanning} message StartScanning\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StartScanning.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StartScanning to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StartScanning\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StartScanning.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StartScanning;\r\n })();\r\n\r\n ClientMessage.StopScanning = (function() {\r\n\r\n /**\r\n * Properties of a StopScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStopScanning\r\n */\r\n\r\n /**\r\n * Constructs a new StopScanning.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StopScanning.\r\n * @implements IStopScanning\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStopScanning=} [properties] Properties to set\r\n */\r\n function StopScanning(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopScanning instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning instance\r\n */\r\n StopScanning.create = function create(properties) {\r\n return new StopScanning(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopScanning message. Does not implicitly {@link Buttplug.ClientMessage.StopScanning.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning} message StopScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopScanning.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopScanning message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StopScanning.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopScanning} message StopScanning message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopScanning.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopScanning message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopScanning.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StopScanning();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopScanning message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopScanning.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopScanning message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopScanning.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopScanning message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StopScanning} StopScanning\r\n */\r\n StopScanning.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StopScanning)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StopScanning();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopScanning message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @static\r\n * @param {Buttplug.ClientMessage.StopScanning} message StopScanning\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopScanning.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopScanning to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StopScanning\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopScanning.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopScanning;\r\n })();\r\n\r\n ClientMessage.StopAllDevices = (function() {\r\n\r\n /**\r\n * Properties of a StopAllDevices.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IStopAllDevices\r\n */\r\n\r\n /**\r\n * Constructs a new StopAllDevices.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a StopAllDevices.\r\n * @implements IStopAllDevices\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IStopAllDevices=} [properties] Properties to set\r\n */\r\n function StopAllDevices(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopAllDevices instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices instance\r\n */\r\n StopAllDevices.create = function create(properties) {\r\n return new StopAllDevices(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopAllDevices message. Does not implicitly {@link Buttplug.ClientMessage.StopAllDevices.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices} message StopAllDevices message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopAllDevices.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopAllDevices message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.StopAllDevices.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.IStopAllDevices} message StopAllDevices message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopAllDevices.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopAllDevices message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopAllDevices.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.StopAllDevices();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopAllDevices message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopAllDevices.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopAllDevices message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopAllDevices.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopAllDevices message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.StopAllDevices} StopAllDevices\r\n */\r\n StopAllDevices.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.StopAllDevices)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.StopAllDevices();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopAllDevices message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @static\r\n * @param {Buttplug.ClientMessage.StopAllDevices} message StopAllDevices\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopAllDevices.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopAllDevices to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.StopAllDevices\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopAllDevices.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopAllDevices;\r\n })();\r\n\r\n ClientMessage.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IDisconnect\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.ClientMessage.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.Disconnect();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.Disconnect)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.Disconnect();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ClientMessage.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n ClientMessage.Ping = (function() {\r\n\r\n /**\r\n * Properties of a Ping.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IPing\r\n */\r\n\r\n /**\r\n * Constructs a new Ping.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a Ping.\r\n * @implements IPing\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IPing=} [properties] Properties to set\r\n */\r\n function Ping(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Ping instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.Ping} Ping instance\r\n */\r\n Ping.create = function create(properties) {\r\n return new Ping(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Ping message. Does not implicitly {@link Buttplug.ClientMessage.Ping.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing} message Ping message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ping.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Ping message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.Ping.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.IPing} message Ping message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ping.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Ping message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ping.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.Ping();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Ping message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ping.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Ping message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Ping.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Ping message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.Ping} Ping\r\n */\r\n Ping.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.Ping)\r\n return object;\r\n return new $root.Buttplug.ClientMessage.Ping();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Ping message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @static\r\n * @param {Buttplug.ClientMessage.Ping} message Ping\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Ping.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Ping to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.Ping\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Ping.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Ping;\r\n })();\r\n\r\n ClientMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.ClientMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.ClientMessage.IConnectLocal|null} [connectLocal] FFIMessage connectLocal\r\n * @property {Buttplug.ClientMessage.IConnectWebsocket|null} [connectWebsocket] FFIMessage connectWebsocket\r\n * @property {Buttplug.ClientMessage.IStartScanning|null} [startScanning] FFIMessage startScanning\r\n * @property {Buttplug.ClientMessage.IStopScanning|null} [stopScanning] FFIMessage stopScanning\r\n * @property {Buttplug.ClientMessage.IStopAllDevices|null} [stopAllDevices] FFIMessage stopAllDevices\r\n * @property {Buttplug.ClientMessage.IDisconnect|null} [disconnect] FFIMessage disconnect\r\n * @property {Buttplug.ClientMessage.IPing|null} [ping] FFIMessage ping\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.ClientMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.ClientMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage connectLocal.\r\n * @member {Buttplug.ClientMessage.IConnectLocal|null|undefined} connectLocal\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.connectLocal = null;\r\n\r\n /**\r\n * FFIMessage connectWebsocket.\r\n * @member {Buttplug.ClientMessage.IConnectWebsocket|null|undefined} connectWebsocket\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.connectWebsocket = null;\r\n\r\n /**\r\n * FFIMessage startScanning.\r\n * @member {Buttplug.ClientMessage.IStartScanning|null|undefined} startScanning\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.startScanning = null;\r\n\r\n /**\r\n * FFIMessage stopScanning.\r\n * @member {Buttplug.ClientMessage.IStopScanning|null|undefined} stopScanning\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopScanning = null;\r\n\r\n /**\r\n * FFIMessage stopAllDevices.\r\n * @member {Buttplug.ClientMessage.IStopAllDevices|null|undefined} stopAllDevices\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopAllDevices = null;\r\n\r\n /**\r\n * FFIMessage disconnect.\r\n * @member {Buttplug.ClientMessage.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.disconnect = null;\r\n\r\n /**\r\n * FFIMessage ping.\r\n * @member {Buttplug.ClientMessage.IPing|null|undefined} ping\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.ping = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n let $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"connectLocal\"|\"connectWebsocket\"|\"startScanning\"|\"stopScanning\"|\"stopAllDevices\"|\"disconnect\"|\"ping\"|undefined} msg\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"connectLocal\", \"connectWebsocket\", \"startScanning\", \"stopScanning\", \"stopAllDevices\", \"disconnect\", \"ping\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.ClientMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.connectLocal != null && Object.hasOwnProperty.call(message, \"connectLocal\"))\r\n $root.Buttplug.ClientMessage.ConnectLocal.encode(message.connectLocal, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.connectWebsocket != null && Object.hasOwnProperty.call(message, \"connectWebsocket\"))\r\n $root.Buttplug.ClientMessage.ConnectWebsocket.encode(message.connectWebsocket, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.startScanning != null && Object.hasOwnProperty.call(message, \"startScanning\"))\r\n $root.Buttplug.ClientMessage.StartScanning.encode(message.startScanning, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.stopScanning != null && Object.hasOwnProperty.call(message, \"stopScanning\"))\r\n $root.Buttplug.ClientMessage.StopScanning.encode(message.stopScanning, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.stopAllDevices != null && Object.hasOwnProperty.call(message, \"stopAllDevices\"))\r\n $root.Buttplug.ClientMessage.StopAllDevices.encode(message.stopAllDevices, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.ClientMessage.Disconnect.encode(message.disconnect, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n if (message.ping != null && Object.hasOwnProperty.call(message, \"ping\"))\r\n $root.Buttplug.ClientMessage.Ping.encode(message.ping, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.ClientMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ClientMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.startScanning = $root.Buttplug.ClientMessage.StartScanning.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.stopScanning = $root.Buttplug.ClientMessage.StopScanning.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.disconnect = $root.Buttplug.ClientMessage.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n case 7:\r\n message.ping = $root.Buttplug.ClientMessage.Ping.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n let properties = {};\r\n if (message.connectLocal != null && message.hasOwnProperty(\"connectLocal\")) {\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.ConnectLocal.verify(message.connectLocal);\r\n if (error)\r\n return \"connectLocal.\" + error;\r\n }\r\n }\r\n if (message.connectWebsocket != null && message.hasOwnProperty(\"connectWebsocket\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.ConnectWebsocket.verify(message.connectWebsocket);\r\n if (error)\r\n return \"connectWebsocket.\" + error;\r\n }\r\n }\r\n if (message.startScanning != null && message.hasOwnProperty(\"startScanning\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.StartScanning.verify(message.startScanning);\r\n if (error)\r\n return \"startScanning.\" + error;\r\n }\r\n }\r\n if (message.stopScanning != null && message.hasOwnProperty(\"stopScanning\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.StopScanning.verify(message.stopScanning);\r\n if (error)\r\n return \"stopScanning.\" + error;\r\n }\r\n }\r\n if (message.stopAllDevices != null && message.hasOwnProperty(\"stopAllDevices\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.StopAllDevices.verify(message.stopAllDevices);\r\n if (error)\r\n return \"stopAllDevices.\" + error;\r\n }\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ClientMessage.Ping.verify(message.ping);\r\n if (error)\r\n return \"ping.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ClientMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ClientMessage.FFIMessage)\r\n return object;\r\n let message = new $root.Buttplug.ClientMessage.FFIMessage();\r\n if (object.connectLocal != null) {\r\n if (typeof object.connectLocal !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.connectLocal: object expected\");\r\n message.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.fromObject(object.connectLocal);\r\n }\r\n if (object.connectWebsocket != null) {\r\n if (typeof object.connectWebsocket !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.connectWebsocket: object expected\");\r\n message.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.fromObject(object.connectWebsocket);\r\n }\r\n if (object.startScanning != null) {\r\n if (typeof object.startScanning !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.startScanning: object expected\");\r\n message.startScanning = $root.Buttplug.ClientMessage.StartScanning.fromObject(object.startScanning);\r\n }\r\n if (object.stopScanning != null) {\r\n if (typeof object.stopScanning !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.stopScanning: object expected\");\r\n message.stopScanning = $root.Buttplug.ClientMessage.StopScanning.fromObject(object.stopScanning);\r\n }\r\n if (object.stopAllDevices != null) {\r\n if (typeof object.stopAllDevices !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.stopAllDevices: object expected\");\r\n message.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.fromObject(object.stopAllDevices);\r\n }\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.ClientMessage.Disconnect.fromObject(object.disconnect);\r\n }\r\n if (object.ping != null) {\r\n if (typeof object.ping !== \"object\")\r\n throw TypeError(\".Buttplug.ClientMessage.FFIMessage.ping: object expected\");\r\n message.ping = $root.Buttplug.ClientMessage.Ping.fromObject(object.ping);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ClientMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (message.connectLocal != null && message.hasOwnProperty(\"connectLocal\")) {\r\n object.connectLocal = $root.Buttplug.ClientMessage.ConnectLocal.toObject(message.connectLocal, options);\r\n if (options.oneofs)\r\n object.msg = \"connectLocal\";\r\n }\r\n if (message.connectWebsocket != null && message.hasOwnProperty(\"connectWebsocket\")) {\r\n object.connectWebsocket = $root.Buttplug.ClientMessage.ConnectWebsocket.toObject(message.connectWebsocket, options);\r\n if (options.oneofs)\r\n object.msg = \"connectWebsocket\";\r\n }\r\n if (message.startScanning != null && message.hasOwnProperty(\"startScanning\")) {\r\n object.startScanning = $root.Buttplug.ClientMessage.StartScanning.toObject(message.startScanning, options);\r\n if (options.oneofs)\r\n object.msg = \"startScanning\";\r\n }\r\n if (message.stopScanning != null && message.hasOwnProperty(\"stopScanning\")) {\r\n object.stopScanning = $root.Buttplug.ClientMessage.StopScanning.toObject(message.stopScanning, options);\r\n if (options.oneofs)\r\n object.msg = \"stopScanning\";\r\n }\r\n if (message.stopAllDevices != null && message.hasOwnProperty(\"stopAllDevices\")) {\r\n object.stopAllDevices = $root.Buttplug.ClientMessage.StopAllDevices.toObject(message.stopAllDevices, options);\r\n if (options.oneofs)\r\n object.msg = \"stopAllDevices\";\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.ClientMessage.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n if (message.ping != null && message.hasOwnProperty(\"ping\")) {\r\n object.ping = $root.Buttplug.ClientMessage.Ping.toObject(message.ping, options);\r\n if (options.oneofs)\r\n object.msg = \"ping\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ClientMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return ClientMessage;\r\n })();\r\n\r\n Buttplug.DeviceMessage = (function() {\r\n\r\n /**\r\n * Properties of a DeviceMessage.\r\n * @memberof Buttplug\r\n * @interface IDeviceMessage\r\n * @property {number|null} [id] DeviceMessage id\r\n * @property {number|null} [index] DeviceMessage index\r\n * @property {Buttplug.DeviceMessage.IFFIMessage|null} [message] DeviceMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a DeviceMessage.\r\n * @implements IDeviceMessage\r\n * @constructor\r\n * @param {Buttplug.IDeviceMessage=} [properties] Properties to set\r\n */\r\n function DeviceMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.id = 0;\r\n\r\n /**\r\n * DeviceMessage index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.index = 0;\r\n\r\n /**\r\n * DeviceMessage message.\r\n * @member {Buttplug.DeviceMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n */\r\n DeviceMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new DeviceMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage instance\r\n */\r\n DeviceMessage.create = function create(properties) {\r\n return new DeviceMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceMessage message. Does not implicitly {@link Buttplug.DeviceMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage} message DeviceMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.index);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.DeviceMessage.FFIMessage.encode(message.message, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceMessage message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.IDeviceMessage} message DeviceMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.index = reader.uint32();\r\n break;\r\n case 3:\r\n message.message = $root.Buttplug.DeviceMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceMessage message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n let error = $root.Buttplug.DeviceMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage} DeviceMessage\r\n */\r\n DeviceMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.message: object expected\");\r\n message.message = $root.Buttplug.DeviceMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage} message DeviceMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.index = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.DeviceMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n DeviceMessage.VibrateComponent = (function() {\r\n\r\n /**\r\n * Properties of a VibrateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IVibrateComponent\r\n * @property {number|null} [index] VibrateComponent index\r\n * @property {number|null} [speed] VibrateComponent speed\r\n */\r\n\r\n /**\r\n * Constructs a new VibrateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a VibrateComponent.\r\n * @implements IVibrateComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent=} [properties] Properties to set\r\n */\r\n function VibrateComponent(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * VibrateComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n */\r\n VibrateComponent.prototype.index = 0;\r\n\r\n /**\r\n * VibrateComponent speed.\r\n * @member {number} speed\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n */\r\n VibrateComponent.prototype.speed = 0;\r\n\r\n /**\r\n * Creates a new VibrateComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent instance\r\n */\r\n VibrateComponent.create = function create(properties) {\r\n return new VibrateComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateComponent message. Does not implicitly {@link Buttplug.DeviceMessage.VibrateComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent} message VibrateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.speed != null && Object.hasOwnProperty.call(message, \"speed\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.speed);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.VibrateComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateComponent} message VibrateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a VibrateComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.VibrateComponent();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.speed = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a VibrateComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a VibrateComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n VibrateComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n if (typeof message.speed !== \"number\")\r\n return \"speed: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a VibrateComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.VibrateComponent} VibrateComponent\r\n */\r\n VibrateComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.VibrateComponent)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.VibrateComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.speed != null)\r\n message.speed = Number(object.speed);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a VibrateComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.VibrateComponent} message VibrateComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n VibrateComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.speed = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n object.speed = options.json && !isFinite(message.speed) ? String(message.speed) : message.speed;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this VibrateComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.VibrateComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n VibrateComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return VibrateComponent;\r\n })();\r\n\r\n DeviceMessage.VibrateCmd = (function() {\r\n\r\n /**\r\n * Properties of a VibrateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IVibrateCmd\r\n * @property {Array.<Buttplug.DeviceMessage.IVibrateComponent>|null} [speeds] VibrateCmd speeds\r\n */\r\n\r\n /**\r\n * Constructs a new VibrateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a VibrateCmd.\r\n * @implements IVibrateCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd=} [properties] Properties to set\r\n */\r\n function VibrateCmd(properties) {\r\n this.speeds = [];\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * VibrateCmd speeds.\r\n * @member {Array.<Buttplug.DeviceMessage.IVibrateComponent>} speeds\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @instance\r\n */\r\n VibrateCmd.prototype.speeds = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new VibrateCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd instance\r\n */\r\n VibrateCmd.create = function create(properties) {\r\n return new VibrateCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateCmd message. Does not implicitly {@link Buttplug.DeviceMessage.VibrateCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd} message VibrateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.speeds != null && message.speeds.length)\r\n for (let i = 0; i < message.speeds.length; ++i)\r\n $root.Buttplug.DeviceMessage.VibrateComponent.encode(message.speeds[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified VibrateCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.VibrateCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IVibrateCmd} message VibrateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n VibrateCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a VibrateCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.VibrateCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.speeds && message.speeds.length))\r\n message.speeds = [];\r\n message.speeds.push($root.Buttplug.DeviceMessage.VibrateComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a VibrateCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n VibrateCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a VibrateCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n VibrateCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.speeds != null && message.hasOwnProperty(\"speeds\")) {\r\n if (!Array.isArray(message.speeds))\r\n return \"speeds: array expected\";\r\n for (let i = 0; i < message.speeds.length; ++i) {\r\n let error = $root.Buttplug.DeviceMessage.VibrateComponent.verify(message.speeds[i]);\r\n if (error)\r\n return \"speeds.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a VibrateCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.VibrateCmd} VibrateCmd\r\n */\r\n VibrateCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.VibrateCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.VibrateCmd();\r\n if (object.speeds) {\r\n if (!Array.isArray(object.speeds))\r\n throw TypeError(\".Buttplug.DeviceMessage.VibrateCmd.speeds: array expected\");\r\n message.speeds = [];\r\n for (let i = 0; i < object.speeds.length; ++i) {\r\n if (typeof object.speeds[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.VibrateCmd.speeds: object expected\");\r\n message.speeds[i] = $root.Buttplug.DeviceMessage.VibrateComponent.fromObject(object.speeds[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a VibrateCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.VibrateCmd} message VibrateCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n VibrateCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.arrays || options.defaults)\r\n object.speeds = [];\r\n if (message.speeds && message.speeds.length) {\r\n object.speeds = [];\r\n for (let j = 0; j < message.speeds.length; ++j)\r\n object.speeds[j] = $root.Buttplug.DeviceMessage.VibrateComponent.toObject(message.speeds[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this VibrateCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.VibrateCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n VibrateCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return VibrateCmd;\r\n })();\r\n\r\n DeviceMessage.RotateComponent = (function() {\r\n\r\n /**\r\n * Properties of a RotateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRotateComponent\r\n * @property {number|null} [index] RotateComponent index\r\n * @property {number|null} [speed] RotateComponent speed\r\n * @property {boolean|null} [clockwise] RotateComponent clockwise\r\n */\r\n\r\n /**\r\n * Constructs a new RotateComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RotateComponent.\r\n * @implements IRotateComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRotateComponent=} [properties] Properties to set\r\n */\r\n function RotateComponent(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RotateComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.index = 0;\r\n\r\n /**\r\n * RotateComponent speed.\r\n * @member {number} speed\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.speed = 0;\r\n\r\n /**\r\n * RotateComponent clockwise.\r\n * @member {boolean} clockwise\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n */\r\n RotateComponent.prototype.clockwise = false;\r\n\r\n /**\r\n * Creates a new RotateComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent instance\r\n */\r\n RotateComponent.create = function create(properties) {\r\n return new RotateComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateComponent message. Does not implicitly {@link Buttplug.DeviceMessage.RotateComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent} message RotateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.speed != null && Object.hasOwnProperty.call(message, \"speed\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.speed);\r\n if (message.clockwise != null && Object.hasOwnProperty.call(message, \"clockwise\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.clockwise);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RotateComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateComponent} message RotateComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RotateComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RotateComponent();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.speed = reader.double();\r\n break;\r\n case 3:\r\n message.clockwise = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RotateComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RotateComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RotateComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n if (typeof message.speed !== \"number\")\r\n return \"speed: number expected\";\r\n if (message.clockwise != null && message.hasOwnProperty(\"clockwise\"))\r\n if (typeof message.clockwise !== \"boolean\")\r\n return \"clockwise: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RotateComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RotateComponent} RotateComponent\r\n */\r\n RotateComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RotateComponent)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RotateComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.speed != null)\r\n message.speed = Number(object.speed);\r\n if (object.clockwise != null)\r\n message.clockwise = Boolean(object.clockwise);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RotateComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RotateComponent} message RotateComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RotateComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.speed = 0;\r\n object.clockwise = false;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.speed != null && message.hasOwnProperty(\"speed\"))\r\n object.speed = options.json && !isFinite(message.speed) ? String(message.speed) : message.speed;\r\n if (message.clockwise != null && message.hasOwnProperty(\"clockwise\"))\r\n object.clockwise = message.clockwise;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RotateComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RotateComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RotateComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RotateComponent;\r\n })();\r\n\r\n DeviceMessage.RotateCmd = (function() {\r\n\r\n /**\r\n * Properties of a RotateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRotateCmd\r\n * @property {Array.<Buttplug.DeviceMessage.IRotateComponent>|null} [rotations] RotateCmd rotations\r\n */\r\n\r\n /**\r\n * Constructs a new RotateCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RotateCmd.\r\n * @implements IRotateCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRotateCmd=} [properties] Properties to set\r\n */\r\n function RotateCmd(properties) {\r\n this.rotations = [];\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RotateCmd rotations.\r\n * @member {Array.<Buttplug.DeviceMessage.IRotateComponent>} rotations\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @instance\r\n */\r\n RotateCmd.prototype.rotations = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new RotateCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd instance\r\n */\r\n RotateCmd.create = function create(properties) {\r\n return new RotateCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RotateCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd} message RotateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.rotations != null && message.rotations.length)\r\n for (let i = 0; i < message.rotations.length; ++i)\r\n $root.Buttplug.DeviceMessage.RotateComponent.encode(message.rotations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RotateCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RotateCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRotateCmd} message RotateCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RotateCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RotateCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RotateCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.rotations && message.rotations.length))\r\n message.rotations = [];\r\n message.rotations.push($root.Buttplug.DeviceMessage.RotateComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RotateCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RotateCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RotateCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RotateCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.rotations != null && message.hasOwnProperty(\"rotations\")) {\r\n if (!Array.isArray(message.rotations))\r\n return \"rotations: array expected\";\r\n for (let i = 0; i < message.rotations.length; ++i) {\r\n let error = $root.Buttplug.DeviceMessage.RotateComponent.verify(message.rotations[i]);\r\n if (error)\r\n return \"rotations.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RotateCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RotateCmd} RotateCmd\r\n */\r\n RotateCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RotateCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RotateCmd();\r\n if (object.rotations) {\r\n if (!Array.isArray(object.rotations))\r\n throw TypeError(\".Buttplug.DeviceMessage.RotateCmd.rotations: array expected\");\r\n message.rotations = [];\r\n for (let i = 0; i < object.rotations.length; ++i) {\r\n if (typeof object.rotations[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.RotateCmd.rotations: object expected\");\r\n message.rotations[i] = $root.Buttplug.DeviceMessage.RotateComponent.fromObject(object.rotations[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RotateCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RotateCmd} message RotateCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RotateCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.arrays || options.defaults)\r\n object.rotations = [];\r\n if (message.rotations && message.rotations.length) {\r\n object.rotations = [];\r\n for (let j = 0; j < message.rotations.length; ++j)\r\n object.rotations[j] = $root.Buttplug.DeviceMessage.RotateComponent.toObject(message.rotations[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RotateCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RotateCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RotateCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RotateCmd;\r\n })();\r\n\r\n DeviceMessage.LinearComponent = (function() {\r\n\r\n /**\r\n * Properties of a LinearComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface ILinearComponent\r\n * @property {number|null} [index] LinearComponent index\r\n * @property {number|null} [duration] LinearComponent duration\r\n * @property {number|null} [position] LinearComponent position\r\n */\r\n\r\n /**\r\n * Constructs a new LinearComponent.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a LinearComponent.\r\n * @implements ILinearComponent\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.ILinearComponent=} [properties] Properties to set\r\n */\r\n function LinearComponent(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * LinearComponent index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.index = 0;\r\n\r\n /**\r\n * LinearComponent duration.\r\n * @member {number} duration\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.duration = 0;\r\n\r\n /**\r\n * LinearComponent position.\r\n * @member {number} position\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n */\r\n LinearComponent.prototype.position = 0;\r\n\r\n /**\r\n * Creates a new LinearComponent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent instance\r\n */\r\n LinearComponent.create = function create(properties) {\r\n return new LinearComponent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearComponent message. Does not implicitly {@link Buttplug.DeviceMessage.LinearComponent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent} message LinearComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearComponent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.duration != null && Object.hasOwnProperty.call(message, \"duration\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.duration);\r\n if (message.position != null && Object.hasOwnProperty.call(message, \"position\"))\r\n writer.uint32(/* id 3, wireType 1 =*/25).double(message.position);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearComponent message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.LinearComponent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearComponent} message LinearComponent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearComponent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a LinearComponent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearComponent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.LinearComponent();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.duration = reader.uint32();\r\n break;\r\n case 3:\r\n message.position = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a LinearComponent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearComponent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a LinearComponent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n LinearComponent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.duration != null && message.hasOwnProperty(\"duration\"))\r\n if (!$util.isInteger(message.duration))\r\n return \"duration: integer expected\";\r\n if (message.position != null && message.hasOwnProperty(\"position\"))\r\n if (typeof message.position !== \"number\")\r\n return \"position: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a LinearComponent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.LinearComponent} LinearComponent\r\n */\r\n LinearComponent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.LinearComponent)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.LinearComponent();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.duration != null)\r\n message.duration = object.duration >>> 0;\r\n if (object.position != null)\r\n message.position = Number(object.position);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a LinearComponent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @static\r\n * @param {Buttplug.DeviceMessage.LinearComponent} message LinearComponent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n LinearComponent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.duration = 0;\r\n object.position = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.duration != null && message.hasOwnProperty(\"duration\"))\r\n object.duration = message.duration;\r\n if (message.position != null && message.hasOwnProperty(\"position\"))\r\n object.position = options.json && !isFinite(message.position) ? String(message.position) : message.position;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this LinearComponent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.LinearComponent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n LinearComponent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return LinearComponent;\r\n })();\r\n\r\n DeviceMessage.LinearCmd = (function() {\r\n\r\n /**\r\n * Properties of a LinearCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface ILinearCmd\r\n * @property {Array.<Buttplug.DeviceMessage.ILinearComponent>|null} [movements] LinearCmd movements\r\n */\r\n\r\n /**\r\n * Constructs a new LinearCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a LinearCmd.\r\n * @implements ILinearCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.ILinearCmd=} [properties] Properties to set\r\n */\r\n function LinearCmd(properties) {\r\n this.movements = [];\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * LinearCmd movements.\r\n * @member {Array.<Buttplug.DeviceMessage.ILinearComponent>} movements\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @instance\r\n */\r\n LinearCmd.prototype.movements = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new LinearCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd instance\r\n */\r\n LinearCmd.create = function create(properties) {\r\n return new LinearCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearCmd message. Does not implicitly {@link Buttplug.DeviceMessage.LinearCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd} message LinearCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.movements != null && message.movements.length)\r\n for (let i = 0; i < message.movements.length; ++i)\r\n $root.Buttplug.DeviceMessage.LinearComponent.encode(message.movements[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified LinearCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.LinearCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.ILinearCmd} message LinearCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n LinearCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a LinearCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.LinearCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n if (!(message.movements && message.movements.length))\r\n message.movements = [];\r\n message.movements.push($root.Buttplug.DeviceMessage.LinearComponent.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a LinearCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n LinearCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a LinearCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n LinearCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.movements != null && message.hasOwnProperty(\"movements\")) {\r\n if (!Array.isArray(message.movements))\r\n return \"movements: array expected\";\r\n for (let i = 0; i < message.movements.length; ++i) {\r\n let error = $root.Buttplug.DeviceMessage.LinearComponent.verify(message.movements[i]);\r\n if (error)\r\n return \"movements.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a LinearCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.LinearCmd} LinearCmd\r\n */\r\n LinearCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.LinearCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.LinearCmd();\r\n if (object.movements) {\r\n if (!Array.isArray(object.movements))\r\n throw TypeError(\".Buttplug.DeviceMessage.LinearCmd.movements: array expected\");\r\n message.movements = [];\r\n for (let i = 0; i < object.movements.length; ++i) {\r\n if (typeof object.movements[i] !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.LinearCmd.movements: object expected\");\r\n message.movements[i] = $root.Buttplug.DeviceMessage.LinearComponent.fromObject(object.movements[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a LinearCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.LinearCmd} message LinearCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n LinearCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.arrays || options.defaults)\r\n object.movements = [];\r\n if (message.movements && message.movements.length) {\r\n object.movements = [];\r\n for (let j = 0; j < message.movements.length; ++j)\r\n object.movements[j] = $root.Buttplug.DeviceMessage.LinearComponent.toObject(message.movements[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this LinearCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.LinearCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n LinearCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return LinearCmd;\r\n })();\r\n\r\n DeviceMessage.StopDeviceCmd = (function() {\r\n\r\n /**\r\n * Properties of a StopDeviceCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IStopDeviceCmd\r\n */\r\n\r\n /**\r\n * Constructs a new StopDeviceCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a StopDeviceCmd.\r\n * @implements IStopDeviceCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd=} [properties] Properties to set\r\n */\r\n function StopDeviceCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new StopDeviceCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd instance\r\n */\r\n StopDeviceCmd.create = function create(properties) {\r\n return new StopDeviceCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified StopDeviceCmd message. Does not implicitly {@link Buttplug.DeviceMessage.StopDeviceCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd} message StopDeviceCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopDeviceCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified StopDeviceCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.StopDeviceCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IStopDeviceCmd} message StopDeviceCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n StopDeviceCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a StopDeviceCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopDeviceCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.StopDeviceCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a StopDeviceCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n StopDeviceCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a StopDeviceCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n StopDeviceCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a StopDeviceCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.StopDeviceCmd} StopDeviceCmd\r\n */\r\n StopDeviceCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.StopDeviceCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.StopDeviceCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a StopDeviceCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.StopDeviceCmd} message StopDeviceCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n StopDeviceCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this StopDeviceCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.StopDeviceCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n StopDeviceCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return StopDeviceCmd;\r\n })();\r\n\r\n DeviceMessage.RawReadCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawReadCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawReadCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawReadCmd endpoint\r\n * @property {Uint8Array|null} [data] RawReadCmd data\r\n * @property {number|null} [expectedLength] RawReadCmd expectedLength\r\n * @property {number|null} [timeout] RawReadCmd timeout\r\n */\r\n\r\n /**\r\n * Constructs a new RawReadCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawReadCmd.\r\n * @implements IRawReadCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd=} [properties] Properties to set\r\n */\r\n function RawReadCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawReadCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawReadCmd data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * RawReadCmd expectedLength.\r\n * @member {number} expectedLength\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.expectedLength = 0;\r\n\r\n /**\r\n * RawReadCmd timeout.\r\n * @member {number} timeout\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n */\r\n RawReadCmd.prototype.timeout = 0;\r\n\r\n /**\r\n * Creates a new RawReadCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd instance\r\n */\r\n RawReadCmd.create = function create(properties) {\r\n return new RawReadCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReadCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawReadCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd} message RawReadCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReadCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.data);\r\n if (message.expectedLength != null && Object.hasOwnProperty.call(message, \"expectedLength\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).uint32(message.expectedLength);\r\n if (message.timeout != null && Object.hasOwnProperty.call(message, \"timeout\"))\r\n writer.uint32(/* id 4, wireType 0 =*/32).uint32(message.timeout);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReadCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawReadCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawReadCmd} message RawReadCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReadCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawReadCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReadCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawReadCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 2:\r\n message.data = reader.bytes();\r\n break;\r\n case 3:\r\n message.expectedLength = reader.uint32();\r\n break;\r\n case 4:\r\n message.timeout = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawReadCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReadCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawReadCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawReadCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n if (message.expectedLength != null && message.hasOwnProperty(\"expectedLength\"))\r\n if (!$util.isInteger(message.expectedLength))\r\n return \"expectedLength: integer expected\";\r\n if (message.timeout != null && message.hasOwnProperty(\"timeout\"))\r\n if (!$util.isInteger(message.timeout))\r\n return \"timeout: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawReadCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawReadCmd} RawReadCmd\r\n */\r\n RawReadCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawReadCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RawReadCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoint = 45;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n if (object.expectedLength != null)\r\n message.expectedLength = object.expectedLength >>> 0;\r\n if (object.timeout != null)\r\n message.timeout = object.timeout >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawReadCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawReadCmd} message RawReadCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawReadCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n object.expectedLength = 0;\r\n object.timeout = 0;\r\n }\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n if (message.expectedLength != null && message.hasOwnProperty(\"expectedLength\"))\r\n object.expectedLength = message.expectedLength;\r\n if (message.timeout != null && message.hasOwnProperty(\"timeout\"))\r\n object.timeout = message.timeout;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawReadCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawReadCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawReadCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawReadCmd;\r\n })();\r\n\r\n DeviceMessage.RawWriteCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawWriteCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawWriteCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawWriteCmd endpoint\r\n * @property {Uint8Array|null} [data] RawWriteCmd data\r\n * @property {boolean|null} [writeWithResponse] RawWriteCmd writeWithResponse\r\n */\r\n\r\n /**\r\n * Constructs a new RawWriteCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawWriteCmd.\r\n * @implements IRawWriteCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd=} [properties] Properties to set\r\n */\r\n function RawWriteCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawWriteCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawWriteCmd data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * RawWriteCmd writeWithResponse.\r\n * @member {boolean} writeWithResponse\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n */\r\n RawWriteCmd.prototype.writeWithResponse = false;\r\n\r\n /**\r\n * Creates a new RawWriteCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd instance\r\n */\r\n RawWriteCmd.create = function create(properties) {\r\n return new RawWriteCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawWriteCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawWriteCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd} message RawWriteCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawWriteCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).bytes(message.data);\r\n if (message.writeWithResponse != null && Object.hasOwnProperty.call(message, \"writeWithResponse\"))\r\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.writeWithResponse);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawWriteCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawWriteCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawWriteCmd} message RawWriteCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawWriteCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawWriteCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawWriteCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawWriteCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 2:\r\n message.data = reader.bytes();\r\n break;\r\n case 3:\r\n message.writeWithResponse = reader.bool();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawWriteCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawWriteCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawWriteCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawWriteCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n if (message.writeWithResponse != null && message.hasOwnProperty(\"writeWithResponse\"))\r\n if (typeof message.writeWithResponse !== \"boolean\")\r\n return \"writeWithResponse: boolean expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawWriteCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawWriteCmd} RawWriteCmd\r\n */\r\n RawWriteCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawWriteCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RawWriteCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoint = 45;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n if (object.writeWithResponse != null)\r\n message.writeWithResponse = Boolean(object.writeWithResponse);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawWriteCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawWriteCmd} message RawWriteCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawWriteCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n object.writeWithResponse = false;\r\n }\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n if (message.writeWithResponse != null && message.hasOwnProperty(\"writeWithResponse\"))\r\n object.writeWithResponse = message.writeWithResponse;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawWriteCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawWriteCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawWriteCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawWriteCmd;\r\n })();\r\n\r\n DeviceMessage.RawSubscribeCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawSubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawSubscribeCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawSubscribeCmd endpoint\r\n */\r\n\r\n /**\r\n * Constructs a new RawSubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawSubscribeCmd.\r\n * @implements IRawSubscribeCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd=} [properties] Properties to set\r\n */\r\n function RawSubscribeCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawSubscribeCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @instance\r\n */\r\n RawSubscribeCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * Creates a new RawSubscribeCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd instance\r\n */\r\n RawSubscribeCmd.create = function create(properties) {\r\n return new RawSubscribeCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawSubscribeCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawSubscribeCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd} message RawSubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawSubscribeCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawSubscribeCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawSubscribeCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawSubscribeCmd} message RawSubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawSubscribeCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawSubscribeCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawSubscribeCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawSubscribeCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawSubscribeCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawSubscribeCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawSubscribeCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawSubscribeCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawSubscribeCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawSubscribeCmd} RawSubscribeCmd\r\n */\r\n RawSubscribeCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawSubscribeCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RawSubscribeCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoint = 45;\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawSubscribeCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawSubscribeCmd} message RawSubscribeCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawSubscribeCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults)\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawSubscribeCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawSubscribeCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawSubscribeCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawSubscribeCmd;\r\n })();\r\n\r\n DeviceMessage.RawUnsubscribeCmd = (function() {\r\n\r\n /**\r\n * Properties of a RawUnsubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRawUnsubscribeCmd\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawUnsubscribeCmd endpoint\r\n */\r\n\r\n /**\r\n * Constructs a new RawUnsubscribeCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RawUnsubscribeCmd.\r\n * @implements IRawUnsubscribeCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd=} [properties] Properties to set\r\n */\r\n function RawUnsubscribeCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawUnsubscribeCmd endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @instance\r\n */\r\n RawUnsubscribeCmd.prototype.endpoint = 0;\r\n\r\n /**\r\n * Creates a new RawUnsubscribeCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd instance\r\n */\r\n RawUnsubscribeCmd.create = function create(properties) {\r\n return new RawUnsubscribeCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawUnsubscribeCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RawUnsubscribeCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd} message RawUnsubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawUnsubscribeCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.endpoint);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawUnsubscribeCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RawUnsubscribeCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRawUnsubscribeCmd} message RawUnsubscribeCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawUnsubscribeCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawUnsubscribeCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawUnsubscribeCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RawUnsubscribeCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.endpoint = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawUnsubscribeCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawUnsubscribeCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawUnsubscribeCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawUnsubscribeCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawUnsubscribeCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RawUnsubscribeCmd} RawUnsubscribeCmd\r\n */\r\n RawUnsubscribeCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RawUnsubscribeCmd)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.RawUnsubscribeCmd();\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoint = 45;\r\n break;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawUnsubscribeCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RawUnsubscribeCmd} message RawUnsubscribeCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawUnsubscribeCmd.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults)\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawUnsubscribeCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RawUnsubscribeCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawUnsubscribeCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawUnsubscribeCmd;\r\n })();\r\n\r\n DeviceMessage.BatteryLevelCmd = (function() {\r\n\r\n /**\r\n * Properties of a BatteryLevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IBatteryLevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new BatteryLevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a BatteryLevelCmd.\r\n * @implements IBatteryLevelCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd=} [properties] Properties to set\r\n */\r\n function BatteryLevelCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new BatteryLevelCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd instance\r\n */\r\n BatteryLevelCmd.create = function create(properties) {\r\n return new BatteryLevelCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelCmd message. Does not implicitly {@link Buttplug.DeviceMessage.BatteryLevelCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd} message BatteryLevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.BatteryLevelCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IBatteryLevelCmd} message BatteryLevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.BatteryLevelCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a BatteryLevelCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n BatteryLevelCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a BatteryLevelCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.BatteryLevelCmd} BatteryLevelCmd\r\n */\r\n BatteryLevelCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.BatteryLevelCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.BatteryLevelCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a BatteryLevelCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.BatteryLevelCmd} message BatteryLevelCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n BatteryLevelCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this BatteryLevelCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.BatteryLevelCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n BatteryLevelCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return BatteryLevelCmd;\r\n })();\r\n\r\n DeviceMessage.RSSILevelCmd = (function() {\r\n\r\n /**\r\n * Properties of a RSSILevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IRSSILevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new RSSILevelCmd.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a RSSILevelCmd.\r\n * @implements IRSSILevelCmd\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd=} [properties] Properties to set\r\n */\r\n function RSSILevelCmd(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new RSSILevelCmd instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd instance\r\n */\r\n RSSILevelCmd.create = function create(properties) {\r\n return new RSSILevelCmd(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelCmd message. Does not implicitly {@link Buttplug.DeviceMessage.RSSILevelCmd.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd} message RSSILevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelCmd.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelCmd message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.RSSILevelCmd.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IRSSILevelCmd} message RSSILevelCmd message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelCmd.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelCmd message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelCmd.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.RSSILevelCmd();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelCmd message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelCmd.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RSSILevelCmd message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RSSILevelCmd.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RSSILevelCmd message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.RSSILevelCmd} RSSILevelCmd\r\n */\r\n RSSILevelCmd.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.RSSILevelCmd)\r\n return object;\r\n return new $root.Buttplug.DeviceMessage.RSSILevelCmd();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RSSILevelCmd message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @static\r\n * @param {Buttplug.DeviceMessage.RSSILevelCmd} message RSSILevelCmd\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RSSILevelCmd.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this RSSILevelCmd to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.RSSILevelCmd\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RSSILevelCmd.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RSSILevelCmd;\r\n })();\r\n\r\n DeviceMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.DeviceMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.DeviceMessage.IVibrateCmd|null} [vibrateCmd] FFIMessage vibrateCmd\r\n * @property {Buttplug.DeviceMessage.IRotateCmd|null} [rotateCmd] FFIMessage rotateCmd\r\n * @property {Buttplug.DeviceMessage.ILinearCmd|null} [linearCmd] FFIMessage linearCmd\r\n * @property {Buttplug.DeviceMessage.IStopDeviceCmd|null} [stopDeviceCmd] FFIMessage stopDeviceCmd\r\n * @property {Buttplug.DeviceMessage.IRawReadCmd|null} [rawReadCmd] FFIMessage rawReadCmd\r\n * @property {Buttplug.DeviceMessage.IRawWriteCmd|null} [rawWriteCmd] FFIMessage rawWriteCmd\r\n * @property {Buttplug.DeviceMessage.IRawSubscribeCmd|null} [rawSubscribeCmd] FFIMessage rawSubscribeCmd\r\n * @property {Buttplug.DeviceMessage.IRawUnsubscribeCmd|null} [rawUnsubscribeCmd] FFIMessage rawUnsubscribeCmd\r\n * @property {Buttplug.DeviceMessage.IBatteryLevelCmd|null} [batteryLevelCmd] FFIMessage batteryLevelCmd\r\n * @property {Buttplug.DeviceMessage.IRSSILevelCmd|null} [rssiLevelCmd] FFIMessage rssiLevelCmd\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.DeviceMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.DeviceMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage vibrateCmd.\r\n * @member {Buttplug.DeviceMessage.IVibrateCmd|null|undefined} vibrateCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.vibrateCmd = null;\r\n\r\n /**\r\n * FFIMessage rotateCmd.\r\n * @member {Buttplug.DeviceMessage.IRotateCmd|null|undefined} rotateCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rotateCmd = null;\r\n\r\n /**\r\n * FFIMessage linearCmd.\r\n * @member {Buttplug.DeviceMessage.ILinearCmd|null|undefined} linearCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.linearCmd = null;\r\n\r\n /**\r\n * FFIMessage stopDeviceCmd.\r\n * @member {Buttplug.DeviceMessage.IStopDeviceCmd|null|undefined} stopDeviceCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.stopDeviceCmd = null;\r\n\r\n /**\r\n * FFIMessage rawReadCmd.\r\n * @member {Buttplug.DeviceMessage.IRawReadCmd|null|undefined} rawReadCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawReadCmd = null;\r\n\r\n /**\r\n * FFIMessage rawWriteCmd.\r\n * @member {Buttplug.DeviceMessage.IRawWriteCmd|null|undefined} rawWriteCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawWriteCmd = null;\r\n\r\n /**\r\n * FFIMessage rawSubscribeCmd.\r\n * @member {Buttplug.DeviceMessage.IRawSubscribeCmd|null|undefined} rawSubscribeCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawSubscribeCmd = null;\r\n\r\n /**\r\n * FFIMessage rawUnsubscribeCmd.\r\n * @member {Buttplug.DeviceMessage.IRawUnsubscribeCmd|null|undefined} rawUnsubscribeCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rawUnsubscribeCmd = null;\r\n\r\n /**\r\n * FFIMessage batteryLevelCmd.\r\n * @member {Buttplug.DeviceMessage.IBatteryLevelCmd|null|undefined} batteryLevelCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.batteryLevelCmd = null;\r\n\r\n /**\r\n * FFIMessage rssiLevelCmd.\r\n * @member {Buttplug.DeviceMessage.IRSSILevelCmd|null|undefined} rssiLevelCmd\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.rssiLevelCmd = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n let $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"vibrateCmd\"|\"rotateCmd\"|\"linearCmd\"|\"stopDeviceCmd\"|\"rawReadCmd\"|\"rawWriteCmd\"|\"rawSubscribeCmd\"|\"rawUnsubscribeCmd\"|\"batteryLevelCmd\"|\"rssiLevelCmd\"|undefined} msg\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"vibrateCmd\", \"rotateCmd\", \"linearCmd\", \"stopDeviceCmd\", \"rawReadCmd\", \"rawWriteCmd\", \"rawSubscribeCmd\", \"rawUnsubscribeCmd\", \"batteryLevelCmd\", \"rssiLevelCmd\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.DeviceMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.vibrateCmd != null && Object.hasOwnProperty.call(message, \"vibrateCmd\"))\r\n $root.Buttplug.DeviceMessage.VibrateCmd.encode(message.vibrateCmd, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.rotateCmd != null && Object.hasOwnProperty.call(message, \"rotateCmd\"))\r\n $root.Buttplug.DeviceMessage.RotateCmd.encode(message.rotateCmd, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.linearCmd != null && Object.hasOwnProperty.call(message, \"linearCmd\"))\r\n $root.Buttplug.DeviceMessage.LinearCmd.encode(message.linearCmd, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.stopDeviceCmd != null && Object.hasOwnProperty.call(message, \"stopDeviceCmd\"))\r\n $root.Buttplug.DeviceMessage.StopDeviceCmd.encode(message.stopDeviceCmd, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.rawReadCmd != null && Object.hasOwnProperty.call(message, \"rawReadCmd\"))\r\n $root.Buttplug.DeviceMessage.RawReadCmd.encode(message.rawReadCmd, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.rawWriteCmd != null && Object.hasOwnProperty.call(message, \"rawWriteCmd\"))\r\n $root.Buttplug.DeviceMessage.RawWriteCmd.encode(message.rawWriteCmd, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n if (message.rawSubscribeCmd != null && Object.hasOwnProperty.call(message, \"rawSubscribeCmd\"))\r\n $root.Buttplug.DeviceMessage.RawSubscribeCmd.encode(message.rawSubscribeCmd, writer.uint32(/* id 7, wireType 2 =*/58).fork()).ldelim();\r\n if (message.rawUnsubscribeCmd != null && Object.hasOwnProperty.call(message, \"rawUnsubscribeCmd\"))\r\n $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.encode(message.rawUnsubscribeCmd, writer.uint32(/* id 8, wireType 2 =*/66).fork()).ldelim();\r\n if (message.batteryLevelCmd != null && Object.hasOwnProperty.call(message, \"batteryLevelCmd\"))\r\n $root.Buttplug.DeviceMessage.BatteryLevelCmd.encode(message.batteryLevelCmd, writer.uint32(/* id 9, wireType 2 =*/74).fork()).ldelim();\r\n if (message.rssiLevelCmd != null && Object.hasOwnProperty.call(message, \"rssiLevelCmd\"))\r\n $root.Buttplug.DeviceMessage.RSSILevelCmd.encode(message.rssiLevelCmd, writer.uint32(/* id 10, wireType 2 =*/82).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.DeviceMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.decode(reader, reader.uint32());\r\n break;\r\n case 7:\r\n message.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.decode(reader, reader.uint32());\r\n break;\r\n case 8:\r\n message.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.decode(reader, reader.uint32());\r\n break;\r\n case 9:\r\n message.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.decode(reader, reader.uint32());\r\n break;\r\n case 10:\r\n message.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n let properties = {};\r\n if (message.vibrateCmd != null && message.hasOwnProperty(\"vibrateCmd\")) {\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.VibrateCmd.verify(message.vibrateCmd);\r\n if (error)\r\n return \"vibrateCmd.\" + error;\r\n }\r\n }\r\n if (message.rotateCmd != null && message.hasOwnProperty(\"rotateCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RotateCmd.verify(message.rotateCmd);\r\n if (error)\r\n return \"rotateCmd.\" + error;\r\n }\r\n }\r\n if (message.linearCmd != null && message.hasOwnProperty(\"linearCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.LinearCmd.verify(message.linearCmd);\r\n if (error)\r\n return \"linearCmd.\" + error;\r\n }\r\n }\r\n if (message.stopDeviceCmd != null && message.hasOwnProperty(\"stopDeviceCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.StopDeviceCmd.verify(message.stopDeviceCmd);\r\n if (error)\r\n return \"stopDeviceCmd.\" + error;\r\n }\r\n }\r\n if (message.rawReadCmd != null && message.hasOwnProperty(\"rawReadCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RawReadCmd.verify(message.rawReadCmd);\r\n if (error)\r\n return \"rawReadCmd.\" + error;\r\n }\r\n }\r\n if (message.rawWriteCmd != null && message.hasOwnProperty(\"rawWriteCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RawWriteCmd.verify(message.rawWriteCmd);\r\n if (error)\r\n return \"rawWriteCmd.\" + error;\r\n }\r\n }\r\n if (message.rawSubscribeCmd != null && message.hasOwnProperty(\"rawSubscribeCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RawSubscribeCmd.verify(message.rawSubscribeCmd);\r\n if (error)\r\n return \"rawSubscribeCmd.\" + error;\r\n }\r\n }\r\n if (message.rawUnsubscribeCmd != null && message.hasOwnProperty(\"rawUnsubscribeCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.verify(message.rawUnsubscribeCmd);\r\n if (error)\r\n return \"rawUnsubscribeCmd.\" + error;\r\n }\r\n }\r\n if (message.batteryLevelCmd != null && message.hasOwnProperty(\"batteryLevelCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.BatteryLevelCmd.verify(message.batteryLevelCmd);\r\n if (error)\r\n return \"batteryLevelCmd.\" + error;\r\n }\r\n }\r\n if (message.rssiLevelCmd != null && message.hasOwnProperty(\"rssiLevelCmd\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceMessage.RSSILevelCmd.verify(message.rssiLevelCmd);\r\n if (error)\r\n return \"rssiLevelCmd.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceMessage.FFIMessage)\r\n return object;\r\n let message = new $root.Buttplug.DeviceMessage.FFIMessage();\r\n if (object.vibrateCmd != null) {\r\n if (typeof object.vibrateCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.vibrateCmd: object expected\");\r\n message.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.fromObject(object.vibrateCmd);\r\n }\r\n if (object.rotateCmd != null) {\r\n if (typeof object.rotateCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rotateCmd: object expected\");\r\n message.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.fromObject(object.rotateCmd);\r\n }\r\n if (object.linearCmd != null) {\r\n if (typeof object.linearCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.linearCmd: object expected\");\r\n message.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.fromObject(object.linearCmd);\r\n }\r\n if (object.stopDeviceCmd != null) {\r\n if (typeof object.stopDeviceCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.stopDeviceCmd: object expected\");\r\n message.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.fromObject(object.stopDeviceCmd);\r\n }\r\n if (object.rawReadCmd != null) {\r\n if (typeof object.rawReadCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawReadCmd: object expected\");\r\n message.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.fromObject(object.rawReadCmd);\r\n }\r\n if (object.rawWriteCmd != null) {\r\n if (typeof object.rawWriteCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawWriteCmd: object expected\");\r\n message.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.fromObject(object.rawWriteCmd);\r\n }\r\n if (object.rawSubscribeCmd != null) {\r\n if (typeof object.rawSubscribeCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawSubscribeCmd: object expected\");\r\n message.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.fromObject(object.rawSubscribeCmd);\r\n }\r\n if (object.rawUnsubscribeCmd != null) {\r\n if (typeof object.rawUnsubscribeCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rawUnsubscribeCmd: object expected\");\r\n message.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.fromObject(object.rawUnsubscribeCmd);\r\n }\r\n if (object.batteryLevelCmd != null) {\r\n if (typeof object.batteryLevelCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.batteryLevelCmd: object expected\");\r\n message.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.fromObject(object.batteryLevelCmd);\r\n }\r\n if (object.rssiLevelCmd != null) {\r\n if (typeof object.rssiLevelCmd !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceMessage.FFIMessage.rssiLevelCmd: object expected\");\r\n message.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.fromObject(object.rssiLevelCmd);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.DeviceMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (message.vibrateCmd != null && message.hasOwnProperty(\"vibrateCmd\")) {\r\n object.vibrateCmd = $root.Buttplug.DeviceMessage.VibrateCmd.toObject(message.vibrateCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"vibrateCmd\";\r\n }\r\n if (message.rotateCmd != null && message.hasOwnProperty(\"rotateCmd\")) {\r\n object.rotateCmd = $root.Buttplug.DeviceMessage.RotateCmd.toObject(message.rotateCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rotateCmd\";\r\n }\r\n if (message.linearCmd != null && message.hasOwnProperty(\"linearCmd\")) {\r\n object.linearCmd = $root.Buttplug.DeviceMessage.LinearCmd.toObject(message.linearCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"linearCmd\";\r\n }\r\n if (message.stopDeviceCmd != null && message.hasOwnProperty(\"stopDeviceCmd\")) {\r\n object.stopDeviceCmd = $root.Buttplug.DeviceMessage.StopDeviceCmd.toObject(message.stopDeviceCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"stopDeviceCmd\";\r\n }\r\n if (message.rawReadCmd != null && message.hasOwnProperty(\"rawReadCmd\")) {\r\n object.rawReadCmd = $root.Buttplug.DeviceMessage.RawReadCmd.toObject(message.rawReadCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawReadCmd\";\r\n }\r\n if (message.rawWriteCmd != null && message.hasOwnProperty(\"rawWriteCmd\")) {\r\n object.rawWriteCmd = $root.Buttplug.DeviceMessage.RawWriteCmd.toObject(message.rawWriteCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawWriteCmd\";\r\n }\r\n if (message.rawSubscribeCmd != null && message.hasOwnProperty(\"rawSubscribeCmd\")) {\r\n object.rawSubscribeCmd = $root.Buttplug.DeviceMessage.RawSubscribeCmd.toObject(message.rawSubscribeCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawSubscribeCmd\";\r\n }\r\n if (message.rawUnsubscribeCmd != null && message.hasOwnProperty(\"rawUnsubscribeCmd\")) {\r\n object.rawUnsubscribeCmd = $root.Buttplug.DeviceMessage.RawUnsubscribeCmd.toObject(message.rawUnsubscribeCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rawUnsubscribeCmd\";\r\n }\r\n if (message.batteryLevelCmd != null && message.hasOwnProperty(\"batteryLevelCmd\")) {\r\n object.batteryLevelCmd = $root.Buttplug.DeviceMessage.BatteryLevelCmd.toObject(message.batteryLevelCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"batteryLevelCmd\";\r\n }\r\n if (message.rssiLevelCmd != null && message.hasOwnProperty(\"rssiLevelCmd\")) {\r\n object.rssiLevelCmd = $root.Buttplug.DeviceMessage.RSSILevelCmd.toObject(message.rssiLevelCmd, options);\r\n if (options.oneofs)\r\n object.msg = \"rssiLevelCmd\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return DeviceMessage;\r\n })();\r\n\r\n Buttplug.ServerMessage = (function() {\r\n\r\n /**\r\n * Properties of a ServerMessage.\r\n * @memberof Buttplug\r\n * @interface IServerMessage\r\n * @property {Buttplug.ServerMessage.IOk|null} [ok] ServerMessage ok\r\n * @property {Buttplug.ServerMessage.IError|null} [error] ServerMessage error\r\n * @property {Buttplug.ServerMessage.IScanningFinished|null} [scanningFinished] ServerMessage scanningFinished\r\n * @property {Buttplug.ServerMessage.IDeviceAdded|null} [deviceAdded] ServerMessage deviceAdded\r\n * @property {Buttplug.ServerMessage.IDeviceRemoved|null} [deviceRemoved] ServerMessage deviceRemoved\r\n * @property {Buttplug.ServerMessage.IDisconnect|null} [disconnect] ServerMessage disconnect\r\n */\r\n\r\n /**\r\n * Constructs a new ServerMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ServerMessage.\r\n * @implements IServerMessage\r\n * @constructor\r\n * @param {Buttplug.IServerMessage=} [properties] Properties to set\r\n */\r\n function ServerMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ServerMessage ok.\r\n * @member {Buttplug.ServerMessage.IOk|null|undefined} ok\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.ok = null;\r\n\r\n /**\r\n * ServerMessage error.\r\n * @member {Buttplug.ServerMessage.IError|null|undefined} error\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.error = null;\r\n\r\n /**\r\n * ServerMessage scanningFinished.\r\n * @member {Buttplug.ServerMessage.IScanningFinished|null|undefined} scanningFinished\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.scanningFinished = null;\r\n\r\n /**\r\n * ServerMessage deviceAdded.\r\n * @member {Buttplug.ServerMessage.IDeviceAdded|null|undefined} deviceAdded\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.deviceAdded = null;\r\n\r\n /**\r\n * ServerMessage deviceRemoved.\r\n * @member {Buttplug.ServerMessage.IDeviceRemoved|null|undefined} deviceRemoved\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.deviceRemoved = null;\r\n\r\n /**\r\n * ServerMessage disconnect.\r\n * @member {Buttplug.ServerMessage.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n ServerMessage.prototype.disconnect = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n let $oneOfFields;\r\n\r\n /**\r\n * ServerMessage msg.\r\n * @member {\"ok\"|\"error\"|\"scanningFinished\"|\"deviceAdded\"|\"deviceRemoved\"|\"disconnect\"|undefined} msg\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n */\r\n Object.defineProperty(ServerMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"ok\", \"error\", \"scanningFinished\", \"deviceAdded\", \"deviceRemoved\", \"disconnect\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new ServerMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage} ServerMessage instance\r\n */\r\n ServerMessage.create = function create(properties) {\r\n return new ServerMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ServerMessage message. Does not implicitly {@link Buttplug.ServerMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage} message ServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ServerMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.ok != null && Object.hasOwnProperty.call(message, \"ok\"))\r\n $root.Buttplug.ServerMessage.Ok.encode(message.ok, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.error != null && Object.hasOwnProperty.call(message, \"error\"))\r\n $root.Buttplug.ServerMessage.Error.encode(message.error, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.scanningFinished != null && Object.hasOwnProperty.call(message, \"scanningFinished\"))\r\n $root.Buttplug.ServerMessage.ScanningFinished.encode(message.scanningFinished, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.deviceAdded != null && Object.hasOwnProperty.call(message, \"deviceAdded\"))\r\n $root.Buttplug.ServerMessage.DeviceAdded.encode(message.deviceAdded, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n if (message.deviceRemoved != null && Object.hasOwnProperty.call(message, \"deviceRemoved\"))\r\n $root.Buttplug.ServerMessage.DeviceRemoved.encode(message.deviceRemoved, writer.uint32(/* id 5, wireType 2 =*/42).fork()).ldelim();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.ServerMessage.Disconnect.encode(message.disconnect, writer.uint32(/* id 6, wireType 2 =*/50).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ServerMessage message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.IServerMessage} message ServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ServerMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ServerMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ServerMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.ok = $root.Buttplug.ServerMessage.Ok.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.error = $root.Buttplug.ServerMessage.Error.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.decode(reader, reader.uint32());\r\n break;\r\n case 5:\r\n message.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.decode(reader, reader.uint32());\r\n break;\r\n case 6:\r\n message.disconnect = $root.Buttplug.ServerMessage.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ServerMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ServerMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ServerMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ServerMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n let properties = {};\r\n if (message.ok != null && message.hasOwnProperty(\"ok\")) {\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.Ok.verify(message.ok);\r\n if (error)\r\n return \"ok.\" + error;\r\n }\r\n }\r\n if (message.error != null && message.hasOwnProperty(\"error\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.Error.verify(message.error);\r\n if (error)\r\n return \"error.\" + error;\r\n }\r\n }\r\n if (message.scanningFinished != null && message.hasOwnProperty(\"scanningFinished\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.ScanningFinished.verify(message.scanningFinished);\r\n if (error)\r\n return \"scanningFinished.\" + error;\r\n }\r\n }\r\n if (message.deviceAdded != null && message.hasOwnProperty(\"deviceAdded\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.DeviceAdded.verify(message.deviceAdded);\r\n if (error)\r\n return \"deviceAdded.\" + error;\r\n }\r\n }\r\n if (message.deviceRemoved != null && message.hasOwnProperty(\"deviceRemoved\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.DeviceRemoved.verify(message.deviceRemoved);\r\n if (error)\r\n return \"deviceRemoved.\" + error;\r\n }\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ServerMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage} ServerMessage\r\n */\r\n ServerMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage)\r\n return object;\r\n let message = new $root.Buttplug.ServerMessage();\r\n if (object.ok != null) {\r\n if (typeof object.ok !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.ok: object expected\");\r\n message.ok = $root.Buttplug.ServerMessage.Ok.fromObject(object.ok);\r\n }\r\n if (object.error != null) {\r\n if (typeof object.error !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.error: object expected\");\r\n message.error = $root.Buttplug.ServerMessage.Error.fromObject(object.error);\r\n }\r\n if (object.scanningFinished != null) {\r\n if (typeof object.scanningFinished !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.scanningFinished: object expected\");\r\n message.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.fromObject(object.scanningFinished);\r\n }\r\n if (object.deviceAdded != null) {\r\n if (typeof object.deviceAdded !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.deviceAdded: object expected\");\r\n message.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.fromObject(object.deviceAdded);\r\n }\r\n if (object.deviceRemoved != null) {\r\n if (typeof object.deviceRemoved !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.deviceRemoved: object expected\");\r\n message.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.fromObject(object.deviceRemoved);\r\n }\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.ServerMessage.Disconnect.fromObject(object.disconnect);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ServerMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage\r\n * @static\r\n * @param {Buttplug.ServerMessage} message ServerMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ServerMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (message.ok != null && message.hasOwnProperty(\"ok\")) {\r\n object.ok = $root.Buttplug.ServerMessage.Ok.toObject(message.ok, options);\r\n if (options.oneofs)\r\n object.msg = \"ok\";\r\n }\r\n if (message.error != null && message.hasOwnProperty(\"error\")) {\r\n object.error = $root.Buttplug.ServerMessage.Error.toObject(message.error, options);\r\n if (options.oneofs)\r\n object.msg = \"error\";\r\n }\r\n if (message.scanningFinished != null && message.hasOwnProperty(\"scanningFinished\")) {\r\n object.scanningFinished = $root.Buttplug.ServerMessage.ScanningFinished.toObject(message.scanningFinished, options);\r\n if (options.oneofs)\r\n object.msg = \"scanningFinished\";\r\n }\r\n if (message.deviceAdded != null && message.hasOwnProperty(\"deviceAdded\")) {\r\n object.deviceAdded = $root.Buttplug.ServerMessage.DeviceAdded.toObject(message.deviceAdded, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceAdded\";\r\n }\r\n if (message.deviceRemoved != null && message.hasOwnProperty(\"deviceRemoved\")) {\r\n object.deviceRemoved = $root.Buttplug.ServerMessage.DeviceRemoved.toObject(message.deviceRemoved, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceRemoved\";\r\n }\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.ServerMessage.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ServerMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ServerMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n /**\r\n * ButtplugErrorType enum.\r\n * @name Buttplug.ServerMessage.ButtplugErrorType\r\n * @enum {number}\r\n * @property {number} ButtplugConnectorError=0 ButtplugConnectorError value\r\n * @property {number} ButtplugHandshakeError=1 ButtplugHandshakeError value\r\n * @property {number} ButtplugDeviceError=2 ButtplugDeviceError value\r\n * @property {number} ButtplugPingError=3 ButtplugPingError value\r\n * @property {number} ButtplugMessageError=4 ButtplugMessageError value\r\n * @property {number} ButtplugUnknownError=5 ButtplugUnknownError value\r\n */\r\n ServerMessage.ButtplugErrorType = (function() {\r\n const valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"ButtplugConnectorError\"] = 0;\r\n values[valuesById[1] = \"ButtplugHandshakeError\"] = 1;\r\n values[valuesById[2] = \"ButtplugDeviceError\"] = 2;\r\n values[valuesById[3] = \"ButtplugPingError\"] = 3;\r\n values[valuesById[4] = \"ButtplugMessageError\"] = 4;\r\n values[valuesById[5] = \"ButtplugUnknownError\"] = 5;\r\n return values;\r\n })();\r\n\r\n /**\r\n * MessageAttributeType enum.\r\n * @name Buttplug.ServerMessage.MessageAttributeType\r\n * @enum {number}\r\n * @property {number} VibrateCmd=0 VibrateCmd value\r\n * @property {number} RotateCmd=1 RotateCmd value\r\n * @property {number} LinearCmd=2 LinearCmd value\r\n * @property {number} StopDeviceCmd=3 StopDeviceCmd value\r\n * @property {number} RawReadCmd=4 RawReadCmd value\r\n * @property {number} RawWriteCmd=5 RawWriteCmd value\r\n * @property {number} RawSubscribeCmd=6 RawSubscribeCmd value\r\n * @property {number} RawUnsubscribeCmd=7 RawUnsubscribeCmd value\r\n * @property {number} BatteryLevelCmd=8 BatteryLevelCmd value\r\n * @property {number} RSSILevelCmd=9 RSSILevelCmd value\r\n */\r\n ServerMessage.MessageAttributeType = (function() {\r\n const valuesById = {}, values = Object.create(valuesById);\r\n values[valuesById[0] = \"VibrateCmd\"] = 0;\r\n values[valuesById[1] = \"RotateCmd\"] = 1;\r\n values[valuesById[2] = \"LinearCmd\"] = 2;\r\n values[valuesById[3] = \"StopDeviceCmd\"] = 3;\r\n values[valuesById[4] = \"RawReadCmd\"] = 4;\r\n values[valuesById[5] = \"RawWriteCmd\"] = 5;\r\n values[valuesById[6] = \"RawSubscribeCmd\"] = 6;\r\n values[valuesById[7] = \"RawUnsubscribeCmd\"] = 7;\r\n values[valuesById[8] = \"BatteryLevelCmd\"] = 8;\r\n values[valuesById[9] = \"RSSILevelCmd\"] = 9;\r\n return values;\r\n })();\r\n\r\n ServerMessage.MessageAttributes = (function() {\r\n\r\n /**\r\n * Properties of a MessageAttributes.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IMessageAttributes\r\n * @property {Buttplug.ServerMessage.MessageAttributeType|null} [messageType] MessageAttributes messageType\r\n * @property {number|null} [featureCount] MessageAttributes featureCount\r\n * @property {Array.<number>|null} [stepCount] MessageAttributes stepCount\r\n * @property {Array.<Buttplug.Endpoint>|null} [endpoints] MessageAttributes endpoints\r\n * @property {Array.<number>|null} [maxDuration] MessageAttributes maxDuration\r\n */\r\n\r\n /**\r\n * Constructs a new MessageAttributes.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a MessageAttributes.\r\n * @implements IMessageAttributes\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IMessageAttributes=} [properties] Properties to set\r\n */\r\n function MessageAttributes(properties) {\r\n this.stepCount = [];\r\n this.endpoints = [];\r\n this.maxDuration = [];\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * MessageAttributes messageType.\r\n * @member {Buttplug.ServerMessage.MessageAttributeType} messageType\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.messageType = 0;\r\n\r\n /**\r\n * MessageAttributes featureCount.\r\n * @member {number} featureCount\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.featureCount = 0;\r\n\r\n /**\r\n * MessageAttributes stepCount.\r\n * @member {Array.<number>} stepCount\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.stepCount = $util.emptyArray;\r\n\r\n /**\r\n * MessageAttributes endpoints.\r\n * @member {Array.<Buttplug.Endpoint>} endpoints\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.endpoints = $util.emptyArray;\r\n\r\n /**\r\n * MessageAttributes maxDuration.\r\n * @member {Array.<number>} maxDuration\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n */\r\n MessageAttributes.prototype.maxDuration = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new MessageAttributes instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes instance\r\n */\r\n MessageAttributes.create = function create(properties) {\r\n return new MessageAttributes(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified MessageAttributes message. Does not implicitly {@link Buttplug.ServerMessage.MessageAttributes.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes} message MessageAttributes message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n MessageAttributes.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.messageType != null && Object.hasOwnProperty.call(message, \"messageType\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.messageType);\r\n if (message.featureCount != null && Object.hasOwnProperty.call(message, \"featureCount\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.featureCount);\r\n if (message.stepCount != null && message.stepCount.length) {\r\n writer.uint32(/* id 3, wireType 2 =*/26).fork();\r\n for (let i = 0; i < message.stepCount.length; ++i)\r\n writer.uint32(message.stepCount[i]);\r\n writer.ldelim();\r\n }\r\n if (message.endpoints != null && message.endpoints.length) {\r\n writer.uint32(/* id 4, wireType 2 =*/34).fork();\r\n for (let i = 0; i < message.endpoints.length; ++i)\r\n writer.int32(message.endpoints[i]);\r\n writer.ldelim();\r\n }\r\n if (message.maxDuration != null && message.maxDuration.length) {\r\n writer.uint32(/* id 5, wireType 2 =*/42).fork();\r\n for (let i = 0; i < message.maxDuration.length; ++i)\r\n writer.uint32(message.maxDuration[i]);\r\n writer.ldelim();\r\n }\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified MessageAttributes message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.MessageAttributes.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.IMessageAttributes} message MessageAttributes message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n MessageAttributes.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a MessageAttributes message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n MessageAttributes.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.MessageAttributes();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.messageType = reader.int32();\r\n break;\r\n case 2:\r\n message.featureCount = reader.uint32();\r\n break;\r\n case 3:\r\n if (!(message.stepCount && message.stepCount.length))\r\n message.stepCount = [];\r\n if ((tag & 7) === 2) {\r\n let end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.stepCount.push(reader.uint32());\r\n } else\r\n message.stepCount.push(reader.uint32());\r\n break;\r\n case 4:\r\n if (!(message.endpoints && message.endpoints.length))\r\n message.endpoints = [];\r\n if ((tag & 7) === 2) {\r\n let end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.endpoints.push(reader.int32());\r\n } else\r\n message.endpoints.push(reader.int32());\r\n break;\r\n case 5:\r\n if (!(message.maxDuration && message.maxDuration.length))\r\n message.maxDuration = [];\r\n if ((tag & 7) === 2) {\r\n let end2 = reader.uint32() + reader.pos;\r\n while (reader.pos < end2)\r\n message.maxDuration.push(reader.uint32());\r\n } else\r\n message.maxDuration.push(reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a MessageAttributes message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n MessageAttributes.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a MessageAttributes message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n MessageAttributes.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.messageType != null && message.hasOwnProperty(\"messageType\"))\r\n switch (message.messageType) {\r\n default:\r\n return \"messageType: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n break;\r\n }\r\n if (message.featureCount != null && message.hasOwnProperty(\"featureCount\"))\r\n if (!$util.isInteger(message.featureCount))\r\n return \"featureCount: integer expected\";\r\n if (message.stepCount != null && message.hasOwnProperty(\"stepCount\")) {\r\n if (!Array.isArray(message.stepCount))\r\n return \"stepCount: array expected\";\r\n for (let i = 0; i < message.stepCount.length; ++i)\r\n if (!$util.isInteger(message.stepCount[i]))\r\n return \"stepCount: integer[] expected\";\r\n }\r\n if (message.endpoints != null && message.hasOwnProperty(\"endpoints\")) {\r\n if (!Array.isArray(message.endpoints))\r\n return \"endpoints: array expected\";\r\n for (let i = 0; i < message.endpoints.length; ++i)\r\n switch (message.endpoints[i]) {\r\n default:\r\n return \"endpoints: enum value[] expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n }\r\n if (message.maxDuration != null && message.hasOwnProperty(\"maxDuration\")) {\r\n if (!Array.isArray(message.maxDuration))\r\n return \"maxDuration: array expected\";\r\n for (let i = 0; i < message.maxDuration.length; ++i)\r\n if (!$util.isInteger(message.maxDuration[i]))\r\n return \"maxDuration: integer[] expected\";\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a MessageAttributes message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.MessageAttributes} MessageAttributes\r\n */\r\n MessageAttributes.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.MessageAttributes)\r\n return object;\r\n let message = new $root.Buttplug.ServerMessage.MessageAttributes();\r\n switch (object.messageType) {\r\n case \"VibrateCmd\":\r\n case 0:\r\n message.messageType = 0;\r\n break;\r\n case \"RotateCmd\":\r\n case 1:\r\n message.messageType = 1;\r\n break;\r\n case \"LinearCmd\":\r\n case 2:\r\n message.messageType = 2;\r\n break;\r\n case \"StopDeviceCmd\":\r\n case 3:\r\n message.messageType = 3;\r\n break;\r\n case \"RawReadCmd\":\r\n case 4:\r\n message.messageType = 4;\r\n break;\r\n case \"RawWriteCmd\":\r\n case 5:\r\n message.messageType = 5;\r\n break;\r\n case \"RawSubscribeCmd\":\r\n case 6:\r\n message.messageType = 6;\r\n break;\r\n case \"RawUnsubscribeCmd\":\r\n case 7:\r\n message.messageType = 7;\r\n break;\r\n case \"BatteryLevelCmd\":\r\n case 8:\r\n message.messageType = 8;\r\n break;\r\n case \"RSSILevelCmd\":\r\n case 9:\r\n message.messageType = 9;\r\n break;\r\n }\r\n if (object.featureCount != null)\r\n message.featureCount = object.featureCount >>> 0;\r\n if (object.stepCount) {\r\n if (!Array.isArray(object.stepCount))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.stepCount: array expected\");\r\n message.stepCount = [];\r\n for (let i = 0; i < object.stepCount.length; ++i)\r\n message.stepCount[i] = object.stepCount[i] >>> 0;\r\n }\r\n if (object.endpoints) {\r\n if (!Array.isArray(object.endpoints))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.endpoints: array expected\");\r\n message.endpoints = [];\r\n for (let i = 0; i < object.endpoints.length; ++i)\r\n switch (object.endpoints[i]) {\r\n default:\r\n case \"Command\":\r\n case 0:\r\n message.endpoints[i] = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoints[i] = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoints[i] = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoints[i] = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoints[i] = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoints[i] = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoints[i] = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoints[i] = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoints[i] = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoints[i] = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoints[i] = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoints[i] = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoints[i] = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoints[i] = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoints[i] = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoints[i] = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoints[i] = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoints[i] = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoints[i] = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoints[i] = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoints[i] = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoints[i] = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoints[i] = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoints[i] = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoints[i] = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoints[i] = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoints[i] = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoints[i] = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoints[i] = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoints[i] = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoints[i] = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoints[i] = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoints[i] = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoints[i] = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoints[i] = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoints[i] = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoints[i] = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoints[i] = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoints[i] = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoints[i] = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoints[i] = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoints[i] = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoints[i] = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoints[i] = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoints[i] = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoints[i] = 45;\r\n break;\r\n }\r\n }\r\n if (object.maxDuration) {\r\n if (!Array.isArray(object.maxDuration))\r\n throw TypeError(\".Buttplug.ServerMessage.MessageAttributes.maxDuration: array expected\");\r\n message.maxDuration = [];\r\n for (let i = 0; i < object.maxDuration.length; ++i)\r\n message.maxDuration[i] = object.maxDuration[i] >>> 0;\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a MessageAttributes message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @static\r\n * @param {Buttplug.ServerMessage.MessageAttributes} message MessageAttributes\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n MessageAttributes.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.arrays || options.defaults) {\r\n object.stepCount = [];\r\n object.endpoints = [];\r\n object.maxDuration = [];\r\n }\r\n if (options.defaults) {\r\n object.messageType = options.enums === String ? \"VibrateCmd\" : 0;\r\n object.featureCount = 0;\r\n }\r\n if (message.messageType != null && message.hasOwnProperty(\"messageType\"))\r\n object.messageType = options.enums === String ? $root.Buttplug.ServerMessage.MessageAttributeType[message.messageType] : message.messageType;\r\n if (message.featureCount != null && message.hasOwnProperty(\"featureCount\"))\r\n object.featureCount = message.featureCount;\r\n if (message.stepCount && message.stepCount.length) {\r\n object.stepCount = [];\r\n for (let j = 0; j < message.stepCount.length; ++j)\r\n object.stepCount[j] = message.stepCount[j];\r\n }\r\n if (message.endpoints && message.endpoints.length) {\r\n object.endpoints = [];\r\n for (let j = 0; j < message.endpoints.length; ++j)\r\n object.endpoints[j] = options.enums === String ? $root.Buttplug.Endpoint[message.endpoints[j]] : message.endpoints[j];\r\n }\r\n if (message.maxDuration && message.maxDuration.length) {\r\n object.maxDuration = [];\r\n for (let j = 0; j < message.maxDuration.length; ++j)\r\n object.maxDuration[j] = message.maxDuration[j];\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this MessageAttributes to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.MessageAttributes\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n MessageAttributes.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return MessageAttributes;\r\n })();\r\n\r\n ServerMessage.Ok = (function() {\r\n\r\n /**\r\n * Properties of an Ok.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IOk\r\n */\r\n\r\n /**\r\n * Constructs a new Ok.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents an Ok.\r\n * @implements IOk\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IOk=} [properties] Properties to set\r\n */\r\n function Ok(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Ok instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Ok} Ok instance\r\n */\r\n Ok.create = function create(properties) {\r\n return new Ok(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Ok message. Does not implicitly {@link Buttplug.ServerMessage.Ok.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk} message Ok message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ok.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Ok message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Ok.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.IOk} message Ok message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Ok.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes an Ok message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ok.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Ok();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes an Ok message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Ok.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies an Ok message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Ok.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates an Ok message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Ok} Ok\r\n */\r\n Ok.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Ok)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.Ok();\r\n };\r\n\r\n /**\r\n * Creates a plain object from an Ok message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @static\r\n * @param {Buttplug.ServerMessage.Ok} message Ok\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Ok.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Ok to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Ok\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Ok.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Ok;\r\n })();\r\n\r\n ServerMessage.Error = (function() {\r\n\r\n /**\r\n * Properties of an Error.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IError\r\n * @property {Buttplug.ServerMessage.ButtplugErrorType|null} [errorType] Error errorType\r\n * @property {string|null} [message] Error message\r\n * @property {string|null} [backtrace] Error backtrace\r\n */\r\n\r\n /**\r\n * Constructs a new Error.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents an Error.\r\n * @implements IError\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IError=} [properties] Properties to set\r\n */\r\n function Error(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Error errorType.\r\n * @member {Buttplug.ServerMessage.ButtplugErrorType} errorType\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.errorType = 0;\r\n\r\n /**\r\n * Error message.\r\n * @member {string} message\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.message = \"\";\r\n\r\n /**\r\n * Error backtrace.\r\n * @member {string} backtrace\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n */\r\n Error.prototype.backtrace = \"\";\r\n\r\n /**\r\n * Creates a new Error instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Error} Error instance\r\n */\r\n Error.create = function create(properties) {\r\n return new Error(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Error message. Does not implicitly {@link Buttplug.ServerMessage.Error.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError} message Error message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Error.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.errorType != null && Object.hasOwnProperty.call(message, \"errorType\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).int32(message.errorType);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.message);\r\n if (message.backtrace != null && Object.hasOwnProperty.call(message, \"backtrace\"))\r\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.backtrace);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Error message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Error.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.IError} message Error message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Error.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes an Error message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Error.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Error();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.errorType = reader.int32();\r\n break;\r\n case 2:\r\n message.message = reader.string();\r\n break;\r\n case 3:\r\n message.backtrace = reader.string();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes an Error message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Error.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies an Error message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Error.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.errorType != null && message.hasOwnProperty(\"errorType\"))\r\n switch (message.errorType) {\r\n default:\r\n return \"errorType: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n break;\r\n }\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n if (!$util.isString(message.message))\r\n return \"message: string expected\";\r\n if (message.backtrace != null && message.hasOwnProperty(\"backtrace\"))\r\n if (!$util.isString(message.backtrace))\r\n return \"backtrace: string expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates an Error message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Error} Error\r\n */\r\n Error.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Error)\r\n return object;\r\n let message = new $root.Buttplug.ServerMessage.Error();\r\n switch (object.errorType) {\r\n case \"ButtplugConnectorError\":\r\n case 0:\r\n message.errorType = 0;\r\n break;\r\n case \"ButtplugHandshakeError\":\r\n case 1:\r\n message.errorType = 1;\r\n break;\r\n case \"ButtplugDeviceError\":\r\n case 2:\r\n message.errorType = 2;\r\n break;\r\n case \"ButtplugPingError\":\r\n case 3:\r\n message.errorType = 3;\r\n break;\r\n case \"ButtplugMessageError\":\r\n case 4:\r\n message.errorType = 4;\r\n break;\r\n case \"ButtplugUnknownError\":\r\n case 5:\r\n message.errorType = 5;\r\n break;\r\n }\r\n if (object.message != null)\r\n message.message = String(object.message);\r\n if (object.backtrace != null)\r\n message.backtrace = String(object.backtrace);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from an Error message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @static\r\n * @param {Buttplug.ServerMessage.Error} message Error\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Error.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.errorType = options.enums === String ? \"ButtplugConnectorError\" : 0;\r\n object.message = \"\";\r\n object.backtrace = \"\";\r\n }\r\n if (message.errorType != null && message.hasOwnProperty(\"errorType\"))\r\n object.errorType = options.enums === String ? $root.Buttplug.ServerMessage.ButtplugErrorType[message.errorType] : message.errorType;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = message.message;\r\n if (message.backtrace != null && message.hasOwnProperty(\"backtrace\"))\r\n object.backtrace = message.backtrace;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this Error to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Error\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Error.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Error;\r\n })();\r\n\r\n ServerMessage.ScanningFinished = (function() {\r\n\r\n /**\r\n * Properties of a ScanningFinished.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IScanningFinished\r\n */\r\n\r\n /**\r\n * Constructs a new ScanningFinished.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a ScanningFinished.\r\n * @implements IScanningFinished\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IScanningFinished=} [properties] Properties to set\r\n */\r\n function ScanningFinished(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new ScanningFinished instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished instance\r\n */\r\n ScanningFinished.create = function create(properties) {\r\n return new ScanningFinished(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ScanningFinished message. Does not implicitly {@link Buttplug.ServerMessage.ScanningFinished.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished} message ScanningFinished message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ScanningFinished.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ScanningFinished message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.ScanningFinished.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.IScanningFinished} message ScanningFinished message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ScanningFinished.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ScanningFinished message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ScanningFinished.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.ScanningFinished();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ScanningFinished message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ScanningFinished.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ScanningFinished message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ScanningFinished.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ScanningFinished message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.ScanningFinished} ScanningFinished\r\n */\r\n ScanningFinished.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.ScanningFinished)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.ScanningFinished();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ScanningFinished message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @static\r\n * @param {Buttplug.ServerMessage.ScanningFinished} message ScanningFinished\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ScanningFinished.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this ScanningFinished to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.ScanningFinished\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ScanningFinished.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return ScanningFinished;\r\n })();\r\n\r\n ServerMessage.DeviceAdded = (function() {\r\n\r\n /**\r\n * Properties of a DeviceAdded.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDeviceAdded\r\n * @property {string|null} [name] DeviceAdded name\r\n * @property {number|null} [index] DeviceAdded index\r\n * @property {Array.<Buttplug.ServerMessage.IMessageAttributes>|null} [messageAttributes] DeviceAdded messageAttributes\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceAdded.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a DeviceAdded.\r\n * @implements IDeviceAdded\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDeviceAdded=} [properties] Properties to set\r\n */\r\n function DeviceAdded(properties) {\r\n this.messageAttributes = [];\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceAdded name.\r\n * @member {string} name\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.name = \"\";\r\n\r\n /**\r\n * DeviceAdded index.\r\n * @member {number} index\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.index = 0;\r\n\r\n /**\r\n * DeviceAdded messageAttributes.\r\n * @member {Array.<Buttplug.ServerMessage.IMessageAttributes>} messageAttributes\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n */\r\n DeviceAdded.prototype.messageAttributes = $util.emptyArray;\r\n\r\n /**\r\n * Creates a new DeviceAdded instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded instance\r\n */\r\n DeviceAdded.create = function create(properties) {\r\n return new DeviceAdded(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceAdded message. Does not implicitly {@link Buttplug.ServerMessage.DeviceAdded.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded} message DeviceAdded message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceAdded.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.name != null && Object.hasOwnProperty.call(message, \"name\"))\r\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.name);\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.index);\r\n if (message.messageAttributes != null && message.messageAttributes.length)\r\n for (let i = 0; i < message.messageAttributes.length; ++i)\r\n $root.Buttplug.ServerMessage.MessageAttributes.encode(message.messageAttributes[i], writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceAdded message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.DeviceAdded.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceAdded} message DeviceAdded message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceAdded.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceAdded message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceAdded.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.DeviceAdded();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.name = reader.string();\r\n break;\r\n case 2:\r\n message.index = reader.uint32();\r\n break;\r\n case 3:\r\n if (!(message.messageAttributes && message.messageAttributes.length))\r\n message.messageAttributes = [];\r\n message.messageAttributes.push($root.Buttplug.ServerMessage.MessageAttributes.decode(reader, reader.uint32()));\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceAdded message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceAdded.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceAdded message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceAdded.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.name != null && message.hasOwnProperty(\"name\"))\r\n if (!$util.isString(message.name))\r\n return \"name: string expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.messageAttributes != null && message.hasOwnProperty(\"messageAttributes\")) {\r\n if (!Array.isArray(message.messageAttributes))\r\n return \"messageAttributes: array expected\";\r\n for (let i = 0; i < message.messageAttributes.length; ++i) {\r\n let error = $root.Buttplug.ServerMessage.MessageAttributes.verify(message.messageAttributes[i]);\r\n if (error)\r\n return \"messageAttributes.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceAdded message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.DeviceAdded} DeviceAdded\r\n */\r\n DeviceAdded.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.DeviceAdded)\r\n return object;\r\n let message = new $root.Buttplug.ServerMessage.DeviceAdded();\r\n if (object.name != null)\r\n message.name = String(object.name);\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.messageAttributes) {\r\n if (!Array.isArray(object.messageAttributes))\r\n throw TypeError(\".Buttplug.ServerMessage.DeviceAdded.messageAttributes: array expected\");\r\n message.messageAttributes = [];\r\n for (let i = 0; i < object.messageAttributes.length; ++i) {\r\n if (typeof object.messageAttributes[i] !== \"object\")\r\n throw TypeError(\".Buttplug.ServerMessage.DeviceAdded.messageAttributes: object expected\");\r\n message.messageAttributes[i] = $root.Buttplug.ServerMessage.MessageAttributes.fromObject(object.messageAttributes[i]);\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceAdded message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @static\r\n * @param {Buttplug.ServerMessage.DeviceAdded} message DeviceAdded\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceAdded.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.arrays || options.defaults)\r\n object.messageAttributes = [];\r\n if (options.defaults) {\r\n object.name = \"\";\r\n object.index = 0;\r\n }\r\n if (message.name != null && message.hasOwnProperty(\"name\"))\r\n object.name = message.name;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.messageAttributes && message.messageAttributes.length) {\r\n object.messageAttributes = [];\r\n for (let j = 0; j < message.messageAttributes.length; ++j)\r\n object.messageAttributes[j] = $root.Buttplug.ServerMessage.MessageAttributes.toObject(message.messageAttributes[j], options);\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceAdded to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.DeviceAdded\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceAdded.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return DeviceAdded;\r\n })();\r\n\r\n ServerMessage.DeviceRemoved = (function() {\r\n\r\n /**\r\n * Properties of a DeviceRemoved.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDeviceRemoved\r\n * @property {number|null} [index] DeviceRemoved index\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceRemoved.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a DeviceRemoved.\r\n * @implements IDeviceRemoved\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved=} [properties] Properties to set\r\n */\r\n function DeviceRemoved(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceRemoved index.\r\n * @member {number} index\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @instance\r\n */\r\n DeviceRemoved.prototype.index = 0;\r\n\r\n /**\r\n * Creates a new DeviceRemoved instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved instance\r\n */\r\n DeviceRemoved.create = function create(properties) {\r\n return new DeviceRemoved(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceRemoved message. Does not implicitly {@link Buttplug.ServerMessage.DeviceRemoved.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved} message DeviceRemoved message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceRemoved.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceRemoved message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.DeviceRemoved.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDeviceRemoved} message DeviceRemoved message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceRemoved.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceRemoved message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceRemoved.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.DeviceRemoved();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceRemoved message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceRemoved.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceRemoved message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceRemoved.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceRemoved message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.DeviceRemoved} DeviceRemoved\r\n */\r\n DeviceRemoved.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.DeviceRemoved)\r\n return object;\r\n let message = new $root.Buttplug.ServerMessage.DeviceRemoved();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceRemoved message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @static\r\n * @param {Buttplug.ServerMessage.DeviceRemoved} message DeviceRemoved\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceRemoved.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults)\r\n object.index = 0;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceRemoved to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.DeviceRemoved\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceRemoved.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return DeviceRemoved;\r\n })();\r\n\r\n ServerMessage.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.ServerMessage\r\n * @interface IDisconnect\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.ServerMessage\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.ServerMessage.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.ServerMessage.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.ServerMessage.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ServerMessage.Disconnect();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ServerMessage.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ServerMessage.Disconnect)\r\n return object;\r\n return new $root.Buttplug.ServerMessage.Disconnect();\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @static\r\n * @param {Buttplug.ServerMessage.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject() {\r\n return {};\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ServerMessage.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n return ServerMessage;\r\n })();\r\n\r\n Buttplug.DeviceEvent = (function() {\r\n\r\n /**\r\n * Properties of a DeviceEvent.\r\n * @memberof Buttplug\r\n * @interface IDeviceEvent\r\n * @property {Buttplug.DeviceEvent.IDisconnect|null} [disconnect] DeviceEvent disconnect\r\n * @property {Buttplug.DeviceEvent.IBatteryLevelReading|null} [batteryLevelReading] DeviceEvent batteryLevelReading\r\n * @property {Buttplug.DeviceEvent.IRSSILevelReading|null} [rssiLevelReading] DeviceEvent rssiLevelReading\r\n * @property {Buttplug.DeviceEvent.IRawReading|null} [rawReading] DeviceEvent rawReading\r\n */\r\n\r\n /**\r\n * Constructs a new DeviceEvent.\r\n * @memberof Buttplug\r\n * @classdesc Represents a DeviceEvent.\r\n * @implements IDeviceEvent\r\n * @constructor\r\n * @param {Buttplug.IDeviceEvent=} [properties] Properties to set\r\n */\r\n function DeviceEvent(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * DeviceEvent disconnect.\r\n * @member {Buttplug.DeviceEvent.IDisconnect|null|undefined} disconnect\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.disconnect = null;\r\n\r\n /**\r\n * DeviceEvent batteryLevelReading.\r\n * @member {Buttplug.DeviceEvent.IBatteryLevelReading|null|undefined} batteryLevelReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.batteryLevelReading = null;\r\n\r\n /**\r\n * DeviceEvent rssiLevelReading.\r\n * @member {Buttplug.DeviceEvent.IRSSILevelReading|null|undefined} rssiLevelReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.rssiLevelReading = null;\r\n\r\n /**\r\n * DeviceEvent rawReading.\r\n * @member {Buttplug.DeviceEvent.IRawReading|null|undefined} rawReading\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n DeviceEvent.prototype.rawReading = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n let $oneOfFields;\r\n\r\n /**\r\n * DeviceEvent msg.\r\n * @member {\"disconnect\"|\"batteryLevelReading\"|\"rssiLevelReading\"|\"rawReading\"|undefined} msg\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n */\r\n Object.defineProperty(DeviceEvent.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"disconnect\", \"batteryLevelReading\", \"rssiLevelReading\", \"rawReading\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new DeviceEvent instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent instance\r\n */\r\n DeviceEvent.create = function create(properties) {\r\n return new DeviceEvent(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceEvent message. Does not implicitly {@link Buttplug.DeviceEvent.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent} message DeviceEvent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceEvent.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.disconnect != null && Object.hasOwnProperty.call(message, \"disconnect\"))\r\n $root.Buttplug.DeviceEvent.Disconnect.encode(message.disconnect, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.batteryLevelReading != null && Object.hasOwnProperty.call(message, \"batteryLevelReading\"))\r\n $root.Buttplug.DeviceEvent.BatteryLevelReading.encode(message.batteryLevelReading, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n if (message.rssiLevelReading != null && Object.hasOwnProperty.call(message, \"rssiLevelReading\"))\r\n $root.Buttplug.DeviceEvent.RSSILevelReading.encode(message.rssiLevelReading, writer.uint32(/* id 3, wireType 2 =*/26).fork()).ldelim();\r\n if (message.rawReading != null && Object.hasOwnProperty.call(message, \"rawReading\"))\r\n $root.Buttplug.DeviceEvent.RawReading.encode(message.rawReading, writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified DeviceEvent message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.IDeviceEvent} message DeviceEvent message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n DeviceEvent.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a DeviceEvent message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceEvent.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.disconnect = $root.Buttplug.DeviceEvent.Disconnect.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.decode(reader, reader.uint32());\r\n break;\r\n case 3:\r\n message.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.decode(reader, reader.uint32());\r\n break;\r\n case 4:\r\n message.rawReading = $root.Buttplug.DeviceEvent.RawReading.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a DeviceEvent message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n DeviceEvent.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a DeviceEvent message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n DeviceEvent.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n let properties = {};\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceEvent.Disconnect.verify(message.disconnect);\r\n if (error)\r\n return \"disconnect.\" + error;\r\n }\r\n }\r\n if (message.batteryLevelReading != null && message.hasOwnProperty(\"batteryLevelReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceEvent.BatteryLevelReading.verify(message.batteryLevelReading);\r\n if (error)\r\n return \"batteryLevelReading.\" + error;\r\n }\r\n }\r\n if (message.rssiLevelReading != null && message.hasOwnProperty(\"rssiLevelReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceEvent.RSSILevelReading.verify(message.rssiLevelReading);\r\n if (error)\r\n return \"rssiLevelReading.\" + error;\r\n }\r\n }\r\n if (message.rawReading != null && message.hasOwnProperty(\"rawReading\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceEvent.RawReading.verify(message.rawReading);\r\n if (error)\r\n return \"rawReading.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a DeviceEvent message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent} DeviceEvent\r\n */\r\n DeviceEvent.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent)\r\n return object;\r\n let message = new $root.Buttplug.DeviceEvent();\r\n if (object.disconnect != null) {\r\n if (typeof object.disconnect !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.disconnect: object expected\");\r\n message.disconnect = $root.Buttplug.DeviceEvent.Disconnect.fromObject(object.disconnect);\r\n }\r\n if (object.batteryLevelReading != null) {\r\n if (typeof object.batteryLevelReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.batteryLevelReading: object expected\");\r\n message.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.fromObject(object.batteryLevelReading);\r\n }\r\n if (object.rssiLevelReading != null) {\r\n if (typeof object.rssiLevelReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.rssiLevelReading: object expected\");\r\n message.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.fromObject(object.rssiLevelReading);\r\n }\r\n if (object.rawReading != null) {\r\n if (typeof object.rawReading !== \"object\")\r\n throw TypeError(\".Buttplug.DeviceEvent.rawReading: object expected\");\r\n message.rawReading = $root.Buttplug.DeviceEvent.RawReading.fromObject(object.rawReading);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a DeviceEvent message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent\r\n * @static\r\n * @param {Buttplug.DeviceEvent} message DeviceEvent\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n DeviceEvent.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (message.disconnect != null && message.hasOwnProperty(\"disconnect\")) {\r\n object.disconnect = $root.Buttplug.DeviceEvent.Disconnect.toObject(message.disconnect, options);\r\n if (options.oneofs)\r\n object.msg = \"disconnect\";\r\n }\r\n if (message.batteryLevelReading != null && message.hasOwnProperty(\"batteryLevelReading\")) {\r\n object.batteryLevelReading = $root.Buttplug.DeviceEvent.BatteryLevelReading.toObject(message.batteryLevelReading, options);\r\n if (options.oneofs)\r\n object.msg = \"batteryLevelReading\";\r\n }\r\n if (message.rssiLevelReading != null && message.hasOwnProperty(\"rssiLevelReading\")) {\r\n object.rssiLevelReading = $root.Buttplug.DeviceEvent.RSSILevelReading.toObject(message.rssiLevelReading, options);\r\n if (options.oneofs)\r\n object.msg = \"rssiLevelReading\";\r\n }\r\n if (message.rawReading != null && message.hasOwnProperty(\"rawReading\")) {\r\n object.rawReading = $root.Buttplug.DeviceEvent.RawReading.toObject(message.rawReading, options);\r\n if (options.oneofs)\r\n object.msg = \"rawReading\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this DeviceEvent to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n DeviceEvent.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n DeviceEvent.Disconnect = (function() {\r\n\r\n /**\r\n * Properties of a Disconnect.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IDisconnect\r\n * @property {number|null} [index] Disconnect index\r\n */\r\n\r\n /**\r\n * Constructs a new Disconnect.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a Disconnect.\r\n * @implements IDisconnect\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IDisconnect=} [properties] Properties to set\r\n */\r\n function Disconnect(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * Disconnect index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @instance\r\n */\r\n Disconnect.prototype.index = 0;\r\n\r\n /**\r\n * Creates a new Disconnect instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect instance\r\n */\r\n Disconnect.create = function create(properties) {\r\n return new Disconnect(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message. Does not implicitly {@link Buttplug.DeviceEvent.Disconnect.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified Disconnect message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.Disconnect.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IDisconnect} message Disconnect message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n Disconnect.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.Disconnect();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a Disconnect message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n Disconnect.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a Disconnect message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n Disconnect.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a Disconnect message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.Disconnect} Disconnect\r\n */\r\n Disconnect.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.Disconnect)\r\n return object;\r\n let message = new $root.Buttplug.DeviceEvent.Disconnect();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a Disconnect message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @static\r\n * @param {Buttplug.DeviceEvent.Disconnect} message Disconnect\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n Disconnect.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults)\r\n object.index = 0;\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this Disconnect to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.Disconnect\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n Disconnect.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return Disconnect;\r\n })();\r\n\r\n DeviceEvent.RawReading = (function() {\r\n\r\n /**\r\n * Properties of a RawReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IRawReading\r\n * @property {number|null} [index] RawReading index\r\n * @property {Buttplug.Endpoint|null} [endpoint] RawReading endpoint\r\n * @property {Uint8Array|null} [data] RawReading data\r\n */\r\n\r\n /**\r\n * Constructs a new RawReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a RawReading.\r\n * @implements IRawReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IRawReading=} [properties] Properties to set\r\n */\r\n function RawReading(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RawReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.index = 0;\r\n\r\n /**\r\n * RawReading endpoint.\r\n * @member {Buttplug.Endpoint} endpoint\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.endpoint = 0;\r\n\r\n /**\r\n * RawReading data.\r\n * @member {Uint8Array} data\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n */\r\n RawReading.prototype.data = $util.newBuffer([]);\r\n\r\n /**\r\n * Creates a new RawReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading instance\r\n */\r\n RawReading.create = function create(properties) {\r\n return new RawReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReading message. Does not implicitly {@link Buttplug.DeviceEvent.RawReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading} message RawReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.endpoint != null && Object.hasOwnProperty.call(message, \"endpoint\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.endpoint);\r\n if (message.data != null && Object.hasOwnProperty.call(message, \"data\"))\r\n writer.uint32(/* id 3, wireType 2 =*/26).bytes(message.data);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RawReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.RawReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRawReading} message RawReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RawReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RawReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.RawReading();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.endpoint = reader.int32();\r\n break;\r\n case 3:\r\n message.data = reader.bytes();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RawReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RawReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RawReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RawReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n switch (message.endpoint) {\r\n default:\r\n return \"endpoint: enum value expected\";\r\n case 0:\r\n case 1:\r\n case 2:\r\n case 3:\r\n case 4:\r\n case 5:\r\n case 6:\r\n case 7:\r\n case 8:\r\n case 9:\r\n case 10:\r\n case 11:\r\n case 12:\r\n case 13:\r\n case 14:\r\n case 15:\r\n case 16:\r\n case 17:\r\n case 18:\r\n case 19:\r\n case 20:\r\n case 21:\r\n case 22:\r\n case 23:\r\n case 24:\r\n case 25:\r\n case 26:\r\n case 27:\r\n case 28:\r\n case 29:\r\n case 30:\r\n case 31:\r\n case 32:\r\n case 33:\r\n case 34:\r\n case 35:\r\n case 36:\r\n case 37:\r\n case 38:\r\n case 39:\r\n case 40:\r\n case 41:\r\n case 42:\r\n case 43:\r\n case 44:\r\n case 45:\r\n break;\r\n }\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n if (!(message.data && typeof message.data.length === \"number\" || $util.isString(message.data)))\r\n return \"data: buffer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RawReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.RawReading} RawReading\r\n */\r\n RawReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.RawReading)\r\n return object;\r\n let message = new $root.Buttplug.DeviceEvent.RawReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n switch (object.endpoint) {\r\n case \"Command\":\r\n case 0:\r\n message.endpoint = 0;\r\n break;\r\n case \"Firmware\":\r\n case 1:\r\n message.endpoint = 1;\r\n break;\r\n case \"Rx\":\r\n case 2:\r\n message.endpoint = 2;\r\n break;\r\n case \"RxAccel\":\r\n case 3:\r\n message.endpoint = 3;\r\n break;\r\n case \"RxBLEBattery\":\r\n case 4:\r\n message.endpoint = 4;\r\n break;\r\n case \"RxPressure\":\r\n case 5:\r\n message.endpoint = 5;\r\n break;\r\n case \"RxTouch\":\r\n case 6:\r\n message.endpoint = 6;\r\n break;\r\n case \"Tx\":\r\n case 7:\r\n message.endpoint = 7;\r\n break;\r\n case \"TxMode\":\r\n case 8:\r\n message.endpoint = 8;\r\n break;\r\n case \"TxShock\":\r\n case 9:\r\n message.endpoint = 9;\r\n break;\r\n case \"TxVibrate\":\r\n case 10:\r\n message.endpoint = 10;\r\n break;\r\n case \"TxVendorControl\":\r\n case 11:\r\n message.endpoint = 11;\r\n break;\r\n case \"Whitelist\":\r\n case 12:\r\n message.endpoint = 12;\r\n break;\r\n case \"Generic0\":\r\n case 13:\r\n message.endpoint = 13;\r\n break;\r\n case \"Generic1\":\r\n case 14:\r\n message.endpoint = 14;\r\n break;\r\n case \"Generic2\":\r\n case 15:\r\n message.endpoint = 15;\r\n break;\r\n case \"Generic3\":\r\n case 16:\r\n message.endpoint = 16;\r\n break;\r\n case \"Generic4\":\r\n case 17:\r\n message.endpoint = 17;\r\n break;\r\n case \"Generic5\":\r\n case 18:\r\n message.endpoint = 18;\r\n break;\r\n case \"Generic6\":\r\n case 19:\r\n message.endpoint = 19;\r\n break;\r\n case \"Generic7\":\r\n case 20:\r\n message.endpoint = 20;\r\n break;\r\n case \"Generic8\":\r\n case 21:\r\n message.endpoint = 21;\r\n break;\r\n case \"Generic9\":\r\n case 22:\r\n message.endpoint = 22;\r\n break;\r\n case \"Generic10\":\r\n case 23:\r\n message.endpoint = 23;\r\n break;\r\n case \"Generic11\":\r\n case 24:\r\n message.endpoint = 24;\r\n break;\r\n case \"Generic12\":\r\n case 25:\r\n message.endpoint = 25;\r\n break;\r\n case \"Generic13\":\r\n case 26:\r\n message.endpoint = 26;\r\n break;\r\n case \"Generic14\":\r\n case 27:\r\n message.endpoint = 27;\r\n break;\r\n case \"Generic15\":\r\n case 28:\r\n message.endpoint = 28;\r\n break;\r\n case \"Generic16\":\r\n case 29:\r\n message.endpoint = 29;\r\n break;\r\n case \"Generic17\":\r\n case 30:\r\n message.endpoint = 30;\r\n break;\r\n case \"Generic18\":\r\n case 31:\r\n message.endpoint = 31;\r\n break;\r\n case \"Generic19\":\r\n case 32:\r\n message.endpoint = 32;\r\n break;\r\n case \"Generic20\":\r\n case 33:\r\n message.endpoint = 33;\r\n break;\r\n case \"Generic21\":\r\n case 34:\r\n message.endpoint = 34;\r\n break;\r\n case \"Generic22\":\r\n case 35:\r\n message.endpoint = 35;\r\n break;\r\n case \"Generic23\":\r\n case 36:\r\n message.endpoint = 36;\r\n break;\r\n case \"Generic24\":\r\n case 37:\r\n message.endpoint = 37;\r\n break;\r\n case \"Generic25\":\r\n case 38:\r\n message.endpoint = 38;\r\n break;\r\n case \"Generic26\":\r\n case 39:\r\n message.endpoint = 39;\r\n break;\r\n case \"Generic27\":\r\n case 40:\r\n message.endpoint = 40;\r\n break;\r\n case \"Generic28\":\r\n case 41:\r\n message.endpoint = 41;\r\n break;\r\n case \"Generic29\":\r\n case 42:\r\n message.endpoint = 42;\r\n break;\r\n case \"Generic30\":\r\n case 43:\r\n message.endpoint = 43;\r\n break;\r\n case \"Generic31\":\r\n case 44:\r\n message.endpoint = 44;\r\n break;\r\n case \"RxBLEModel\":\r\n case 45:\r\n message.endpoint = 45;\r\n break;\r\n }\r\n if (object.data != null)\r\n if (typeof object.data === \"string\")\r\n $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);\r\n else if (object.data.length)\r\n message.data = object.data;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RawReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.RawReading} message RawReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RawReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.endpoint = options.enums === String ? \"Command\" : 0;\r\n if (options.bytes === String)\r\n object.data = \"\";\r\n else {\r\n object.data = [];\r\n if (options.bytes !== Array)\r\n object.data = $util.newBuffer(object.data);\r\n }\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.endpoint != null && message.hasOwnProperty(\"endpoint\"))\r\n object.endpoint = options.enums === String ? $root.Buttplug.Endpoint[message.endpoint] : message.endpoint;\r\n if (message.data != null && message.hasOwnProperty(\"data\"))\r\n object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RawReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.RawReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RawReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RawReading;\r\n })();\r\n\r\n DeviceEvent.BatteryLevelReading = (function() {\r\n\r\n /**\r\n * Properties of a BatteryLevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IBatteryLevelReading\r\n * @property {number|null} [index] BatteryLevelReading index\r\n * @property {number|null} [reading] BatteryLevelReading reading\r\n */\r\n\r\n /**\r\n * Constructs a new BatteryLevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a BatteryLevelReading.\r\n * @implements IBatteryLevelReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading=} [properties] Properties to set\r\n */\r\n function BatteryLevelReading(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * BatteryLevelReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n */\r\n BatteryLevelReading.prototype.index = 0;\r\n\r\n /**\r\n * BatteryLevelReading reading.\r\n * @member {number} reading\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n */\r\n BatteryLevelReading.prototype.reading = 0;\r\n\r\n /**\r\n * Creates a new BatteryLevelReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading instance\r\n */\r\n BatteryLevelReading.create = function create(properties) {\r\n return new BatteryLevelReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelReading message. Does not implicitly {@link Buttplug.DeviceEvent.BatteryLevelReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading} message BatteryLevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.reading != null && Object.hasOwnProperty.call(message, \"reading\"))\r\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.reading);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified BatteryLevelReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.BatteryLevelReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IBatteryLevelReading} message BatteryLevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n BatteryLevelReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.BatteryLevelReading();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.reading = reader.double();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a BatteryLevelReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n BatteryLevelReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a BatteryLevelReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n BatteryLevelReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n if (typeof message.reading !== \"number\")\r\n return \"reading: number expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a BatteryLevelReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.BatteryLevelReading} BatteryLevelReading\r\n */\r\n BatteryLevelReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.BatteryLevelReading)\r\n return object;\r\n let message = new $root.Buttplug.DeviceEvent.BatteryLevelReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.reading != null)\r\n message.reading = Number(object.reading);\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a BatteryLevelReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.BatteryLevelReading} message BatteryLevelReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n BatteryLevelReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.reading = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n object.reading = options.json && !isFinite(message.reading) ? String(message.reading) : message.reading;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this BatteryLevelReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.BatteryLevelReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n BatteryLevelReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return BatteryLevelReading;\r\n })();\r\n\r\n DeviceEvent.RSSILevelReading = (function() {\r\n\r\n /**\r\n * Properties of a RSSILevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @interface IRSSILevelReading\r\n * @property {number|null} [index] RSSILevelReading index\r\n * @property {number|null} [reading] RSSILevelReading reading\r\n */\r\n\r\n /**\r\n * Constructs a new RSSILevelReading.\r\n * @memberof Buttplug.DeviceEvent\r\n * @classdesc Represents a RSSILevelReading.\r\n * @implements IRSSILevelReading\r\n * @constructor\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading=} [properties] Properties to set\r\n */\r\n function RSSILevelReading(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * RSSILevelReading index.\r\n * @member {number} index\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n */\r\n RSSILevelReading.prototype.index = 0;\r\n\r\n /**\r\n * RSSILevelReading reading.\r\n * @member {number} reading\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n */\r\n RSSILevelReading.prototype.reading = 0;\r\n\r\n /**\r\n * Creates a new RSSILevelReading instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading=} [properties] Properties to set\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading instance\r\n */\r\n RSSILevelReading.create = function create(properties) {\r\n return new RSSILevelReading(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelReading message. Does not implicitly {@link Buttplug.DeviceEvent.RSSILevelReading.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading} message RSSILevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelReading.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.index != null && Object.hasOwnProperty.call(message, \"index\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.index);\r\n if (message.reading != null && Object.hasOwnProperty.call(message, \"reading\"))\r\n writer.uint32(/* id 2, wireType 0 =*/16).int32(message.reading);\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified RSSILevelReading message, length delimited. Does not implicitly {@link Buttplug.DeviceEvent.RSSILevelReading.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.IRSSILevelReading} message RSSILevelReading message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n RSSILevelReading.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelReading message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelReading.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.DeviceEvent.RSSILevelReading();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.index = reader.uint32();\r\n break;\r\n case 2:\r\n message.reading = reader.int32();\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a RSSILevelReading message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n RSSILevelReading.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a RSSILevelReading message.\r\n * @function verify\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n RSSILevelReading.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n if (!$util.isInteger(message.index))\r\n return \"index: integer expected\";\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n if (!$util.isInteger(message.reading))\r\n return \"reading: integer expected\";\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a RSSILevelReading message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.DeviceEvent.RSSILevelReading} RSSILevelReading\r\n */\r\n RSSILevelReading.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.DeviceEvent.RSSILevelReading)\r\n return object;\r\n let message = new $root.Buttplug.DeviceEvent.RSSILevelReading();\r\n if (object.index != null)\r\n message.index = object.index >>> 0;\r\n if (object.reading != null)\r\n message.reading = object.reading | 0;\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a RSSILevelReading message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @static\r\n * @param {Buttplug.DeviceEvent.RSSILevelReading} message RSSILevelReading\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n RSSILevelReading.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.index = 0;\r\n object.reading = 0;\r\n }\r\n if (message.index != null && message.hasOwnProperty(\"index\"))\r\n object.index = message.index;\r\n if (message.reading != null && message.hasOwnProperty(\"reading\"))\r\n object.reading = message.reading;\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this RSSILevelReading to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.DeviceEvent.RSSILevelReading\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n RSSILevelReading.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return RSSILevelReading;\r\n })();\r\n\r\n return DeviceEvent;\r\n })();\r\n\r\n Buttplug.ButtplugFFIServerMessage = (function() {\r\n\r\n /**\r\n * Properties of a ButtplugFFIServerMessage.\r\n * @memberof Buttplug\r\n * @interface IButtplugFFIServerMessage\r\n * @property {number|null} [id] ButtplugFFIServerMessage id\r\n * @property {Buttplug.ButtplugFFIServerMessage.IFFIMessage|null} [message] ButtplugFFIServerMessage message\r\n */\r\n\r\n /**\r\n * Constructs a new ButtplugFFIServerMessage.\r\n * @memberof Buttplug\r\n * @classdesc Represents a ButtplugFFIServerMessage.\r\n * @implements IButtplugFFIServerMessage\r\n * @constructor\r\n * @param {Buttplug.IButtplugFFIServerMessage=} [properties] Properties to set\r\n */\r\n function ButtplugFFIServerMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * ButtplugFFIServerMessage id.\r\n * @member {number} id\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n */\r\n ButtplugFFIServerMessage.prototype.id = 0;\r\n\r\n /**\r\n * ButtplugFFIServerMessage message.\r\n * @member {Buttplug.ButtplugFFIServerMessage.IFFIMessage|null|undefined} message\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n */\r\n ButtplugFFIServerMessage.prototype.message = null;\r\n\r\n /**\r\n * Creates a new ButtplugFFIServerMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage instance\r\n */\r\n ButtplugFFIServerMessage.create = function create(properties) {\r\n return new ButtplugFFIServerMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified ButtplugFFIServerMessage message. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage} message ButtplugFFIServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ButtplugFFIServerMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.id != null && Object.hasOwnProperty.call(message, \"id\"))\r\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.id);\r\n if (message.message != null && Object.hasOwnProperty.call(message, \"message\"))\r\n $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.encode(message.message, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified ButtplugFFIServerMessage message, length delimited. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.IButtplugFFIServerMessage} message ButtplugFFIServerMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n ButtplugFFIServerMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a ButtplugFFIServerMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ButtplugFFIServerMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ButtplugFFIServerMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.id = reader.uint32();\r\n break;\r\n case 2:\r\n message.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a ButtplugFFIServerMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n ButtplugFFIServerMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a ButtplugFFIServerMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n ButtplugFFIServerMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n if (!$util.isInteger(message.id))\r\n return \"id: integer expected\";\r\n if (message.message != null && message.hasOwnProperty(\"message\")) {\r\n let error = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.verify(message.message);\r\n if (error)\r\n return \"message.\" + error;\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a ButtplugFFIServerMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ButtplugFFIServerMessage} ButtplugFFIServerMessage\r\n */\r\n ButtplugFFIServerMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ButtplugFFIServerMessage)\r\n return object;\r\n let message = new $root.Buttplug.ButtplugFFIServerMessage();\r\n if (object.id != null)\r\n message.id = object.id >>> 0;\r\n if (object.message != null) {\r\n if (typeof object.message !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.message: object expected\");\r\n message.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.fromObject(object.message);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a ButtplugFFIServerMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage} message ButtplugFFIServerMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n ButtplugFFIServerMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (options.defaults) {\r\n object.id = 0;\r\n object.message = null;\r\n }\r\n if (message.id != null && message.hasOwnProperty(\"id\"))\r\n object.id = message.id;\r\n if (message.message != null && message.hasOwnProperty(\"message\"))\r\n object.message = $root.Buttplug.ButtplugFFIServerMessage.FFIMessage.toObject(message.message, options);\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this ButtplugFFIServerMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n ButtplugFFIServerMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n ButtplugFFIServerMessage.FFIMessage = (function() {\r\n\r\n /**\r\n * Properties of a FFIMessage.\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @interface IFFIMessage\r\n * @property {Buttplug.IServerMessage|null} [serverMessage] FFIMessage serverMessage\r\n * @property {Buttplug.IDeviceEvent|null} [deviceEvent] FFIMessage deviceEvent\r\n */\r\n\r\n /**\r\n * Constructs a new FFIMessage.\r\n * @memberof Buttplug.ButtplugFFIServerMessage\r\n * @classdesc Represents a FFIMessage.\r\n * @implements IFFIMessage\r\n * @constructor\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage=} [properties] Properties to set\r\n */\r\n function FFIMessage(properties) {\r\n if (properties)\r\n for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i)\r\n if (properties[keys[i]] != null)\r\n this[keys[i]] = properties[keys[i]];\r\n }\r\n\r\n /**\r\n * FFIMessage serverMessage.\r\n * @member {Buttplug.IServerMessage|null|undefined} serverMessage\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.serverMessage = null;\r\n\r\n /**\r\n * FFIMessage deviceEvent.\r\n * @member {Buttplug.IDeviceEvent|null|undefined} deviceEvent\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n FFIMessage.prototype.deviceEvent = null;\r\n\r\n // OneOf field names bound to virtual getters and setters\r\n let $oneOfFields;\r\n\r\n /**\r\n * FFIMessage msg.\r\n * @member {\"serverMessage\"|\"deviceEvent\"|undefined} msg\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n */\r\n Object.defineProperty(FFIMessage.prototype, \"msg\", {\r\n get: $util.oneOfGetter($oneOfFields = [\"serverMessage\", \"deviceEvent\"]),\r\n set: $util.oneOfSetter($oneOfFields)\r\n });\r\n\r\n /**\r\n * Creates a new FFIMessage instance using the specified properties.\r\n * @function create\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage=} [properties] Properties to set\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage instance\r\n */\r\n FFIMessage.create = function create(properties) {\r\n return new FFIMessage(properties);\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.FFIMessage.verify|verify} messages.\r\n * @function encode\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encode = function encode(message, writer) {\r\n if (!writer)\r\n writer = $Writer.create();\r\n if (message.serverMessage != null && Object.hasOwnProperty.call(message, \"serverMessage\"))\r\n $root.Buttplug.ServerMessage.encode(message.serverMessage, writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim();\r\n if (message.deviceEvent != null && Object.hasOwnProperty.call(message, \"deviceEvent\"))\r\n $root.Buttplug.DeviceEvent.encode(message.deviceEvent, writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim();\r\n return writer;\r\n };\r\n\r\n /**\r\n * Encodes the specified FFIMessage message, length delimited. Does not implicitly {@link Buttplug.ButtplugFFIServerMessage.FFIMessage.verify|verify} messages.\r\n * @function encodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.IFFIMessage} message FFIMessage message or plain object to encode\r\n * @param {$protobuf.Writer} [writer] Writer to encode to\r\n * @returns {$protobuf.Writer} Writer\r\n */\r\n FFIMessage.encodeDelimited = function encodeDelimited(message, writer) {\r\n return this.encode(message, writer).ldelim();\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer.\r\n * @function decode\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @param {number} [length] Message length if known beforehand\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decode = function decode(reader, length) {\r\n if (!(reader instanceof $Reader))\r\n reader = $Reader.create(reader);\r\n let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Buttplug.ButtplugFFIServerMessage.FFIMessage();\r\n while (reader.pos < end) {\r\n let tag = reader.uint32();\r\n switch (tag >>> 3) {\r\n case 1:\r\n message.serverMessage = $root.Buttplug.ServerMessage.decode(reader, reader.uint32());\r\n break;\r\n case 2:\r\n message.deviceEvent = $root.Buttplug.DeviceEvent.decode(reader, reader.uint32());\r\n break;\r\n default:\r\n reader.skipType(tag & 7);\r\n break;\r\n }\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Decodes a FFIMessage message from the specified reader or buffer, length delimited.\r\n * @function decodeDelimited\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n * @throws {Error} If the payload is not a reader or valid buffer\r\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\r\n */\r\n FFIMessage.decodeDelimited = function decodeDelimited(reader) {\r\n if (!(reader instanceof $Reader))\r\n reader = new $Reader(reader);\r\n return this.decode(reader, reader.uint32());\r\n };\r\n\r\n /**\r\n * Verifies a FFIMessage message.\r\n * @function verify\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} message Plain object to verify\r\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\r\n */\r\n FFIMessage.verify = function verify(message) {\r\n if (typeof message !== \"object\" || message === null)\r\n return \"object expected\";\r\n let properties = {};\r\n if (message.serverMessage != null && message.hasOwnProperty(\"serverMessage\")) {\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.ServerMessage.verify(message.serverMessage);\r\n if (error)\r\n return \"serverMessage.\" + error;\r\n }\r\n }\r\n if (message.deviceEvent != null && message.hasOwnProperty(\"deviceEvent\")) {\r\n if (properties.msg === 1)\r\n return \"msg: multiple values\";\r\n properties.msg = 1;\r\n {\r\n let error = $root.Buttplug.DeviceEvent.verify(message.deviceEvent);\r\n if (error)\r\n return \"deviceEvent.\" + error;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Creates a FFIMessage message from a plain object. Also converts values to their respective internal types.\r\n * @function fromObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Object.<string,*>} object Plain object\r\n * @returns {Buttplug.ButtplugFFIServerMessage.FFIMessage} FFIMessage\r\n */\r\n FFIMessage.fromObject = function fromObject(object) {\r\n if (object instanceof $root.Buttplug.ButtplugFFIServerMessage.FFIMessage)\r\n return object;\r\n let message = new $root.Buttplug.ButtplugFFIServerMessage.FFIMessage();\r\n if (object.serverMessage != null) {\r\n if (typeof object.serverMessage !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.FFIMessage.serverMessage: object expected\");\r\n message.serverMessage = $root.Buttplug.ServerMessage.fromObject(object.serverMessage);\r\n }\r\n if (object.deviceEvent != null) {\r\n if (typeof object.deviceEvent !== \"object\")\r\n throw TypeError(\".Buttplug.ButtplugFFIServerMessage.FFIMessage.deviceEvent: object expected\");\r\n message.deviceEvent = $root.Buttplug.DeviceEvent.fromObject(object.deviceEvent);\r\n }\r\n return message;\r\n };\r\n\r\n /**\r\n * Creates a plain object from a FFIMessage message. Also converts values to other types if specified.\r\n * @function toObject\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @static\r\n * @param {Buttplug.ButtplugFFIServerMessage.FFIMessage} message FFIMessage\r\n * @param {$protobuf.IConversionOptions} [options] Conversion options\r\n * @returns {Object.<string,*>} Plain object\r\n */\r\n FFIMessage.toObject = function toObject(message, options) {\r\n if (!options)\r\n options = {};\r\n let object = {};\r\n if (message.serverMessage != null && message.hasOwnProperty(\"serverMessage\")) {\r\n object.serverMessage = $root.Buttplug.ServerMessage.toObject(message.serverMessage, options);\r\n if (options.oneofs)\r\n object.msg = \"serverMessage\";\r\n }\r\n if (message.deviceEvent != null && message.hasOwnProperty(\"deviceEvent\")) {\r\n object.deviceEvent = $root.Buttplug.DeviceEvent.toObject(message.deviceEvent, options);\r\n if (options.oneofs)\r\n object.msg = \"deviceEvent\";\r\n }\r\n return object;\r\n };\r\n\r\n /**\r\n * Converts this FFIMessage to JSON.\r\n * @function toJSON\r\n * @memberof Buttplug.ButtplugFFIServerMessage.FFIMessage\r\n * @instance\r\n * @returns {Object.<string,*>} JSON object\r\n */\r\n FFIMessage.prototype.toJSON = function toJSON() {\r\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\r\n };\r\n\r\n return FFIMessage;\r\n })();\r\n\r\n return ButtplugFFIServerMessage;\r\n })();\r\n\r\n return Buttplug;\r\n})();\r\n\r\nexport { $root as default };\r\n","// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n","\r\nimport { ButtplugEmbeddedConnectorOptions, ButtplugWebsocketConnectorOptions } from \"./connectors.js\";\r\nimport { ButtplugMessageSorter } from \"./sorter.js\";\r\nimport { Buttplug } from \"./buttplug_ffi.js\";\r\n\r\nfunction must_run_init_1(a: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n\r\nfunction must_run_init_2(a: any | undefined, b: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n\r\nfunction must_run_init_3(a: any | undefined, b: any | undefined, c: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n\r\nfunction must_run_init_4(a: any | undefined, b: any | undefined, c: any | undefined, d: any | undefined): any {\r\n throw new Error(\"Must run buttplugInit() async before calling any Buttplug methods!\");\r\n}\r\n// import { buttplug_create_protobuf_client, buttplug_free_client, buttplug_client_protobuf_message, buttplug_activate_env_logger, buttplug_free_device, buttplug_create_device, buttplug_device_protobuf_message } from \"./buttplug-rs-ffi/buttplug_rs_ffi\";\r\n\r\nlet buttplug_create_protobuf_client = must_run_init_3;\r\nlet buttplug_free_client = must_run_init_1;\r\nlet buttplug_client_protobuf_message = must_run_init_4;\r\nlet buttplug_activate_env_logger = must_run_init_1;\r\nlet buttplug_free_device = must_run_init_1;\r\nlet buttplug_create_device = must_run_init_2;\r\nlet buttplug_device_protobuf_message = must_run_init_4;\r\nlet buttplug_has_init_run = false;\r\n\r\nexport async function buttplugInit() {\r\n if (buttplug_has_init_run) {\r\n console.log(\"buttplugInit function has already run successfully. This only needs to be run once, but doesn't affect anything (other than printing this message) if called again.\");\r\n return;\r\n }\r\n let index = await import(/* webpackPrefetch: 1 */ \"./buttplug-rs-ffi/buttplug_rs_ffi.js\").catch((e) => {\r\n console.log(e);\r\n return Promise.reject(e);\r\n });\r\n buttplug_create_protobuf_client = index.buttplug_create_protobuf_client;\r\n buttplug_free_client = index.buttplug_free_client;\r\n buttplug_client_protobuf_message = index.buttplug_client_protobuf_message;\r\n buttplug_activate_env_logger = index.buttplug_activate_env_logger;\r\n buttplug_free_device = index.buttplug_free_device;\r\n buttplug_create_device = index.buttplug_create_device;\r\n buttplug_device_protobuf_message = index.buttplug_device_protobuf_message;\r\n buttplug_has_init_run = true;\r\n}\r\n\r\nfunction sendClientMessage(sorter: ButtplugMessageSorter, clientPtr: number, message: Buttplug.ClientMessage, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let promise = sorter.PrepareOutgoingMessage(message);\r\n let buffer = Buffer.from(Buttplug.ClientMessage.encode(message).finish())\r\n buttplug_client_protobuf_message(clientPtr, buffer, callback, 0);\r\n return promise;\r\n}\r\n\r\nexport function connectEmbedded(sorter: ButtplugMessageSorter, clientPtr: number, options: ButtplugEmbeddedConnectorOptions, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n connectLocal: Buttplug.ClientMessage.ConnectLocal.create({\r\n serverName: options.ServerName,\r\n allowRawMessages: options.AllowRawMessages,\r\n deviceConfigurationJson: options.DeviceConfigJSON,\r\n userDeviceConfigurationJson: options.UserDeviceConfigJSON,\r\n commManagerTypes: options.DeviceCommunicationManagerTypes,\r\n maxPingTime: options.MaxPingTime\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nexport function connectWebsocket(sorter: ButtplugMessageSorter, clientPtr: number, options: ButtplugWebsocketConnectorOptions, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n connectWebsocket: Buttplug.ClientMessage.ConnectWebsocket.create({\r\n address: options.Address\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nexport function disconnect(sorter: ButtplugMessageSorter, clientPtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n disconnect: Buttplug.ClientMessage.Disconnect.create({})\r\n })\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nexport function startScanning(sorter: ButtplugMessageSorter, clientPtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n startScanning: Buttplug.ClientMessage.StartScanning.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nexport function stopScanning(sorter: ButtplugMessageSorter, clientPtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n stopScanning: Buttplug.ClientMessage.StopScanning.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nexport function stopAllDevices(sorter: ButtplugMessageSorter, clientPtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.ClientMessage.create({\r\n message: Buttplug.ClientMessage.FFIMessage.create({\r\n stopAllDevices: Buttplug.ClientMessage.StopAllDevices.create({})\r\n }),\r\n id: 1\r\n });\r\n return sendClientMessage(sorter, clientPtr, msg, callback);\r\n}\r\n\r\nfunction sendDeviceMessage(sorter: ButtplugMessageSorter, devicePtr: number, message: Buttplug.DeviceMessage, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let promise = sorter.PrepareOutgoingMessage(message);\r\n let buffer = Buffer.from(Buttplug.DeviceMessage.encode(message).finish())\r\n buttplug_device_protobuf_message(devicePtr, buffer, callback, 0);\r\n return promise;\r\n}\r\n\r\nexport function vibrate(sorter: ButtplugMessageSorter, devicePtr: number, speeds: Buttplug.DeviceMessage.VibrateComponent[], callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n vibrateCmd: Buttplug.DeviceMessage.VibrateCmd.create({\r\n speeds: speeds\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rotate(sorter: ButtplugMessageSorter, devicePtr: number, rotations: Buttplug.DeviceMessage.RotateComponent[], callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rotateCmd: Buttplug.DeviceMessage.RotateCmd.create({\r\n rotations: rotations\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function linear(sorter: ButtplugMessageSorter, devicePtr: number, vectors: Buttplug.DeviceMessage.LinearComponent[], callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n linearCmd: Buttplug.DeviceMessage.LinearCmd.create({\r\n movements: vectors\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function stopDevice(sorter: ButtplugMessageSorter, devicePtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n stopDeviceCmd: Buttplug.DeviceMessage.StopDeviceCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function batteryLevel(sorter: ButtplugMessageSorter, devicePtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n batteryLevelCmd: Buttplug.DeviceMessage.BatteryLevelCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rssiLevel(sorter: ButtplugMessageSorter, devicePtr: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rssiLevelCmd: Buttplug.DeviceMessage.RSSILevelCmd.create({\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rawRead(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, expectedLength: number, timeout: number, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawReadCmd: Buttplug.DeviceMessage.RawReadCmd.create({\r\n endpoint: endpoint,\r\n expectedLength: expectedLength,\r\n timeout: timeout\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rawWrite(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, data: Uint8Array, writeWithResponse: boolean, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawWriteCmd: Buttplug.DeviceMessage.RawWriteCmd.create({\r\n endpoint: endpoint,\r\n data: data,\r\n writeWithResponse: writeWithResponse\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rawSubscribe(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawSubscribeCmd: Buttplug.DeviceMessage.RawSubscribeCmd.create({\r\n endpoint: endpoint\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function rawUnsubscribe(sorter: ButtplugMessageSorter, devicePtr: number, endpoint: Buttplug.Endpoint, callback: Function): Promise<Buttplug.ButtplugFFIServerMessage> {\r\n let msg = Buttplug.DeviceMessage.create({\r\n message: Buttplug.DeviceMessage.FFIMessage.create({\r\n rawUnsubscribeCmd: Buttplug.DeviceMessage.RawUnsubscribeCmd.create({\r\n endpoint: endpoint\r\n })\r\n }),\r\n id: 1\r\n });\r\n return sendDeviceMessage(sorter, devicePtr, msg, callback);\r\n}\r\n\r\nexport function createClientPtr(eventCallback: Function, clientName: string): number {\r\n return buttplug_create_protobuf_client(clientName, eventCallback, 0);\r\n}\r\n\r\nexport function createDevicePtr(clientPtr: number, deviceIndex: number): number | null {\r\n return buttplug_create_device(clientPtr, deviceIndex);\r\n}\r\n\r\nexport function freeClientPtr(clientPtr: number) {\r\n buttplug_free_client(clientPtr);\r\n}\r\n\r\nexport function freeDevicePtr(devicePtr: number) {\r\n buttplug_free_device(devicePtr);\r\n}\r\n\r\nexport function activateConsoleLogger(logLevel: \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\") {\r\n buttplug_activate_env_logger(logLevel);\r\n}\r\n\r\n/*\r\nexport function addLogHandler(logCallback: Function, logLevel: \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\", useJSON: boolean) {\r\n buttplug_add_log_handler(logCallback, logLevel, useJSON);\r\n}\r\n*/","\"use strict\";\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"@protobufjs/aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"@protobufjs/base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"@protobufjs/eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"@protobufjs/float\");\n\n// requires modules optionally and hides the call from bundlers\nutil.inquire = require(\"@protobufjs/inquire\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"@protobufjs/utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"@protobufjs/pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && obj.hasOwnProperty(prop)) // eslint-disable-line eqeqeq, no-prototype-builtins\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.inquire(\"buffer\").Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons):\n return Buffer.prototype.utf8Write ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n// Internal alias of or polyfull for Buffer.from.\nutil._Buffer_from = null;\n\n// Internal alias of or polyfill for Buffer.allocUnsafe.\nutil._Buffer_allocUnsafe = null;\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? util.Buffer\n ? util._Buffer_allocUnsafe(sizeOrArray)\n : new util.Array(sizeOrArray)\n : util.Buffer\n ? util._Buffer_from(sizeOrArray)\n : typeof Uint8Array === \"undefined\"\n ? sizeOrArray\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Array implementation used in the browser. `Uint8Array` if supported, otherwise `Array`.\n * @type {Constructor<Uint8Array>}\n */\nutil.Array = typeof Uint8Array !== \"undefined\" ? Uint8Array /* istanbul ignore next */ : Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || util.inquire(\"long\");\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^true|false|0|1$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\\\x00-\\\\xff]{8}|-?(?:0|[1-9][0-9]*))$/;\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {Object.<string,*>} src Source object\n * @param {boolean} [ifNotSet=false] Merges only if the key is not already set\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst, src, ifNotSet) { // used by converters\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (dst[keys[i]] === undefined || !ifNotSet)\n dst[keys[i]] = src[keys[i]];\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n (CustomError.prototype = Object.create(Error.prototype)).constructor = CustomError;\n\n Object.defineProperty(CustomError.prototype, \"name\", { get: function() { return name; } });\n\n CustomError.prototype.toString = function toString() {\n return this.name + \": \" + this.message;\n };\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n\n// Sets up buffer utility according to the environment (called in index-minimal)\nutil._configure = function() {\n var Buffer = util.Buffer;\n /* istanbul ignore if */\n if (!Buffer) {\n util._Buffer_from = util._Buffer_allocUnsafe = null;\n return;\n }\n // because node 4.x buffers are incompatible & immutable\n // see: https://github.com/dcodeIO/protobuf.js/pull/665\n util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from ||\n /* istanbul ignore next */\n function Buffer_from(value, encoding) {\n return new Buffer(value, encoding);\n };\n util._Buffer_allocUnsafe = Buffer.allocUnsafe ||\n /* istanbul ignore next */\n function Buffer_allocUnsafe(size) {\n return new Buffer(size);\n };\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer operation instance.\n * @classdesc Scheduled writer operation.\n * @constructor\n * @param {function(*, Uint8Array, number)} fn Function to call\n * @param {number} len Value byte length\n * @param {*} val Value to write\n * @ignore\n */\nfunction Op(fn, len, val) {\n\n /**\n * Function to call.\n * @type {function(Uint8Array, number, *)}\n */\n this.fn = fn;\n\n /**\n * Value byte length.\n * @type {number}\n */\n this.len = len;\n\n /**\n * Next operation.\n * @type {Writer.Op|undefined}\n */\n this.next = undefined;\n\n /**\n * Value to write.\n * @type {*}\n */\n this.val = val; // type varies\n}\n\n/* istanbul ignore next */\nfunction noop() {} // eslint-disable-line no-empty-function\n\n/**\n * Constructs a new writer state instance.\n * @classdesc Copied writer state.\n * @memberof Writer\n * @constructor\n * @param {Writer} writer Writer to copy state from\n * @ignore\n */\nfunction State(writer) {\n\n /**\n * Current head.\n * @type {Writer.Op}\n */\n this.head = writer.head;\n\n /**\n * Current tail.\n * @type {Writer.Op}\n */\n this.tail = writer.tail;\n\n /**\n * Current buffer length.\n * @type {number}\n */\n this.len = writer.len;\n\n /**\n * Next state.\n * @type {State|null}\n */\n this.next = writer.states;\n}\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Current length.\n * @type {number}\n */\n this.len = 0;\n\n /**\n * Operations head.\n * @type {Object}\n */\n this.head = new Op(noop, 0, 0);\n\n /**\n * Operations tail\n * @type {Object}\n */\n this.tail = this.head;\n\n /**\n * Linked forked states.\n * @type {Object|null}\n */\n this.states = null;\n\n // When a value is written, the writer calculates its byte length and puts it into a linked\n // list of operations to perform when finish() is called. This both allows us to allocate\n // buffers of the exact required size and reduces the amount of work we have to do compared\n // to first calculating over objects and then encoding over objects. In our case, the encoding\n // part is just a linked list walk calling operations with already prepared values.\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new util.Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\n/* istanbul ignore else */\nif (util.Array !== Array)\n Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray);\n\n/**\n * Pushes a new operation to the queue.\n * @param {function(Uint8Array, number, *)} fn Function to call\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._push = function push(fn, len, val) {\n this.tail = this.tail.next = new Op(fn, len, val);\n this.len += len;\n return this;\n};\n\nfunction writeByte(val, buf, pos) {\n buf[pos] = val & 255;\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n}\n\n/**\n * Constructs a new varint writer operation instance.\n * @classdesc Scheduled varint writer operation.\n * @extends Op\n * @constructor\n * @param {number} len Value byte length\n * @param {number} val Value to write\n * @ignore\n */\nfunction VarintOp(len, val) {\n this.len = len;\n this.next = undefined;\n this.val = val;\n}\n\nVarintOp.prototype = Object.create(Op.prototype);\nVarintOp.prototype.fn = writeVarint32;\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n // here, the call to this.push has been inlined and a varint specific Op subclass is used.\n // uint32 is by far the most frequently used operation and benefits significantly from this.\n this.len += (this.tail = this.tail.next = new VarintOp(\n (value = value >>> 0)\n < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5,\n value)).len;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n return value < 0\n ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) // 10 bytes per spec\n : this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n while (val.hi) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0;\n val.hi >>>= 7;\n }\n while (val.lo > 127) {\n buf[pos++] = val.lo & 127 | 128;\n val.lo = val.lo >>> 7;\n }\n buf[pos++] = val.lo;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n return this._push(writeVarint64, bits.length(), bits);\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n return this._push(writeByte, 1, value ? 1 : 0);\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n return this._push(writeFixed32, 4, value >>> 0);\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi);\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n return this._push(util.float.writeFloatLE, 4, value);\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n return this._push(util.float.writeDoubleLE, 8, value);\n};\n\nvar writeBytes = util.Array.prototype.set\n ? function writeBytes_set(val, buf, pos) {\n buf.set(val, pos); // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytes_for(val, buf, pos) {\n for (var i = 0; i < val.length; ++i)\n buf[pos + i] = val[i];\n };\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len)\n return this._push(writeByte, 1, 0);\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n return this.uint32(len)._push(writeBytes, len, value);\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var len = utf8.length(value);\n return len\n ? this.uint32(len)._push(utf8.write, len, value)\n : this._push(writeByte, 1, 0);\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * Calling {@link Writer#reset|reset} or {@link Writer#ldelim|ldelim} resets the writer to the previous state.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this.states = new State(this);\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n if (this.states) {\n this.head = this.states.head;\n this.tail = this.states.tail;\n this.len = this.states.len;\n this.states = this.states.next;\n } else {\n this.head = this.tail = new Op(noop, 0, 0);\n this.len = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and appends the fork state's current write length as a varint followed by its operations.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var head = this.head,\n tail = this.tail,\n len = this.len;\n this.reset().uint32(len);\n if (len) {\n this.tail.next = head.next; // skip noop\n this.tail = tail;\n this.len += len;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish() {\n var head = this.head.next, // skip noop\n buf = this.constructor.alloc(this.len),\n pos = 0;\n while (head) {\n head.fn(head.val, buf, pos);\n pos += head.len;\n head = head.next;\n }\n // this.head = this.tail = null;\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array` if available, otherwise `Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n}\n\nvar create_array = typeof Uint8Array !== \"undefined\"\n ? function create_typed_array(buffer) {\n if (buffer instanceof Uint8Array || Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n }\n /* istanbul ignore next */\n : function create_array(buffer) {\n if (Array.isArray(buffer))\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n };\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\nReader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice;\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = (function read_uint32_setup() {\n var value = 4294967295; // optimizer type-hint, tends to deopt otherwise (?!)\n return function read_uint32() {\n value = ( this.buf[this.pos] & 127 ) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value;\n value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value;\n\n /* istanbul ignore if */\n if ((this.pos += 5) > this.len) {\n this.pos = this.len;\n throw indexOutOfRange(this, 10);\n }\n return value;\n };\n})();\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 3; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..3th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 4th\n bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0;\n return bits;\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n return this.uint32() !== 0;\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos += length;\n if (Array.isArray(this.buf)) // plain array\n return this.buf.slice(start, end);\n return start === end // fix for IE 10/Win8 and others' subarray returning array of size 1\n ? new this.buf.constructor(0)\n : this._slice.call(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var bytes = this.bytes();\n return utf8.read(bytes, 0, bytes.length);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType) {\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while ((wireType = this.uint32() & 7) !== 4) {\n this.skipType(wireType);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n","\"use strict\";\nvar protobuf = exports;\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nprotobuf.build = \"minimal\";\n\n// Serialization\nprotobuf.Writer = require(\"./writer\");\nprotobuf.BufferWriter = require(\"./writer_buffer\");\nprotobuf.Reader = require(\"./reader\");\nprotobuf.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nprotobuf.util = require(\"./util/minimal\");\nprotobuf.rpc = require(\"./rpc\");\nprotobuf.roots = require(\"./roots\");\nprotobuf.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n protobuf.util._configure();\n protobuf.Writer._configure(protobuf.BufferWriter);\n protobuf.Reader._configure(protobuf.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","\"use strict\";\r\nmodule.exports = asPromise;\r\n\r\n/**\r\n * Callback as used by {@link util.asPromise}.\r\n * @typedef asPromiseCallback\r\n * @type {function}\r\n * @param {Error|null} error Error, if any\r\n * @param {...*} params Additional arguments\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Returns a promise from a node-style callback function.\r\n * @memberof util\r\n * @param {asPromiseCallback} fn Function to call\r\n * @param {*} ctx Function context\r\n * @param {...*} params Function arguments\r\n * @returns {Promise<*>} Promisified function\r\n */\r\nfunction asPromise(fn, ctx/*, varargs */) {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0,\r\n index = 2,\r\n pending = true;\r\n while (index < arguments.length)\r\n params[offset++] = arguments[index++];\r\n return new Promise(function executor(resolve, reject) {\r\n params[offset] = function callback(err/*, varargs */) {\r\n if (pending) {\r\n pending = false;\r\n if (err)\r\n reject(err);\r\n else {\r\n var params = new Array(arguments.length - 1),\r\n offset = 0;\r\n while (offset < params.length)\r\n params[offset++] = arguments[offset];\r\n resolve.apply(null, params);\r\n }\r\n }\r\n };\r\n try {\r\n fn.apply(ctx || null, params);\r\n } catch (err) {\r\n if (pending) {\r\n pending = false;\r\n reject(err);\r\n }\r\n }\r\n });\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal base64 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar base64 = exports;\r\n\r\n/**\r\n * Calculates the byte length of a base64 encoded string.\r\n * @param {string} string Base64 encoded string\r\n * @returns {number} Byte length\r\n */\r\nbase64.length = function length(string) {\r\n var p = string.length;\r\n if (!p)\r\n return 0;\r\n var n = 0;\r\n while (--p % 4 > 1 && string.charAt(p) === \"=\")\r\n ++n;\r\n return Math.ceil(string.length * 3) / 4 - n;\r\n};\r\n\r\n// Base64 encoding table\r\nvar b64 = new Array(64);\r\n\r\n// Base64 decoding table\r\nvar s64 = new Array(123);\r\n\r\n// 65..90, 97..122, 48..57, 43, 47\r\nfor (var i = 0; i < 64;)\r\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n\r\n/**\r\n * Encodes a buffer to a base64 encoded string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} Base64 encoded string\r\n */\r\nbase64.encode = function encode(buffer, start, end) {\r\n var parts = null,\r\n chunk = [];\r\n var i = 0, // output index\r\n j = 0, // goto index\r\n t; // temporary\r\n while (start < end) {\r\n var b = buffer[start++];\r\n switch (j) {\r\n case 0:\r\n chunk[i++] = b64[b >> 2];\r\n t = (b & 3) << 4;\r\n j = 1;\r\n break;\r\n case 1:\r\n chunk[i++] = b64[t | b >> 4];\r\n t = (b & 15) << 2;\r\n j = 2;\r\n break;\r\n case 2:\r\n chunk[i++] = b64[t | b >> 6];\r\n chunk[i++] = b64[b & 63];\r\n j = 0;\r\n break;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (j) {\r\n chunk[i++] = b64[t];\r\n chunk[i++] = 61;\r\n if (j === 1)\r\n chunk[i++] = 61;\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\nvar invalidEncoding = \"invalid encoding\";\r\n\r\n/**\r\n * Decodes a base64 encoded string to a buffer.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Number of bytes written\r\n * @throws {Error} If encoding is invalid\r\n */\r\nbase64.decode = function decode(string, buffer, offset) {\r\n var start = offset;\r\n var j = 0, // goto index\r\n t; // temporary\r\n for (var i = 0; i < string.length;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error(invalidEncoding);\r\n switch (j) {\r\n case 0:\r\n t = c;\r\n j = 1;\r\n break;\r\n case 1:\r\n buffer[offset++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n case 2:\r\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n case 3:\r\n buffer[offset++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n if (j === 1)\r\n throw Error(invalidEncoding);\r\n return offset - start;\r\n};\r\n\r\n/**\r\n * Tests if the specified string appears to be base64 encoded.\r\n * @param {string} string String to test\r\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\r\n */\r\nbase64.test = function test(string) {\r\n return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string);\r\n};\r\n","\"use strict\";\r\nmodule.exports = EventEmitter;\r\n\r\n/**\r\n * Constructs a new event emitter instance.\r\n * @classdesc A minimal event emitter.\r\n * @memberof util\r\n * @constructor\r\n */\r\nfunction EventEmitter() {\r\n\r\n /**\r\n * Registered listeners.\r\n * @type {Object.<string,*>}\r\n * @private\r\n */\r\n this._listeners = {};\r\n}\r\n\r\n/**\r\n * Registers an event listener.\r\n * @param {string} evt Event name\r\n * @param {function} fn Listener\r\n * @param {*} [ctx] Listener context\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\r\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\r\n fn : fn,\r\n ctx : ctx || this\r\n });\r\n return this;\r\n};\r\n\r\n/**\r\n * Removes an event listener or any matching listeners if arguments are omitted.\r\n * @param {string} [evt] Event name. Removes all listeners if omitted.\r\n * @param {function} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.off = function off(evt, fn) {\r\n if (evt === undefined)\r\n this._listeners = {};\r\n else {\r\n if (fn === undefined)\r\n this._listeners[evt] = [];\r\n else {\r\n var listeners = this._listeners[evt];\r\n for (var i = 0; i < listeners.length;)\r\n if (listeners[i].fn === fn)\r\n listeners.splice(i, 1);\r\n else\r\n ++i;\r\n }\r\n }\r\n return this;\r\n};\r\n\r\n/**\r\n * Emits an event by calling its listeners with the specified arguments.\r\n * @param {string} evt Event name\r\n * @param {...*} args Arguments\r\n * @returns {util.EventEmitter} `this`\r\n */\r\nEventEmitter.prototype.emit = function emit(evt) {\r\n var listeners = this._listeners[evt];\r\n if (listeners) {\r\n var args = [],\r\n i = 1;\r\n for (; i < arguments.length;)\r\n args.push(arguments[i++]);\r\n for (i = 0; i < listeners.length;)\r\n listeners[i].fn.apply(listeners[i++].ctx, args);\r\n }\r\n return this;\r\n};\r\n","\"use strict\";\r\n\r\nmodule.exports = factory(factory);\r\n\r\n/**\r\n * Reads / writes floats / doubles from / to buffers.\r\n * @name util.float\r\n * @namespace\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using little endian byte order.\r\n * @name util.float.writeFloatLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 32 bit float to a buffer using big endian byte order.\r\n * @name util.float.writeFloatBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using little endian byte order.\r\n * @name util.float.readFloatLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 32 bit float from a buffer using big endian byte order.\r\n * @name util.float.readFloatBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using little endian byte order.\r\n * @name util.float.writeDoubleLE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Writes a 64 bit double to a buffer using big endian byte order.\r\n * @name util.float.writeDoubleBE\r\n * @function\r\n * @param {number} val Value to write\r\n * @param {Uint8Array} buf Target buffer\r\n * @param {number} pos Target buffer offset\r\n * @returns {undefined}\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using little endian byte order.\r\n * @name util.float.readDoubleLE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n/**\r\n * Reads a 64 bit double from a buffer using big endian byte order.\r\n * @name util.float.readDoubleBE\r\n * @function\r\n * @param {Uint8Array} buf Source buffer\r\n * @param {number} pos Source buffer offset\r\n * @returns {number} Value read\r\n */\r\n\r\n// Factory function for the purpose of node-based testing in modified global environments\r\nfunction factory(exports) {\r\n\r\n // float: typed array\r\n if (typeof Float32Array !== \"undefined\") (function() {\r\n\r\n var f32 = new Float32Array([ -0 ]),\r\n f8b = new Uint8Array(f32.buffer),\r\n le = f8b[3] === 128;\r\n\r\n function writeFloat_f32_cpy(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n }\r\n\r\n function writeFloat_f32_rev(val, buf, pos) {\r\n f32[0] = val;\r\n buf[pos ] = f8b[3];\r\n buf[pos + 1] = f8b[2];\r\n buf[pos + 2] = f8b[1];\r\n buf[pos + 3] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\r\n\r\n function readFloat_f32_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n function readFloat_f32_rev(buf, pos) {\r\n f8b[3] = buf[pos ];\r\n f8b[2] = buf[pos + 1];\r\n f8b[1] = buf[pos + 2];\r\n f8b[0] = buf[pos + 3];\r\n return f32[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\r\n /* istanbul ignore next */\r\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\r\n\r\n // float: ieee754\r\n })(); else (function() {\r\n\r\n function writeFloat_ieee754(writeUint, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0)\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\r\n else if (isNaN(val))\r\n writeUint(2143289344, buf, pos);\r\n else if (val > 3.4028234663852886e+38) // +-Infinity\r\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\r\n else if (val < 1.1754943508222875e-38) // denormal\r\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\r\n else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2),\r\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\r\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\r\n }\r\n }\r\n\r\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\r\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\r\n\r\n function readFloat_ieee754(readUint, buf, pos) {\r\n var uint = readUint(buf, pos),\r\n sign = (uint >> 31) * 2 + 1,\r\n exponent = uint >>> 23 & 255,\r\n mantissa = uint & 8388607;\r\n return exponent === 255\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 1.401298464324817e-45 * mantissa\r\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\r\n }\r\n\r\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\r\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\r\n\r\n })();\r\n\r\n // double: typed array\r\n if (typeof Float64Array !== \"undefined\") (function() {\r\n\r\n var f64 = new Float64Array([-0]),\r\n f8b = new Uint8Array(f64.buffer),\r\n le = f8b[7] === 128;\r\n\r\n function writeDouble_f64_cpy(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[0];\r\n buf[pos + 1] = f8b[1];\r\n buf[pos + 2] = f8b[2];\r\n buf[pos + 3] = f8b[3];\r\n buf[pos + 4] = f8b[4];\r\n buf[pos + 5] = f8b[5];\r\n buf[pos + 6] = f8b[6];\r\n buf[pos + 7] = f8b[7];\r\n }\r\n\r\n function writeDouble_f64_rev(val, buf, pos) {\r\n f64[0] = val;\r\n buf[pos ] = f8b[7];\r\n buf[pos + 1] = f8b[6];\r\n buf[pos + 2] = f8b[5];\r\n buf[pos + 3] = f8b[4];\r\n buf[pos + 4] = f8b[3];\r\n buf[pos + 5] = f8b[2];\r\n buf[pos + 6] = f8b[1];\r\n buf[pos + 7] = f8b[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\r\n\r\n function readDouble_f64_cpy(buf, pos) {\r\n f8b[0] = buf[pos ];\r\n f8b[1] = buf[pos + 1];\r\n f8b[2] = buf[pos + 2];\r\n f8b[3] = buf[pos + 3];\r\n f8b[4] = buf[pos + 4];\r\n f8b[5] = buf[pos + 5];\r\n f8b[6] = buf[pos + 6];\r\n f8b[7] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n function readDouble_f64_rev(buf, pos) {\r\n f8b[7] = buf[pos ];\r\n f8b[6] = buf[pos + 1];\r\n f8b[5] = buf[pos + 2];\r\n f8b[4] = buf[pos + 3];\r\n f8b[3] = buf[pos + 4];\r\n f8b[2] = buf[pos + 5];\r\n f8b[1] = buf[pos + 6];\r\n f8b[0] = buf[pos + 7];\r\n return f64[0];\r\n }\r\n\r\n /* istanbul ignore next */\r\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\r\n /* istanbul ignore next */\r\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\r\n\r\n // double: ieee754\r\n })(); else (function() {\r\n\r\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\r\n var sign = val < 0 ? 1 : 0;\r\n if (sign)\r\n val = -val;\r\n if (val === 0) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\r\n } else if (isNaN(val)) {\r\n writeUint(0, buf, pos + off0);\r\n writeUint(2146959360, buf, pos + off1);\r\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\r\n writeUint(0, buf, pos + off0);\r\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\r\n } else {\r\n var mantissa;\r\n if (val < 2.2250738585072014e-308) { // denormal\r\n mantissa = val / 5e-324;\r\n writeUint(mantissa >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\r\n } else {\r\n var exponent = Math.floor(Math.log(val) / Math.LN2);\r\n if (exponent === 1024)\r\n exponent = 1023;\r\n mantissa = val * Math.pow(2, -exponent);\r\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\r\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\r\n }\r\n }\r\n }\r\n\r\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\r\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\r\n\r\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\r\n var lo = readUint(buf, pos + off0),\r\n hi = readUint(buf, pos + off1);\r\n var sign = (hi >> 31) * 2 + 1,\r\n exponent = hi >>> 20 & 2047,\r\n mantissa = 4294967296 * (hi & 1048575) + lo;\r\n return exponent === 2047\r\n ? mantissa\r\n ? NaN\r\n : sign * Infinity\r\n : exponent === 0 // denormal\r\n ? sign * 5e-324 * mantissa\r\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\r\n }\r\n\r\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\r\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\r\n\r\n })();\r\n\r\n return exports;\r\n}\r\n\r\n// uint helpers\r\n\r\nfunction writeUintLE(val, buf, pos) {\r\n buf[pos ] = val & 255;\r\n buf[pos + 1] = val >>> 8 & 255;\r\n buf[pos + 2] = val >>> 16 & 255;\r\n buf[pos + 3] = val >>> 24;\r\n}\r\n\r\nfunction writeUintBE(val, buf, pos) {\r\n buf[pos ] = val >>> 24;\r\n buf[pos + 1] = val >>> 16 & 255;\r\n buf[pos + 2] = val >>> 8 & 255;\r\n buf[pos + 3] = val & 255;\r\n}\r\n\r\nfunction readUintLE(buf, pos) {\r\n return (buf[pos ]\r\n | buf[pos + 1] << 8\r\n | buf[pos + 2] << 16\r\n | buf[pos + 3] << 24) >>> 0;\r\n}\r\n\r\nfunction readUintBE(buf, pos) {\r\n return (buf[pos ] << 24\r\n | buf[pos + 1] << 16\r\n | buf[pos + 2] << 8\r\n | buf[pos + 3]) >>> 0;\r\n}\r\n","\"use strict\";\r\nmodule.exports = inquire;\r\n\r\n/**\r\n * Requires a module only if available.\r\n * @memberof util\r\n * @param {string} moduleName Module to require\r\n * @returns {?Object} Required module if available and not empty, otherwise `null`\r\n */\r\nfunction inquire(moduleName) {\r\n try {\r\n var mod = eval(\"quire\".replace(/^/,\"re\"))(moduleName); // eslint-disable-line no-eval\r\n if (mod && (mod.length || Object.keys(mod).length))\r\n return mod;\r\n } catch (e) {} // eslint-disable-line no-empty\r\n return null;\r\n}\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","\"use strict\";\r\nmodule.exports = pool;\r\n\r\n/**\r\n * An allocator as used by {@link util.pool}.\r\n * @typedef PoolAllocator\r\n * @type {function}\r\n * @param {number} size Buffer size\r\n * @returns {Uint8Array} Buffer\r\n */\r\n\r\n/**\r\n * A slicer as used by {@link util.pool}.\r\n * @typedef PoolSlicer\r\n * @type {function}\r\n * @param {number} start Start offset\r\n * @param {number} end End offset\r\n * @returns {Uint8Array} Buffer slice\r\n * @this {Uint8Array}\r\n */\r\n\r\n/**\r\n * A general purpose buffer pool.\r\n * @memberof util\r\n * @function\r\n * @param {PoolAllocator} alloc Allocator\r\n * @param {PoolSlicer} slice Slicer\r\n * @param {number} [size=8192] Slab size\r\n * @returns {PoolAllocator} Pooled allocator\r\n */\r\nfunction pool(alloc, slice, size) {\r\n var SIZE = size || 8192;\r\n var MAX = SIZE >>> 1;\r\n var slab = null;\r\n var offset = SIZE;\r\n return function pool_alloc(size) {\r\n if (size < 1 || size > MAX)\r\n return alloc(size);\r\n if (offset + size > SIZE) {\r\n slab = alloc(SIZE);\r\n offset = 0;\r\n }\r\n var buf = slice.call(slab, offset, offset += size);\r\n if (offset & 7) // align to 32 bit\r\n offset = (offset | 7) + 1;\r\n return buf;\r\n };\r\n}\r\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar util = require(\"../util/minimal\");\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (util.isString(value)) {\n /* istanbul ignore else */\n if (util.Long)\n value = util.Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return util.Long\n ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\n(BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util._Buffer_allocUnsafe;\n\n BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === \"set\"\n ? function writeBytesBuffer_set(val, buf, pos) {\n buf.set(val, pos); // faster than copy (requires node >= 4 where Buffers extend Uint8Array and set is properly inherited)\n // also works for plain array values\n }\n /* istanbul ignore next */\n : function writeBytesBuffer_copy(val, buf, pos) {\n if (val.copy) // Buffer values\n val.copy(buf, pos, 0, val.length);\n else for (var i = 0; i < val.length;) // plain array values\n buf[pos++] = val[i++];\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util._Buffer_from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len)\n this._push(BufferWriter.writeBytesBuffer, len, value);\n return this;\n};\n\nfunction writeStringBuffer(val, buf, pos) {\n if (val.length < 40) // plain js is faster for short strings (probably due to redundant assertions)\n util.utf8.write(val, buf, pos);\n else if (buf.utf8Write)\n buf.utf8Write(val, pos);\n else\n buf.write(val, pos);\n}\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n if (len)\n this._push(writeStringBuffer, len, value);\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\n(BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader;\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(); // modifies pos\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len))\n : this.buf.toString(\"utf-8\", this.pos, this.pos = Math.min(this.pos + len, this.len));\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\n(Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service;\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} [callback] Node-style callback called with the error, if any, and the response message\n * @returns {Promise<Message<TRes>>} Promise if `callback` has been omitted, otherwise `undefined`\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n","\"use strict\";\nmodule.exports = {};\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available accross modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <http://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n return toString.call(arr) == '[object Array]';\n};\n","import { Buttplug } from \"./buttplug_ffi.js\";\r\n\r\nexport class ButtplugError extends Error {\r\n /*\r\n\r\n public get ErrorClass(): Messages.ErrorClass {\r\n return this.errorClass;\r\n }\r\n\r\n public get InnerError(): Error | undefined {\r\n return this.innerError;\r\n }\r\n\r\n public get Id(): number | undefined {\r\n return this.messageId;\r\n }\r\n\r\n public get ErrorMessage(): Messages.ButtplugMessage {\r\n return new Messages.Error(this.message, this.ErrorClass, this.Id);\r\n }\r\n\r\n public static FromError(aError: Messages.Error) {\r\n switch (aError.ErrorCode) {\r\n case Messages.ErrorClass.ERROR_DEVICE:\r\n return new ButtplugDeviceError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_INIT:\r\n return new ButtplugInitError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_UNKNOWN:\r\n return new ButtplugUnknownError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_PING:\r\n return new ButtplugPingError(aError.ErrorMessage, aError.Id);\r\n case Messages.ErrorClass.ERROR_MSG:\r\n return new ButtplugMessageError(aError.ErrorMessage, aError.Id);\r\n default:\r\n throw new Error(`Message type ${aError.ErrorCode} not handled`);\r\n }\r\n }\r\n*/\r\n public innerError: Error | undefined;\r\n public messageId: number | undefined;\r\n\r\n protected constructor(aMessage: string,\r\n aId: number = 0,\r\n aInner?: Error) {\r\n super(aMessage);\r\n this.innerError = aInner;\r\n this.messageId = aId;\r\n }\r\n}\r\n\r\nexport class ButtplugHandshakeError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugDeviceError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugMessageError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugPingError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugUnknownError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport class ButtplugClientConnectorError extends ButtplugError {\r\n public constructor(aMessage: string, aId: number = 0) {\r\n super(aMessage, aId);\r\n }\r\n}\r\n\r\nexport function convertPBufError(err: Buttplug.ServerMessage.IError, id: number): ButtplugError {\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugConnectorError) {\r\n return new ButtplugClientConnectorError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugDeviceError) {\r\n return new ButtplugDeviceError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugHandshakeError) {\r\n return new ButtplugHandshakeError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugMessageError) {\r\n return new ButtplugMessageError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugPingError) {\r\n return new ButtplugPingError(err.message!, id);\r\n }\r\n if (err.errorType === Buttplug.ServerMessage.ButtplugErrorType.ButtplugUnknownError) {\r\n return new ButtplugUnknownError(err.message!, id);\r\n }\r\n throw new ButtplugUnknownError(\"Cannot convert error: \" + err);\r\n}\r\n","export class ButtplugEmbeddedConnectorOptions {\r\n public constructor(\r\n public ServerName: string = \"Buttplug WASM Embedded Server\",\r\n // Empty string means ignore.\r\n public DeviceConfigJSON: string = \"\",\r\n // Empty string means ignore.\r\n public UserDeviceConfigJSON: string = \"\",\r\n // 0 here means all device.\r\n public DeviceCommunicationManagerTypes: number = 0,\r\n // Require opt-in on raw messages.\r\n public AllowRawMessages: boolean = false,\r\n public MaxPingTime: number = 0,\r\n ) {}\r\n}\r\n\r\nexport class ButtplugWebsocketConnectorOptions {\r\n public constructor(\r\n // Default to the insecure port.\r\n public Address: string = \"ws://127.0.0.1:12345\",\r\n ) {}\r\n}","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\nimport { Buttplug } from \"./buttplug_ffi.js\";\r\nimport { convertPBufError } from \"./errors.js\";\r\n\r\nexport class ButtplugMessageSorter {\r\n protected _counter: number = 1;\r\n protected _waitingMsgs: Map<number, [(val: Buttplug.ServerMessage) => void, (err: Error) => void]> = new Map();\r\n\r\n public constructor() {\r\n }\r\n\r\n // One of the places we should actually return a promise, as we need to store\r\n // them while waiting for them to return across the line.\r\n // tslint:disable:promise-function-async\r\n public PrepareOutgoingMessage(aMsg: Buttplug.ClientMessage | Buttplug.DeviceMessage) : Promise<Buttplug.ButtplugFFIServerMessage> {\r\n aMsg.id = this._counter;\r\n // Always increment last, otherwise we might lose sync\r\n this._counter += 1;\r\n let res;\r\n let rej;\r\n const msgPromise = new Promise<Buttplug.ButtplugFFIServerMessage>((resolve, reject) => { res = resolve; rej = reject; });\r\n this._waitingMsgs.set(aMsg.id, [res, rej]);\r\n return msgPromise;\r\n }\r\n\r\n public ParseIncomingMessages(msg: Buttplug.ButtplugFFIServerMessage): Buttplug.ServerMessage | null {\r\n if (msg.id !== 0 && this._waitingMsgs.has(msg.id)) {\r\n const [res, rej] = this._waitingMsgs.get(msg.id)!;\r\n // If we've gotten back an error, reject the related promise using a\r\n // ButtplugException derived type.\r\n if (msg.message?.serverMessage?.error) {\r\n rej(convertPBufError(msg.message?.serverMessage?.error, msg.id));\r\n return null;\r\n }\r\n res(msg);\r\n return null;\r\n }\r\n return msg;\r\n }\r\n}\r\n","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n\"use strict\";\r\nimport { Buttplug } from \"./buttplug_ffi.js\";\r\nimport { ButtplugDeviceError } from \"./errors.js\";\r\nimport { EventEmitter } from \"events\";\r\nimport { vibrate, rotate, stopDevice, linear, batteryLevel,\r\n rssiLevel, rawRead, rawWrite, rawSubscribe, rawUnsubscribe } from \"./ffi.js\";\r\nimport { ButtplugMessageSorter } from \"./sorter.js\";\r\n\r\n// Re-export the protobuf enum, so we don't require users to have to know the\r\n// full resolution path.\r\nexport import ButtplugDeviceMessageType = Buttplug.ServerMessage.MessageAttributeType;\r\n\r\nexport class MessageAttributes {\r\n /** MessageAttributes featureCount */\r\n featureCount?: (number | null);\r\n\r\n /** MessageAttributes stepCount */\r\n stepCount?: (number[] | null);\r\n\r\n /** MessageAttributes endpoints */\r\n endpoints?: (Buttplug.Endpoint[] | null);\r\n\r\n /** MessageAttributes maxDuration */\r\n maxDuration?: (number[] | null);\r\n\r\n constructor(attributes: Buttplug.ServerMessage.IMessageAttributes) {\r\n this.featureCount = attributes.featureCount;\r\n this.stepCount = attributes.stepCount;\r\n this.maxDuration = attributes.maxDuration;\r\n this.endpoints = attributes.endpoints;\r\n }\r\n}\r\n\r\nexport class VibrationCmd {\r\n public readonly Index: number;\r\n public readonly Speed: number;\r\n\r\n constructor(index: number, speed: number) {\r\n this.Index = index;\r\n this.Speed = speed;\r\n }\r\n}\r\n\r\nexport class RotationCmd {\r\n public readonly Index: number;\r\n public readonly Speed: number;\r\n public readonly Clockwise: boolean;\r\n\r\n constructor(index: number, speed: number, clockwise: boolean) {\r\n this.Index = index;\r\n this.Speed = speed;\r\n this.Clockwise = clockwise;\r\n }\r\n}\r\n\r\nexport class VectorCmd {\r\n public readonly Index: number;\r\n public readonly Duration: number;\r\n public readonly Position: number;\r\n\r\n constructor(index: number, duration: number, position: number) {\r\n this.Index = index;\r\n this.Duration = duration;\r\n this.Position = position;\r\n }\r\n}\r\n\r\n/**\r\n * Represents an abstract device, capable of taking certain kinds of messages.\r\n */\r\nexport class ButtplugClientDevice extends EventEmitter {\r\n\r\n private _name: string;\r\n private _index: number;\r\n private _devicePtr: number;\r\n private _messageAttributes: Map<ButtplugDeviceMessageType, MessageAttributes> = new Map();\r\n private _sorter: ButtplugMessageSorter;\r\n private _sorterCallback: Function;\r\n\r\n /**\r\n * Return the name of the device.\r\n */\r\n public get Name(): string {\r\n return this._name;\r\n }\r\n\r\n /**\r\n * Return the index of the device.\r\n */\r\n public get Index(): number {\r\n return this._index;\r\n }\r\n\r\n /**\r\n * Return a list of message types the device accepts.\r\n */\r\n public get AllowedMessages(): ButtplugDeviceMessageType[] {\r\n return Array.from(this._messageAttributes.keys());\r\n }\r\n\r\n /**\r\n * @param _index Index of the device, as created by the device manager.\r\n * @param _name Name of the device.\r\n * @param allowedMsgs Buttplug messages the device can receive.\r\n */\r\n constructor(\r\n devicePtr: number,\r\n sorter: ButtplugMessageSorter,\r\n sorter_callback: Function,\r\n index: number,\r\n name: string,\r\n allowedMsgsObj: Buttplug.ServerMessage.IMessageAttributes[]) {\r\n super();\r\n this._devicePtr = devicePtr;\r\n this._sorter = sorter;\r\n this._index = index;\r\n this._name = name;\r\n this._sorterCallback = sorter_callback;\r\n for (let attributes of allowedMsgsObj) {\r\n this._messageAttributes.set(attributes.messageType!, new MessageAttributes(attributes));\r\n }\r\n }\r\n\r\n /**\r\n * Return the message attributes related to the given message\r\n */\r\n public messageAttributes(messageName: ButtplugDeviceMessageType): MessageAttributes | undefined {\r\n return this._messageAttributes.get(messageName);\r\n }\r\n\r\n protected checkAllowedMessageType(messageType: ButtplugDeviceMessageType) {\r\n if (!this._messageAttributes.has(messageType)) {\r\n throw new ButtplugDeviceError(`Message ${ButtplugDeviceMessageType[messageType]} does not exist on device ${this._name}`);\r\n }\r\n }\r\n\r\n public async vibrate(speeds: number | Array<VibrationCmd | number>): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.VibrateCmd);\r\n let msgSpeeds: Buttplug.DeviceMessage.VibrateComponent[];\r\n if (typeof (speeds) === \"number\") {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.VibrateCmd)!.featureCount!;\r\n msgSpeeds = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: i,\r\n speed: speeds,\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => typeof(x) === \"number\")) {\r\n msgSpeeds = speeds.map((x, index) => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: index,\r\n speed: x as number\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => x instanceof VibrationCmd)) {\r\n msgSpeeds = (speeds as VibrationCmd[]).map(x => Buttplug.DeviceMessage.VibrateComponent.create({\r\n index: x.Index,\r\n speed: x.Speed\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"vibrate can only take numbers or arrays of numbers or VibrationCmds.\");\r\n }\r\n await vibrate(this._sorter, this._devicePtr, msgSpeeds, this._sorterCallback);\r\n }\r\n\r\n public async rotate(speeds: number | RotationCmd[], clockwise: boolean | undefined): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RotateCmd);\r\n let msgRotations: Buttplug.DeviceMessage.RotateComponent[];\r\n if (typeof (speeds) === \"number\" && clockwise !== undefined) {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.RotateCmd)!.featureCount!;\r\n msgRotations = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.RotateComponent.create({\r\n index: i,\r\n speed: speeds,\r\n clockwise: clockwise\r\n }));\r\n } else if (Array.isArray(speeds) && speeds.every(x => x instanceof RotationCmd)) {\r\n msgRotations = (speeds as any).map(x => Buttplug.DeviceMessage.RotateComponent.create({\r\n index: x.Index,\r\n speed: x.Speed,\r\n clockwise: x.Clockwise\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"rotate can only take number/boolean or arrays of RotateCmds.\");\r\n }\r\n await rotate(this._sorter, this._devicePtr, msgRotations, this._sorterCallback);\r\n }\r\n\r\n public async linear(position: number | VectorCmd[], duration: number | undefined): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.LinearCmd);\r\n let msgVectors: Buttplug.DeviceMessage.LinearComponent[];\r\n if (typeof (position) === \"number\" && duration !== undefined) {\r\n // We can skip the check here since we're building the command array ourselves.\r\n const features = this._messageAttributes.get(ButtplugDeviceMessageType.LinearCmd)!.featureCount!;\r\n msgVectors = Array.from({length: features}, (_, i) => Buttplug.DeviceMessage.LinearComponent.create({\r\n index: i,\r\n position: position,\r\n duration: duration\r\n }));\r\n } else if (Array.isArray(position) && position.every(x => x instanceof VectorCmd)) {\r\n msgVectors = position.map(x => Buttplug.DeviceMessage.LinearComponent.create({\r\n index: x.Index,\r\n position: x.Position,\r\n duration: x.Duration\r\n }));\r\n } else {\r\n throw new ButtplugDeviceError(\"linear can only take number/number or arrays of VectorCmds.\");\r\n }\r\n await linear(this._sorter, this._devicePtr, msgVectors, this._sorterCallback);\r\n }\r\n\r\n public async batteryLevel(): Promise<number> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.BatteryLevelCmd);\r\n let batteryMsg = await batteryLevel(this._sorter, this._devicePtr, this._sorterCallback);\r\n if (batteryMsg.message?.deviceEvent?.batteryLevelReading) {\r\n let reading = batteryMsg.message?.deviceEvent?.batteryLevelReading;\r\n return reading.reading!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for batteryLevel: \" + batteryMsg);\r\n }\r\n\r\n public async rssiLevel(): Promise<number> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RSSILevelCmd);\r\n let rssiMsg = await rssiLevel(this._sorter, this._devicePtr, this._sorterCallback);\r\n if (rssiMsg.message?.deviceEvent?.rssiLevelReading) {\r\n return rssiMsg.message?.deviceEvent?.rssiLevelReading.reading!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for rssiLevel: \" + rssiMsg);\r\n }\r\n\r\n public async rawRead(endpoint: Buttplug.Endpoint, expectedLength: number, timeout: number): Promise<Uint8Array> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawReadCmd);\r\n let readingMsg = await rawRead(this._sorter, this._devicePtr, endpoint, expectedLength, timeout, this._sorterCallback);\r\n if (readingMsg.message?.deviceEvent?.rawReading) {\r\n return readingMsg.message.deviceEvent.rawReading.data!;\r\n }\r\n throw new ButtplugDeviceError(\"Wrong reply message received for rawRead: \" + readingMsg);\r\n }\r\n\r\n public async rawWrite(endpoint: Buttplug.Endpoint, data: Uint8Array, writeWithResponse: boolean): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawWriteCmd);\r\n await rawWrite(this._sorter, this._devicePtr, endpoint, data, writeWithResponse, this._sorterCallback);\r\n }\r\n\r\n public async rawSubscribe(endpoint: Buttplug.Endpoint): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawSubscribeCmd);\r\n await rawSubscribe(this._sorter, this._devicePtr, endpoint, this._sorterCallback);\r\n }\r\n\r\n public async rawUnsubscribe(endpoint: Buttplug.Endpoint): Promise<void> {\r\n this.checkAllowedMessageType(ButtplugDeviceMessageType.RawUnsubscribeCmd);\r\n await rawUnsubscribe(this._sorter, this._devicePtr, endpoint, this._sorterCallback);\r\n }\r\n\r\n public async stop(): Promise<void> {\r\n await stopDevice(this._sorter, this._devicePtr, this._sorterCallback);\r\n }\r\n\r\n public emitDisconnected() {\r\n this.emit(\"deviceremoved\");\r\n }\r\n}\r\n","/*!\r\n * Buttplug JS Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { Buttplug } from \"./buttplug_ffi.js\";\r\nimport { ButtplugClientConnectorError } from \"./errors.js\";\r\nimport { createClientPtr, createDevicePtr, connectEmbedded, connectWebsocket, startScanning, stopScanning, stopAllDevices, disconnect } from \"./ffi.js\";\r\nimport { ButtplugEmbeddedConnectorOptions, ButtplugWebsocketConnectorOptions } from \"./connectors.js\";\r\nimport { ButtplugMessageSorter } from \"./sorter.js\";\r\nimport { ButtplugClientDevice } from \"./device.js\";\r\nexport class ButtplugClient extends EventEmitter {\r\n protected _devices: Map<number, ButtplugClientDevice> = new Map();\r\n protected _clientName: string;\r\n // This will either be null, or our WASM heap pointer for our connected client object.\r\n private _clientPtr?: number = undefined;\r\n protected _isScanning = false;\r\n private _connected = false;\r\n private _sorter: ButtplugMessageSorter = new ButtplugMessageSorter();\r\n\r\n constructor(clientName: string = \"Generic Buttplug Client\") {\r\n super();\r\n this._clientName = clientName;\r\n this._clientPtr = createClientPtr(this.sorterCallback, clientName);\r\n }\r\n\r\n public get Connected(): boolean {\r\n return this._connected;\r\n }\r\n\r\n public get Devices(): ButtplugClientDevice[] {\r\n // While this function doesn't actually send a message, if we don't have a\r\n // connector, we shouldn't have devices.\r\n this.CheckConnector();\r\n const devices: ButtplugClientDevice[] = [];\r\n this._devices.forEach((d, i) => {\r\n devices.push(d);\r\n });\r\n return devices;\r\n }\r\n\r\n public get isScanning(): boolean {\r\n return this._isScanning;\r\n }\r\n\r\n public connect = async (options: ButtplugEmbeddedConnectorOptions | ButtplugWebsocketConnectorOptions): Promise<void> => {\r\n if (this._connected) {\r\n throw new ButtplugClientConnectorError(\"Client already connected.\");\r\n }\r\n if (options instanceof ButtplugEmbeddedConnectorOptions) {\r\n await connectEmbedded(this._sorter, this._clientPtr!, options, this.sorterCallback);\r\n } else if (options instanceof ButtplugWebsocketConnectorOptions) {\r\n await connectWebsocket(this._sorter, this._clientPtr!, options, this.sorterCallback);\r\n } else {\r\n throw new ButtplugClientConnectorError(\"Invalid connector type.\");\r\n }\r\n this._connected = true;\r\n }\r\n\r\n public disconnect = async () => {\r\n if (!this._clientPtr) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await disconnect(this._sorter, this._clientPtr, this.sorterCallback);\r\n }\r\n\r\n public startScanning = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n this._isScanning = true;\r\n await startScanning(this._sorter, this._clientPtr!, this.sorterCallback);\r\n }\r\n\r\n public stopScanning = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n this._isScanning = false;\r\n await stopScanning(this._sorter, this._clientPtr!, this.sorterCallback);\r\n }\r\n\r\n public stopAllDevices = async () => {\r\n if (!this._connected) {\r\n throw new ButtplugClientConnectorError(\"Not connected.\");\r\n }\r\n await stopAllDevices(this._sorter, this._clientPtr!, this.sorterCallback);\r\n }\r\n\r\n protected CheckConnector() {\r\n if (!this.Connected) {\r\n throw new ButtplugClientConnectorError(\"ButtplugClient not connected\");\r\n }\r\n }\r\n\r\n private sorterCallback = (buf: Uint8Array) => {\r\n const msg = Buttplug.ButtplugFFIServerMessage.decode(buf);\r\n if (msg.id > 0) {\r\n this._sorter.ParseIncomingMessages(msg);\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.deviceAdded) {\r\n const addedMsg = msg.message?.serverMessage?.deviceAdded;\r\n const devicePtr = createDevicePtr(this._clientPtr!, addedMsg.index!);\r\n const device = new ButtplugClientDevice(devicePtr!, this._sorter, this.sorterCallback, addedMsg.index!, addedMsg.name!, addedMsg.messageAttributes!);\r\n this._devices.set(addedMsg.index!, device);\r\n this.emit(\"deviceadded\", device);\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.deviceRemoved) {\r\n const removedMsg = msg.message?.serverMessage?.deviceRemoved;\r\n if (this._devices.has(removedMsg.index!)) {\r\n const removedDevice = this._devices.get(removedMsg.index!);\r\n removedDevice?.emitDisconnected();\r\n this._devices.delete(removedMsg.index!);\r\n this.emit(\"deviceremoved\", removedDevice);\r\n }\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.scanningFinished) {\r\n this._isScanning = false;\r\n this.emit(\"scanningfinished\");\r\n return;\r\n }\r\n if (msg.message?.serverMessage?.disconnect) {\r\n this._connected = false;\r\n this.emit(\"serverdisconnect\");\r\n }\r\n }\r\n}\r\n","/*!\r\n * Buttplug WASM Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright 2020-2021 (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\nexport * from \"./client.js\";\r\nexport * from \"./connectors.js\";\r\nexport * from \"./device.js\";\r\nexport * from \"./errors.js\";\r\nexport * from \"./ffi.js\";\r\nexport * from \"./sorter.js\";\r\nimport { Buttplug } from \"./buttplug_ffi.js\";\r\nexport import Endpoint = Buttplug.Endpoint;","/*!\r\n * Buttplug WASM Source Code File - Visit https://buttplug.io for more info about\r\n * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the\r\n * project root for full license information.\r\n *\r\n * @copyright Copyright 2020-2021 (c) Nonpolynomial Labs LLC. All rights reserved.\r\n */\r\n\r\n// Godawful hack for CDN support.\r\n//\r\n// Since users are used to being able to include the library off CDNs, I wanted\r\n// to keep supporting that with the new WASM package. Unfortunately WASM\r\n// requires webpack to chunk loading due to the async nature of WASM loads,\r\n// which means dynamic import() calls. In order to make sure the import always\r\n// includes itself on the correct domain, we have to:\r\n//\r\n// - Get the URL of the CDN we're on (via querying the currently processed\r\n// script. Hacky as hell.)\r\n// - Override Webpack's special __webpack_public_path__ variable with that path.\r\n// - Have the user call the buttplugInit() method to actually load the WASM\r\n// blob.\r\n//\r\n// Gross, but it does the job.\r\n\r\ndeclare var __webpack_public_path__: any;\r\n\r\nvar scripts = document.getElementsByTagName( \"script\" );\r\nvar lastScript = scripts[scripts.length - 1].src;\r\n__webpack_public_path__ = lastScript.substr(0, lastScript.lastIndexOf('/') + 1);\r\n\r\nexport * from \"./index.js\";"],"sourceRoot":""}
|