From 7cbda17d2656d8c0e7b6e9ad4f66268ed792898b Mon Sep 17 00:00:00 2001 From: Kevin Fitzgerald Date: Thu, 16 Jan 2020 15:33:13 -0600 Subject: [PATCH] Added farm link reporting routes --- dist/client.js | 56 +++++++++++++++++++++++++++++++++++++- dist/okanjo-sdk.js | 56 +++++++++++++++++++++++++++++++++++++- dist/okanjo-sdk.min.js | 4 +-- dist/okanjo-sdk.min.js.map | 2 +- package-lock.json | 2 +- package.json | 2 +- 6 files changed, 115 insertions(+), 7 deletions(-) diff --git a/dist/client.js b/dist/client.js index 239b4d4..38731bb 100644 --- a/dist/client.js +++ b/dist/client.js @@ -82,7 +82,7 @@ function Client(config) { /** * SDK Version */ -Client.Version = '3.4.0'; +Client.Version = '3.5.0'; /** * Expose the Provider base class @@ -2564,6 +2564,60 @@ Client.resourceBinders.push(function(Client) { }; + /** + * Reporting + * @namespace Client.farm.reporting + */ + Client.farm.reporting = { + + /** + * Returns a histogram of link metrics for time-series visualizations + * @param {object} [query] - Filter arguments + * @param {requestCallback} [callback] – Optional callback. When present, the request is executed + * @return {Query} - Compiled query ready for execution + * @memberof Client.reportings# + */ + link_date_histogram: function(query, callback) { + // Shift optional arguments, if necessary + if (typeof query === "function") { + callback = query; + query = undefined; + } + + return Client._makeRequest({ + api: 'farm', + action: 'reporting.link_date_histogram', + method: 'GET', + path: '/api/reporting/links/date-histogram', + query: query + }, callback); + }, + + /** + * Returns the top N results per aggregation group + * @param {object} [query] - Filter arguments + * @param {requestCallback} [callback] – Optional callback. When present, the request is executed + * @return {Query} - Compiled query ready for execution + * @memberof Client.reportings# + */ + link_top_n: function(query, callback) { + // Shift optional arguments, if necessary + if (typeof query === "function") { + callback = query; + query = undefined; + } + + return Client._makeRequest({ + api: 'farm', + action: 'reporting.link_top_n', + method: 'GET', + path: '/api/reporting/links/top-n', + query: query + }, callback); + } + + }; + /** * Vendors * @namespace Client.farm.vendors diff --git a/dist/okanjo-sdk.js b/dist/okanjo-sdk.js index 10c7b66..22ff2d0 100644 --- a/dist/okanjo-sdk.js +++ b/dist/okanjo-sdk.js @@ -1904,7 +1904,7 @@ function Client(config) { /** * SDK Version */ -Client.Version = '3.4.0'; +Client.Version = '3.5.0'; /** * Expose the Provider base class @@ -4386,6 +4386,60 @@ Client.resourceBinders.push(function(Client) { }; + /** + * Reporting + * @namespace Client.farm.reporting + */ + Client.farm.reporting = { + + /** + * Returns a histogram of link metrics for time-series visualizations + * @param {object} [query] - Filter arguments + * @param {requestCallback} [callback] – Optional callback. When present, the request is executed + * @return {Query} - Compiled query ready for execution + * @memberof Client.reportings# + */ + link_date_histogram: function(query, callback) { + // Shift optional arguments, if necessary + if (typeof query === "function") { + callback = query; + query = undefined; + } + + return Client._makeRequest({ + api: 'farm', + action: 'reporting.link_date_histogram', + method: 'GET', + path: '/api/reporting/links/date-histogram', + query: query + }, callback); + }, + + /** + * Returns the top N results per aggregation group + * @param {object} [query] - Filter arguments + * @param {requestCallback} [callback] – Optional callback. When present, the request is executed + * @return {Query} - Compiled query ready for execution + * @memberof Client.reportings# + */ + link_top_n: function(query, callback) { + // Shift optional arguments, if necessary + if (typeof query === "function") { + callback = query; + query = undefined; + } + + return Client._makeRequest({ + api: 'farm', + action: 'reporting.link_top_n', + method: 'GET', + path: '/api/reporting/links/top-n', + query: query + }, callback); + } + + }; + /** * Vendors * @namespace Client.farm.vendors diff --git a/dist/okanjo-sdk.min.js b/dist/okanjo-sdk.min.js index 0bb3f72..f58fd0d 100644 --- a/dist/okanjo-sdk.min.js +++ b/dist/okanjo-sdk.min.js @@ -1,3 +1,3 @@ -require=function(){function e(t,n,i){function a(o,s){if(!n[o]){if(!t[o]){var c="function"==typeof require&&require;if(!s&&c)return c(o,!0);if(r)return r(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var p=n[o]={exports:{}};t[o][0].call(p.exports,function(e){return a(t[o][1][e]||e)},p,p.exports,e,t,n,i)}return n[o].exports}for(var r="function"==typeof require&&require,o=0;o1)for(var n=1;n0&&u>c&&(u=c);for(var p=0;p=0?(d=l.substr(0,_),h=l.substr(_+1)):(d=l,h=""),m=decodeURIComponent(d),f=decodeURIComponent(h),i(o,m)?a(o[m])?o[m].push(f):o[m]=[o[m],f]:o[m]=f}return o};var a=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},{}],5:[function(e,t,n){"use strict";function i(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n.setImmediate="function"==typeof t?t:function(e){var t=u++,i=!(arguments.length<2)&&s.call(arguments,1);return c[t]=!0,r(function(){c[t]&&(i?e.apply(null,i):e.call(null),n.clearImmediate(t))}),t},n.clearImmediate="function"==typeof i?i:function(e){delete c[e]}}).call(this,e("timers").setImmediate,e("timers").clearImmediate)},{"process/browser.js":3,timers:7}],8:[function(e,t,n){t.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},{}],9:[function(e,t,n){(function(t,i){function a(e,t){var i={seen:[],stylize:o};return arguments.length>=3&&(i.depth=arguments[2]),arguments.length>=4&&(i.colors=arguments[3]),l(t)?i.showHidden=t:t&&n._extend(i,t),g(i.showHidden)&&(i.showHidden=!1),g(i.depth)&&(i.depth=2),g(i.colors)&&(i.colors=!1),g(i.customInspect)&&(i.customInspect=!0),i.colors&&(i.stylize=r),c(i,e,i.depth)}function r(e,t){var n=a.styles[t];return n?"["+a.colors[n][0]+"m"+e+"["+a.colors[n][1]+"m":e}function o(e,t){return e}function s(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function c(e,t,i){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var a=t.inspect(i,e);return k(a)||(a=c(e,a,i)),a}var r=u(e,t);if(r)return r;var o=Object.keys(t),l=s(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),b(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(t);if(0===o.length){if(E(t)){var _=t.name?": "+t.name:"";return e.stylize("[Function"+_+"]","special")}if(P(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(R(t))return e.stylize(Date.prototype.toString.call(t),"date");if(b(t))return p(t)}var y="",v=!1,q=["{","}"];if(f(t)&&(v=!0,q=["[","]"]),E(t)){y=" [Function"+(t.name?": "+t.name:"")+"]"}if(P(t)&&(y=" "+RegExp.prototype.toString.call(t)),R(t)&&(y=" "+Date.prototype.toUTCString.call(t)),b(t)&&(y=" "+p(t)),0===o.length&&(!v||0==t.length))return q[0]+y+q[1];if(i<0)return P(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var g;return g=v?d(e,t,i,l,o):o.map(function(n){return h(e,t,i,l,n,v)}),e.seen.pop(),m(g,y,q)}function u(e,t){if(g(t))return e.stylize("undefined","undefined");if(k(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return v(t)?e.stylize(""+t,"number"):l(t)?e.stylize(""+t,"boolean"):_(t)?e.stylize("null","null"):void 0}function p(e){return"["+Error.prototype.toString.call(e)+"]"}function d(e,t,n,i,a){for(var r=[],o=0,s=t.length;o-1&&(s=r?s.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+s.split("\n").map(function(e){return" "+e}).join("\n"))):s=e.stylize("[Circular]","special")),g(o)){if(r&&a.match(/^\d+$/))return s;o=JSON.stringify(""+a),o.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+s}function m(e,t,n){var i=0;return e.reduce(function(e,t){return i++,t.indexOf("\n")>=0&&i++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function f(e){return Array.isArray(e)}function l(e){return"boolean"==typeof e}function _(e){return null===e}function y(e){return null==e}function v(e){return"number"==typeof e}function k(e){return"string"==typeof e}function q(e){return"symbol"==typeof e}function g(e){return void 0===e}function P(e){return T(e)&&"[object RegExp]"===O(e)}function T(e){return"object"==typeof e&&null!==e}function R(e){return T(e)&&"[object Date]"===O(e)}function b(e){return T(e)&&("[object Error]"===O(e)||e instanceof Error)}function E(e){return"function"==typeof e}function w(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e}function O(e){return Object.prototype.toString.call(e)}function G(e){return e<10?"0"+e.toString(10):e.toString(10)}function S(){var e=new Date,t=[G(e.getHours()),G(e.getMinutes()),G(e.getSeconds())].join(":");return[e.getDate(),I[e.getMonth()],t].join(" ")}function x(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var z=/%[sdj%]/g;n.format=function(e){if(!k(e)){for(var t=[],n=0;n=r)return e;switch(e){case"%s":return String(i[n++]);case"%d":return Number(i[n++]);case"%j":try{return JSON.stringify(i[n++])}catch(e){return"[Circular]"}default:return e}}),s=i[n];n=this.maxConcurrency},i.prototype._queueRequest=function(e,t){var n=this._requestQueue,i=this._runQueueIfAble;return new Promise(function(a,r){n.push({query:e,callback:t,resolve:a,reject:r}),i()})},i.prototype._runQueueIfAble=function(){var e=this._handleRequest;if(this._requestQueue.length>0&&!this.areRequestsSaturated()){this._activeRequests++;var t=this._requestQueue.shift();return s(function(){e(t)})}},i.prototype._completeRequest=function(){this._activeRequests--,this._runQueueIfAble()},i.prototype.execute=function(e,t){return this._queueRequest(e,t)},i.prototype._handleRequest=function(e){var t=a({},e.query),n=t.options;delete t.options;var i={method:this.rpcMethod,body:JSON.stringify(e.query),credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8"}};n.signal&&(i.signal=n.signal);var r=this._completeRequest;return fetch(this.rpcHost+"?a="+encodeURIComponent(e.query.action),i).then(function(e){return e.json()}).then(function(t){return t.error?Promise.reject(t):e.callback?s(function(){r(),e.callback(null,t)}):(r(),e.resolve(t),Promise.resolve(t))}).catch(function(t){return t&&t.statusCode||(t={statusCode:503,error:t instanceof Error?t.message:t,message:"Something went wrong",attributes:{source:"okanjo.providers.FetchProvider",wrappedError:t}}),401===t.statusCode&&this._unauthorizedHook(t,e.query),e.callback?s(function(){r(),e.callback(t,null)}):(r(),e.reject(t),Promise.resolve(t))}.bind(this))},t.exports=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../provider":10,timers:7,util:9}],12:[function(e,t,n){function i(e,t){this.api=null,this.action=null,this.method=null,this.path="",this.pathParams={},this.query=null,this.payload=null,this.key=null,this.sessionToken=null,this.cookies={},this.options={},this._extend(e),this._extend(t,!0)}var a=e("./util"),r=e("querystring");i.prototype._extend=function(e,t){e&&(void 0!==e.api&&this.setAPI(e.api),void 0!==e.action&&this.setAction(e.action),void 0!==e.method&&this.setMethod(e.method),void 0!==e.path&&this.setPath(e.path),void 0!==e.pathParams&&this.setPathParams(e.pathParams),void 0!==e.query&&this.where(e.query),void 0!==e.payload&&this.data(e.payload),void 0!==e.cookies&&this.setCookies(e.cookies),void 0!==e.options&&this.setOptions(e.options),t&&(void 0!==e.key&&this.setKey(e.key),void 0!==e.sessionToken&&this.setSessionToken(e.sessionToken)))},i.prototype.getRealPath=function(){return a.buildPath(this.path,this.pathParams)},i.prototype.getFullPath=function(){var e=this.getRealPath();return e&&this.query?e+"?"+r.stringify(this.query):e},i.prototype.setAPI=function(e){return this.api=e,this},i.prototype.setAction=function(e){return this.action=e,this},i.prototype.setMethod=function(e){return this.method=e,this},i.prototype.setPath=function(e){return this.path=e,this},i.prototype.setPathParams=function(e){return this.pathParams=a.copy(this.pathParams,e),this},i.prototype.where=function(e){return this.query=a.copy(this.query,e),this},i.prototype.data=function(e){return this.payload=a.copy(this.payload,e),this},i.prototype.skip=function(e){return this.query=a.copy(this.query,{skip:e}),this},i.prototype.take=function(e){return this.query=a.copy(this.query,{take:e}),this},i.prototype.setKey=function(e){return this.key=e,this},i.prototype.setSessionToken=function(e){return this.sessionToken=e,this},i.prototype.setCookies=function(e){return this.cookies=e,this},i.prototype.setOptions=function(e){return this.options=e,this},t.exports=i},{"./util":13,querystring:6}],13:[function(e,t,n){function i(e,t){return null!==t&&"object"==typeof t?Array.isArray(t)?(e=e||[],t.forEach(function(t,n){e[n]=i(e[n],t)})):(e=e||{},Object.keys(t).forEach(function(n){e[n]=i(e[n],t[n])})):e=t,e}function a(e,t){for(var n,i,a,r=/{([a-zA-Z_]+)}/g,o=e;null!==(n=r.exec(e));){if(i=n[0],a=n[1],!t[a])return new Error("Path parameter "+i+" required to call "+e);o=o.replace(i,encodeURIComponent(t[a]))}return o}t.exports={copy:i,buildPath:a}},{}],"okanjo-sdk":[function(e,t,n){(function(n){function i(t){t="string"==typeof t?{key:t}:t||{},this.config=t,"function"==typeof t.provider?this.provider=new t.provider(this):n.browser?this.provider=new(e("../src/providers/fetch_provider"))(this):this.provider=new(e("../src/providers/http_provider"))(this);for(var a=0;a1)for(var n=1;n0&&u>c&&(u=c);for(var p=0;p=0?(d=l.substr(0,_),m=l.substr(_+1)):(d=l,m=""),h=decodeURIComponent(d),f=decodeURIComponent(m),i(o,h)?a(o[h])?o[h].push(f):o[h]=[o[h],f]:o[h]=f}return o};var a=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}},{}],5:[function(e,t,n){"use strict";function i(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n.setImmediate="function"==typeof t?t:function(e){var t=u++,i=!(arguments.length<2)&&s.call(arguments,1);return c[t]=!0,r(function(){c[t]&&(i?e.apply(null,i):e.call(null),n.clearImmediate(t))}),t},n.clearImmediate="function"==typeof i?i:function(e){delete c[e]}}).call(this,e("timers").setImmediate,e("timers").clearImmediate)},{"process/browser.js":3,timers:7}],8:[function(e,t,n){t.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},{}],9:[function(e,t,n){(function(t,i){function a(e,t){var i={seen:[],stylize:o};return arguments.length>=3&&(i.depth=arguments[2]),arguments.length>=4&&(i.colors=arguments[3]),l(t)?i.showHidden=t:t&&n._extend(i,t),g(i.showHidden)&&(i.showHidden=!1),g(i.depth)&&(i.depth=2),g(i.colors)&&(i.colors=!1),g(i.customInspect)&&(i.customInspect=!0),i.colors&&(i.stylize=r),c(i,e,i.depth)}function r(e,t){var n=a.styles[t];return n?"["+a.colors[n][0]+"m"+e+"["+a.colors[n][1]+"m":e}function o(e,t){return e}function s(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function c(e,t,i){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==n.inspect&&(!t.constructor||t.constructor.prototype!==t)){var a=t.inspect(i,e);return k(a)||(a=c(e,a,i)),a}var r=u(e,t);if(r)return r;var o=Object.keys(t),l=s(o);if(e.showHidden&&(o=Object.getOwnPropertyNames(t)),b(t)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return p(t);if(0===o.length){if(E(t)){var _=t.name?": "+t.name:"";return e.stylize("[Function"+_+"]","special")}if(T(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(R(t))return e.stylize(Date.prototype.toString.call(t),"date");if(b(t))return p(t)}var y="",v=!1,q=["{","}"];if(f(t)&&(v=!0,q=["[","]"]),E(t)){y=" [Function"+(t.name?": "+t.name:"")+"]"}if(T(t)&&(y=" "+RegExp.prototype.toString.call(t)),R(t)&&(y=" "+Date.prototype.toUTCString.call(t)),b(t)&&(y=" "+p(t)),0===o.length&&(!v||0==t.length))return q[0]+y+q[1];if(i<0)return T(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var g;return g=v?d(e,t,i,l,o):o.map(function(n){return m(e,t,i,l,n,v)}),e.seen.pop(),h(g,y,q)}function u(e,t){if(g(t))return e.stylize("undefined","undefined");if(k(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return v(t)?e.stylize(""+t,"number"):l(t)?e.stylize(""+t,"boolean"):_(t)?e.stylize("null","null"):void 0}function p(e){return"["+Error.prototype.toString.call(e)+"]"}function d(e,t,n,i,a){for(var r=[],o=0,s=t.length;o-1&&(s=r?s.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+s.split("\n").map(function(e){return" "+e}).join("\n"))):s=e.stylize("[Circular]","special")),g(o)){if(r&&a.match(/^\d+$/))return s;o=JSON.stringify(""+a),o.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+s}function h(e,t,n){var i=0;return e.reduce(function(e,t){return i++,t.indexOf("\n")>=0&&i++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function f(e){return Array.isArray(e)}function l(e){return"boolean"==typeof e}function _(e){return null===e}function y(e){return null==e}function v(e){return"number"==typeof e}function k(e){return"string"==typeof e}function q(e){return"symbol"==typeof e}function g(e){return void 0===e}function T(e){return P(e)&&"[object RegExp]"===O(e)}function P(e){return"object"==typeof e&&null!==e}function R(e){return P(e)&&"[object Date]"===O(e)}function b(e){return P(e)&&("[object Error]"===O(e)||e instanceof Error)}function E(e){return"function"==typeof e}function w(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e}function O(e){return Object.prototype.toString.call(e)}function G(e){return e<10?"0"+e.toString(10):e.toString(10)}function S(){var e=new Date,t=[G(e.getHours()),G(e.getMinutes()),G(e.getSeconds())].join(":");return[e.getDate(),I[e.getMonth()],t].join(" ")}function x(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var z=/%[sdj%]/g;n.format=function(e){if(!k(e)){for(var t=[],n=0;n=r)return e;switch(e){case"%s":return String(i[n++]);case"%d":return Number(i[n++]);case"%j":try{return JSON.stringify(i[n++])}catch(e){return"[Circular]"}default:return e}}),s=i[n];n=this.maxConcurrency},i.prototype._queueRequest=function(e,t){var n=this._requestQueue,i=this._runQueueIfAble;return new Promise(function(a,r){n.push({query:e,callback:t,resolve:a,reject:r}),i()})},i.prototype._runQueueIfAble=function(){var e=this._handleRequest;if(this._requestQueue.length>0&&!this.areRequestsSaturated()){this._activeRequests++;var t=this._requestQueue.shift();return s(function(){e(t)})}},i.prototype._completeRequest=function(){this._activeRequests--,this._runQueueIfAble()},i.prototype.execute=function(e,t){return this._queueRequest(e,t)},i.prototype._handleRequest=function(e){var t=a({},e.query),n=t.options;delete t.options;var i={method:this.rpcMethod,body:JSON.stringify(e.query),credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8"}};n.signal&&(i.signal=n.signal);var r=this._completeRequest;return fetch(this.rpcHost+"?a="+encodeURIComponent(e.query.action),i).then(function(e){return e.json()}).then(function(t){return t.error?Promise.reject(t):e.callback?s(function(){r(),e.callback(null,t)}):(r(),e.resolve(t),Promise.resolve(t))}).catch(function(t){return t&&t.statusCode||(t={statusCode:503,error:t instanceof Error?t.message:t,message:"Something went wrong",attributes:{source:"okanjo.providers.FetchProvider",wrappedError:t}}),401===t.statusCode&&this._unauthorizedHook(t,e.query),e.callback?s(function(){r(),e.callback(t,null)}):(r(),e.reject(t),Promise.resolve(t))}.bind(this))},t.exports=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../provider":10,timers:7,util:9}],12:[function(e,t,n){function i(e,t){this.api=null,this.action=null,this.method=null,this.path="",this.pathParams={},this.query=null,this.payload=null,this.key=null,this.sessionToken=null,this.cookies={},this.options={},this._extend(e),this._extend(t,!0)}var a=e("./util"),r=e("querystring");i.prototype._extend=function(e,t){e&&(void 0!==e.api&&this.setAPI(e.api),void 0!==e.action&&this.setAction(e.action),void 0!==e.method&&this.setMethod(e.method),void 0!==e.path&&this.setPath(e.path),void 0!==e.pathParams&&this.setPathParams(e.pathParams),void 0!==e.query&&this.where(e.query),void 0!==e.payload&&this.data(e.payload),void 0!==e.cookies&&this.setCookies(e.cookies),void 0!==e.options&&this.setOptions(e.options),t&&(void 0!==e.key&&this.setKey(e.key),void 0!==e.sessionToken&&this.setSessionToken(e.sessionToken)))},i.prototype.getRealPath=function(){return a.buildPath(this.path,this.pathParams)},i.prototype.getFullPath=function(){var e=this.getRealPath();return e&&this.query?e+"?"+r.stringify(this.query):e},i.prototype.setAPI=function(e){return this.api=e,this},i.prototype.setAction=function(e){return this.action=e,this},i.prototype.setMethod=function(e){return this.method=e,this},i.prototype.setPath=function(e){return this.path=e,this},i.prototype.setPathParams=function(e){return this.pathParams=a.copy(this.pathParams,e),this},i.prototype.where=function(e){return this.query=a.copy(this.query,e),this},i.prototype.data=function(e){return this.payload=a.copy(this.payload,e),this},i.prototype.skip=function(e){return this.query=a.copy(this.query,{skip:e}),this},i.prototype.take=function(e){return this.query=a.copy(this.query,{take:e}),this},i.prototype.setKey=function(e){return this.key=e,this},i.prototype.setSessionToken=function(e){return this.sessionToken=e,this},i.prototype.setCookies=function(e){return this.cookies=e,this},i.prototype.setOptions=function(e){return this.options=e,this},t.exports=i},{"./util":13,querystring:6}],13:[function(e,t,n){function i(e,t){return null!==t&&"object"==typeof t?Array.isArray(t)?(e=e||[],t.forEach(function(t,n){e[n]=i(e[n],t)})):(e=e||{},Object.keys(t).forEach(function(n){e[n]=i(e[n],t[n])})):e=t,e}function a(e,t){for(var n,i,a,r=/{([a-zA-Z_]+)}/g,o=e;null!==(n=r.exec(e));){if(i=n[0],a=n[1],!t[a])return new Error("Path parameter "+i+" required to call "+e);o=o.replace(i,encodeURIComponent(t[a]))}return o}t.exports={copy:i,buildPath:a}},{}],"okanjo-sdk":[function(e,t,n){(function(n){function i(t){t="string"==typeof t?{key:t}:t||{},this.config=t,"function"==typeof t.provider?this.provider=new t.provider(this):n.browser?this.provider=new(e("../src/providers/fetch_provider"))(this):this.provider=new(e("../src/providers/http_provider"))(this);for(var a=0;a 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],4:[function(require,module,exports){\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\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n},{}],5:[function(require,module,exports){\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 stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n},{\"./decode\":4,\"./encode\":5}],7:[function(require,module,exports){\n(function (setImmediate,clearImmediate){\nvar nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n}).call(this,require(\"timers\").setImmediate,require(\"timers\").clearImmediate)\n},{\"process/browser.js\":3,\"timers\":7}],8:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],9:[function(require,module,exports){\n(function (process,global){\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\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":8,\"_process\":3,\"inherits\":2}],10:[function(require,module,exports){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Request handler\n * @param {Client} [client]\n * @constructor\n */\nfunction Provider(client) {\n this.client = client;\n}\n\n/**\n * Compiles the query into an executable request\n * @param {Query} query – The query to build\n */\nProvider.prototype.compile = function(query) {\n var provider = this;\n\n // Attach execute function to the query\n query.execute = function(callback) {\n return provider.execute(query, callback);\n };\n\n // Future: Attach cache/execute function to the query\n};\n\n\n/**\n * Executes the query\n * @param {Query} query - The query to execute\n * @param {requestCallback} callback – Callback to fire when request is completed\n * @abstract\n */\nProvider.prototype.execute = function(query, callback) {\n //console.error('Okanjo Base Provider Execute:', query);\n callback(new Error('Transport provider not implemented'), null);\n};\n\n/**\n * Fires the client-given unauthorized hook in the event a response comes back 401-Unauthorized\n * which generally means, your session is dead, jim.\n * @param {object} err - The response payload\n * @param {Query} query - The offending query\n * @return {*}\n * @protected\n */\nProvider.prototype._unauthorizedHook = function(err, query) {\n if (typeof this.client.config.onUnauthorizedResponse === \"function\") {\n this.client.config.onUnauthorizedResponse(err, query);\n }\n};\n\n\n/**\n * @callback requestCallback\n * @param {object|null} error\n * @param {object|null} response\n */\n\nmodule.exports = Provider;\n},{}],11:[function(require,module,exports){\n(function (global){\n/*\n * Date: 10/20/16 4:30 PM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar util = require('util'),\n timers = require('timers'),\n setImmediate = global.setImmediate /* istanbul ignore next */ || timers.setImmediate,\n Provider = require('../provider');\n\n/**\n * Request handler\n * @param {Client} [client]\n * @constructor\n */\nfunction FetchProvider(client) {\n Provider.call(this, client);\n\n /**\n * Where to send requests to\n * @type {string}\n */\n this.rpcHost = client.config.rpcHost || \"/rpc\";\n\n /**\n * What method is the RPC router expecting\n * @type {string}\n */\n this.rpcMethod = client.config.rpcMethod || 'POST';\n\n /**\n * How many requests can be run in parallel at any given time. Additional requests will be queued.\n * @type {*|number}\n */\n this.maxConcurrency = client.config.maxConcurrency || 5;\n\n /**\n * Active request counter\n * @type {number}\n * @private\n */\n this._activeRequests = 0;\n\n /**\n * Request queue\n * @type {Array}\n * @private\n */\n this._requestQueue = [];\n\n this._handleRequest = this._handleRequest.bind(this);\n this._completeRequest = this._completeRequest.bind(this);\n this._runQueueIfAble = this._runQueueIfAble.bind(this);\n}\n\nutil.inherits(FetchProvider, Provider);\n\n/**\n * Returns whether the request pipeline is full (true) or not (false)\n * @returns {boolean}\n */\nFetchProvider.prototype.areRequestsSaturated = function() {\n return this._activeRequests >= this.maxConcurrency;\n};\n\n/**\n * Queues a new request. Will run it if able\n * @param query\n * @param callback\n * @returns {Promise}\n * @private\n */\nFetchProvider.prototype._queueRequest = function(query, callback) {\n var queue = this._requestQueue;\n var _runQueueIfAble = this._runQueueIfAble;\n\n return new Promise(function (resolve, reject) {\n queue.push({\n query: query,\n callback: callback,\n resolve: resolve,\n reject: reject\n });\n _runQueueIfAble();\n });\n};\n\n/**\n * Runs the next available item in the queue if concurrency not met\n * @private\n */\nFetchProvider.prototype._runQueueIfAble = function() {\n var _handleRequest = this._handleRequest;\n\n // Run any queued requests if able\n if (this._requestQueue.length > 0 && !this.areRequestsSaturated()) {\n\n // Bump request counter\n this._activeRequests++;\n\n // Take the one off the top\n var queuedRequest = this._requestQueue.shift();\n\n // Execute\n return setImmediate(function () {\n _handleRequest(queuedRequest);\n });\n }\n};\n\n/**\n * Hook for when a request completes. Will try to run the next task in the queue if able\n * @private\n */\nFetchProvider.prototype._completeRequest = function() {\n\n // Decrement request counter\n this._activeRequests--;\n\n // Handle the next available request\n this._runQueueIfAble();\n};\n\n/**\n * Executes the query\n * @param {Query} query - The query to execute\n * @param callback – Callback to fire when request is completed\n * @returns {Promise}\n * @abstract\n */\nFetchProvider.prototype.execute = function(query, callback) {\n // Queue this request (returns a promise, resolved when the req completes)\n return this._queueRequest(query, callback);\n};\n\n\n/* istanbul ignore next: taken from MDN, like it's the gospel */\n/**\n * Object.assign polyfill from MDN\n * @param target\n * @param varArgs\n * @return {any}\n */\nfunction assign(target, varArgs) { // .length of function is 2\n 'use strict';\n if (target === null || target === undefined) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var to = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var nextSource = arguments[index];\n\n if (nextSource !== null && nextSource !== undefined) {\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n}\n\n/**\n * Handles the request like execute() used to do\n * @param queuedRequest\n * @return {Promise}\n * @private\n */\nFetchProvider.prototype._handleRequest = function(queuedRequest) {\n\n // shallow copy the query so we can safely mutate it\n var payload = assign({}, queuedRequest.query);\n var options = payload.options;\n delete payload.options;\n\n var req = {\n method: this.rpcMethod,\n body: JSON.stringify(queuedRequest.query),\n credentials: 'same-origin', // preserve authentication\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json; charset=utf-8'\n }\n };\n\n // Hook for making fetch abortable, see: https://developers.google.com/web/updates/2017/09/abortable-fetch\n if (options.signal) req.signal = options.signal;\n\n var _completeRequest = this._completeRequest;\n\n return fetch(this.rpcHost + '?a=' + encodeURIComponent(queuedRequest.query.action), req)\n .then(function(res) {\n return res.json();\n })\n .then(function(res) {\n if (res.error) {\n // Error response from API\n return Promise.reject(res);\n } else {\n // Browserify should polyfill setImmediate\n if (queuedRequest.callback) {\n return setImmediate(function() {\n _completeRequest();\n queuedRequest.callback(null, res);\n });\n }\n _completeRequest();\n queuedRequest.resolve(res); // this goes back to caller\n return Promise.resolve(res); // internally resolve\n }\n })\n .catch(function(err) {\n if (!err || !err.statusCode) {\n err = {\n statusCode: 503,\n error: (err instanceof Error ? err.message : /* istanbul ignore next: not worth testing err vs stats */ err),\n message: \"Something went wrong\",\n attributes: {\n source: 'okanjo.providers.FetchProvider',\n wrappedError: err\n }\n };\n }\n\n // Check for unauthorized hook case\n if (err.statusCode === 401) this._unauthorizedHook(err, queuedRequest.query);\n\n if (queuedRequest.callback) {\n return setImmediate(function() {\n _completeRequest();\n queuedRequest.callback(err, null);\n });\n }\n\n _completeRequest();\n queuedRequest.reject(err); // this goes back to caller\n return Promise.resolve(err); // internally resolve\n }.bind(this))\n ;\n};\n\n\n/**\n * @callback requestCallback\n * @param {object|null} error\n * @param {object|null} response\n */\n\nmodule.exports = FetchProvider;\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../provider\":10,\"timers\":7,\"util\":9}],12:[function(require,module,exports){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar sdkUtil = require('./util'),\n querystring = require('querystring');\n\n/**\n * Query container\n * @param {object} [base] - Base query to clone\n * @param {object} [options] - Options to override\n * @constructor\n */\nfunction Query(base, options) {\n\n /**\n * The API in which the resource belongs to\n * @type {null}\n */\n this.api = null;\n\n /**\n * Resource method action / route id\n * @type {string}\n */\n this.action = null;\n\n /**\n * Request method\n * @example `GET` or `PUT` or `POST` or `DELETE`\n * @type {string}\n */\n this.method = null;\n\n /**\n * Request path\n * @type {string}\n */\n this.path = '';\n\n /**\n * Request path parameters\n * @type {object}\n */\n this.pathParams = {};\n\n /**\n * Request query arguments\n * @type {object|null}\n */\n this.query = null;\n\n /**\n * Request payload\n * @type {object|null}\n */\n this.payload = null;\n\n /**\n * API key\n * @type {null}\n */\n this.key = null;\n\n /**\n * Authorization token\n * @type {null}\n */\n this.sessionToken = null;\n\n /**\n * Cookies\n * @type {{}}\n */\n this.cookies = {};\n\n /**\n * SDK options, do not transmit\n * @type {{}}\n */\n this.options = {};\n\n this._extend(base);\n this._extend(options, true);\n}\n\n\n\n/**\n * Copies and clones properties from the given object\n * @param extra\n * @param overrideAll\n * @private\n */\nQuery.prototype._extend = function(extra, overrideAll) {\n if (extra) {\n if (extra.api !== undefined) this.setAPI(extra.api);\n if (extra.action !== undefined) this.setAction(extra.action);\n if (extra.method !== undefined) this.setMethod(extra.method);\n if (extra.path !== undefined) this.setPath(extra.path);\n if (extra.pathParams !== undefined) this.setPathParams(extra.pathParams);\n if (extra.query !== undefined) this.where(extra.query);\n if (extra.payload !== undefined) this.data(extra.payload);\n if (extra.cookies !== undefined) this.setCookies(extra.cookies);\n if (extra.options !== undefined) this.setOptions(extra.options);\n\n if (overrideAll) {\n if (extra.key !== undefined) this.setKey(extra.key);\n if (extra.sessionToken !== undefined) this.setSessionToken(extra.sessionToken);\n }\n }\n};\n\n\n/**\n * Returns the real URL path of the request\n * @return {string|Error}\n */\nQuery.prototype.getRealPath = function() {\n return sdkUtil.buildPath(this.path, this.pathParams);\n};\n\n\n/**\n * Returns the full URL path including the querystring\n * @return {string|Error}\n */\nQuery.prototype.getFullPath = function() {\n var path = this.getRealPath();\n if (path && this.query) {\n return path + '?' + querystring.stringify(this.query);\n } else {\n return path;\n }\n};\n\n/**\n * Sets the name of the API which handles the query\n * @param {string} api\n * @return {Query}\n */\nQuery.prototype.setAPI = function(api) { this.api = api; return this; };\n\n/**\n * Sets the method action / route id\n * @param {string} action\n * @return {Query}\n */\nQuery.prototype.setAction = function(action) { this.action = action; return this; };\n\n/**\n * Sets the HTTP method on the request\n * @param {string} method\n * @return {Query}\n */\nQuery.prototype.setMethod = function(method) { this.method = method; return this; };\n\n\n/**\n * Sets the URL path template on the request\n * @param {string} path\n * @return {Query}\n */\nQuery.prototype.setPath = function(path) { this.path = path; return this; };\n\n/**\n * Sets the URL path parameters on the request\n * @param {object} params\n * @return {Query}\n */\nQuery.prototype.setPathParams = function(params) { this.pathParams = sdkUtil.copy(this.pathParams, params); return this; };\n\n/**\n * Sets the query parameters on the request\n * @param {object} params\n * @return {Query}\n */\nQuery.prototype.where = function(params) { this.query = sdkUtil.copy(this.query, params); return this; };\n\n/**\n * Sets the payload on the request\n * @param {object} doc\n * @return {Query}\n */\nQuery.prototype.data = function(doc) { this.payload = sdkUtil.copy(this.payload, doc); return this; };\n\n/**\n * Sets the pagination skip count on the request\n * @param {number} count\n * @return {Query}\n */\nQuery.prototype.skip = function(count) { this.query = sdkUtil.copy(this.query, { skip: count }); return this; };\n\n/**\n * Sets the pagination return count on the request\n * @param {number} count\n * @return {Query}\n */\nQuery.prototype.take = function(count) { this.query = sdkUtil.copy(this.query, { take: count }); return this; };\n\n/**\n * Sets the API key to use on the request\n * @param {string} key\n * @return {Query}\n */\nQuery.prototype.setKey = function(key) { this.key = key; return this; };\n\n\n/**\n * Sets the authorization context of the request\n * @param {string} sessionToken\n * @return {Query}\n */\nQuery.prototype.setSessionToken = function(sessionToken) { this.sessionToken = sessionToken; return this; };\n\n/**\n * Sets cookies on the request\n * @param {*} cookies\n * @returns {Query}\n */\nQuery.prototype.setCookies = function(cookies) { this.cookies = cookies; return this; };\n\n/**\n * Sets sdk options for the request\n * @param {*} options\n * @returns {Query}\n */\nQuery.prototype.setOptions = function(options) { this.options = options; return this; };\n\nmodule.exports = Query;\n},{\"./util\":13,\"querystring\":6}],13:[function(require,module,exports){\n/*\n * Date: 1/26/16 12:01 PM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Simple, deep, key-value copier\n * @param {*} destination – Target object or empty to make brand new copy\n * @param {*} source – Object to make a duplicate of\n * @return {*} – The resulting object, which might be the same as dest unless source was a value not a reference\n * @author Kevin Fitzgerald\n */\nfunction copy(destination, source) {\n if (source !== null && typeof source === \"object\") {\n if (Array.isArray(source)) {\n destination = destination || [];\n source.forEach(function(val, index) {\n destination[index] = copy(destination[index], val);\n });\n } else {\n destination = destination || {};\n Object.keys(source).forEach(function(key) {\n destination[key] = copy(destination[key], source[key]);\n });\n }\n } else {\n destination = source;\n }\n\n return destination;\n}\n\n\n/**\n * Builds the final URL path given replaceable param names\n * @param {string} path - Route path\n * @param {object} params - Parameter key value pairs\n * @return {string|Error} Final path or Error if missing a parameter\n */\nfunction buildPath(path, params) {\n\n var extractParams = /{([a-zA-Z_]+)}/g,\n resultPath = path,\n p, token, name;\n\n // Pull out the expected parameters\n while ((p = extractParams.exec(path)) !== null) {\n\n token = p[0];\n name = p[1];\n\n // Make sure the param was given\n if (params[name]) {\n resultPath = resultPath.replace(token, encodeURIComponent(params[name]));\n } else {\n return new Error('Path parameter ' + token + ' required to call ' + path);\n }\n }\n\n return resultPath;\n}\n\n\n/**\n *\n * @type {{copy: copy}}\n */\nmodule.exports = {\n copy: copy,\n buildPath: buildPath\n};\n},{}],\"okanjo-sdk\":[function(require,module,exports){\n(function (process){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar Provider = require('../src/provider'),\n Query = require('../src/query');\n\n/**\n * SDK Base\n * @param {object} [config] Client options\n * @namespace\n * @constructor\n */\nfunction Client(config) {\n\n // Allow client to be initialized as: var api = new Client(\"api_key\");\n if (typeof config === \"string\") {\n config = {\n key: config\n };\n } else {\n config = config || {};\n }\n\n this.config = config;\n\n // Connect the right default provider based on runtime context\n if (typeof config.provider === \"function\") {\n // Context is provided in the config - use the constructor as-is\n this.provider = new config.provider(this);\n } else {\n // Detect context\n if (process.browser) {\n // Running in browser - default to proxy mode\n //this.provider = new (require('../src/providers/jquery_provider'))(this);\n this.provider = new (require('../src/providers/fetch_provider'))(this);\n } else {\n // Running in Node - Use the HTTP provider by default to make real requests\n this.provider = new (require('../src/providers/http_provider'))(this);\n }\n }\n\n // Attach resources\n for (var i = 0; i < Client.resourceBinders.length; i++) {\n Client.resourceBinders[i](this);\n }\n}\n\n/**\n * SDK Version\n */\nClient.Version = '3.4.0';\n\n/**\n * Expose the Provider base class\n * @type {Provider}\n */\nClient.Provider = Provider;\n\n/**\n * Expose the Query base class\n * @type {Query}\n */\nClient.Query = Query;\n\n\n/**\n * Routes a request through the client's registered transport provider\n * @param {object} spec - Query specifications\n * @param {function} callback\n * @return {Query} - A compiled query, ready to rock and roll, or be modified and executed yourself\n */\nClient.prototype._makeRequest = function(spec, callback) {\n\n // Build the query\n var query = new Query(this.config, spec);\n\n // Compile the query\n this.provider.compile(query);\n\n // If we have a callback, execute the request\n if (callback) {\n query.execute(callback);\n }\n\n // Return the query for reuse or manual execution\n return query;\n};\n\n/**\n * Container for resource binder functions\n * @type {Array}\n */\nClient.resourceBinders = [];\n\n\nmodule.exports = Client;\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n \n /**\n * Accounts\n * @namespace Client.accounts\n */\n Client.accounts = {\n \n /**\n * Registers a new Okanjo account\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.create',\n method: 'POST',\n path: '/accounts',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an account\n * @param {string} account_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n retrieve: function(account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.retrieve',\n method: 'GET',\n path: '/accounts/{account_id}',\n pathParams: {\n account_id: account_id\n }\n }, callback);\n },\n \n /**\n * Returns manageable accounts, or accounts on a given resource.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'account.list',\n method: 'GET',\n path: '/accounts',\n query: query\n }, callback);\n },\n \n /**\n * Updates an account\n * @param {string} account_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n update: function(account_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.update',\n method: 'PUT',\n path: '/accounts/{account_id}',\n pathParams: {\n account_id: account_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Requests a password reset for an account with the given email address\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n recover: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.recover',\n method: 'POST',\n path: '/accounts/recover',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an account's access control list. This provides an overview of what the account has access to.\n * @param {string} account_id – Account id for the acl to be retrieved.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n retrieve_acl: function(account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.retrieve_acl',\n method: 'GET',\n path: '/accounts/{account_id}/acl',\n pathParams: {\n account_id: account_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Ads\n * @namespace Client.ads\n */\n Client.ads = {\n \n /**\n * Returns content to fill a placement.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ads#\n */\n fill: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'ads.fill',\n method: 'POST',\n path: '/content',\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Articles\n * @namespace Client.articles\n */\n Client.articles = {\n \n /**\n * Creates an article for distribution\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.create',\n method: 'POST',\n path: '/articles',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an article\n * @param {string} url – URL of the article\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n retrieve: function(url, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.retrieve',\n method: 'GET',\n path: '/articles/{url}',\n pathParams: {\n url: url\n }\n }, callback);\n },\n \n /**\n * Lists articles that meet the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'article.list',\n method: 'GET',\n path: '/articles',\n query: query\n }, callback);\n },\n \n /**\n * Modifies an article\n * @param {string} url – URL of the article\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n update: function(url, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.update',\n method: 'PUT',\n path: '/articles/{url}',\n pathParams: {\n url: url\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Domains\n * @namespace Client.domains\n */\n Client.domains = {\n \n /**\n * Associates a domain with the property.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.create',\n method: 'POST',\n path: '/domains',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a domain with the given name.\n * @param {string} domain_name – Fully qualified domain name\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n retrieve: function(domain_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.retrieve',\n method: 'GET',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n }\n }, callback);\n },\n \n /**\n * List domains with the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'domain.list',\n method: 'GET',\n path: '/domains',\n query: query\n }, callback);\n },\n \n /**\n * Updates a domain with the given name.\n * @param {string} domain_name – Fully qualified domain name\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n update: function(domain_name, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.update',\n method: 'PUT',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Dissociates a domain from its associated property.\n * @param {string} domain_name – Fully qualified domain name\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n delete: function(domain_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.delete',\n method: 'DELETE',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n }\n }, callback);\n }\n \n };\n \n /**\n * Organizations\n * @namespace Client.organizations\n */\n Client.organizations = {\n \n /**\n * Creates a new organization under the current user.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.create',\n method: 'POST',\n path: '/organizations',\n payload: payload\n }, callback);\n },\n \n /**\n * Gets a particular organization if visible to the current user.\n * @param {string} org_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n retrieve: function(org_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.retrieve',\n method: 'GET',\n path: '/organizations/{org_id}',\n pathParams: {\n org_id: org_id\n }\n }, callback);\n },\n \n /**\n * Lists organizations visible to the current user.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'organization.list',\n method: 'GET',\n path: '/organizations',\n query: query\n }, callback);\n },\n \n /**\n * Updates an organization\n * @param {string} org_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n update: function(org_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.update',\n method: 'PUT',\n path: '/organizations/{org_id}',\n pathParams: {\n org_id: org_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Placements\n * @namespace Client.placements\n */\n Client.placements = {\n \n /**\n * Creates a ProductMatch placement\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.create',\n method: 'POST',\n path: '/placements',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n retrieve: function(placement_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.retrieve',\n method: 'GET',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n }\n }, callback);\n },\n \n /**\n * List ProductMatch placements\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'placement.list',\n method: 'GET',\n path: '/placements',\n query: query\n }, callback);\n },\n \n /**\n * Updates a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n update: function(placement_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.update',\n method: 'PUT',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n delete: function(placement_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.delete',\n method: 'DELETE',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n }\n }, callback);\n },\n \n /**\n * Creates a placement test, used for A-B testing.\n * @param {string} placement_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n create_test: function(placement_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.create_test',\n method: 'POST',\n path: '/placements/{placement_id}/tests',\n pathParams: {\n placement_id: placement_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a placement test.\n * @param {string} placement_id – Object identifier.\n * @param {string} placement_test_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n delete_test: function(placement_id, placement_test_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.delete_test',\n method: 'DELETE',\n path: '/placements/{placement_id}/tests/{placement_test_id}',\n pathParams: {\n placement_id: placement_id,\n placement_test_id: placement_test_id\n }\n }, callback);\n },\n \n /**\n * Updates a placement test.\n * @param {string} placement_id – Object identifier.\n * @param {string} placement_test_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n update_test: function(placement_id, placement_test_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.update_test',\n method: 'PUT',\n path: '/placements/{placement_id}/tests/{placement_test_id}',\n pathParams: {\n placement_id: placement_id,\n placement_test_id: placement_test_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Products\n * @namespace Client.products\n */\n Client.products = {\n \n /**\n * Creates a product\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.create',\n method: 'POST',\n path: '/products',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a product\n * @param {string} product_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n retrieve: function(product_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.retrieve',\n method: 'GET',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n }\n }, callback);\n },\n \n /**\n * Lists products\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'product.list',\n method: 'GET',\n path: '/products',\n query: query\n }, callback);\n },\n \n /**\n * Updates a product\n * @param {string} product_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n update: function(product_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.update',\n method: 'PUT',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a product\n * @param {string} product_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n delete: function(product_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.delete',\n method: 'DELETE',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Properties\n * @namespace Client.properties\n */\n Client.properties = {\n \n /**\n * Creates a new property.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.create',\n method: 'POST',\n path: '/properties',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a property.\n * @param {string} property_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n retrieve: function(property_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.retrieve',\n method: 'GET',\n path: '/properties/{property_id}',\n pathParams: {\n property_id: property_id\n }\n }, callback);\n },\n \n /**\n * Returns accessible properties.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'property.list',\n method: 'GET',\n path: '/properties',\n query: query\n }, callback);\n },\n \n /**\n * Updates a property.\n * @param {string} property_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n update: function(property_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.update',\n method: 'PUT',\n path: '/properties/{property_id}',\n pathParams: {\n property_id: property_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Reporting\n * @namespace Client.reporting\n */\n Client.reporting = {\n \n /**\n * Returns a histogram of page metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n page_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.page_date_histogram',\n method: 'GET',\n path: '/reporting/pages/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n page_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.page_top_n',\n method: 'GET',\n path: '/reporting/pages/top-n',\n query: query\n }, callback);\n },\n \n /**\n * Returns a histogram of resource metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n resource_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.resource_date_histogram',\n method: 'GET',\n path: '/reporting/resources/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n resource_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.resource_top_n',\n method: 'GET',\n path: '/reporting/resources/top-n',\n query: query\n }, callback);\n },\n \n /**\n * Returns a histogram of widget metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n widget_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.widget_date_histogram',\n method: 'GET',\n path: '/reporting/widgets/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n widget_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.widget_top_n',\n method: 'GET',\n path: '/reporting/widgets/top-n',\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Resource Sets\n * @namespace Client.resource_sets\n */\n Client.resource_sets = {\n \n /**\n * Creates a new resource set.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.create',\n method: 'POST',\n path: '/resource-sets',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a resource set with the given name.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n retrieve: function(resource_set_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.retrieve',\n method: 'GET',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n }\n }, callback);\n },\n \n /**\n * List resource sets with the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.list',\n method: 'GET',\n path: '/resource-sets',\n query: query\n }, callback);\n },\n \n /**\n * Updates a resource set with the given name.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n update: function(resource_set_name, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.update',\n method: 'PUT',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a resource set.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n delete: function(resource_set_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.delete',\n method: 'DELETE',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n }\n }, callback);\n }\n \n };\n \n /**\n * Roles\n * @namespace Client.roles\n */\n Client.roles = {\n \n /**\n * Creates a role for the given resource\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.create',\n method: 'POST',\n path: '/roles',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a role.\n * @param {string} role_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n retrieve: function(role_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.retrieve',\n method: 'GET',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n }\n }, callback);\n },\n \n /**\n * Retrieves roles on a given resource.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'role.list',\n method: 'GET',\n path: '/roles',\n query: query\n }, callback);\n },\n \n /**\n * Updates a role\n * @param {string} role_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n update: function(role_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.update',\n method: 'PUT',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a role\n * @param {string} role_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n delete: function(role_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.delete',\n method: 'DELETE',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n }\n }, callback);\n },\n \n /**\n * Adds an account to a role.\n * @param {string} role_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n add_account: function(role_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.add_account',\n method: 'POST',\n path: '/roles/{role_id}/members',\n pathParams: {\n role_id: role_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * List accounts that belong to a role.\n * @param {string} role_id – Object identifier.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n list_accounts: function(role_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'role.list_accounts',\n method: 'GET',\n path: '/roles/{role_id}/members',\n pathParams: {\n role_id: role_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Removes an account from a role.\n * @param {string} role_id – Object identifier.\n * @param {string} account_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n remove_account: function(role_id, account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.remove_account',\n method: 'DELETE',\n path: '/roles/{role_id}/members/{account_id}',\n pathParams: {\n role_id: role_id,\n account_id: account_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Account Sessions\n * @namespace Client.sessions\n */\n Client.sessions = {\n \n /**\n * Starts a new account session\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.create',\n method: 'POST',\n path: '/accounts/sessions',\n payload: payload\n }, callback);\n },\n \n /**\n * Gets an particular session.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n retrieve: function(account_id, session_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.retrieve',\n method: 'GET',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n }\n }, callback);\n },\n \n /**\n * Returns past and present sessions belonging to the account.\n * @param {string} account_id – Object identifier.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n list: function(account_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'session.list',\n method: 'GET',\n path: '/accounts/{account_id}/sessions',\n pathParams: {\n account_id: account_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Updates a session belonging to the account.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n update: function(account_id, session_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.update',\n method: 'PUT',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Closes the session, invalidating the `session_token`. The status of the session will become `ended`.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n delete: function(account_id, session_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.delete',\n method: 'DELETE',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Stores\n * @namespace Client.stores\n */\n Client.stores = {\n \n /**\n * Creates a new store.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.create',\n method: 'POST',\n path: '/stores',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a store.\n * @param {string} store_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n retrieve: function(store_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.retrieve',\n method: 'GET',\n path: '/stores/{store_id}',\n pathParams: {\n store_id: store_id\n }\n }, callback);\n },\n \n /**\n * Retrieves accessible stores.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'store.list',\n method: 'GET',\n path: '/stores',\n query: query\n }, callback);\n },\n \n /**\n * Updates a store.\n * @param {string} store_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n update: function(store_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.update',\n method: 'PUT',\n path: '/stores/{store_id}',\n pathParams: {\n store_id: store_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n Client.farm = {};\n \n \n /**\n * Activity\n * @namespace Client.farm.activities\n */\n Client.farm.activities = {\n \n /**\n * Lists the most recent events generated by curators.\n * @param {string} instance_id – Instance Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.activities#\n */\n list: function(instance_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'activity.list',\n method: 'GET',\n path: '/api/{instance_id}/activity',\n pathParams: {\n instance_id: instance_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Amazon Links\n * @namespace Client.farm.amazon_links\n */\n Client.farm.amazon_links = {\n \n /**\n * Creates a new Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.create',\n method: 'POST',\n path: '/api/{instance_id}/links/amazon',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an existing Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n retrieve: function(instance_id, vendor_id_asin, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n }\n }, callback);\n },\n \n /**\n * Returns Amazon links that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.list',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Update an existing Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n update: function(instance_id, vendor_id_asin, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.update',\n method: 'PUT',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Follows the Amazon link to the offer page, or finds a replacement if no longer available.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n follow: function(instance_id, vendor_id_asin, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.follow',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}/follow',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n query: query\n }, callback);\n },\n \n /**\n * Returns Amazon offers that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n search: function(instance_id, vendor_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.search',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/amazon-search',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Tracks an image impression for the given Amazon link\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n track_impression: function(instance_id, vendor_id_asin, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.track_impression',\n method: 'GET',\n path: '/images/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n query: query\n }, callback);\n },\n \n /**\n * Deletes an Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n delete: function(instance_id, vendor_id_asin, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n }\n }, callback);\n }\n \n };\n \n /**\n * Buckets\n * @namespace Client.farm.buckets\n */\n Client.farm.buckets = {\n \n /**\n * Create a new bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.create',\n method: 'POST',\n path: '/api/{instance_id}/buckets',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Returns a specific bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n retrieve: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Returns a list of buckets.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.list',\n method: 'GET',\n path: '/api/{instance_id}/buckets',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Make changes to a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n update: function(instance_id, bucket_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.update',\n method: 'PUT',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n delete: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Fills a bucket to capacity with recommended offers.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n backfill: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.backfill',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/do-backfill',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Gets the current state of the offers within the bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n status: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.status',\n method: 'GET',\n path: '/api/{instance_id}/buckets/{bucket_id}/status',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Toggles AI recommendations ON if currently disabled, or OFF if currently enabled.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n toggle_ai: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.toggle_ai',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/toggle-ai',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Toggles AI automation ON if currently disabled, or OFF if currently enabled.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n toggle_ai_automation: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.toggle_ai_automation',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/toggle-ai-automation',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Remove all offers from a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n truncate: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.truncate',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/truncate',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Bucket Items\n * @namespace Client.farm.bucket_items\n */\n Client.farm.bucket_items = {\n \n /**\n * Adds the given list of offers to a bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.bucket_items#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket_item.create',\n method: 'POST',\n path: '/api/{instance_id}/bucket-items',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a list of offers from a bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.bucket_items#\n */\n delete: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket_item.delete',\n method: 'POST',\n path: '/api/{instance_id}/bucket-items/delete',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Categories\n * @namespace Client.farm.categories\n */\n Client.farm.categories = {\n \n /**\n * Returns a list of merchant category mappings by vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {string} merchant_id – Vendor merchant identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.categories#\n */\n list: function(instance_id, vendor_id, merchant_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'category.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants/{merchant_id}/categories',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id,\n merchant_id: merchant_id\n }\n }, callback);\n },\n \n /**\n * Adds or updates a vendor-merchant category mapping\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {string} merchant_id – Vendor merchant identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.categories#\n */\n upsert: function(instance_id, vendor_id, merchant_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'category.upsert',\n method: 'POST',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants/{merchant_id}/categories',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id,\n merchant_id: merchant_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Correlations\n * @namespace Client.farm.correlations\n */\n Client.farm.correlations = {\n \n /**\n * Sets an offer's augmentation data.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.correlations#\n */\n update: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'correlation.update',\n method: 'PUT',\n path: '/api/{instance_id}/correlations',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Direct Links\n * @namespace Client.farm.direct_links\n */\n Client.farm.direct_links = {\n \n /**\n * Creates a new direct link.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.create',\n method: 'POST',\n path: '/api/{instance_id}/links',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an existing direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n retrieve: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Returns direct links that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.list',\n method: 'GET',\n path: '/api/{instance_id}/links',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Update an existing direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n update: function(instance_id, vendor_offer_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.update',\n method: 'PUT',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n delete: function(instance_id, vendor_offer_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n }\n }, callback);\n },\n \n /**\n * Follows the direct offer link to the offer page, or finds a replacement if no longer available.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n follow: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.follow',\n method: 'GET',\n path: '/api/{instance_id}/links/{vendor_offer_id}/follow',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Tracks an image impression for the given offer\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n track_impression: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.track_impression',\n method: 'GET',\n path: '/images/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Instances\n * @namespace Client.farm.instances\n */\n Client.farm.instances = {\n \n /**\n * Creates a new instance of the farm.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.create',\n method: 'POST',\n path: '/api/instances',\n payload: payload\n }, callback);\n },\n \n /**\n * Returns a given farm instance.\n * @param {string} instance_id – Instance Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n retrieve: function(instance_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.retrieve',\n method: 'GET',\n path: '/api/instances/{instance_id}',\n pathParams: {\n instance_id: instance_id\n }\n }, callback);\n },\n \n /**\n * Returns accessible farm instances\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'instance.list',\n method: 'GET',\n path: '/api/instances',\n query: query\n }, callback);\n },\n \n /**\n * Updates a farm instance.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n update: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.update',\n method: 'PUT',\n path: '/api/instances/{instance_id}',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Vendors\n * @namespace Client.farm.merchants\n */\n Client.farm.merchants = {\n \n /**\n * Returns a list of merchants belonging to the vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.merchants#\n */\n list: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'merchants.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Offers\n * @namespace Client.farm.offers\n */\n Client.farm.offers = {\n \n /**\n * Returns an offer given its canonical id\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.offers#\n */\n retrieve: function(instance_id, vendor_offer_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'offer.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/offers/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n }\n }, callback);\n },\n \n /**\n * List and filter offers.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.offers#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'offer.list',\n method: 'GET',\n path: '/api/{instance_id}/offers',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Recommended Offers\n * @namespace Client.farm.recommended_offers\n */\n Client.farm.recommended_offers = {\n \n /**\n * List and filter recommended offers.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.recommended_offers#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'recommended_offer.list',\n method: 'GET',\n path: '/api/{instance_id}/ai/offers',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Vendors\n * @namespace Client.farm.vendors\n */\n Client.farm.vendors = {\n \n /**\n * Returns detailed information about a vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n retrieve: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n },\n \n /**\n * Returns a list of vendors.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Updates a vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n update: function(instance_id, vendor_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.update',\n method: 'PUT',\n path: '/api/{instance_id}/vendors/{vendor_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Resynchronizes all offers associated with the vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n resync: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.resync',\n method: 'POST',\n path: '/api/{instance_id}/vendors/{vendor_id}/resync',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n Client.shortcodes = {};\n \n \n /**\n * Reporting\n * @namespace Client.shortcodes.reporting\n */\n Client.shortcodes.reporting = {\n \n /**\n * Returns a histogram of link metrics for time-series visualizations\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'reporting.date_histogram',\n method: 'GET',\n path: '/api/reporting/clicks/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'reporting.top_n',\n method: 'GET',\n path: '/api/reporting/clicks/top-n',\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Shortcodes\n * @namespace Client.shortcodes.shortcodes\n */\n Client.shortcodes.shortcodes = {\n \n /**\n * Creates a new shortcode.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.create',\n method: 'POST',\n path: '/api/shortcodes',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n retrieve: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.retrieve',\n method: 'GET',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n },\n \n /**\n * Lists shortcode.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.list',\n method: 'GET',\n path: '/api/shortcodes',\n query: query\n }, callback);\n },\n \n /**\n * Updates a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n update: function(shortcode, payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.update',\n method: 'PUT',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n delete: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.delete',\n method: 'DELETE',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n },\n \n /**\n * Follows the shortcode URL link.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n follow: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.follow',\n method: 'GET',\n path: '/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n }\n \n };\n \n /**\n * Workspace\n * @namespace Client.shortcodes.workspaces\n */\n Client.shortcodes.workspaces = {\n \n /**\n * Creates a new workspace.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.create',\n method: 'POST',\n path: '/api/workspaces',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n retrieve: function(workspace_id, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.retrieve',\n method: 'GET',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n }\n }, callback);\n },\n \n /**\n * Lists workspaces.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.list',\n method: 'GET',\n path: '/api/workspaces',\n query: query\n }, callback);\n },\n \n /**\n * Updates a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n update: function(workspace_id, payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.update',\n method: 'PUT',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n delete: function(workspace_id, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.delete',\n method: 'DELETE',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n }\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n \n /**\n * Session\n * @namespace Client.sso\n */\n Client.sso = {\n \n /**\n * Authenticates a user session\n * @param {string} prefix – Environment login path\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n login: function(prefix, payload, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.login',\n method: 'POST',\n path: '/{prefix}/api/sessions',\n pathParams: {\n prefix: prefix\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Terminates the given session\n * @param {string} prefix – Environment login path\n * @param {string} sid – Session identifier\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n logout: function(prefix, sid, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.logout',\n method: 'DELETE',\n path: '/{prefix}/api/sessions/{sid}',\n pathParams: {\n prefix: prefix,\n sid: sid\n }\n }, callback);\n },\n \n /**\n * Starts the account recovery process\n * @param {string} prefix – Environment login path\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n recover: function(prefix, payload, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.recover',\n method: 'POST',\n path: '/{prefix}/api/recover',\n pathParams: {\n prefix: prefix\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Gets the session state if still valid\n * @param {string} prefix – Environment login path\n * @param {string} sso_token – Session identifier\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n validate: function(prefix, sso_token, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.validate',\n method: 'GET',\n path: '/{prefix}/api/sessions/{sso_token}',\n pathParams: {\n prefix: prefix,\n sso_token: sso_token\n }\n }, callback);\n }\n \n };\n \n\n});\n}).call(this,require('_process'))\n},{\"../src/provider\":10,\"../src/providers/fetch_provider\":11,\"../src/providers/http_provider\":1,\"../src/query\":12,\"_process\":3}]},{},[]);\n"]} \ No newline at end of file +{"version":3,"sources":["okanjo-sdk.min.js"],"names":["require","r","e","n","t","o","i","f","c","u","a","Error","code","p","exports","call","length","1","module","2","Object","create","ctor","superCtor","super_","prototype","constructor","value","enumerable","writable","configurable","TempCtor","3","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","this","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","len","run","Item","array","noop","process","nextTick","args","Array","arguments","push","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","4","hasOwnProperty","obj","prop","qs","sep","eq","options","regexp","split","maxKeys","kstr","vstr","k","v","x","replace","idx","indexOf","substr","decodeURIComponent","isArray","xs","toString","5","map","res","stringifyPrimitive","isFinite","undefined","objectKeys","ks","encodeURIComponent","join","keys","key","6","decode","parse","encode","stringify","./decode","./encode","7","setImmediate","clearImmediate","Timeout","id","clearFn","_id","_clearFn","Function","slice","immediateIds","nextImmediateId","window","setInterval","clearInterval","close","unref","ref","enroll","item","msecs","_idleTimeoutId","_idleTimeout","unenroll","_unrefActive","active","_onTimeout","fn","process/browser.js","timers","8","arg","copy","fill","readUInt8","9","global","inspect","opts","ctx","seen","stylize","stylizeNoColor","depth","colors","isBoolean","showHidden","_extend","isUndefined","customInspect","stylizeWithColor","formatValue","str","styleType","style","styles","arrayToHash","hash","forEach","val","recurseTimes","isFunction","ret","isString","primitive","formatPrimitive","visibleKeys","getOwnPropertyNames","isError","formatError","isRegExp","RegExp","isDate","Date","base","braces","toUTCString","output","formatArray","formatProperty","pop","reduceToSingleString","simple","JSON","isNumber","isNull","l","String","match","desc","getOwnPropertyDescriptor","get","set","line","numLinesEst","reduce","prev","cur","ar","isNullOrUndefined","isSymbol","re","isObject","objectToString","d","isPrimitive","pad","timestamp","time","getHours","getMinutes","getSeconds","getDate","months","getMonth","formatRegExp","format","objects","Number","_","deprecate","msg","deprecated","warned","throwDeprecation","traceDeprecation","console","trace","error","noDeprecation","debugEnviron","debugs","debuglog","NODE_DEBUG","toUpperCase","test","pid","bold","italic","underline","inverse","white","grey","black","blue","cyan","green","magenta","red","yellow","special","number","boolean","null","string","date","isBuffer","log","inherits","origin","add","self","./support/isBuffer","_process","10","Provider","client","compile","query","provider","execute","callback","_unauthorizedHook","err","config","onUnauthorizedResponse","11","FetchProvider","rpcHost","rpcMethod","maxConcurrency","_activeRequests","_requestQueue","_handleRequest","bind","_completeRequest","_runQueueIfAble","assign","target","varArgs","TypeError","to","index","nextSource","nextKey","util","areRequestsSaturated","_queueRequest","Promise","resolve","reject","queuedRequest","shift","payload","req","method","body","credentials","headers","Accept","Content-Type","signal","fetch","action","then","json","catch","statusCode","message","attributes","source","wrappedError","../provider","12","Query","api","path","pathParams","sessionToken","cookies","sdkUtil","querystring","extra","overrideAll","setAPI","setAction","setMethod","setPath","setPathParams","where","data","setCookies","setOptions","setKey","setSessionToken","getRealPath","buildPath","getFullPath","params","doc","skip","count","take","./util","13","destination","token","extractParams","resultPath","exec","okanjo-sdk","Client","resourceBinders","Version","_makeRequest","spec","accounts","retrieve","account_id","list","update","recover","retrieve_acl","ads","articles","url","domains","domain_name","delete","organizations","org_id","placements","placement_id","create_test","delete_test","placement_test_id","update_test","products","product_id","properties","property_id","reporting","page_date_histogram","page_top_n","resource_date_histogram","resource_top_n","widget_date_histogram","widget_top_n","resource_sets","resource_set_name","roles","role_id","add_account","list_accounts","remove_account","sessions","session_id","stores","store_id","farm","activities","instance_id","amazon_links","vendor_id_asin","follow","search","vendor_id","track_impression","buckets","bucket_id","backfill","status","toggle_ai","toggle_ai_automation","truncate","bucket_items","categories","merchant_id","upsert","correlations","direct_links","vendor_offer_id","instances","merchants","offers","recommended_offers","link_date_histogram","link_top_n","vendors","resync","shortcodes","date_histogram","top_n","shortcode","workspaces","workspace_id","sso","login","prefix","logout","sid","validate","sso_token","../src/provider","../src/providers/fetch_provider","../src/providers/http_provider","../src/query"],"mappings":"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","file":"okanjo-sdk.min.js","sourcesContent":["require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],4:[function(require,module,exports){\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\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n},{}],5:[function(require,module,exports){\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 stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n},{\"./decode\":4,\"./encode\":5}],7:[function(require,module,exports){\n(function (setImmediate,clearImmediate){\nvar nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};\n}).call(this,require(\"timers\").setImmediate,require(\"timers\").clearImmediate)\n},{\"process/browser.js\":3,\"timers\":7}],8:[function(require,module,exports){\nmodule.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}\n},{}],9:[function(require,module,exports){\n(function (process,global){\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\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./support/isBuffer\":8,\"_process\":3,\"inherits\":2}],10:[function(require,module,exports){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Request handler\n * @param {Client} [client]\n * @constructor\n */\nfunction Provider(client) {\n this.client = client;\n}\n\n/**\n * Compiles the query into an executable request\n * @param {Query} query – The query to build\n */\nProvider.prototype.compile = function(query) {\n var provider = this;\n\n // Attach execute function to the query\n query.execute = function(callback) {\n return provider.execute(query, callback);\n };\n\n // Future: Attach cache/execute function to the query\n};\n\n\n/**\n * Executes the query\n * @param {Query} query - The query to execute\n * @param {requestCallback} callback – Callback to fire when request is completed\n * @abstract\n */\nProvider.prototype.execute = function(query, callback) {\n //console.error('Okanjo Base Provider Execute:', query);\n callback(new Error('Transport provider not implemented'), null);\n};\n\n/**\n * Fires the client-given unauthorized hook in the event a response comes back 401-Unauthorized\n * which generally means, your session is dead, jim.\n * @param {object} err - The response payload\n * @param {Query} query - The offending query\n * @return {*}\n * @protected\n */\nProvider.prototype._unauthorizedHook = function(err, query) {\n if (typeof this.client.config.onUnauthorizedResponse === \"function\") {\n this.client.config.onUnauthorizedResponse(err, query);\n }\n};\n\n\n/**\n * @callback requestCallback\n * @param {object|null} error\n * @param {object|null} response\n */\n\nmodule.exports = Provider;\n},{}],11:[function(require,module,exports){\n(function (global){\n/*\n * Date: 10/20/16 4:30 PM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar util = require('util'),\n timers = require('timers'),\n setImmediate = global.setImmediate /* istanbul ignore next */ || timers.setImmediate,\n Provider = require('../provider');\n\n/**\n * Request handler\n * @param {Client} [client]\n * @constructor\n */\nfunction FetchProvider(client) {\n Provider.call(this, client);\n\n /**\n * Where to send requests to\n * @type {string}\n */\n this.rpcHost = client.config.rpcHost || \"/rpc\";\n\n /**\n * What method is the RPC router expecting\n * @type {string}\n */\n this.rpcMethod = client.config.rpcMethod || 'POST';\n\n /**\n * How many requests can be run in parallel at any given time. Additional requests will be queued.\n * @type {*|number}\n */\n this.maxConcurrency = client.config.maxConcurrency || 5;\n\n /**\n * Active request counter\n * @type {number}\n * @private\n */\n this._activeRequests = 0;\n\n /**\n * Request queue\n * @type {Array}\n * @private\n */\n this._requestQueue = [];\n\n this._handleRequest = this._handleRequest.bind(this);\n this._completeRequest = this._completeRequest.bind(this);\n this._runQueueIfAble = this._runQueueIfAble.bind(this);\n}\n\nutil.inherits(FetchProvider, Provider);\n\n/**\n * Returns whether the request pipeline is full (true) or not (false)\n * @returns {boolean}\n */\nFetchProvider.prototype.areRequestsSaturated = function() {\n return this._activeRequests >= this.maxConcurrency;\n};\n\n/**\n * Queues a new request. Will run it if able\n * @param query\n * @param callback\n * @returns {Promise}\n * @private\n */\nFetchProvider.prototype._queueRequest = function(query, callback) {\n var queue = this._requestQueue;\n var _runQueueIfAble = this._runQueueIfAble;\n\n return new Promise(function (resolve, reject) {\n queue.push({\n query: query,\n callback: callback,\n resolve: resolve,\n reject: reject\n });\n _runQueueIfAble();\n });\n};\n\n/**\n * Runs the next available item in the queue if concurrency not met\n * @private\n */\nFetchProvider.prototype._runQueueIfAble = function() {\n var _handleRequest = this._handleRequest;\n\n // Run any queued requests if able\n if (this._requestQueue.length > 0 && !this.areRequestsSaturated()) {\n\n // Bump request counter\n this._activeRequests++;\n\n // Take the one off the top\n var queuedRequest = this._requestQueue.shift();\n\n // Execute\n return setImmediate(function () {\n _handleRequest(queuedRequest);\n });\n }\n};\n\n/**\n * Hook for when a request completes. Will try to run the next task in the queue if able\n * @private\n */\nFetchProvider.prototype._completeRequest = function() {\n\n // Decrement request counter\n this._activeRequests--;\n\n // Handle the next available request\n this._runQueueIfAble();\n};\n\n/**\n * Executes the query\n * @param {Query} query - The query to execute\n * @param callback – Callback to fire when request is completed\n * @returns {Promise}\n * @abstract\n */\nFetchProvider.prototype.execute = function(query, callback) {\n // Queue this request (returns a promise, resolved when the req completes)\n return this._queueRequest(query, callback);\n};\n\n\n/* istanbul ignore next: taken from MDN, like it's the gospel */\n/**\n * Object.assign polyfill from MDN\n * @param target\n * @param varArgs\n * @return {any}\n */\nfunction assign(target, varArgs) { // .length of function is 2\n 'use strict';\n if (target === null || target === undefined) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var to = Object(target);\n\n for (var index = 1; index < arguments.length; index++) {\n var nextSource = arguments[index];\n\n if (nextSource !== null && nextSource !== undefined) {\n for (var nextKey in nextSource) {\n // Avoid bugs when hasOwnProperty is shadowed\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n}\n\n/**\n * Handles the request like execute() used to do\n * @param queuedRequest\n * @return {Promise}\n * @private\n */\nFetchProvider.prototype._handleRequest = function(queuedRequest) {\n\n // shallow copy the query so we can safely mutate it\n var payload = assign({}, queuedRequest.query);\n var options = payload.options;\n delete payload.options;\n\n var req = {\n method: this.rpcMethod,\n body: JSON.stringify(queuedRequest.query),\n credentials: 'same-origin', // preserve authentication\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json; charset=utf-8'\n }\n };\n\n // Hook for making fetch abortable, see: https://developers.google.com/web/updates/2017/09/abortable-fetch\n if (options.signal) req.signal = options.signal;\n\n var _completeRequest = this._completeRequest;\n\n return fetch(this.rpcHost + '?a=' + encodeURIComponent(queuedRequest.query.action), req)\n .then(function(res) {\n return res.json();\n })\n .then(function(res) {\n if (res.error) {\n // Error response from API\n return Promise.reject(res);\n } else {\n // Browserify should polyfill setImmediate\n if (queuedRequest.callback) {\n return setImmediate(function() {\n _completeRequest();\n queuedRequest.callback(null, res);\n });\n }\n _completeRequest();\n queuedRequest.resolve(res); // this goes back to caller\n return Promise.resolve(res); // internally resolve\n }\n })\n .catch(function(err) {\n if (!err || !err.statusCode) {\n err = {\n statusCode: 503,\n error: (err instanceof Error ? err.message : /* istanbul ignore next: not worth testing err vs stats */ err),\n message: \"Something went wrong\",\n attributes: {\n source: 'okanjo.providers.FetchProvider',\n wrappedError: err\n }\n };\n }\n\n // Check for unauthorized hook case\n if (err.statusCode === 401) this._unauthorizedHook(err, queuedRequest.query);\n\n if (queuedRequest.callback) {\n return setImmediate(function() {\n _completeRequest();\n queuedRequest.callback(err, null);\n });\n }\n\n _completeRequest();\n queuedRequest.reject(err); // this goes back to caller\n return Promise.resolve(err); // internally resolve\n }.bind(this))\n ;\n};\n\n\n/**\n * @callback requestCallback\n * @param {object|null} error\n * @param {object|null} response\n */\n\nmodule.exports = FetchProvider;\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"../provider\":10,\"timers\":7,\"util\":9}],12:[function(require,module,exports){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar sdkUtil = require('./util'),\n querystring = require('querystring');\n\n/**\n * Query container\n * @param {object} [base] - Base query to clone\n * @param {object} [options] - Options to override\n * @constructor\n */\nfunction Query(base, options) {\n\n /**\n * The API in which the resource belongs to\n * @type {null}\n */\n this.api = null;\n\n /**\n * Resource method action / route id\n * @type {string}\n */\n this.action = null;\n\n /**\n * Request method\n * @example `GET` or `PUT` or `POST` or `DELETE`\n * @type {string}\n */\n this.method = null;\n\n /**\n * Request path\n * @type {string}\n */\n this.path = '';\n\n /**\n * Request path parameters\n * @type {object}\n */\n this.pathParams = {};\n\n /**\n * Request query arguments\n * @type {object|null}\n */\n this.query = null;\n\n /**\n * Request payload\n * @type {object|null}\n */\n this.payload = null;\n\n /**\n * API key\n * @type {null}\n */\n this.key = null;\n\n /**\n * Authorization token\n * @type {null}\n */\n this.sessionToken = null;\n\n /**\n * Cookies\n * @type {{}}\n */\n this.cookies = {};\n\n /**\n * SDK options, do not transmit\n * @type {{}}\n */\n this.options = {};\n\n this._extend(base);\n this._extend(options, true);\n}\n\n\n\n/**\n * Copies and clones properties from the given object\n * @param extra\n * @param overrideAll\n * @private\n */\nQuery.prototype._extend = function(extra, overrideAll) {\n if (extra) {\n if (extra.api !== undefined) this.setAPI(extra.api);\n if (extra.action !== undefined) this.setAction(extra.action);\n if (extra.method !== undefined) this.setMethod(extra.method);\n if (extra.path !== undefined) this.setPath(extra.path);\n if (extra.pathParams !== undefined) this.setPathParams(extra.pathParams);\n if (extra.query !== undefined) this.where(extra.query);\n if (extra.payload !== undefined) this.data(extra.payload);\n if (extra.cookies !== undefined) this.setCookies(extra.cookies);\n if (extra.options !== undefined) this.setOptions(extra.options);\n\n if (overrideAll) {\n if (extra.key !== undefined) this.setKey(extra.key);\n if (extra.sessionToken !== undefined) this.setSessionToken(extra.sessionToken);\n }\n }\n};\n\n\n/**\n * Returns the real URL path of the request\n * @return {string|Error}\n */\nQuery.prototype.getRealPath = function() {\n return sdkUtil.buildPath(this.path, this.pathParams);\n};\n\n\n/**\n * Returns the full URL path including the querystring\n * @return {string|Error}\n */\nQuery.prototype.getFullPath = function() {\n var path = this.getRealPath();\n if (path && this.query) {\n return path + '?' + querystring.stringify(this.query);\n } else {\n return path;\n }\n};\n\n/**\n * Sets the name of the API which handles the query\n * @param {string} api\n * @return {Query}\n */\nQuery.prototype.setAPI = function(api) { this.api = api; return this; };\n\n/**\n * Sets the method action / route id\n * @param {string} action\n * @return {Query}\n */\nQuery.prototype.setAction = function(action) { this.action = action; return this; };\n\n/**\n * Sets the HTTP method on the request\n * @param {string} method\n * @return {Query}\n */\nQuery.prototype.setMethod = function(method) { this.method = method; return this; };\n\n\n/**\n * Sets the URL path template on the request\n * @param {string} path\n * @return {Query}\n */\nQuery.prototype.setPath = function(path) { this.path = path; return this; };\n\n/**\n * Sets the URL path parameters on the request\n * @param {object} params\n * @return {Query}\n */\nQuery.prototype.setPathParams = function(params) { this.pathParams = sdkUtil.copy(this.pathParams, params); return this; };\n\n/**\n * Sets the query parameters on the request\n * @param {object} params\n * @return {Query}\n */\nQuery.prototype.where = function(params) { this.query = sdkUtil.copy(this.query, params); return this; };\n\n/**\n * Sets the payload on the request\n * @param {object} doc\n * @return {Query}\n */\nQuery.prototype.data = function(doc) { this.payload = sdkUtil.copy(this.payload, doc); return this; };\n\n/**\n * Sets the pagination skip count on the request\n * @param {number} count\n * @return {Query}\n */\nQuery.prototype.skip = function(count) { this.query = sdkUtil.copy(this.query, { skip: count }); return this; };\n\n/**\n * Sets the pagination return count on the request\n * @param {number} count\n * @return {Query}\n */\nQuery.prototype.take = function(count) { this.query = sdkUtil.copy(this.query, { take: count }); return this; };\n\n/**\n * Sets the API key to use on the request\n * @param {string} key\n * @return {Query}\n */\nQuery.prototype.setKey = function(key) { this.key = key; return this; };\n\n\n/**\n * Sets the authorization context of the request\n * @param {string} sessionToken\n * @return {Query}\n */\nQuery.prototype.setSessionToken = function(sessionToken) { this.sessionToken = sessionToken; return this; };\n\n/**\n * Sets cookies on the request\n * @param {*} cookies\n * @returns {Query}\n */\nQuery.prototype.setCookies = function(cookies) { this.cookies = cookies; return this; };\n\n/**\n * Sets sdk options for the request\n * @param {*} options\n * @returns {Query}\n */\nQuery.prototype.setOptions = function(options) { this.options = options; return this; };\n\nmodule.exports = Query;\n},{\"./util\":13,\"querystring\":6}],13:[function(require,module,exports){\n/*\n * Date: 1/26/16 12:01 PM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Simple, deep, key-value copier\n * @param {*} destination – Target object or empty to make brand new copy\n * @param {*} source – Object to make a duplicate of\n * @return {*} – The resulting object, which might be the same as dest unless source was a value not a reference\n * @author Kevin Fitzgerald\n */\nfunction copy(destination, source) {\n if (source !== null && typeof source === \"object\") {\n if (Array.isArray(source)) {\n destination = destination || [];\n source.forEach(function(val, index) {\n destination[index] = copy(destination[index], val);\n });\n } else {\n destination = destination || {};\n Object.keys(source).forEach(function(key) {\n destination[key] = copy(destination[key], source[key]);\n });\n }\n } else {\n destination = source;\n }\n\n return destination;\n}\n\n\n/**\n * Builds the final URL path given replaceable param names\n * @param {string} path - Route path\n * @param {object} params - Parameter key value pairs\n * @return {string|Error} Final path or Error if missing a parameter\n */\nfunction buildPath(path, params) {\n\n var extractParams = /{([a-zA-Z_]+)}/g,\n resultPath = path,\n p, token, name;\n\n // Pull out the expected parameters\n while ((p = extractParams.exec(path)) !== null) {\n\n token = p[0];\n name = p[1];\n\n // Make sure the param was given\n if (params[name]) {\n resultPath = resultPath.replace(token, encodeURIComponent(params[name]));\n } else {\n return new Error('Path parameter ' + token + ' required to call ' + path);\n }\n }\n\n return resultPath;\n}\n\n\n/**\n *\n * @type {{copy: copy}}\n */\nmodule.exports = {\n copy: copy,\n buildPath: buildPath\n};\n},{}],\"okanjo-sdk\":[function(require,module,exports){\n(function (process){\n/*\n * Date: 1/26/16 11:59 AM\n *\n * ----\n *\n * (c) Okanjo Partners Inc\n * https://okanjo.com\n * support@okanjo.com\n *\n * https://github.com/okanjo/okanjo-nodejs\n *\n * ----\n *\n * TL;DR? see: http://www.tldrlegal.com/license/mit-license\n *\n * The MIT License (MIT)\n * Copyright (c) 2013 Okanjo Partners Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n * of the Software, and to permit persons to whom the Software is furnished to do\n * so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nvar Provider = require('../src/provider'),\n Query = require('../src/query');\n\n/**\n * SDK Base\n * @param {object} [config] Client options\n * @namespace\n * @constructor\n */\nfunction Client(config) {\n\n // Allow client to be initialized as: var api = new Client(\"api_key\");\n if (typeof config === \"string\") {\n config = {\n key: config\n };\n } else {\n config = config || {};\n }\n\n this.config = config;\n\n // Connect the right default provider based on runtime context\n if (typeof config.provider === \"function\") {\n // Context is provided in the config - use the constructor as-is\n this.provider = new config.provider(this);\n } else {\n // Detect context\n if (process.browser) {\n // Running in browser - default to proxy mode\n //this.provider = new (require('../src/providers/jquery_provider'))(this);\n this.provider = new (require('../src/providers/fetch_provider'))(this);\n } else {\n // Running in Node - Use the HTTP provider by default to make real requests\n this.provider = new (require('../src/providers/http_provider'))(this);\n }\n }\n\n // Attach resources\n for (var i = 0; i < Client.resourceBinders.length; i++) {\n Client.resourceBinders[i](this);\n }\n}\n\n/**\n * SDK Version\n */\nClient.Version = '3.5.0';\n\n/**\n * Expose the Provider base class\n * @type {Provider}\n */\nClient.Provider = Provider;\n\n/**\n * Expose the Query base class\n * @type {Query}\n */\nClient.Query = Query;\n\n\n/**\n * Routes a request through the client's registered transport provider\n * @param {object} spec - Query specifications\n * @param {function} callback\n * @return {Query} - A compiled query, ready to rock and roll, or be modified and executed yourself\n */\nClient.prototype._makeRequest = function(spec, callback) {\n\n // Build the query\n var query = new Query(this.config, spec);\n\n // Compile the query\n this.provider.compile(query);\n\n // If we have a callback, execute the request\n if (callback) {\n query.execute(callback);\n }\n\n // Return the query for reuse or manual execution\n return query;\n};\n\n/**\n * Container for resource binder functions\n * @type {Array}\n */\nClient.resourceBinders = [];\n\n\nmodule.exports = Client;\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n \n /**\n * Accounts\n * @namespace Client.accounts\n */\n Client.accounts = {\n \n /**\n * Registers a new Okanjo account\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.create',\n method: 'POST',\n path: '/accounts',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an account\n * @param {string} account_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n retrieve: function(account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.retrieve',\n method: 'GET',\n path: '/accounts/{account_id}',\n pathParams: {\n account_id: account_id\n }\n }, callback);\n },\n \n /**\n * Returns manageable accounts, or accounts on a given resource.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'account.list',\n method: 'GET',\n path: '/accounts',\n query: query\n }, callback);\n },\n \n /**\n * Updates an account\n * @param {string} account_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n update: function(account_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.update',\n method: 'PUT',\n path: '/accounts/{account_id}',\n pathParams: {\n account_id: account_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Requests a password reset for an account with the given email address\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n recover: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.recover',\n method: 'POST',\n path: '/accounts/recover',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an account's access control list. This provides an overview of what the account has access to.\n * @param {string} account_id – Account id for the acl to be retrieved.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.accounts#\n */\n retrieve_acl: function(account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'account.retrieve_acl',\n method: 'GET',\n path: '/accounts/{account_id}/acl',\n pathParams: {\n account_id: account_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Ads\n * @namespace Client.ads\n */\n Client.ads = {\n \n /**\n * Returns content to fill a placement.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ads#\n */\n fill: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'ads.fill',\n method: 'POST',\n path: '/content',\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Articles\n * @namespace Client.articles\n */\n Client.articles = {\n \n /**\n * Creates an article for distribution\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.create',\n method: 'POST',\n path: '/articles',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an article\n * @param {string} url – URL of the article\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n retrieve: function(url, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.retrieve',\n method: 'GET',\n path: '/articles/{url}',\n pathParams: {\n url: url\n }\n }, callback);\n },\n \n /**\n * Lists articles that meet the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'article.list',\n method: 'GET',\n path: '/articles',\n query: query\n }, callback);\n },\n \n /**\n * Modifies an article\n * @param {string} url – URL of the article\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.articles#\n */\n update: function(url, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'article.update',\n method: 'PUT',\n path: '/articles/{url}',\n pathParams: {\n url: url\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Domains\n * @namespace Client.domains\n */\n Client.domains = {\n \n /**\n * Associates a domain with the property.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.create',\n method: 'POST',\n path: '/domains',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a domain with the given name.\n * @param {string} domain_name – Fully qualified domain name\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n retrieve: function(domain_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.retrieve',\n method: 'GET',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n }\n }, callback);\n },\n \n /**\n * List domains with the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'domain.list',\n method: 'GET',\n path: '/domains',\n query: query\n }, callback);\n },\n \n /**\n * Updates a domain with the given name.\n * @param {string} domain_name – Fully qualified domain name\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n update: function(domain_name, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.update',\n method: 'PUT',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Dissociates a domain from its associated property.\n * @param {string} domain_name – Fully qualified domain name\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.domains#\n */\n delete: function(domain_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'domain.delete',\n method: 'DELETE',\n path: '/domains/{domain_name}',\n pathParams: {\n domain_name: domain_name\n }\n }, callback);\n }\n \n };\n \n /**\n * Organizations\n * @namespace Client.organizations\n */\n Client.organizations = {\n \n /**\n * Creates a new organization under the current user.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.create',\n method: 'POST',\n path: '/organizations',\n payload: payload\n }, callback);\n },\n \n /**\n * Gets a particular organization if visible to the current user.\n * @param {string} org_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n retrieve: function(org_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.retrieve',\n method: 'GET',\n path: '/organizations/{org_id}',\n pathParams: {\n org_id: org_id\n }\n }, callback);\n },\n \n /**\n * Lists organizations visible to the current user.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'organization.list',\n method: 'GET',\n path: '/organizations',\n query: query\n }, callback);\n },\n \n /**\n * Updates an organization\n * @param {string} org_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.organizations#\n */\n update: function(org_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'organization.update',\n method: 'PUT',\n path: '/organizations/{org_id}',\n pathParams: {\n org_id: org_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Placements\n * @namespace Client.placements\n */\n Client.placements = {\n \n /**\n * Creates a ProductMatch placement\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.create',\n method: 'POST',\n path: '/placements',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n retrieve: function(placement_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.retrieve',\n method: 'GET',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n }\n }, callback);\n },\n \n /**\n * List ProductMatch placements\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'placement.list',\n method: 'GET',\n path: '/placements',\n query: query\n }, callback);\n },\n \n /**\n * Updates a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n update: function(placement_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.update',\n method: 'PUT',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a ProductMatch placement\n * @param {string} placement_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n delete: function(placement_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.delete',\n method: 'DELETE',\n path: '/placements/{placement_id}',\n pathParams: {\n placement_id: placement_id\n }\n }, callback);\n },\n \n /**\n * Creates a placement test, used for A-B testing.\n * @param {string} placement_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n create_test: function(placement_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.create_test',\n method: 'POST',\n path: '/placements/{placement_id}/tests',\n pathParams: {\n placement_id: placement_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a placement test.\n * @param {string} placement_id – Object identifier.\n * @param {string} placement_test_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n delete_test: function(placement_id, placement_test_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.delete_test',\n method: 'DELETE',\n path: '/placements/{placement_id}/tests/{placement_test_id}',\n pathParams: {\n placement_id: placement_id,\n placement_test_id: placement_test_id\n }\n }, callback);\n },\n \n /**\n * Updates a placement test.\n * @param {string} placement_id – Object identifier.\n * @param {string} placement_test_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.placements#\n */\n update_test: function(placement_id, placement_test_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'placement.update_test',\n method: 'PUT',\n path: '/placements/{placement_id}/tests/{placement_test_id}',\n pathParams: {\n placement_id: placement_id,\n placement_test_id: placement_test_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Products\n * @namespace Client.products\n */\n Client.products = {\n \n /**\n * Creates a product\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.create',\n method: 'POST',\n path: '/products',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a product\n * @param {string} product_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n retrieve: function(product_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.retrieve',\n method: 'GET',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n }\n }, callback);\n },\n \n /**\n * Lists products\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'product.list',\n method: 'GET',\n path: '/products',\n query: query\n }, callback);\n },\n \n /**\n * Updates a product\n * @param {string} product_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n update: function(product_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.update',\n method: 'PUT',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a product\n * @param {string} product_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.products#\n */\n delete: function(product_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'product.delete',\n method: 'DELETE',\n path: '/products/{product_id}',\n pathParams: {\n product_id: product_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Properties\n * @namespace Client.properties\n */\n Client.properties = {\n \n /**\n * Creates a new property.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.create',\n method: 'POST',\n path: '/properties',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a property.\n * @param {string} property_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n retrieve: function(property_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.retrieve',\n method: 'GET',\n path: '/properties/{property_id}',\n pathParams: {\n property_id: property_id\n }\n }, callback);\n },\n \n /**\n * Returns accessible properties.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'property.list',\n method: 'GET',\n path: '/properties',\n query: query\n }, callback);\n },\n \n /**\n * Updates a property.\n * @param {string} property_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.properties#\n */\n update: function(property_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'property.update',\n method: 'PUT',\n path: '/properties/{property_id}',\n pathParams: {\n property_id: property_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Reporting\n * @namespace Client.reporting\n */\n Client.reporting = {\n \n /**\n * Returns a histogram of page metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n page_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.page_date_histogram',\n method: 'GET',\n path: '/reporting/pages/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n page_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.page_top_n',\n method: 'GET',\n path: '/reporting/pages/top-n',\n query: query\n }, callback);\n },\n \n /**\n * Returns a histogram of resource metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n resource_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.resource_date_histogram',\n method: 'GET',\n path: '/reporting/resources/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n resource_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.resource_top_n',\n method: 'GET',\n path: '/reporting/resources/top-n',\n query: query\n }, callback);\n },\n \n /**\n * Returns a histogram of widget metrics in timescale\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n widget_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.widget_date_histogram',\n method: 'GET',\n path: '/reporting/widgets/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n widget_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'reporting.widget_top_n',\n method: 'GET',\n path: '/reporting/widgets/top-n',\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Resource Sets\n * @namespace Client.resource_sets\n */\n Client.resource_sets = {\n \n /**\n * Creates a new resource set.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.create',\n method: 'POST',\n path: '/resource-sets',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a resource set with the given name.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n retrieve: function(resource_set_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.retrieve',\n method: 'GET',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n }\n }, callback);\n },\n \n /**\n * List resource sets with the given criteria.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.list',\n method: 'GET',\n path: '/resource-sets',\n query: query\n }, callback);\n },\n \n /**\n * Updates a resource set with the given name.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n update: function(resource_set_name, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.update',\n method: 'PUT',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a resource set.\n * @param {string} resource_set_name – Name of the resource set.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.resource_sets#\n */\n delete: function(resource_set_name, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'resource_set.delete',\n method: 'DELETE',\n path: '/resource-sets/{resource_set_name}',\n pathParams: {\n resource_set_name: resource_set_name\n }\n }, callback);\n }\n \n };\n \n /**\n * Roles\n * @namespace Client.roles\n */\n Client.roles = {\n \n /**\n * Creates a role for the given resource\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.create',\n method: 'POST',\n path: '/roles',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a role.\n * @param {string} role_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n retrieve: function(role_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.retrieve',\n method: 'GET',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n }\n }, callback);\n },\n \n /**\n * Retrieves roles on a given resource.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'role.list',\n method: 'GET',\n path: '/roles',\n query: query\n }, callback);\n },\n \n /**\n * Updates a role\n * @param {string} role_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n update: function(role_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.update',\n method: 'PUT',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a role\n * @param {string} role_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n delete: function(role_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.delete',\n method: 'DELETE',\n path: '/roles/{role_id}',\n pathParams: {\n role_id: role_id\n }\n }, callback);\n },\n \n /**\n * Adds an account to a role.\n * @param {string} role_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n add_account: function(role_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.add_account',\n method: 'POST',\n path: '/roles/{role_id}/members',\n pathParams: {\n role_id: role_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * List accounts that belong to a role.\n * @param {string} role_id – Object identifier.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n list_accounts: function(role_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'role.list_accounts',\n method: 'GET',\n path: '/roles/{role_id}/members',\n pathParams: {\n role_id: role_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Removes an account from a role.\n * @param {string} role_id – Object identifier.\n * @param {string} account_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.roles#\n */\n remove_account: function(role_id, account_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'role.remove_account',\n method: 'DELETE',\n path: '/roles/{role_id}/members/{account_id}',\n pathParams: {\n role_id: role_id,\n account_id: account_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Account Sessions\n * @namespace Client.sessions\n */\n Client.sessions = {\n \n /**\n * Starts a new account session\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.create',\n method: 'POST',\n path: '/accounts/sessions',\n payload: payload\n }, callback);\n },\n \n /**\n * Gets an particular session.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n retrieve: function(account_id, session_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.retrieve',\n method: 'GET',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n }\n }, callback);\n },\n \n /**\n * Returns past and present sessions belonging to the account.\n * @param {string} account_id – Object identifier.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n list: function(account_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'session.list',\n method: 'GET',\n path: '/accounts/{account_id}/sessions',\n pathParams: {\n account_id: account_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Updates a session belonging to the account.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n update: function(account_id, session_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.update',\n method: 'PUT',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Closes the session, invalidating the `session_token`. The status of the session will become `ended`.\n * @param {string} account_id – Object identifier.\n * @param {string} session_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.sessions#\n */\n delete: function(account_id, session_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'session.delete',\n method: 'DELETE',\n path: '/accounts/{account_id}/sessions/{session_id}',\n pathParams: {\n account_id: account_id,\n session_id: session_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Stores\n * @namespace Client.stores\n */\n Client.stores = {\n \n /**\n * Creates a new store.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.create',\n method: 'POST',\n path: '/stores',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a store.\n * @param {string} store_id – Object identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n retrieve: function(store_id, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.retrieve',\n method: 'GET',\n path: '/stores/{store_id}',\n pathParams: {\n store_id: store_id\n }\n }, callback);\n },\n \n /**\n * Retrieves accessible stores.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'api',\n action: 'store.list',\n method: 'GET',\n path: '/stores',\n query: query\n }, callback);\n },\n \n /**\n * Updates a store.\n * @param {string} store_id – Object identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.stores#\n */\n update: function(store_id, payload, callback) {\n return Client._makeRequest({\n api: 'api',\n action: 'store.update',\n method: 'PUT',\n path: '/stores/{store_id}',\n pathParams: {\n store_id: store_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n Client.farm = {};\n \n \n /**\n * Activity\n * @namespace Client.farm.activities\n */\n Client.farm.activities = {\n \n /**\n * Lists the most recent events generated by curators.\n * @param {string} instance_id – Instance Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.activities#\n */\n list: function(instance_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'activity.list',\n method: 'GET',\n path: '/api/{instance_id}/activity',\n pathParams: {\n instance_id: instance_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Amazon Links\n * @namespace Client.farm.amazon_links\n */\n Client.farm.amazon_links = {\n \n /**\n * Creates a new Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.create',\n method: 'POST',\n path: '/api/{instance_id}/links/amazon',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an existing Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n retrieve: function(instance_id, vendor_id_asin, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n }\n }, callback);\n },\n \n /**\n * Returns Amazon links that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.list',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Update an existing Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n update: function(instance_id, vendor_id_asin, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.update',\n method: 'PUT',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Follows the Amazon link to the offer page, or finds a replacement if no longer available.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n follow: function(instance_id, vendor_id_asin, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.follow',\n method: 'GET',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}/follow',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n query: query\n }, callback);\n },\n \n /**\n * Returns Amazon offers that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n search: function(instance_id, vendor_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.search',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/amazon-search',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Tracks an image impression for the given Amazon link\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n track_impression: function(instance_id, vendor_id_asin, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.track_impression',\n method: 'GET',\n path: '/images/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n },\n query: query\n }, callback);\n },\n \n /**\n * Deletes an Amazon link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id_asin – Unique amazon product id, using combined vendor_id:asin pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.amazon_links#\n */\n delete: function(instance_id, vendor_id_asin, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'amazon_link.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/links/amazon/{vendor_id_asin}',\n pathParams: {\n instance_id: instance_id,\n vendor_id_asin: vendor_id_asin\n }\n }, callback);\n }\n \n };\n \n /**\n * Buckets\n * @namespace Client.farm.buckets\n */\n Client.farm.buckets = {\n \n /**\n * Create a new bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.create',\n method: 'POST',\n path: '/api/{instance_id}/buckets',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Returns a specific bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n retrieve: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Returns a list of buckets.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.list',\n method: 'GET',\n path: '/api/{instance_id}/buckets',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Make changes to a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n update: function(instance_id, bucket_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.update',\n method: 'PUT',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n delete: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/buckets/{bucket_id}',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Fills a bucket to capacity with recommended offers.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n backfill: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.backfill',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/do-backfill',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Gets the current state of the offers within the bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n status: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.status',\n method: 'GET',\n path: '/api/{instance_id}/buckets/{bucket_id}/status',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Toggles AI recommendations ON if currently disabled, or OFF if currently enabled.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n toggle_ai: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.toggle_ai',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/toggle-ai',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Toggles AI automation ON if currently disabled, or OFF if currently enabled.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n toggle_ai_automation: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.toggle_ai_automation',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/toggle-ai-automation',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n },\n \n /**\n * Remove all offers from a bucket.\n * @param {string} instance_id – Instance Id\n * @param {string} bucket_id – Bucket Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.buckets#\n */\n truncate: function(instance_id, bucket_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket.truncate',\n method: 'POST',\n path: '/api/{instance_id}/buckets/{bucket_id}/truncate',\n pathParams: {\n instance_id: instance_id,\n bucket_id: bucket_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Bucket Items\n * @namespace Client.farm.bucket_items\n */\n Client.farm.bucket_items = {\n \n /**\n * Adds the given list of offers to a bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.bucket_items#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket_item.create',\n method: 'POST',\n path: '/api/{instance_id}/bucket-items',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Removes a list of offers from a bucket.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.bucket_items#\n */\n delete: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'bucket_item.delete',\n method: 'POST',\n path: '/api/{instance_id}/bucket-items/delete',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Categories\n * @namespace Client.farm.categories\n */\n Client.farm.categories = {\n \n /**\n * Returns a list of merchant category mappings by vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {string} merchant_id – Vendor merchant identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.categories#\n */\n list: function(instance_id, vendor_id, merchant_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'category.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants/{merchant_id}/categories',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id,\n merchant_id: merchant_id\n }\n }, callback);\n },\n \n /**\n * Adds or updates a vendor-merchant category mapping\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {string} merchant_id – Vendor merchant identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.categories#\n */\n upsert: function(instance_id, vendor_id, merchant_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'category.upsert',\n method: 'POST',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants/{merchant_id}/categories',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id,\n merchant_id: merchant_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Correlations\n * @namespace Client.farm.correlations\n */\n Client.farm.correlations = {\n \n /**\n * Sets an offer's augmentation data.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.correlations#\n */\n update: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'correlation.update',\n method: 'PUT',\n path: '/api/{instance_id}/correlations',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Direct Links\n * @namespace Client.farm.direct_links\n */\n Client.farm.direct_links = {\n \n /**\n * Creates a new direct link.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n create: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.create',\n method: 'POST',\n path: '/api/{instance_id}/links',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves an existing direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n retrieve: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Returns direct links that meet the filter criteria.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.list',\n method: 'GET',\n path: '/api/{instance_id}/links',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Update an existing direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n update: function(instance_id, vendor_offer_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.update',\n method: 'PUT',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a direct link.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n delete: function(instance_id, vendor_offer_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.delete',\n method: 'DELETE',\n path: '/api/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n }\n }, callback);\n },\n \n /**\n * Follows the direct offer link to the offer page, or finds a replacement if no longer available.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n follow: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.follow',\n method: 'GET',\n path: '/api/{instance_id}/links/{vendor_offer_id}/follow',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Tracks an image impression for the given offer\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.direct_links#\n */\n track_impression: function(instance_id, vendor_offer_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'direct_link.track_impression',\n method: 'GET',\n path: '/images/{instance_id}/links/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Instances\n * @namespace Client.farm.instances\n */\n Client.farm.instances = {\n \n /**\n * Creates a new instance of the farm.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.create',\n method: 'POST',\n path: '/api/instances',\n payload: payload\n }, callback);\n },\n \n /**\n * Returns a given farm instance.\n * @param {string} instance_id – Instance Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n retrieve: function(instance_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.retrieve',\n method: 'GET',\n path: '/api/instances/{instance_id}',\n pathParams: {\n instance_id: instance_id\n }\n }, callback);\n },\n \n /**\n * Returns accessible farm instances\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'instance.list',\n method: 'GET',\n path: '/api/instances',\n query: query\n }, callback);\n },\n \n /**\n * Updates a farm instance.\n * @param {string} instance_id – Instance Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.instances#\n */\n update: function(instance_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'instance.update',\n method: 'PUT',\n path: '/api/instances/{instance_id}',\n pathParams: {\n instance_id: instance_id\n },\n payload: payload\n }, callback);\n }\n \n };\n \n /**\n * Vendors\n * @namespace Client.farm.merchants\n */\n Client.farm.merchants = {\n \n /**\n * Returns a list of merchants belonging to the vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.merchants#\n */\n list: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'merchants.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}/merchants',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n }\n \n };\n \n /**\n * Offers\n * @namespace Client.farm.offers\n */\n Client.farm.offers = {\n \n /**\n * Returns an offer given its canonical id\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_offer_id – Unique offer id, using combined vendor_id:offer_id pair\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.offers#\n */\n retrieve: function(instance_id, vendor_offer_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'offer.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/offers/{vendor_offer_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_offer_id: vendor_offer_id\n }\n }, callback);\n },\n \n /**\n * List and filter offers.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.offers#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'offer.list',\n method: 'GET',\n path: '/api/{instance_id}/offers',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Recommended Offers\n * @namespace Client.farm.recommended_offers\n */\n Client.farm.recommended_offers = {\n \n /**\n * List and filter recommended offers.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.recommended_offers#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'recommended_offer.list',\n method: 'GET',\n path: '/api/{instance_id}/ai/offers',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Reporting\n * @namespace Client.farm.reporting\n */\n Client.farm.reporting = {\n \n /**\n * Returns a histogram of link metrics for time-series visualizations\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n link_date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'reporting.link_date_histogram',\n method: 'GET',\n path: '/api/reporting/links/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n link_top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'reporting.link_top_n',\n method: 'GET',\n path: '/api/reporting/links/top-n',\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Vendors\n * @namespace Client.farm.vendors\n */\n Client.farm.vendors = {\n \n /**\n * Returns detailed information about a vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n retrieve: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.retrieve',\n method: 'GET',\n path: '/api/{instance_id}/vendors/{vendor_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n },\n \n /**\n * Returns a list of vendors.\n * @param {string} instance_id – Instance Id\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n list: function(instance_id, query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.list',\n method: 'GET',\n path: '/api/{instance_id}/vendors',\n pathParams: {\n instance_id: instance_id\n },\n query: query\n }, callback);\n },\n \n /**\n * Updates a vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n update: function(instance_id, vendor_id, payload, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.update',\n method: 'PUT',\n path: '/api/{instance_id}/vendors/{vendor_id}',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Resynchronizes all offers associated with the vendor.\n * @param {string} instance_id – Instance Id\n * @param {string} vendor_id – Vendor Id\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.vendors#\n */\n resync: function(instance_id, vendor_id, callback) {\n return Client._makeRequest({\n api: 'farm',\n action: 'vendor.resync',\n method: 'POST',\n path: '/api/{instance_id}/vendors/{vendor_id}/resync',\n pathParams: {\n instance_id: instance_id,\n vendor_id: vendor_id\n }\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n Client.shortcodes = {};\n \n \n /**\n * Reporting\n * @namespace Client.shortcodes.reporting\n */\n Client.shortcodes.reporting = {\n \n /**\n * Returns a histogram of link metrics for time-series visualizations\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n date_histogram: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'reporting.date_histogram',\n method: 'GET',\n path: '/api/reporting/clicks/date-histogram',\n query: query\n }, callback);\n },\n \n /**\n * Returns the top N results per aggregation group\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.reportings#\n */\n top_n: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'reporting.top_n',\n method: 'GET',\n path: '/api/reporting/clicks/top-n',\n query: query\n }, callback);\n }\n \n };\n \n /**\n * Shortcodes\n * @namespace Client.shortcodes.shortcodes\n */\n Client.shortcodes.shortcodes = {\n \n /**\n * Creates a new shortcode.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.create',\n method: 'POST',\n path: '/api/shortcodes',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n retrieve: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.retrieve',\n method: 'GET',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n },\n \n /**\n * Lists shortcode.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.list',\n method: 'GET',\n path: '/api/shortcodes',\n query: query\n }, callback);\n },\n \n /**\n * Updates a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n update: function(shortcode, payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.update',\n method: 'PUT',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a shortcode.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n delete: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.delete',\n method: 'DELETE',\n path: '/api/shortcodes/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n },\n \n /**\n * Follows the shortcode URL link.\n * @param {string} shortcode – Shortcode identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.shortcodes#\n */\n follow: function(shortcode, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'shortcode.follow',\n method: 'GET',\n path: '/{shortcode}',\n pathParams: {\n shortcode: shortcode\n }\n }, callback);\n }\n \n };\n \n /**\n * Workspace\n * @namespace Client.shortcodes.workspaces\n */\n Client.shortcodes.workspaces = {\n \n /**\n * Creates a new workspace.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n create: function(payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.create',\n method: 'POST',\n path: '/api/workspaces',\n payload: payload\n }, callback);\n },\n \n /**\n * Retrieves a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n retrieve: function(workspace_id, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.retrieve',\n method: 'GET',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n }\n }, callback);\n },\n \n /**\n * Lists workspaces.\n * @param {object} [query] - Filter arguments\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n list: function(query, callback) {\n // Shift optional arguments, if necessary\n if (typeof query === \"function\") {\n callback = query;\n query = undefined;\n }\n \n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.list',\n method: 'GET',\n path: '/api/workspaces',\n query: query\n }, callback);\n },\n \n /**\n * Updates a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n update: function(workspace_id, payload, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.update',\n method: 'PUT',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Deletes a workspace.\n * @param {string} workspace_id – Workspace identifier.\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.workspaces#\n */\n delete: function(workspace_id, callback) {\n return Client._makeRequest({\n api: 'shortcodes',\n action: 'workspace.delete',\n method: 'DELETE',\n path: '/api/workspaces/{workspace_id}',\n pathParams: {\n workspace_id: workspace_id\n }\n }, callback);\n }\n \n };\n \n\n});\n/* istanbul ignore next: generated code */\nClient.resourceBinders.push(function(Client) {\n \n \n /**\n * Session\n * @namespace Client.sso\n */\n Client.sso = {\n \n /**\n * Authenticates a user session\n * @param {string} prefix – Environment login path\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n login: function(prefix, payload, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.login',\n method: 'POST',\n path: '/{prefix}/api/sessions',\n pathParams: {\n prefix: prefix\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Terminates the given session\n * @param {string} prefix – Environment login path\n * @param {string} sid – Session identifier\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n logout: function(prefix, sid, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.logout',\n method: 'DELETE',\n path: '/{prefix}/api/sessions/{sid}',\n pathParams: {\n prefix: prefix,\n sid: sid\n }\n }, callback);\n },\n \n /**\n * Starts the account recovery process\n * @param {string} prefix – Environment login path\n * @param {object} payload - Resource or parameters\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n recover: function(prefix, payload, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.recover',\n method: 'POST',\n path: '/{prefix}/api/recover',\n pathParams: {\n prefix: prefix\n },\n payload: payload\n }, callback);\n },\n \n /**\n * Gets the session state if still valid\n * @param {string} prefix – Environment login path\n * @param {string} sso_token – Session identifier\n * @param {requestCallback} [callback] – Optional callback. When present, the request is executed\n * @return {Query} - Compiled query ready for execution\n * @memberof Client.ssos#\n */\n validate: function(prefix, sso_token, callback) {\n return Client._makeRequest({\n api: 'sso',\n action: 'sso.validate',\n method: 'GET',\n path: '/{prefix}/api/sessions/{sso_token}',\n pathParams: {\n prefix: prefix,\n sso_token: sso_token\n }\n }, callback);\n }\n \n };\n \n\n});\n}).call(this,require('_process'))\n},{\"../src/provider\":10,\"../src/providers/fetch_provider\":11,\"../src/providers/http_provider\":1,\"../src/query\":12,\"_process\":3}]},{},[]);\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 72fe883..938c5c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "okanjo", - "version": "2.6.0", + "version": "3.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8ac1165..61642dc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "okanjo", - "version": "3.4.0", + "version": "3.5.0", "description": "Integrate your application with the Okanjo API.", "main": "dist/client.js", "scripts": {